2008-10-28 13 views
11

Gibt es ein pure-Java-Pendant zu < jsp: forward page = "..."/>, das ich innerhalb eines <% ...%> Blocks verwenden kann?Jsp: Weiter in Java ohne JSP-Tag verwenden?

Zum Beispiel, ich habe derzeit eine JSP-Seite etwas wie folgt aus:

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

Nachdem die <% zu brechen ...%> Block die jsp zu verwenden: vorwärts ist hässlich und macht es schwieriger zu lesen aufgrund von Einrückungen, unter anderem.

Also, kann ich die Weiterleitung in den Java-Code ohne Verwendung des JSP-Tags tun?

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

Es ist das Aufbrechen von Code, der Scriptlets wartbaren im Laufe der Zeit macht. Aus diesem Grund wurde die Verwendung von Tag-Bibliotheken und JSTL vorangetrieben. Es ist einfacher, alles so ähnlich wie HTML zu sehen als <% for // %> etwas Text <% tue etwas%> anderen Text <% end for loop%> mehr Text. – MetroidFan2002

Antwort

28

Die someObject Sie suchen, ist pageContext.

Diese Aufgabe wird in JSP implizit definiert, so können Sie es wie folgt verwenden:

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

Guter Anruf! Das ist sauberer als den Dispatcher explizit zu bekommen. – erickson

+0

Ich denke, Sie sollten eine «Rückkehr» nach einem Forward setzen, sonst wird die Seite weiterlaufen und wird Fehler erzeugen (illegaler Zustand). Ich denke, das Tag macht es automatisch für Sie. – marcus

7

Sie sollten wirklich versuchen und vermeiden scriplets wenn Sie können, und in Ihrem Fall eine Menge von dem, was Sie tun kann mit 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 verfügen Sie error.jsp ändern würden, so dass die Fehlermeldung in der Sitzung nicht einmal müssen gesetzt werden, aber ich habe nicht möchte dein Design zu sehr verändern.

+0

Können Sie bitte in Ihrer Antwort erklären, warum Scriptlets gegenüber JSTL vermieden werden sollten? –

+3

Es war mir nie klar, was der Vorteil von JSTL gegenüber einfachen Scriptlets ist. Ich habe Diskussionen gesehen, die sagen, dass dies Nicht-Programmierern erlaubt, dynamische Webseiten zu erstellen, weil Sie Java nicht kennen müssen. Aber jetzt, schau dir das obige Beispiel an: Wie heißt das NICHT "programmieren"? Sicher, es ist kein Java, aber bei jeder rationalen Definition ist es eine Programmiersprache. Anstatt also Java zu lernen und zu verwenden, können Sie Java lernen UND verwenden und eine andere Sprache lernen und verwenden. Was ist gewonnen, neben der Menge, die Sie lernen müssen? – Jay

+0

Ich bin mit den Scriptlet Menschen hier. Es ist weniger Code, vermeidet die unbeholfene ''-Syntax und schneller, weil der EL-Ausdruck im' when' bei jeder Ausführung als String geparst wird, während der Java-Code kompiliert wird. – davidsheldon

3

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

besseren Ansatz:

die doSomething Invoke() von einem Servlet. Ihre Fehlerseite in web.xml Set

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

Persönlich - und das ist eine ganz persönliche Vorliebe, vielleicht - Ich denke, es ist einfacher, meine Flusskontrolle in JSP zu tun als mit einer Kombination aus JSP-, Servlets- und web.xml-Einstellungen. Und der Grund wird durch diesen Satz illustriert: Wenn ich alles in JSP mache, dann ist es an einem Ort statt an drei. – Jay