Servlet JSP服务器端的重定向.docx

上传人:b****0 文档编号:18487009 上传时间:2023-08-18 格式:DOCX 页数:20 大小:42.89KB
下载 相关 举报
Servlet JSP服务器端的重定向.docx_第1页
第1页 / 共20页
Servlet JSP服务器端的重定向.docx_第2页
第2页 / 共20页
Servlet JSP服务器端的重定向.docx_第3页
第3页 / 共20页
Servlet JSP服务器端的重定向.docx_第4页
第4页 / 共20页
Servlet JSP服务器端的重定向.docx_第5页
第5页 / 共20页
Servlet JSP服务器端的重定向.docx_第6页
第6页 / 共20页
Servlet JSP服务器端的重定向.docx_第7页
第7页 / 共20页
Servlet JSP服务器端的重定向.docx_第8页
第8页 / 共20页
Servlet JSP服务器端的重定向.docx_第9页
第9页 / 共20页
Servlet JSP服务器端的重定向.docx_第10页
第10页 / 共20页
Servlet JSP服务器端的重定向.docx_第11页
第11页 / 共20页
Servlet JSP服务器端的重定向.docx_第12页
第12页 / 共20页
Servlet JSP服务器端的重定向.docx_第13页
第13页 / 共20页
Servlet JSP服务器端的重定向.docx_第14页
第14页 / 共20页
Servlet JSP服务器端的重定向.docx_第15页
第15页 / 共20页
Servlet JSP服务器端的重定向.docx_第16页
第16页 / 共20页
Servlet JSP服务器端的重定向.docx_第17页
第17页 / 共20页
Servlet JSP服务器端的重定向.docx_第18页
第18页 / 共20页
Servlet JSP服务器端的重定向.docx_第19页
第19页 / 共20页
Servlet JSP服务器端的重定向.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Servlet JSP服务器端的重定向.docx

《Servlet JSP服务器端的重定向.docx》由会员分享,可在线阅读,更多相关《Servlet JSP服务器端的重定向.docx(20页珍藏版)》请在冰点文库上搜索。

Servlet JSP服务器端的重定向.docx

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"

"

FirstServlet

org.javaresearch.redirecttest.ServletOne

SecondServlet

org.javaresearch.redirecttest.ServletTwo

FirstServlet

/servlet/firstservlet/

SecondServlet

/servlet/secondservlet/

其中定义了两个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。

下面是个例子:

ABCServlet

ABCServlet

XYZServlet

XYZServlet

如果你改变了所含的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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2