jsp: transférer en Java sans utiliser de balise JSP?
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);
}
%>
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>