1.Forword


request.getRequestDispatcher (“url”).forword (request,response) 是请求转发,也就是说,一个 Servlet 向当前的

Servlet 发出请求后,经过这个方法后,请求会继续转发到请求的 URL, 在这个过程中,只向服务器发出一次请求。效率当然也就高了.
从在浏览器地址栏中显示的 URL 来看,response.sendRedirect (“url”), 地址栏中的 URL 会发生变化,会显示重定向的这个 URL 的地址,
而 request.getRequestDispatcher (“url”).forword (request,response) 这种方法,地址栏中的地址是不变的.
示例如下:
先创建 servlet 实例:a.java 代码如下:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
package package1;

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

/** * Servlet implementation class a */@WebServlet("/a")public class a extends HttpServlet {	private static final long serialVersionUID = 1L;

    /**     * @see HttpServlet#HttpServlet()     */    public a() {        super();        // TODO Auto-generated constructor stub    }

	/**	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)	 */	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		// TODO Auto-generated method stub		//第一种 请求转发		request.setAttribute("message","aaaaaa");		request.getRequestDispatcher("/b").forward(request,response);		// 第二种 重定向		response.setContentType("text/html; charset=UTF-8");		response.sendRedirect("/Tomcat_Test/b");	}

	/**	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)	 */	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		// TODO Auto-generated method stub

	}

}

创建 servlet 实例:b.java 代码如下:

1234567891011121314151617181920212223242526272829303132333435363738394041424344
package package1;

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

/** * Servlet implementation class b */@WebServlet("/b")public class b extends HttpServlet {	private static final long serialVersionUID = 1L;

    /**     * @see HttpServlet#HttpServlet()     */    public b() {        super();        // TODO Auto-generated constructor stub    }

	/**	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)	 */	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		// TODO Auto-generated method stub		response.setCharacterEncoding("utf-8");		String message=(String)request.getAttribute("message");		response.getWriter().append("this is B page with message from A: ").append(message);

	}

	/**	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)	 */	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		// TODO Auto-generated method stub		doGet(request, response);	}

}

先注释

123
// 第二种 重定向response.setContentType("text/html; charset=UTF-8");response.sendRedirect("/Tomcat_Test/b");

运行 a.java 测试 “请求转发”

getRequestDispatcher () 方法的参数必须以 “/” 开始,“/” 表示本 Web 应用程序的根目录。如上例中,表示要跳转的地址为 http://localhost:8080/servlet/b

forward 是最常用的方式,在 Structs 等 MVC 框架中,都是用 Servlet 来处理用户请求,把结果通过 request.setAttribute () 放到 request 中,
然后 forward 到 JSP 中显示。
当执行 forward 方法时,不能有任何输出到达客户端,否则会抛出异常,也就是说,在 forward 之前,不要使用 out.println () 语句向客户端输出。

尤其注意 HttpServlet 默认的 super.doGet () 和 super.goPost () 方法都包含了相关操作,所以在使用时应该把这两个方法注释掉!!

2.Redirect


这种方式要传值出去的话,只能在 url 中带 parameter 或者放在 session 中,无法使用 request.setAttribute 来传递。
这种方式是在客户端作的重定向处理。该方法通过修改 HTTP 协议的 HEADER 部分,对浏览器下达重定向指令的,让浏览器对在 location 中指定的 URL 提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的 URLs。如果传递到该方法的参数是一个相对的 URL,那么 Web container 在将它发送到客户端前会把它转换成一个绝对的 URL。

注释

123
// 第一种 请求转发response.setContentType("text/html; charset=UTF-8");response.sendRedirect("/Tomcat_Test/b");

运行 a.java 测试 “重定向”

3.JavaScript


另还有一种跳转页面的方法,也就是在 Servlet 中输出 JavaScript 代码,也能实现页面的跳转

PrintWriter out = request.getWriter();
out.println("<script>window.location.href = "url"</script>");
out.flush();
out.close();

这种方法和 response.sendRedirect () 的效率是差不多的,也要向服务器发出再次请求才能跳转到的 URL。

4. 小结


  • 0、跳转 (forward) 是在服务器端实现的,客户端浏览器并不知道该浏览动作,而使用 sendRedirect 跳转时,跳转是在客户端实现的,也就是说客户端浏览器实际上请求了 2 次服务器。
  • 1、forward 重定向是在容器内部实现的同一个 Web 应用程序的重定向,所以 forward 方法只能重定向到同一个 Web 应用程序中的一个资源,重定向后浏览器地址栏 URL 不变,而 sendRedirect 方法可以重定向到任何 URL, 因为这种方法是修改 http 头来实现的,URL 没什么限制,重定向后浏览器地址栏 URL 改变。
  • 2、forward 重定向将原始的 HTTP 请求对象(request)从一个 servlet 实例传递到另一个实例,而采用 sendRedirect 方式两者不是同一个 application。
  • 3、基于第二点,参数的传递方式不一样。forward 的 form 参数跟着传递,所以在第二个实例中可以取得 HTTP 请求的参数。sendRedirect 只能通过链接传递参数,response.sendRedirect (“login.jsp?param1=a”)。
  • 4、sendRedirect 能够处理相对 URL,自动把它们转换成绝对 URL,如果地址是相对的,没有一个‘/’,那么 Web container 就认为它是相对于当前的请求 URI 的。比如,如果为 response.sendRedirect (“login.jsp”),则会从当前 servlet 的 URL 路径下找 login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的 URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为 response.sendRedirect (“/login.jsp”) 则会从当前应用径下查找 url:http://10.1.18.8:8081/login.jsp。而 forward 不能这样处理相对路径。

Servlet 的三种跳转方式的更多相关文章

  1. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  2. VMware的三种网络连接方式区别

    关于VMware的三种网络连接方式,NAT,Bridged,Host-Only ,在刚接触的时候通常会遇到主机Ping不通虚拟机而虚拟机能Ping得通主机:主机与虚拟机互不相通等等网络问题.本文就这三 ...

  3. .NET中的三种接口实现方式

    摘自:http://www.cnblogs.com/zhangronghua/archive/2009/11/25/1610713.html 一般来说.NET提供了三种不同的接口实现方式,分别为隐式接 ...

  4. Apache Spark探秘:三种分布式部署方式比较

    转自:链接地址: http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/     目 ...

  5. [转]详述DHCP服务器的三种IP分配方式

    DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol),它的目的就是为了减轻TCP/IP网络的规划.管理和维护的负担,解决IP地址空间缺乏问题.这种网络 ...

  6. Binding 中 Elementname,Source,RelativeSource 三种绑定的方式

    在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...

  7. windows phone 三种数据共享的方式(8)

    原文:windows phone 三种数据共享的方式(8) 本节实现的内容是数据共享,实现的效果描述:首先是建立两个页面,当页面MainPage通过事件导航到页面SecondPage是,我们需要将Ma ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十二 || 三种跨域方式比较,DTOs(数据传输对象)初探

    更新反馈 1.博友@落幕残情童鞋说到了,Nginx反向代理实现跨域,因为我目前还没有使用到,给忽略了,这次记录下,为下次补充.此坑已填 2.提示:跨域的姊妹篇——<三十三║ ⅖ 种方法实现完美跨 ...

  9. Kubernetes的三种外部访问方式:NodePort、LoadBalancer和Ingress(转发)

    原文 http://cloud.51cto.com/art/201804/570386.htm Kubernetes的三种外部访问方式:NodePort.LoadBalancer和Ingress 最近 ...

随机推荐

  1. golang的select实现原理剖析

    写在最前面 select为golang提供了多路IO复用机制,和其他IO复用一样,用于检测是否有读写事件是否ready. 本文将介绍一下golang的select的用法和实现原理. 实现原理 gola ...

  2. linux设置自动同步服务器时间

    最近遇到一个问题,由于两台服务器时间的问题,经常导致用户登录由于时间差问题而报错,再三百度,最后整理了一下修改linux定时同步的操作(本方法适用于有自己时间服务器,没有的只限于借鉴) 首先确认,我们 ...

  3. 1.Hbase集群安装配置(一主三从)

     1.HBase安装配置,使用独立zookeeper,shell测试 安装步骤:首先在Master(shizhan2)上安装:前提必须保证hadoop集群和zookeeper集群是可用的 1.上传:用 ...

  4. Linux shell批量执行scp脚本工具

    转载: linux shell + expect:批量scp脚本工具             2011-09-13 15:51:06 分类: Python/Ruby 最近在准备一个部署的任务,其中有一 ...

  5. django 搜索引擎 Elasticsearch 安装使用

    1.使用docker安装elasticsearch a.获取镜像 # 拉取镜像到本地仓库 # docker image pull delron/elasticsearch-ik:2.4.6-1.0 由 ...

  6. python 学习笔记_1 pip安装、卸载、更新包相关操作及数据类型学习

    '''prepare_1 pip安装.卸载.更新组件type 各数据类型''' py -3 -m pip py -3 -m pip listpy -3 -m pip show nosepy -3 -m ...

  7. zencart批量更新后台邮箱地址sql

    zencart批量更新后台邮箱地址sql UPDATE `configuration` SET `configuration_value` = '新邮箱地址' WHERE `configuration ...

  8. 【简易DFS/BFS+标记搜索次序的数组】zznu-2025 : 简单环路

    2025 : 简单环路 时间限制:1 Sec 内存限制:128 MiB提交:145 答案正确:41 提交 状态 编辑 讨论区 题目描述 有一个N x M 大小的地图,地图中的每个单元包含一个大写字母. ...

  9. 关于webpack require.context() 的那点事

    先说 webpack里面有这么一招:使用require.context()方法来自动导入模块 官方文档有点深奥,老衲百度下拿了一段来直接使用,但是想看下它是如何运行的 本篇这里不会有太深入的研究,只是 ...

  10. nginx配置及使用

    偶尔会用到nginx部署项目,记录nginx配置备忘.主要有端口.地址及别名,代理转发和https配置. 配置文件为nginx.conf. 部署http项目: 1.找到http下的server配置项 ...