2010-09-10 80 views
2

所有的在线参考和头第一个JSP & Servlet的书我读状态RequestDispatcher的和重定向的特性(即resoponse.sendRedirect()),如:混淆的RequestDispatcher说浏览器地址栏并没有改变

“请求分派器” - 浏览器栏中的URL不会更改。

“重定向” - 用户在浏览器中看到新的URL。

但根据我的测试,对于RequestDispatcher,我看到URL的更改,所以我不明白它们的真正含义。

与下面的代码,

  1. 我在http://whatever.com/tmp3.jsp这就是URL在浏览器中说。

  2. 点击按钮来调用servlet的作为回报它的数据转发到服务器,然后服务器发送响应返回给浏览器,所以URL在浏览器现在说http://whatever.com/register

所以..网址变了! (从.../tmp3.jsp到.../register)

任何人都可以向我解释他们的意思是“浏览器中的URL不会改变”吗?

实施例:

(tmp3.jsp)

<html> 
<head> 
</head> 
<body> 
    ${message} 
    <!-- click button to send request to servlet --> 
    <form method="POST" action="register"> 
     <input type="submit" value="click!"> 
    </form> 
</body> 
</html> 

(servlet的)

package com.masatosan.tmp; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class Tmp extends HttpServlet { 


    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doPost(request, response); 
    } 

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     request.setAttribute("message", "processed!"); 

     String address = "/tmp3.jsp"; 
     request.getRequestDispatcher(address).forward(request, response); 
    }//end doPost() 

}//end class 

(web.xml中片段) - 映射servlet和URL

<servlet> 
    <servlet-name>test</servlet-name> 
    <servlet-class>com.masatosan.tmp.Tmp</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/register</url-pattern> 
</servlet-mapping> 
+0

我会把JSP放在'/ WEB-INF'文件夹中,并且一直使用'/ register'。 – BalusC 2010-09-10 11:27:51

+0

@BalusC:在/ WEB-INF下放置jsp文件的原因是什么?我认为/ WEB-INF包含类和库,jsp文件转到webapps/webContent/foo.jsp之类的东西? – 2010-09-10 11:32:17

+1

隐藏JSP直接访问。这样你最终得到更好的URL。您已经在GET请求上向JSP文件发送请求。那么,为什么不直接使用servlet作为控制器呢?另请参阅[“JSP/Servlet的隐藏功能”](http://stackoverflow.com/questions/2523430/hidden-features-of-jsp-servlet/2525995#2525995)。更多有用的信息和链接可以在[Servlets标签信息页面](http://stackoverflow.com/tags/servlets/info)中找到。 – BalusC 2010-09-10 11:37:43

回答

5

两件事情发生在这里:

  • 首先你提交表单到Servlet,这总是改变URL
  • 那么你选择重定向或转发到一个视图 - 即另一(或同一)JSP

对于第二个步骤:

  • 重定向发送一个特殊的报头添加到浏览器,它使一个新的请求向其中重定向页面要点
  • 转发在相同的请求内部进行此操作,并且浏览器不会理解它不是它请求的资源

在您的示例中,由于您使用forward,因此URL保留为/register。如果你使用redirect,它会先更改为/register,然后将它变回tmp.jsp

+0

谢谢!在阅读了5次这样的答案之后,我终于明白了... – 2010-09-10 11:29:08

+1

@ masato-san,您可能会发现在这样的交流中观看由浏览器和服务器发送的HTTP头是有用的。 – 2010-09-10 11:51:20

+0

@matt b:这实际上是伟大的一点,因为我有萤火虫。 – 2010-09-10 12:09:20

0

地址并没有改变,从.../registertmp3.jsp,而响应来自后者。通过Redirect,您将在浏览器URL栏中看到.../tmp3.jsp

相关问题