11

我可以在 <% ... %> 块中使用与 <jsp:forward page="..." /> 等效的纯 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 是丑陋的,并且由于缩进等原因使其更难阅读。

那么,我可以在不使用 JSP 标签的情况下在 Java 代码中进行转发吗?

像这样的东西是理想的:

<%
    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);
    }
%>
4

3 回答 3

30

someObject您正在寻找的是pageContext

这个对象是在 JSP 中隐式定义的,所以你可以像这样使用它:

pageContext.forward("<some relative jsp>");
于 2008-10-28T23:28:50.480 回答
7

如果可以的话,你真的应该尽量避免使用脚本,而且在你的情况下,你正在做的很多事情都可以用 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,以便甚至不需要在会话中设置错误消息,但我不想过多地更改您的设计。

于 2008-10-29T01:37:26.790 回答
3

一个简单的方法:

<%@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());
%>

更好的方法:

从 servlet 调用 doSomething()。在 web.xml 中设置错误页面

<error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/Error.jsp</location>
</error-page>
于 2008-10-29T11:41:54.773 回答