java - etiquetas - jstl core
jsp: reenviar en Java sin usar la etiqueta JSP? (3)
¿Hay un equivalente de Java puro para <jsp: forward page = "..." /> que pueda usar dentro de un bloque <% ...%>?
Por ejemplo, actualmente tengo una página JSP como esta:
<%
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);
}
%>
Tener que romper el bloque <% ...%> para usar jsp: forward es feo y hace que sea más difícil de leer debido a la sangría, entre otras cosas.
Entonces, ¿puedo hacer el reenvío en el código de Java sin usar la etiqueta JSP?
Algo como esto sería 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);
}
%>
El someObject
que está buscando es pageContext .
Este objeto está implícitamente definido en JSP, por lo que puedes usarlo así:
pageContext.forward("<some relative jsp>");
Deberías intentar evitar los scriplets si puedes, y en tu caso, mucho de lo que estás haciendo puede ser reemplazado con el código JSTL. El siguiente reemplazo para su ejemplo es mucho más limpio, 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, modificaría error.jsp para que el mensaje de error ni siquiera tenga que configurarse en la sesión, pero no quería cambiar demasiado su diseño.
Un enfoque 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());
%>
Mejor enfoque:
Invoque doSomething () desde un servlet. Configure su página de error en web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/Error.jsp</location>
</error-page>