<%...%>ブロック内で使用できる<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>");
可能であれば、実際にはスクリプレットを避けるようにしてください。あなたの場合、あなたがしていることの多くは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());
%>
より良いアプローチ:
サーブレットからdoSomething()を呼び出します。 web.xmlでエラーページを設定します
<error-page>
<exception-type>Java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/Error.jsp</location>
</error-page>