11

<% ... %> ブロック内で使用できる <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 コードで forward を実行できますか?

次のようなものが理想的です。

<%
    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);
    }
%>
4

3 に答える 3

30

someObjectあなたが探しているのはpageContextです

このオブジェクトは JSP で暗黙的に定義されているため、次のように使用できます。

pageContext.forward("<some relative jsp>");
于 2008-10-28T23:28:50.480 に答える
7

可能であれば、スクリプトレットを避けるようにしてください。あなたの場合、あなたがしていることの多くは 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 を変更して、セッションでエラー メッセージを設定する必要さえないようにしますが、設計をあまり変更したくありませんでした。

于 2008-10-29T01:37:26.790 に答える
3

簡単なアプローチ:

<%@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>
于 2008-10-29T11:41:54.773 に答える