若天明 发表于 2015-1-18 11:20:42

JAVA网页编程之JAVA进阶:Servlet/JSP服务器端重定向

但是对于JAVA技术类的学习,我觉得大课堂反而会影响自身独立思考的过程,因为上课的时候,老师讲课的速度很快为了不遗漏要点,通常会仔细的听,js|servlet|服务器一般,在一个计划优秀的Web使用中,城市综合利用Servlet和JSP手艺。Servlet把持营业流转,JSP则卖力营业处置了局的显现。此时,将大批用到重定向手艺。
一般,在一个计划优秀的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.io.IOException


这个办法将呼应定向到参数location指定的、新的URL。location能够是一个相对的URL,如response.sendRedirect("http://java.sun.com")也能够利用绝对的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:


"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">


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还供应了更便当的操纵,以下:





JSP页面实行到这儿,将停止以后的处置,将把持权交由nextpage.jsp。


怎样选择


RequestDispatcher.forward()办法和HttpServletResponse.sendRedirect()办法的区分是:前者仅是容器中把持权的转向,在客户端扫瞄器地点栏中不会显现出转向后的地点;后者则是完整的跳转,扫瞄器将会失掉跳转的地点,偏重新发送哀求链接。如许,从扫瞄器的地点栏中能够看到跳转后的链接地点。以是,前者加倍高效,在前者能够满意必要时,只管利用RequestDispatcher.forward()办法,而且,如许也有助于埋没实践的链接。在有些情形下,好比,必要跳转到一个别的服务器上的资本,则必需利用HttpServletResponse.sendRequest()办法。

什么时候上述的三种开发工具能和三为一,什么时候java的竞争力才更强,才有机会拉拢更多的程序员投入到对java的开发上,因为到时的开发工具将会比.net的更简单。还有一点也很关键,什么时候java推出的jsf能成为真正意义上的标准。

金色的骷髅 发表于 2015-1-18 14:40:12

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重构)和极限XP编程,相信你又会上一个台阶。做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

小女巫 发表于 2015-1-22 06:49:35

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

老尸 发表于 2015-1-30 23:29:12

是一种为 Internet发展的计算机语言

因胸联盟 发表于 2015-2-6 15:39:56

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

海妖 发表于 2015-2-16 22:10:46

是一种为 Internet发展的计算机语言

变相怪杰 发表于 2015-3-3 19:31:21

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

飘灵儿 发表于 2015-3-8 17:58:03

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

再现理想 发表于 2015-3-16 08:40:12

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

莫相离 发表于 2015-3-22 21:38:37

一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
页: [1]
查看完整版本: JAVA网页编程之JAVA进阶:Servlet/JSP服务器端重定向