jsp:在Java中转发而不使用JSP标记?

Chr*_*ers 11 java jsp jsp-tags forward

我可以在<%...%>块中使用与<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);
    }
%>
Run Code Online (Sandbox Code Playgroud)

必须打破<%...%>块以使用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);
    }
%>
Run Code Online (Sandbox Code Playgroud)

小智 29

someObject你要找的是pageContext的.

此对象在JSP中隐式定义,因此您可以像这样使用它:

pageContext.forward("<some relative jsp>");
Run Code Online (Sandbox Code Playgroud)


Jac*_*eow 7

如果可以的话,你真的应该尽量避免使用scriplets,在你的情况下,很多你正在做的事情可以用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>
Run Code Online (Sandbox Code Playgroud)

理想情况下,您需要修改error.jsp,以便甚至不需要在会话中设置错误消息,但我不想过多地更改您的设计.

  • 对我来说,从来都不清楚JSTL相对于普通scriptlet的优势是什么.我已经看过讨论说这可以让非程序员创建动态网页,因为你不必了解Java.但是现在真的,只要看看上面的例子:这不是"编程"吗?当然,它不是Java,但通过任何理性的定义,它都是一种编程语言.因此,您可以学习和使用Java并学习和使用其他语言,而不是学习和使用Java.获得了什么,除了增加你必须学习的金额? (3认同)