jsp: encaminha em Java sem usar JSP tag?
Pergunta
Existe um puro-Java equivalente a?
Por exemplo, eu tenho atualmente uma página JSP algo parecido com isto:
<%
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);
}
%>
ter que quebrar o bloco <% ...%> para usar o jsp:. Para a frente é feio e torna mais difícil de ler devido ao recuo, entre outras coisas
Assim, posso fazer a frente no código Java sem o uso da tag JSP?
Algo como isso seria o 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);
}
%>
Solução
O someObject
que você está procurando é pageContext .
Este objeto é definido implicitamente em JSP, para que você possa usá-lo como este:
pageContext.forward("<some relative jsp>");
Outras dicas
Você realmente deve tentar Scriplets evitar se você pode, e no seu caso, muito do que você está fazendo pode ser substituído por código JSTL. A seguir substituto para o seu exemplo é muito mais limpo, 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, você modificar error.jsp para que a mensagem de erro não precisa mesmo de ser definido na sessão, mas eu não queria mudar seu projeto muito.
Uma abordagem simples:
<%@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());
%>
Melhor abordagem:
invocar o doSomething () a partir de um servlet. Defina sua página de erro em web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/Error.jsp</location>
</error-page>