Domanda

Esiste un equivalente Java puro a < jsp: forward page = " ... " / Gt &; che posso usare in un <% ...% > bloccare?

Ad esempio, al momento ho una pagina JSP simile a questa:

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

Dover rompere <% ...% > bloccare l'uso di jsp: forward è brutto e rende più difficile la lettura a causa del rientro, tra le altre cose.

Quindi, posso fare l'inoltro nel codice Java senza usare il tag JSP?

Qualcosa del genere sarebbe l'ideale:

<%
    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);
    }
%>
È stato utile?

Soluzione

Il someObject che stai cercando è pageContext .

Questo oggetto è implicitamente definito in JSP, quindi puoi usarlo in questo modo:

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

Altri suggerimenti

Dovresti davvero cercare di evitare gli script se puoi e, nel tuo caso, molto di ciò che stai facendo può essere sostituito con il codice JSTL. La seguente sostituzione per il tuo esempio è molto più pulita, 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>

Idealmente, dovresti modificare error.jsp in modo che il messaggio di errore non debba nemmeno essere impostato nella sessione, ma non volevo cambiare troppo il tuo design.

Un approccio semplice:

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

Approccio migliore:

Richiama doSomething () da un servlet. Imposta la tua pagina di errore in web.xml

<error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/Error.jsp</location>
</error-page>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top