2008-10-28 17 views
11

¿Hay un Java puro equivalente a < jsp: reenvíe la página = "..."/> que puedo usar dentro de un bloque <% ...%>?jsp: reenviar en Java sin usar la etiqueta JSP?

Por ejemplo, actualmente tienen una página JSP algo como esto:

<% 
    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 de utilizar el 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); 
    } 
%> 
+0

Es la ruptura de código que hace scriptles imposible de mantener en el tiempo. Es por eso que se hizo un esfuerzo para usar bibliotecas de etiquetas y JSTL en primer lugar. Es más fácil ver todo como algo similar a HTML que <% for // %> texto <% do something%> other text <% end for loop%> más texto. – MetroidFan2002

Respuesta

28

El someObject que busca es pageContext.

Este objeto se define implícitamente en JSP, por lo que se puede utilizar de esta manera:

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

¡Buena llamada! Eso es más limpio que obtener el despachador de forma explícita. – erickson

+0

Creo que se supone que debe poner un «return;» después de un forward, de lo contrario, la página continuará ejecutándose y generará errores (estado ilegal). Supongo que la etiqueta lo hace automáticamente. – marcus

7

Usted realmente debe tratar de evitar scriplets si es posible, y en su caso, una gran cantidad de lo que está haciendo puede ser reemplazado con el código JSTL. La siguiente reemplazo para su ejemplo es mucho más limpio, la OMI:

<% 
    // 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> 

Lo ideal sería modificar error.jsp para que el mensaje de error ni siquiera es necesario establecer en la sesión, pero no lo hice quiero cambiar demasiado tu diseño.

+0

¿Puede explicar en su respuesta por qué se deben evitar los scriptlets en lugar de JSTL? –

+3

Nunca me ha quedado claro cuál es la ventaja de JSTL sobre los scriptlets simples. He visto discusiones que dicen que esto permite a los no programadores crear páginas web dinámicas porque no es necesario que conozcas Java. Pero realmente ahora, solo mire el ejemplo anterior: ¿Cómo NO es esto "programación"? Claro, no es Java, pero por cualquier definición racional es un lenguaje de programación. Entonces, en lugar de aprender y usar Java, puedes aprender y usar Java Y aprender y usar otro idioma. ¿Qué se gana, además de aumentar la cantidad que tiene que aprender? – Jay

+0

Estoy con las personas scriptlet aquí. Es menos código, evita la tosca sintaxis '', y más rápido, porque la expresión EL en 'when' se analiza como una cadena cada vez que se ejecuta, mientras que el código java se compila. – davidsheldon

3

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 la doSomething() desde un servlet. Indica tu 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> 
+0

Personalmente, y esta es una preferencia totalmente personal, tal vez, creo que es más fácil hacer mi control de flujo en JSP en vez que con una combinación de configuraciones JSP, servlets y web.xml. Y la razón se ilustra con esa frase: si lo hago todo en JSP, entonces está en un lugar, en lugar de en tres. – Jay

Cuestiones relacionadas