Question

Existe-t-il un équivalent pur-Java de < jsp: forward page = " ... ... " / > que je peux utiliser dans un <% ...% > bloquer?

Par exemple, j'ai actuellement une page JSP qui ressemble à ceci:

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

Devoir briser le <% ...% > bloquer l'utilisation de jsp: forward est laide et rend plus difficile la lecture, entre autres, en raison de l'indentation.

Alors, puis-je effectuer la transmission dans le code Java sans utiliser la balise JSP?

Quelque chose comme ça serait l'idéal:

<%
    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);
    }
%>
Était-ce utile?

La solution

Le someObject que vous recherchez est pageContext .

Cet objet est défini implicitement dans JSP. Vous pouvez donc l'utiliser comme suit:

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

Autres conseils

Si vous le pouvez, évitez les scriplets. Dans votre cas, une grande partie de ce que vous faites peut être remplacée par du code JSTL. Le remplacement suivant de votre exemple est beaucoup plus propre, 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>

Idéalement, vous devriez modifier error.jsp afin que le message d'erreur n'ait même pas besoin d'être défini dans la session, mais je ne voulais pas trop modifier votre conception.

Une approche simple:

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

Meilleure approche:

Appelez le doSomething () à partir d'un servlet. Définissez votre page d'erreur dans le fichier web.xml

<error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/Error.jsp</location>
</error-page>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top