如何处理以前由servlet转发的页面上的请求?

时间:2010-09-08 11:06:22

标签: jsp url tomcat redirect forward

我有一个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">

目标

如果添加新用户的insert语句失败,我想将用户重定向回regis_and_login.jsp页面并显示我的自定义错误。

servlet行为

(登录servlet)

如果登录失败,我的自定义错误消息会添加到请求中(即request.setAttribute("error", "there is error!"),调度程序将转发回regis_and_login.jsp页面并正确显示错误消息,但由于这是转发< / strong>,网址从http://localhost:8080/regis_and_login.jsp更改为http://localhost:8080/servlet/login

(RegisterServlet) 注册servlet的工作方式相同。如果检测到任何错误,我会根据请求调用setAttribute()并调用RequestDispatcher的forward函数将用户重定向回regis_and_login.jsp页面,并显示我的自定义错误。

问题

每个表单都可以单独使用,但是当它们一起使用时,它会有一些问题。

  1. 向登录表单填写无效输入,以便在我的自定义消息正确显示的情况下重定向回http://localhost:8080/servlet/login

  2. 在同一页面(http://localhost:8080/servlet/login)上,填写注册表并提交。

  3. 结果:

    现在网址看起来很疯狂。

    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的原因?

    我的想法很少:

    1. 只需使用绝对路径来形成行动路径

    2. 不使用转发,而是使用response.sendRedirect(地址)远离URL更改(但这不允许我在请求中设置属性,因此我无法在JSP页面上显示错误消息。这是针对的我的目标)

    3. 我应该使用绝对路径吗?

      如果您需要更多说明,请与我们联系。

      更新

      我请求帮助台删除mount指令,现在它接受所有传入的请求。 web.xml和表单操作URL不再提及“/ servlet”,代码开始正常工作。现在我认为有额外的“/ servlet”的原因,我想知道它是否是由于mount指令..

1 个答案:

答案 0 :(得分:1)

  

但由于这是转发,因此网址从http://localhost:8080/regis_and_login.jsp更改为http://localhost:8080/servlet/login

这句话有点奇怪。转发根本不会更改URL。转发只指向另一个资源(Servlet或JSP)以继续处理当前 HTTP请求。导致URL更改是因为表单操作URL与原始请求URL不同。您正在此URL上触发同步POST请求。浏览器地址栏中的URL成为表单操作URL。

  

现在网址看起来很疯狂   请求的资源(/ servlet / servlet / process_register)不可用。

那么,在开始时你有一个"/"的上下文路径,在提交表单后它变为"/servlet"?对不起,问题是由其他原因造成的。您的Web应用程序是否部署为ROOT?你在运行你认为正在运行的代码吗?


但是,我有两条建议如何以不同的方式处理这个问题:

  1. 不要在/servlet/process_register/servlet/login上映射servlet,而只是在/process_register/login上映射。

    <form action="process_register" method="post">
    ...
    <form action="login" method="post">
    
  2. 或者,将JSP文件隐藏在/WEB-INF文件夹中,在/register_and_login上使用单个servlet进行GET和POST,并让servlet根据按下的按钮执行所需的操作。这样,网址始终保持http://localhost:8080/register_and_login