`
pterodactyl
  • 浏览: 773827 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jsp/servlet中 forward, include, reDirect 之间的区别

    博客分类:
  • java
阅读更多

 

jsp/servlet forward, include, reDirect 之间的区别

讨论它们的区别之前,先让我们看下它们是怎样被调用的?

 

Response.sendRedirect ( redirect)

redirect ="AccessGoalCharts.jsp?rcatID=3&rhaID=All_&doSearch=true”

实际上,container 会将这个 redirect url 字符串重新送到

Browser interface, 相当于用户重新在address 栏中输入了一个地址,赫赫,

这样解释简单吧?

 

request.getRequestDispatcher ( "welcome.jsp ").forward(request, response);

我们查一下web.xml , 如果我们没有找到相应的servlet  mapping , 那么这套

Request response( 也就是原来的browse interface) 就被转到 welcome.jsp

去处理了,welcome.jsp 产生的html page 也就被返回到了 response( 也就是原来的browser interface). 如果在web.xml 当中我们找到了相应的 servlet mapping, 如下所示,

 <servlet -mapping >

    <servlet -name>DemoServlet </servlet -name>

    <url -pattern>/welcome.jsp </url -pattern>

 </servlet -mapping>

那么这套requestresponse 就被forward 到了DemoServlet doGet 或者 doPost 去处理了,问题是,getRequestDispatcher 为什么 改名字叫做 getURLDispatcher , 这不是更加符合 由 web.xml 控制的实际情况吗?

 

Request.getRequestDispatcher (“welcome.jsp ”).include(request,response ) forward(request,response ) 的情况一模一样,区别在于,这个response, 也就是 Browse Interface 在接收了welcome.jsp 产生的html page 以后( 假设在 web,xml 当中没有相对应于 welcome.jsp servlet -mapping) ,还可以在这个response( browser interface) 当中接收其他的html page, 我测试过的代码如下所示:

            request.getRequestDispatcher ( "welcome.jsp " ).include(request, response);

           

            PrintWriter out = response.getWriter ( );

            out.println ( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" );

            out.println ( "<HTML>" );

            out.println ( " <HEAD><TITLE>A Servlet </TITLE></HEAD>" );

            out.println ( " <BODY>" );

            out.print ( "    This is " + request.getParameter ( "name" ));

            out.print ( this .getClass ());

            out.println ( ", using the POST method" );

            out.println ( " </BODY>" );

            out.println ( "</HTML>" );

            out.flush ( );

            out.close ( );

 

好了,还有一些考试大全中经常描述的 forward 对于 用户来讲是透明的,而 reDirect 对于用户来讲是 在browser 的地址栏中可见的讲法,都是正确的讲法.

==============================================================

forward,include,redirect jsp web 页面(jsp servelt ) 的三种不同的路由关系,三个貌似相同,其实还是有许多差别的,而了解这些细微的差别,在web 开发中是很重要的。
说明:
一、forwardincludejavax.servlet.RequestDispatcher 来封装, 由包容器container 提供RequestDispatcher 接口的实现,其中声明如下:
void forward(ServletRequest req,ServletResponse res)
void include(ServeltRequest req,ServletResponse res)
可以通过两种方式得到RequestDispatcher :
1
ServletContext.getRequestDispatcher (String path);
其中这里path 必须开始为"/" ,即这里的path 必须相对于contextroot.
2
ServeltRequest.getRequestDispatcher (String path)
这里的path 可以为相对路径, 如果path 开始为"/", 则也认为是从contextroot 开始的。
二、RedirectHttpServletResponse.sendRedirect (String location) 来支持
差别:
三个都可以对用户的request 进行转发,但是还是有许多的不同,差别最主要集中在如下几个方面:
1
forwardinclude 共亨 Request 范围内的对象,redirect 则不行,即:如果一个javabean 被声明为request 范围的话,则被forward 到的资源也可以访问这个javabean ,redriect 则不行。
2
forwardinclude 基本上都是转发到context 内部的资源,而redirect 可以重定向到外部的资源, 如: req.sendRedriect ("
http://www.mocuai.com ");

以上来源 http://www.cn-java.com/target/news.php?news_id=3176


struts-config.xml
<forward name="succ "  path ="/pages/dynabean2.jsp" redirect="true" />
设置redirect="true" 后 转向目标页面时效果和redirect 一致。

==================================================================

forward,include,redirect jsp web 页面(jsp servelt ) 的三种不同的路由关系,三个貌似相同,其实还是有许多差别的,而了解这些细微的差别,在web 开发中是很重要的。
说明:
一、forwardincludejavax.servlet.RequestDispatcher 来封装, 由包容器container 提供RequestDispatcher 接口的实现,其中声明如下:

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

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


服务器端的重定向相关类


服务器端的重定向技术涉及到

javax.servlet.ServletContext

javax.servlet.RequestDispatcher

javax.servlet.http.ServletRequest

javax.servlet.http.ServletResponse 等几个接口。图1 是这几个接口之间的关系图。


1 重定向相关类关系图

 <!-- [if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:420.75pt; height:296.25pt'> <v:imagedata src="jspservlet中%20forward,%20include-%20reDirect%20之间的区别.files/image001.gif" o:title="83364"/> </v:shape><![endif]--><!-- [if !vml]--> <!-- [endif]-->

服务器端的重定向方式


服务器端的重定向可以有两种方式,一是使用HttpServletResponse.sendRedirect () 方法 ,一是使用RequestDispatcher.forward () 方法 。下面对这两种方式进行介绍。

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 . 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

<?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 ,名字分别为FirstServlet SecondServlet ,对应的类分别为 org.javaresearch . redirecttest.ServletOne org. 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 ,名字分别为FirstServlet SecondServlet ,所以可以得到命名的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 () 方法。

 

===================================================

forward 是服务器请求资源, 服务器直接访问目标地址的URL, 把那个URL 的响应内容读取过来, 然后把这些内容

再发给浏览器. 浏览器根本不知道服务器发送的内容从哪里来的, 所以它的地址栏还是原来的地址.

redirect
是服务端根据 逻辑, 发送一个状态码, 告诉浏览器重新去请求那个地址. 所以地址栏显示的是新的URL.

redirect 等于客户端向服务器端发出 两次request ,同时也接受两次response

2.
从数据共享来说

forward:
转发页面和转发到的页面可以共享request 里面的数据.

假如从a 页面 到 b 页面 在到c 页面 如果用

a 页面中:

request.setAttribute ( "a","aa ");

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

b 页面中:

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

跳转 在c 页面用

request.getAttribute ( "a")

就可以得到a 页面的值,或者用

request.getParameter ( "name")

也可以得到。

但是要用response.sendRedirect ( "b.jsp ");

跳转的话就得不到a 页面的值和内容。


redirect:
不能共享数据.

redirect
不仅可以重定向到当前应用程序的其他资源, 还可以重定向到同一个站点上的其他应用程序中的资源,

甚至是使用绝对URL 重定向到其他站点的资源.

forward,
方法只能在同一个Web 应用程序内的资源之间转发请求.

forward
是服务器内部的一种操作.
redirect
是服务器通知客户端, 让客户端重新发起请求.


所以, 你可以说 redirect 是一种间接的请求, 但是你不能说" 一个请求是属于forward 还是redirect "


3.
从运用地方来说

forward:
一般用于用户登陆的时候, 根据角色转发到相应的模块.

redirect:
一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.
从效率来说
forward:
.
redirect:
.


5.jsp
语法

<jsp:forward page={"relativeurl " | "<%= expression %>"} />

或者这样写:

<jsp:forward page={"relativeurl " | "<%= expression %>"} >


<jsp:param name="parametername " value="{parametervalue | <%= expression %>}" />+


</jsp:forward >

6.
例子

<jsp:forward page="/servlet /login" />

<jsp:forward page="/servlet /login">

<jsp:param name="username" value="jsmith " />

</jsp:forward >

描述

<jsp:forward >
标签从一个jsp 文件向另一个文件传递一个包含用户请求的request 对象.<jsp:forward > 标签以下的代码,将不能执行.


你能够向目标文件传送参数和值,在这个例子中我们传递的参数名为username, 值为scott , 如果你使用了<jsp:param > 标签的话,目标文件必须是一个动态的文件,能够处理参数.


如果你使用了非缓冲输出的话,那么使用<jsp:forward > 时就要小心。
如果在你使用<jsp:forward > 之前,jsp 文件已经有了数据,那么文件执行就会出错.

属性

page="{relativeurl | <%= expression %>}"
这里是一个表达式或是一个字符串用于说明你将要定向的文件或url . 这个文件可以是jsp , 程序段,或者其它能够处理request 对象的文件(asp,cgi,php ).

<jsp:param name="parametername " value="{parametervalue | <%= expression %>}" />+
向一个动态文件发送一个或多个参数,这个文件一定是动态文件.

如果你想传递多个参数,你可以在一个jsp 文件中使用多个<jsp:param >name 指定参数名,value 指定参数值.



<jsp:forward >
例子

<%@ page contentType ="text/html;charset =gb2312" %>

<html>

       <head>

              <title>test</title>

       </head>

       <body>

              <jsp:forward page="forwardTo.jsp ">

                     <jsp:param name="userName " value="riso "/>

              </jsp:forward >

       </body>

</html>

forwardTo.jsp

<%@ page contentType ="text/html;charset =gb2312" %>

<!--forwardTo.jsp -->

<%

       String useName =request.getParameter ("userName ");

       String outStr = "
谢谢光临!";

       outStr +=useName ;

       out.println (outStr );

%>

redirect
的例子:

譬 如:client 通过XXX\index.jsp?name =gauss&pwd =123 访问index.jsp ,index.jsp 中有< jsp:forward page="login.jsp "/>, 则在login.jsp 中可以通过<span c

分享到:
评论

相关推荐

    JSPServlet新手学习资料

    **JSP和Servlet基础知识详解** ...理解并掌握这些基本概念对于JSPServlet新手来说至关重要,它们构成了开发Web应用的基础。在实际开发中,根据需求选择合适的方法,可以构建高效、功能丰富的Web应用。

    servlet/jsp跳转

    Servlet和JSP是Java Web开发中的重要组成部分,用于构建动态网页应用。Servlet是Java编写的服务端程序,负责处理客户端请求并生成响应。JSP(JavaServer Pages)则是一种视图技术,它允许开发者将HTML代码与Java代码...

    JSP和SERVLET笔试常遇到的一些问题

    JSP(JavaServer Pages)和Servlet是Java Web开发中两个核心的技术,它们主要用于构建动态网站。下面将详细阐述这两个概念以及它们在笔试中常遇到的问题。 1. JSP内置对象: - request:代表HttpServletRequest对象...

    Web编程Jsp&Servlet技术面试题.doc

    Web编程中的JSP(JavaServer Pages)和Servlet是两种核心的技术,它们被广泛应用于构建动态网页应用程序。在面试中,了解这些技术的基本概念、工作原理和相关实践是至关重要的。 1. **Tomcat配置**: - `JAVA_HOME...

    Wiz书库经典教程JSP Servlet

    在IT行业中,JSP(JavaServer Pages)和Servlet是两种重要的技术,主要用于构建动态Web应用程序。JSP是一种视图技术,而Servlet则是用于处理HTTP请求的Java类。本教程“Wiz书库经典教程JSP Servlet”涵盖了这些核心...

    Servlet&jsp;

    二者之间的联系在于,Servlet可以通过转发(forward)或重定向(redirect)机制将请求转发给JSP页面,而JSP页面也可以通过表单提交等方式将请求发送给Servlet进行处理。这样,Servlet负责处理业务逻辑,而JSP专注于展示...

    jsp基础教程精讲 jsp基础教程精讲

    在JSP中,Servlet通常被用来处理业务逻辑。要创建一个Servlet,你需要: 1. **继承自HttpServlet类**:所有Servlet都应继承自`javax.servlet.http.HttpServlet`。 2. **实现doGet()或doPost()方法**:这两个方法是...

    面试知识点总结--Web编程Jsp&Servlet技术.pdf

    #### 二、JSP中的动态INCLUDE与静态INCLUDE的区别 1. **动态INCLUDE (`jsp:include`)**: - 在运行时将另一个JSP页面包含进来。 - 允许两个页面之间共享变量,因此可以在包含页面中访问被包含页面中定义的变量。 ...

    jsp面试考题

    下列关于JSP和Servlet中forward与redirect的描述,哪一项是不正确的? - forward不会改变浏览器地址栏中的URL,而redirect会。 - 在forward和redirect的情况下,服务器都会发送新的URL给浏览器打开。 - forward不会...

    RAD--J2EE,Servlet and JSP

    - **Servlet通信**:Servlet之间可以通过转发(forward)和重定向(redirect)机制进行通信,其中转发保持了原始请求URL,而重定向则会改变浏览器的地址栏显示。 #### 三、JavaServer Pages (JSP) 规范及语法 JSP是另...

    jsp重要知识点总结

    一、jsp与Servlet的区别: * jsp经编译后变成了Servlet,jsp的本质就是Servlet,JVM只能识别Java类,不能识别jsp代码,Web容器将jsp代码编译成JVM能够识别的Java类。 * jsp更擅长于页面显示,Servlet更擅长于逻辑...

    JSP经典例子教程-100例

    在此示例中,`&lt;jsp:include&gt;`标签用于包含`header.jsp`和`footer.jsp`两个文件。这种方式可以让头部和底部的内容在多个页面中复用。 #### 5. JSP页面跳转 JSP页面跳转有两种方式:使用`&lt;jsp:forward&gt;`标签和`&lt;c:...

    笔试JSP1.doc

    JSP 中动态 INCLUDE 和静态 INCLUDE 是两种不同的 INCLUDE 机制: * 动态 INCLUDE:在运行时包含其他 JSP 文件 * 静态 INCLUDE:在编译时包含其他 JSP 文件 22. Servlet 的基本架构 Servlet 的基本架构包括: * ...

    servlet面试题

    尽管JSP和Servlet都是用于动态网页开发的技术,但它们之间存在一些关键的区别: 1. **编写方式**: - Servlet使用纯Java代码编写,更适合于处理业务逻辑。 - JSP则是HTML与Java的混合,主要用于生成动态HTML页面...

    JSP学习总结(多人智慧的结晶)

    - **优化页面结构:** 采用模块化设计,合理利用JSP的`include`指令和`jsp:include`动作标签,避免重复代码,提高代码复用率。 通过以上总结,我们可以看到JSP作为一种强大的服务器端动态页面技术,在处理复杂的Web...

    web项目答辩

    涵盖了 CSS 和 DIV 开发的优势、页面间参数传递方式、hidden 表单域的作用、JSP 内置对象、Session 和 Application 对象的作用、JSP 动作、Java Servlet API 中 forward 和 redirect 的区别、Class.forName 的作用、...

    JEE企业应用笔记

    5. **转发(forward)、包含(include)与重定向(redirect)的区别:** - **转发(Forward)**和**包含(Include)**都是由`javax.servlet.RequestDispatcher`接口实现的。 - **转发**:将请求转发给服务器上的另一个...

    java面试题web部分

    本文总结了Java web开发面试中的一些常见问题和答案,涵盖了forward和redirect的区别、JSP中的INCLUDE、应用服务器、数据连接池、JSP的内置对象、JSP指令、Servlet的生命周期等知识点。 一、forward和redirect的...

    Java-Web简答题.docx

    Servlet 中 forward() 与 redirect() 的区别 Servlet 中有两种页面跳转方式:forward() 和 redirect()。 * forward():一次请求,在容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。 * ...

    servlet请求转发、重定向、包含

    当Servlet接收到请求后,可以通过`RequestDispatcher`对象的`forward()`方法将请求转发给其他资源,如另一个Servlet、JSP页面等。 - 请求转发共享相同的请求环境,也就是说,请求参数和对象在转发过程中保持不变,...

Global site tag (gtag.js) - Google Analytics