Frage

Gibt es eine reine Java-Äquivalent zu , dass ich innerhalb eines verwenden <% ...%> Block

?

Zum Beispiel, ich habe derzeit eine JSP-Seite so 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);
    }
%>

Mit dem <% ...%> Block brechen die jsp zu verwenden. Vorwärts ist hässlich und macht es schwieriger, aufgrund der Vertiefung zu lesen, unter anderem

Also, ich kann tun, um die nach vorn in dem Java-Code ohne Verwendung den JSP-Tag?

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);
    }
%>
War es hilfreich?

Lösung

Die someObject Sie suchen ist pagecontext .

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

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

Andere Tipps

Sie sollten wirklich versuchen und vermeiden scriplets wenn Sie können, und in Ihrem Fall eine Menge von dem, was Sie tun können 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>

Im Idealfall würden Sie error.jsp ändern, so dass die Fehlermeldung in der Sitzung nicht einmal müssen gesetzt werden, aber ich wollte nicht, Ihr Design zu viel ändern.

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. Legen Sie Ihre Fehlerseite in web.xml

<error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/Error.jsp</location>
</error-page>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top