JSP: вперед в Java без использования тега JSP? - PullRequest
11 голосов
/ 29 октября 2008

Есть ли чистый Java-эквивалент , который я могу использовать в блоке <% ...%>?

Например, у меня сейчас есть страница 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 уродлив и затрудняет чтение из-за отступов, между прочим.

Итак, можно ли выполнить пересылку в коде 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);
    }
%>

Ответы [ 3 ]

29 голосов
/ 29 октября 2008

someObject, который вы ищете, это pageContext .

Этот объект неявно определен в JSP, поэтому вы можете использовать его следующим образом:

pageContext.forward("<some relative jsp>");
7 голосов
/ 29 октября 2008

Вы действительно должны стараться избегать скриптов, если можете, и в вашем случае многое из того, что вы делаете, может быть заменено кодом JSTL. Следующая замена для вашего примера намного чище, ИМО:

<%
  // 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 так, чтобы сообщение об ошибке даже не нужно было устанавливать в сеансе, но я не хотел слишком сильно менять ваш дизайн.

3 голосов
/ 29 октября 2008

Простой подход:

<%@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>
...