本文将介绍Servlet/JSP服务器端的重定向。通常,在一个设计良好的Web应用中,都会综合使用Servlet和JSP技术。Servlet控制业务流转,JSP则负责业务处理结果的显示。此时,将大量用到重定向技术。

重定向技能能够分为两类,一类是客户端重定向,一类是服务器端重定向。客户端重定向能够经过设置特定的HTTP头,或许写JavaScript脚本完结。本文首要讨论服务器端重定向技能的完结。

浅谈Servlet/JSP服务器端的重定向(servlet请求转发与重定向的具体实现)  JSP服务器 第1张

JSP服务器端的重定向相关类

JSP服务器端的重定向技能涉及到javax.servlet.ServletContext、javax.servlet.RequestDispatcher、javax.servlet.http.ServletRequest、javax.servlet.http.ServletResponse等几个接口。

JSP服务器端的重定向办法

JSP服务器端的重定向能够有两种办法,一是运用HttpServletResponse的sendRedirect()办法,一是运用RequestDispatcher的forward()办法。下面临这两种办法进行介绍。

HttpServletResponse.sendRedirect()办法

HttpServletResponse接口界说了可用于转向的sendRedirect()办法。代码如下:

public void sendRedirect(java.lang.String location)throws java.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接口中界说了两个办法,拜见如下代码:

public interface RequestDispatcher {void forward(ServletRequest request, ServletResponse response); void include(ServletRequest request, ServletResponse response);}

forward()办法将当时的request和response重定向到该RequestDispacher指定的资源。这在实践项目中很多运用,由于完结一个事务操作往往需求跨过多个过程,每一过程完结相应的处理后,转向到下一个过程。比方,一般事务处理在Servlet中处理,处理的成果转向到一个JSP页面进行显现。这样看起来类似于Servlet链的功用,可是还有一些差异。一个RequestDispatcher目标能够把恳求发送到恣意一个服务器资源,而不仅仅是别的一个Servlet。 include()办法将把Request Dispatcher资源的输出包含到当时输出中。

留意,只要在尚未向客户端输出呼应时才能够调用forward()办法,假如页面缓存不为空,在重定向前将主动铲除缓存。不然将抛出一个IllegalStateException反常。

怎么得到RequestDispatcher

有三种办法能够得到Request Dispatcher目标。

1.javax.servlet. ServletRequest的getRequestDispatcher(String path)办法,其间path能够是相对途径,但不能越出当时Servlet上下文。假如path以“/”最初,则解析为相对于当时上下文的根。

2.javax.servlet. ServletContext的getRequestDispatcher(String path)办法,其间path有必要以“/”最初,途径相对于当时的Servlet上下文。能够调用ServletContext的getContext(String uripath)得到另一个Servlet上下文,并能够转向到外部上下文的一个服务器资源链接。

3.运用javax.servlet. ServletContext的getNamedDispatcher(String name)得到名为name的一个Web资源,包含Servlet和JSP页面。这个资源的姓名在Web运用布置描绘文件web.xml中指定。

这三种办法的运用有纤细的不同。比方,下面是一个运用的配置文件web.xml:

  1. <?xmlversion="1.0"?>
  2. <!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN""http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"><web-app>
  3. <servlet><servlet-name>FirstServlet</servlet-name>
  4. <servlet-class>org.javaresearch.redirecttest.ServletOne</servlet-class></servlet>
  5. <servlet><servlet-name>SecondServlet</servlet-name>
  6. <servlet-class>org.javaresearch.redirecttest.ServletTwo</servlet-class></servlet>
  7. <servlet-mapping><servlet-name>FirstServlet</servlet-name>
  8. <url-pattern>/servlet/firstservlet/</url-pattern></servlet-mapping>
  9. <servlet-mapping><servlet-name>SecondServlet</servlet-name>
  10. <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能够写入下面的代码:

  1. RequestDispatcherrd=request.getRequestDispatcher("secondservlet");rd.forward(request,response);

此刻控制权将转向到第二个Servlet了。

运用2中的办法,能够从Servlet Context中得到RequestDispatcher代码如下:

  1. RequestDispatcherrd=getServletContext().getRequestDispatcher("/servlet/secondservlet");rd.forward(request,response);

运用3中的办法,从上面的web. xml配置文件能够看到界说了两个Servlet,姓名分别为FirstServlet和SecondServlet,所以能够得到命名的Dispatcher:

  1. RequestDispatcherrd=getServletContext().getNamedDispatcher("SecondServlet");rd.forward(request,response);

这样也能够重定向到SecondServlet了。

JSP页面中的重定向

JSP在解析后编译为一个Servlet运转,所以在JSP中也能够运用上面的重定向代码,而且,JSP还供给了更便当的操作,如下:

  1. <jsp:forwardpage="nextpage.jsp"/>

JSP页面履行到这儿,将停止当时的处理,将控制权交由nextpage.jsp。

怎么挑选JSP服务器端

RequestDispatcher.forward()办法和HttpServletResponse.sendRedirect()办法的差异是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显现出转向后的地址;后者则是彻底的跳转,浏览器将会得到跳转的地址,偏重新发送恳求链接。这样,从浏览器的地址栏中能够看到跳转后的链接地址。所以,前者愈加高效,在前者能够满足需求时,尽量运用Request Dispatcher.forward()办法,而且,这样也有助于躲藏实践的链接。在有些情况下,比方,需求跳转到一个其它服务器上的资源,则有必要运用HttpServletResponse.sendRequest()办法。

【修改引荐】

  1. 在JSP中获取数据库衔接
  2. 介绍JSP Action的运用
  3. 简化JSP表达式中代码
  4. 详解JSP向Servlet转化
  5. 简略介绍JSP元素教程
转载请说明出处
知优网 » 浅谈Servlet/JSP服务器端的重定向(servlet请求转发与重定向的具体实现)

发表评论

您需要后才能发表评论