【发布时间】:2012-04-05 03:05:01
【问题描述】:
我有一个 .jsp 文件,它接收请求并检查请求的参数。在与此 JSP 文件相同的目录中,有一个 error.jsp 文件应该进行错误处理。如果参数为空,我想将请求转发到 error.jsp 文件,如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<html>
<head></head>
<body></body>
<%
request.setCharacterEncoding("UTF-8");
String uid = request.getParameter("uid");
String procName = request.getParameter("procName");
//param check
if(uid == null || procName == null){ %>
<jsp:forward page="error.jsp"/>
<% }%>
</html>
但是,这不起作用。在转发行之后,我将请求重新提交到同一个 JSP 而不是 error.jsp。最终,由于服务器上的循环,我得到了 StackOverflowException。
如果不是 JSP:forward,我使用 response.sendRedirect(),如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<html>
<head></head>
<body></body>
<%
request.setCharacterEncoding("UTF-8");
String uid = request.getParameter("uid");
String procName = request.getParameter("procName");
//param check
if(uid == null || procName == null){
response.sendRedirect("error.jsp");
}%>
</html>
一切正常。为什么 jsp:forward 无法工作?根据this site 和API 我有正确的标签。
PS.:JSP 部署在 4.0.5 GA 版本的 JBoss AS 中。
【问题讨论】:
-
您真的不应该在 JSP 中执行此逻辑,而应在 servlet 中执行。 JSP 用于呈现视图,而不是确定控制流。如果您针对问题使用适当的技术,您会发现它更容易预测。
-
@skaffman 我知道;这不是 JSP 正在做的唯一事情。如果参数正确,则在检查后会显示一个表单。我把代码剪短了。
-
这不是重点。您的 JSP 不应该接收请求并确定控制流,它应该仅呈现表单。如果原始请求出错,则 servlet 应转发到
error.jsp。 -
@skaffman 指出。这是因为 .jsp 可以通过浏览器访问,并且我正在尝试检测错误的访问。否则,JSP 的唯一责任就是呈现表单。谢谢。
-
请发布
StackOverflowError堆栈跟踪的相关部分,以便我们至少可以确定它在哪里重复。还请说明您是否在web.xml中映射了任何 servlet/过滤器,如果有,说明哪些 URL 模式以及它们都在做什么。