Servlet JSP服务器端的重定向.docx
- 文档编号:30633759
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:20
- 大小:42.89KB
Servlet JSP服务器端的重定向.docx
《Servlet JSP服务器端的重定向.docx》由会员分享,可在线阅读,更多相关《Servlet JSP服务器端的重定向.docx(20页珍藏版)》请在冰豆网上搜索。
ServletJSP服务器端的重定向
Servlet/JSP服务器端的重定向
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是:
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。
forward和redirect的区别
答:
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。
这样,从浏览器的地址栏中可以看到跳转后的链接地址。
所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。
在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。
a页面-------->b页面(-->代表两种方法的一种)
a页面里有一个动作:
request.setAttribute("temp",object);
Response.forward()---->用这个方法到达b,可以在b里通过request.getAttribute("temp")得到存储的object对象,这个方法扩大了request里保存的值的作用范围;
Response.redirect()---->用这个方法到达b,object对象将丢失。
如果想到达b页面(无论是哪个方法)而有想得到object对象,则最好将object对象保存在request.getSession()里,也就是Session对象里
通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。
Servlet控制业务流转,JSP则负责业务处理结果的显示。
此时,将大量用到重定向技术。
重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。
客户端重定向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。
本文主要探讨服务器端重定向技术的实现。
服务器端的重定向相关类
服务器端的重定向技术涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。
图1是这几个接口之间的关系图。
图1重定向相关类关系图
服务器端的重定向方式
服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法。
下面对这两种方式进行介绍。
HttpServletResponse.sendRedirect()方法
HttpServletResponse接口定义了可用于转向的sendRedirect()方法。
代码如下:
publicvoidsendRedirect(java.lang.Stringlocation)throwsjava.io.IOException
这个方法将响应定向到参数location指定的、新的URL。
location可以是一个绝对的URL,如response.sendRedirect("")也可以使用相对的URL。
如果location以“/”开头,则容器认为相对于当前Web应用的根,否则,容器将解析为相对于当前请求的URL。
这种重定向的方法,将导致客户端浏览器的请求URL跳转。
从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。
RequestDispatcher.forward()方法
RequestDispatcher是一个Web资源的包装器,可以用来把当前request传递到该资源,或者把新的资源包括到当前响应中。
RequestDispatcher接口中定义了两个方法,参见如下代码:
publicinterfaceRequestDispatcher{
voidforward(ServletRequestrequest,ServletResponseresponse);
voidinclude(ServletRequestrequest,ServletResponseresponse);
}
forward()方法将当前的request和response重定向到该RequestDispacher指定的资源。
这在实际项目中大量使用,因为完成一个业务操作往往需要跨越多个步骤,每一步骤完成相应的处理后,转向到下一个步骤。
比如,通常业务处理在Servlet中处理,处理的结果转向到一个JSP页面进行显示。
这样看起来类似于Servlet链的功能,但是还有一些区别。
一个RequestDispatcher对象可以把请求发送到任意一个服务器资源,而不仅仅是另外一个Servlet。
include()方法将把RequestDispatcher资源的输出包含到当前输出中。
注意,只有在尚未向客户端输出响应时才可以调用forward()方法,如果页面缓存不为空,在重定向前将自动清除缓存。
否则将抛出一个IllegalStateException异常。
如何得到RequestDispatcher
有三种方法可以得到RequestDispatcher对象。
1.javax.servlet.ServletRequest的getRequestDispatcher(Stringpath)方法,其中path可以是相对路径,但不能越出当前Servlet上下文。
如果path以“/”开头,则解析为相对于当前上下文的根。
2.javax.servlet.ServletContext的getRequestDispatcher(Stringpath)方法,其中path必须以“/”开头,路径相对于当前的Servlet上下文。
可以调用ServletContext的getContext(Stringuripath)得到另一个Servlet上下文,并可以转向到外部上下文的一个服务器资源链接。
3.使用javax.servlet.ServletContext的getNamedDispatcher(Stringname)得到名为name的一个Web资源,包括Servlet和JSP页面。
这个资源的名字在Web应用部署描述文件web.xml中指定。
这三种方法的使用有细微的差别。
比如,下面是一个应用的配置文件web.xml:
xmlversion="1.0"?
>
DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN"
"
其中定义了两个Servlet,名字分别为FirstServlet和SecondServlet,对应的类分别为org.javaresearch.redirecttest.ServletOne和org.javaresearch.redirecttest.ServletTwo。
可以在浏览器中通过类似于下面的链接访问:
http:
//localhost:
8080/servlet/firstservlet/
使用1中方法,例如在firstservlet可以写入下面的代码:
RequestDispatcherrd=request.getRequestDispatcher("secondservlet");
rd.forward(request,response);
此时控制权将转向到第二个Servlet了。
使用2中的方法,可以从ServletContext中得到RequestDispatcher代码如下:
RequestDispatcherrd=getServletContext().getRequest
Dispatcher("/servlet/secondservlet");
rd.forward(request,response);
使用3中的方法,从上面的web.xml配置文件可以看到定义了两个Servlet,名字分别为FirstServlet和SecondServlet,所以可以得到命名的Dispatcher:
RequestDispatcherrd=getServletContext().getNamedDispatcher("SecondServlet");
rd.forward(request,response);
这样也可以重定向到SecondServlet了。
JSP页面中的重定向
JSP在解析后编译为一个Servlet运行,所以在JSP中也可以使用上面的重定向代码,并且,JSP还提供了更便利的操作,如下:
forwardpage="nextpage.jsp"/> JSP页面执行到这儿,将终止当前的处理,将控制权交由nextpage.jsp。 如何选择 RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别是: 前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。 这样,从浏览器的地址栏中可以看到跳转后的链接地址。 所以,前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。 在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。 运用服务器端重定向的这两个技巧来控制用户想访问的servlet/JSP页面或URLs。 byBudiKurniawan 重定向(redirection)是Web编程中的一个重要的技术。 运用重定向,你可以把控件发送到另一个servlet/JSP页面,或将Web浏览器(用户)重定向到一个新的URL。 然而,将用户重定向到同一个页面也是很常见的。 例如,如果要查看浏览器的cookiesupport是否激活,你可以把一个cookie发送到浏览器,然后将浏览器重定向到同一个页面。 重定向可以在服务器端进行,也可以在客户端(浏览器)进行。 因为在servlet/JSP页面上有服务器端的代码,所以可以在服务器端进行重定向。 客户端的重定向可以通过发送JavaScript代码或者传送到浏览器的HTML页面的元数据来完成。 现在,让我们来看看两个服务器端重定向的技巧。 在servlet/JSP编程中,服务器端重定向可以通过下面两个方法来实现: 1.运用javax.servlet.RequestDispatcher接口的forward方法, 2.或者运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法。 运用RequestDispatcher接口的Forward方法 要运用RequestDispatcher接口的forward方法,首先要得到一个RequestDispatcher对象。 servlet技术提供了三种方式来得到它: 1.通过运用javax.servlet.ServletContext接口的getRequestDispatcher方法,将一个包含路径的String传递给其它资源。 该路径是相对于ServletContext的根路径的。 2.通过运用javax.servlet.ServletRequest接口的getRequestDispatcher方法,将一个包含路径的String传递到其它资源。 该路径是相对于当前的HTTP请求的。 3.通过运用javax.servlet.ServletContext接口的getNamedDispatcher方法,传递一个包含其它资源名字的String。 在得到RequestDispatcher对象后,运用forward方法就很容易了。 forward方法的定义如下: publicvoidforward(javax.servlet.ServletRequestrequest, javax.servlet.ServletResponseresponse) throwsjavax.servlet.ServletException,java.io.IOException 但要注意,你只有在客户端没有输出时才可以调用forward方法。 如果当前页面的缓冲区(buffer)不是空的,那么你在调用forward方法前必须先清空缓冲区。 否则,会抛出一个IllegalStateException。 forward方法也可以用来将请求发送到一个静态的页面。 servlet/JSP的初学者在尝试得到一个RequestDispatcher对象时,常感到困惑,这是因为ServletContext接口的getRequestDispatcher方法和ServletRequest接口的getRequestDispatcher方法有很大的不同。 接着阅读本文你就可以得到一些技巧来避免将这两者混淆在一起了。 在运用RequestDispatcher对象的forward方法来将一个控件从一个叫做ABCServlet的servlet传递到另一个叫做XYZServlet的servlet时,最简单的方法就是把ABCServlet和XYZServlet的类文件放在同一个目录中。 通过这种方法,你就可以从http: //domain/VirtualDir/servlet/ABCServlet来调用ABCServlet,从http: //domain/VirtualDir/servlet/XYZServlet来调用XYZServlet了。 然后运用forward方法就很简单了。 你可以从ServletRequest接口运用getRequestDispatcher,传递第二个servlet的名字。 在ABCServlet中,你可以写下面的代码: RequestDispatcherrd= request.getRequestDispatcher("SecondServlet"); rd.forward(request,response); 你不需要在XYZServlet前放/符号。 这种方法是最简单的,因为你根本不需要担心两个servlets的路径。 稍复杂的方法就是把下面这个String传递到ServletRequest的getRequestDispatcher: "/servlet/XYZServlet" 如果你必须调用一个从ServletContext的getRequestDispatcher得到的RequestDispatcher对象的forward方法,你需要将“/VirtualDir/servlet/XYZServlet”作为路径参数来传递,如下: RequestDispatcherrd=getServletContext().getRequestDispatcher("/servlet/XYZServlet"); rd.forward(request,response); 要运用getNamedDispatcher方法,你的代码就会变成: RequestDispatcherrd=getServletContext().getNamedDispatcher("XYZServlet"); rd.forward(request,response); 在运用getNamedDispatcher方法时,你必须在部署描述符中注册第二个servlet。 下面是个例子: 如果你改变了所含的servlet,你需要重新启动Webcontainer以使改变生效。 这是因为所包含的servlet从来都不是直接调用的。 一旦加载了所包含的servlet,它的时间戳(timestamp)就不会改变了。 如果你从一个JSP页面发送控件,你也可以用 forward>执行元素,它会终止当前JSP页面的执行,并将控件传递到另一个资源。 它的语法如下: forwardpage="relativeURL"/> 例如,在JSP页面被解析后, forwardpage=”OtherPage.jsp”/>在结果servlet中就转换成了下面的代码: pageContext.forward("OtherPage.jsp"); 运用HttpServletResponse接口的sendRedirect方法 sendRedirect方法比forward方法要容易。 其定义如下: publicvoidsendRedirect(java.lang.Stringlocation) throwsjava.iio.IOException 该方法把一个命令发送到浏览器,让浏览器对在location中指定的URL提出请求。 该方法可以接受绝对的或相对的URLs。 如果传递到该方法的参数是一个相对的URL,那么Webcontainer在将它发送到客户端前会把它转换成一个绝对的URL。 如果地址是相对的,没有一个’/’,那么Webcontainer就认为它是相对于当前的请求URI的。 例如,你可以用下面的代码将用户重定向到: response.sendRedirect(); 你应该运用哪种技巧? 为了编写最有效的代码,你应该了解这两种重定向技巧的不同。 forward方法是在Webcontainer内部工作的。 sendRedirect方法需要到客户端的一个往返。 所以forward方法比sendRedirect要快。 但是,运用forward方法有局限性,你只能重定向到同一个Web应用程序中的一个资源。 而sendRedirect方法可以让你重定向到任何URL。 结论: 如果可以解决你的问题,那么就用forward方法。 只有当你不能用forward方法时才运用sendRedirect方法。 关于作者: BudiKurniawan是澳大利亚悉尼的一位独立的顾问,是JavaScalabilitywithServlet,JSPandEJB一书的作者,该书已于2002年4月由NewRiders出版了。 他也是BrainySoftware的一位开发人员。 你可以通过budi@联系他。 通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。 Servlet控制业务流转,JSP则负责业务处理结果的显示。 此时,将大量用到重定向技术。 重定向技术可以分为两类,一类是客户端重定向,一类是服务器端重定向。 客户端重定向可以通过设置特定的HTTP头,或者写JavaScript脚本实现。 本文主要探讨服务器端重定向技术的实现。 服务器端的重定向相关类 服务器端的重定向技术涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。 服务器端的重定向方式 服务器端的重定向可以有两种方式,一是使用HttpServletResponse的sendRedirect()方法,一是使用RequestDispatcher的forward()方法。 下面对这两种方式进行介绍。 HttpServletResponse.sendRedirect()方法 HttpServletResponse接口定义了可用于转向的sendRedirect()方法。 代码如下: publicvoidsendRedirect(java.lang.Stringlocation)throwsjava.i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Servlet JSP服务器端的重定向 JSP 服务器端 定向