Servlet/JSP服务器端的重定向

个其简单,不平常有候用到,得去google,所以先放自己里方便,^_^

通常,在一个设计良好的Web用中,都会合使用ServletJSPServlet控制业务JSP则负责业务处果的示。此,将大量用到重定向技

重定向技可以分,一是客端重定向,一是服器端重定向。客端重定向可以通过设置特定的HTTP,或者写JavaScript脚本实现。本文主要探器端重定向技实现

器端的重定向相关类



器端的重定向技术涉及到javax.servlet.ServletContextjavax.servlet.RequestDispatcherjavax.servlet.http.ServletRequestjavax.servlet.http.ServletResponse等几个接口。


器端的重定向方式



器端的重定向可以有两方式,一是使用HttpServletResponsesendRedirect()方法,一是使用RequestDispatcherforward()方法。下面对这方式行介

HttpServletResponse.sendRedirect()
方法

HttpServletResponse
接口定了可用于向的sendRedirect()方法。代如下:






public void sendRedirect(java.lang.String location)throws java.io.IOException



个方法将响定向到参数location指定的、新的URLlocation可以是一个绝对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()
方法将当前的requestresponse重定向到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. ServletContextgetRequestDispatcher(String path)方法,其中path“/”开头,路径相于当前的Servlet上下文。可以ServletContextgetContext(String uripath)得到另一个Servlet上下文,并可以向到外部上下文的一个服接。

3.
使用javax.servlet. ServletContextgetNamedDispatcher(String name)得到名name的一个Web源,包括ServletJSP面。源的名字在Web用部署描述文件web.xml中指定。

方法的使用有微的差。比如,下面是一个用的配置文件web.xml






<?xml version="1.0" ?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.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,名字分别为FirstServletSecondServlet对应别为org.javaresearch. redirecttest.ServletOneorg. javaresearch.redirecttest.ServletTwo。可以在浏览器中通过类似于下面的访问

http://localhost:8080/servlet/firstservlet/

使用1中方法,例如在firstservlet可以写入下面的代






RequestDispatcher rd = request.getRequestDispatcher("secondservlet");

rd.forward(request, response);



控制向到第二个Servlet了。

使用2中的方法,可以从Servlet Context中得到RequestDispatcher如下:






RequestDispatcher rd = getServletContext().getRequest

Dispatcher("/servlet/secondservlet");

rd.forward(request, response);



使用3中的方法,从上面的web. xml配置文件可以看到定了两个Servlet,名字分别为FirstServletSecondServlet,所以可以得到命名的Dispatcher






RequestDispatcher rd =  getServletContext().getNamedDispatcher("SecondServlet");

rd.forward(request, response);



这样也可以重定向到SecondServlet了。

JSP面中的重定向



JSP
在解析后编译为一个Servlet运行,所以在JSP中也可以使用上面的重定向代,并且,JSP提供了更便利的操作,如下:






<jsp:forward page= "nextpage.jsp"/>



JSP
行到儿,将止当前的理,将控制交由nextpage.jsp

如何选择



RequestDispatcher.forward()
方法和HttpServletResponse.sendRedirect()方法的区是:前者是容器中控制向,在客浏览器地址中不会示出向后的地址;后者是完全的跳浏览器将会得到跳的地址,并重新接。这样,从浏览器的地址中可以看到跳后的接地址。所以,前者更加高效,在前者可以足需要,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于实际接。在有些情况下,比如,需要跳到一个其它服器上的源,使用HttpServletResponse.sendRequest()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值