Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jsp:在Java中转发而不使用jsp标记?_Java_Jsp_Jsp Tags_Forward - Fatal编程技术网

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

jsp:在Java中转发而不使用jsp标记?,java,jsp,jsp-tags,forward,Java,Jsp,Jsp Tags,Forward,是否有一个纯Java等价物可以在一个块中使用 例如,我当前有一个类似以下内容的JSP页面: <% String errorMessage = SomeClass.getInstance().doSomething(); if (errorMessage != null) { session.setAttribute("error", errorMessage); %> <jsp:forward page="error.jsp" /> <

是否有一个纯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);
    }
%>
pageContext.forward("<some relative jsp>");

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

您要查找的
某个对象是

此对象是在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);
    }
%>
pageContext.forward("<some relative jsp>");
pageContext.forward(“”);

如果可以的话,你真的应该尽量避免使用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>

理想情况下,您可以修改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());
%>

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());
%>
从servlet调用doSomething()。 在web.xml中设置错误页

<error-page>
        <exception-type>java.lang.Exception</exception-type>
        <location>/WEB-INF/jsp/Error.jsp</location>
</error-page>

java.lang.Exception
/WEB-INF/jsp/Error.jsp

打得好!这比直接得到调度员更干净。我想你应该放一个«返回;»转发后,否则页面将继续运行并生成错误(非法状态)。我猜标签是自动为你做的。是代码的分解使得Scriptlet随着时间的推移变得不可维护。这就是为什么要首先使用标记库和JSTL。与其他文本相比,将其视为类似于HTML更容易。请您在回答中解释为什么应该避免使用Scriptlet而不是JSTL?我从来都不清楚JSTL相对于纯Scriptlet的优势是什么。我看到一些讨论说,这允许非程序员创建动态网页,因为您不必了解Java。但实际上现在,只要看看上面的例子:这怎么不是“编程”?当然,它不是Java,但根据任何rational定义,它是一种编程语言。因此,您可以学习和使用Java,学习和使用另一种语言,而不是学习和使用Java。除了增加你必须学习的内容之外,还有什么收获?我和scriptlet的人在一起。它的代码更少,避免了笨拙的
语法,而且速度更快,因为每次运行
中的EL表达式都被解析为字符串,而java代码是编译的。@Jay等人,你确实提出了一个很好的观点。在本例中,JSP只是作为一种编程语言使用(IMO,滥用),因此它实际上并不重要。然而,在我看来,JSP应该严格地用作模板引擎,只使用表示逻辑(即,没有控制器逻辑,这就是我们在这里所做的,或者更糟的是,使用业务逻辑)。我认为“JSP作为编程语言”和“JSP作为带有servlet的模板引擎或任何用于业务逻辑的工具”。(我认为反对JSP作为编程语言的最佳论据是:迟早,您会发现它不充分,并且无论如何都必须做一些其他的事情。那么为什么不早点做并保持一致呢?)但我真的看不到JSTL的价值。它只是另一种需要学习的编程语言,而且在这方面非常薄弱。就我个人而言——这可能是我个人的偏好——我认为用JSP进行流控制比用JSP、servlet和web.xml设置的组合更容易。这一点就说明了原因tence:如果我全部用JSP完成,那么它就在一个地方,而不是三个地方。