Pregunta

¿Existe un equivalente de Java puro para < jsp: forward page = " ... " / > que puedo usar dentro de <% ...% > bloquear?

Por ejemplo, actualmente tengo una página JSP similar a 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 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);
    }
%>
¿Fue útil?

Solución

El someObject que está buscando es pageContext .

Este objeto está definido implícitamente en JSP, por lo que puede usarlo así:

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

Otros consejos

Realmente debería intentar evitar los scriplets si puede, y en su caso, mucho de lo que está haciendo puede reemplazarse con el código JSTL. El siguiente reemplazo para su ejemplo es mucho más limpio, en mi opinión:

<%
  // 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 sea necesario configurarlo 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:

Invocar doSomething () desde un servlet. Establezca 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top