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.
<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.