[英]jsp:forward in Java without using JSP tag?
我可以在<%...%>塊中使用與<jsp:forward page =“...”/>等效的純Java嗎?
例如,我目前有一個這樣的JSP頁面:
<%
String errorMessage = SomeClass.getInstance().doSomething();
if (errorMessage != null) {
session.setAttribute("error", errorMessage);
%>
<jsp:forward page="error.jsp" />
<%
} else {
String url = response.encodeRedirectURL("index.jsp");
response.sendRedirect(url);
}
%>
必須打破<%...%>塊以使用jsp:forward是丑陋的,並且由於縮進等原因使得更難閱讀。
那么,我可以在不使用JSP標記的情況下在Java代碼中進行轉發嗎?
這樣的事情是理想的:
<%
String errorMessage = SomeClass.getInstance().doSomething();
if (errorMessage != null) {
session.setAttribute("error", errorMessage);
someObject.forward("error.jsp");
} else {
String url = response.encodeRedirectURL("index.jsp");
response.sendRedirect(url);
}
%>
您正在尋找的someObject
是pageContext 。
此對象在JSP中隱式定義,因此您可以像這樣使用它:
pageContext.forward("<some relative jsp>");
如果可以的話,你真的應該盡量避免使用scriplets,在你的情況下,很多你正在做的事情可以用JSTL代碼替換。 以下替換為您的示例更清晰,IMO:
<%
// Consider moving to a servlet or controller/action class
String errorMessage = SomeClass.getInstance().doSomething();
pageContext.setAttribute("errorMessage", errorMessage);
%>
<c:choose>
<c:when test="${not empty errorMessage}">
<c:set var="error" scope="session" value="${errorMessage}" />
<jsp:forward page="error.jsp" />
</c:when>
<c:otherwise>
<c:redirect url="index.jsp" />
</c:otherwise>
</c:choose>
理想情況下,您需要修改error.jsp,以便甚至不需要在會話中設置錯誤消息,但我不想過多地更改您的設計。
一個簡單的方法:
<%@page errorPage="Error.jsp" %>
<%
String errorMessage = SomeClass.getInstance().doSomething();
if (errorMessage != null) {
throw new Exception(errorMessage); // Better throw the exception from doSomething()
}
pageContext.forward("index.jsp");
%>
Error.jsp
.........
<%@ page isErrorPage='true' %>
<%
out.print("Error!!!");
out.print(exception.getMessage());
%>
更好的方法:
從servlet調用doSomething()。 在web.xml中設置錯誤頁面
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/Error.jsp</location>
</error-page>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.