jsp:在Java中转发而不使用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" /> <
<%
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完成,那么它就在一个地方,而不是三个地方。