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. word生成目录的pdf

    在很多情况下,需要将Word转换为带目录书签的PDF,方便pdf阅读,所以可以使用word自带的pdf转换,在转换时设置相关即可 注意:待转换Word中应该有目录,可以用Word中的标题来自动生成目录 ...

  2. 判断一个ip地址是动态的还是静态的

    要确定计算机的IP是静态IP还是动态IP,请执行以下步骤: 通过单击开始打开命令提示符并搜索CMD,然后单击cmd.exe 键入ipconfig / all.  找到“以太网本地连接”列表.找到“ I ...

  3. java与.net_20190726

    特性与注解 方法首字母 Java没有ref和out关键字 Java的main方法与C#的Main方法不一样: Java的io类和C#不一样. java的jsp和aspx还是很类似的. Java的ser ...

  4. Anton and Chess(模拟+思维)

    http://codeforces.com/group/1EzrFFyOc0/contest/734/problem/D 题意:就是给你一个很大的棋盘,给你一个白棋的位置还有n个黑棋的位置,问你黑棋能 ...

  5. gitlab-ce白名单设置杜绝并发数过大引起的封ip故障

    gitlab-ce 7.9安装手札以及上篇文章的问题解决 鸣谢 感谢ruby大神===>章鱼的一路指点,才能拨开迷雾见云天! 章鱼大人: 国内Ansible部落原创翻译之一! 资深运维! ROR ...

  6. post和get的在测试眼里的区别大概就是post比get安全吧……

    get将请求数据放在url中,而post将请求数据放在request body中 http://www.cnblogs.com/logsharing/p/8448446.html

  7. 前端知识体系:JavaScript基础-作用域和闭包-词法作用域和动态作用域

    词法作用域和动态作用域 1.作用域: 作用域是指程序代码中定义变量的区域 JavaScript采用词法作用域,也就是静态作用域 2.词法作用域和动态作用域 因为JavaScript采用的是词法作用域, ...

  8. js代码加这个<!--代码//-->

    避免因为浏览器不支持js代码,而直接显示出来,以html注释的形式隐藏

  9. groovy基本语法--JSON

    1.groovy提供了对JSON解析的方法       ①JsonSlurper   JsonSlurper是一个将JSON文本或阅读器内容解析为Groovy数据的类结构,例如map,列表和原始类型, ...

  10. keil结合st-link使用SWO的两种调试方法笔记

    通过strongerHuang的教程,实现了SWO的两种调试方法, 1.在keil调试的过程中,使用debug printf viewer打印信息, 2.在STM32 ST-LINK Utility中 ...