Ответ 1
someObject
, который вы ищете, pageContext.
Этот объект неявно определен в JSP, поэтому вы можете использовать его следующим образом:
pageContext.forward("<some relative jsp>");
Существует ли эквивалент pure-Java для < jsp: forward page = "..." / > что я могу использовать в блоке <%...% > ?
Например, в настоящее время у меня есть страница JSP примерно так:
<%
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);
}
%>
Чтобы разбить блок <%...% > для использования jsp: forward является уродливым и затрудняет чтение из-за отступов, между прочим.
Итак, могу ли я сделать forward в коде Java без использования тега JSP?
Что-то вроде этого было бы идеальным:
<%
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);
}
%>
someObject
, который вы ищете, pageContext.
Этот объект неявно определен в JSP, поэтому вы можете использовать его следующим образом:
pageContext.forward("<some relative jsp>");
Вы действительно должны попытаться избежать скриптов, если сможете, и в вашем случае многое из того, что вы делаете, можно заменить кодом JSTL. Следующая замена для вашего примера намного чище, 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>
В идеале, вы должны изменить error.jsp, чтобы сообщение об ошибке даже не нужно было устанавливать в сеансе, но я не хотел слишком сильно изменять ваш дизайн.
Простой подход:
<%@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());
%>
Лучший подход:
Вызвать doSomething() из сервлета. Задайте страницу с ошибкой в web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/jsp/Error.jsp</location>
</error-page>