我有一个 JSP 页面,它在 Tomcat 6 上运行了 2 个表单。一个是注册表单,第二个是登录表单。(请注意上下文路径,后面会杀了我)
(regis_and_login.jsp)
<% String path = request.getContextPath(); %>
//regis form
<form id="regis_form" name="register_form"
action="<%= path %>/servlet/process_register" method="post">
//login form
<form name="login_form" action="<%= path %>/servlet/login" method="POST">
目标
如果添加新用户的插入语句失败,我想将用户重定向回 regis_and_login.jsp 页面,并显示我的自定义错误。
servlet 行为
(登录小服务程序)
如果登录失败,我的自定义错误消息将添加到请求中(即request.setAttribute("error", "there is error!")
调度程序将转发回regis_and_login.jsp
页面并正确显示错误消息,但由于这是转发,URL 更改从http://localhost:8080/regis_and_login.jsp到http ://localhost:8080/servlet/login
(RegisterServlet) 注册 servlet 的工作方式相同。如果检测到任何错误,我会根据请求调用 setAttribute() 并调用 RequestDispatcher 的转发函数将用户重定向回 regis_and_login.jsp 页面,并显示我的自定义错误。
问题
每种形式单独工作都很好,但是当一起使用时,它有一些问题。
在登录表单中填写无效输入,这样您就会被重定向回http://localhost:8080/servlet/login并正确显示我的自定义消息。
在同一页面(http://localhost:8080/servlet/login),填写注册表并提交。
结果:
现在 URL 看起来很疯狂。
The requested resource (/servlet/servlet/process_register) is not available.
我的猜测是这是因为在 中regis_and_login.jsp
,我设置了 contextPath 并连接到表单的操作值:action="<%= path %>/servlet/process_register
所以我相信在通过转发(http://localhost:8080/servlet/login)修改 URL 之后,contextPath 现在设置为“/servlet/”,这就是我请求/servlet/servlet/process_register
而不是仅仅请求的原因/servlet/process_register
?
我的想法有几个选择:
只需使用绝对路径来表单的操作路径
而不是转发,使用 response.sendRedirect(address) 远离 URL 更改(但这不允许我根据请求设置属性,因此我无法在我的 JSP 页面上显示错误消息..这违背了我的目标)
我应该只使用绝对路径吗?
如果您需要更多说明,请告诉我。
更新
我要求帮助台删除挂载指令,现在它接受所有传入的请求。web.xml 和表单操作 URL 不再提及“/servlet”,代码开始正常工作。现在我认为有额外的“/servlet”的原因,我想知道是不是由于 mount 指令..