tag etiquetas ejemplos ejemplo basico java jsp jsp-tags forward

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>