jsp:forward in Java ohne Verwendung des JSP-Tags?

Gibt es ein reines Java-Äquivalent zu <jsp:forward page="..." /> das ich innerhalb eines <% ... %> Blocks verwenden kann?

Zum Beispiel habe ich derzeit eine JSP-Seite wie diese:

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

Der <% ... %> Block zu brechen, um den jsp:forward zu verwenden, ist hässlich und macht es schwieriger zu lesen, unter anderem durch Einzug.

Also, kann ich den Vorwärts im Java-Code tun, ohne das JSP-Tag zu verwenden?

So etwas wäre ideal:

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

Antwort auf "jsp:forward in Java ohne Verwendung des JSP-Tags? " 3 von antworten

Die someObject you are looking for is Sie suchen ist pageContext. .

Dieses Objekt ist implizit in JSP definiert, so dass Sie es wie folgt verwenden können:

pageContext.forward("<some relative jsp>");

Sie sollten wirklich versuchen, Scriplets zu vermeiden, wenn Sie können, und in Ihrem Fall kann eine Menge von dem, was Sie tun, durch JSTL-Code ersetzt werden. Der folgende Ersatz für Ihr Beispiel ist viel sauberer, 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>

Idealerweise würden Sie error.jsp so ändern, dass die Fehlermeldung nicht einmal in der Sitzung gesetzt werden muss, aber ich wollte Ihr Design nicht zu sehr ändern.

Festlegen der Fehlerseite in web.xml

<error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/Error.jsp</location>
</error-page>

Ein einfacher Ansatz:

<%@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());
%>

Besserer Ansatz:

Rufen Sie das doSomething() von einem Servlet an.