再现理想 发表于 2015-1-18 11:32:23

JAVA编程:Servlet/JSP服务器真个重定向

Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。Oracle收购Sun后Java前途未卜。js|servlet|服务器一般,在一个计划优秀的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:

<?xmlversion="1.0"?>
<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>org.javaresearch.redirecttest.ServletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>org.javaresearch.redirecttest.ServletTwo</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/servlet/firstservlet/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/servlet/secondservlet/</url-pattern>
</servlet-mapping>
</web-app>



个中界说了两个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:forwardpage="nextpage.jsp"/>



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


怎样选择


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


由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,

再见西城 发表于 2015-1-20 12:34:16

是一种突破用户端机器环境和CPU

精灵巫婆 发表于 2015-1-24 14:27:39

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

再现理想 发表于 2015-1-28 19:43:08

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

海妖 发表于 2015-2-2 12:54:25

是一种将安全性(Security)列为第一优先考虑的语言

不帅 发表于 2015-2-3 12:10:07

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

愤怒的大鸟 发表于 2015-2-5 20:54:15

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

飘飘悠悠 发表于 2015-2-13 10:48:45

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

莫相离 发表于 2015-2-24 04:42:47

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

若相依 发表于 2015-3-7 10:52:19

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

只想知道 发表于 2015-3-15 00:46:56

是一种语言,用以产生「小应用程序(Applet(s))

admin 发表于 2015-3-22 03:36:03

是一种将安全性(Security)列为第一优先考虑的语言

乐观 发表于 2015-3-22 06:09:25

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

深爱那片海 发表于 2015-3-22 16:56:01

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

若天明 发表于 2015-3-23 10:12:49

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

金色的骷髅 发表于 2015-3-23 11:01:54

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

因胸联盟 发表于 2015-3-23 21:51:01

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

变相怪杰 发表于 2015-3-30 20:18:00

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

小妖女 发表于 2015-4-2 09:24:34

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

简单生活 发表于 2015-4-7 17:37:41

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
页: [1]
查看完整版本: JAVA编程:Servlet/JSP服务器真个重定向