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. JavaScript程序块初始练习

    由语句语句块,函数,对象,方法,属性构成.通过顺序,分支,循环三种基本程序控制结构来进行编程. 来一段小代码: <!DOCTYPE html> <html> <head& ...

  2. Image Processing and Analysis_15_Image Registration:Multi-modal volume registration by maximization of mutual information——1996

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  3. 【Day5】3.反爬策略之模拟登录

    import urllib.request as ur import user_agent import lxml.etree as le request = ur.Request( url='htt ...

  4. U盘装manjaro 18报Python error in job “initcpio”

    更新: 还是不行,大家再找别的方法. 以下内容仅做参考,意义不大. U盘安装 用rufus做U盘,写入选DD模式,比ISO模式可靠点. 错误解决 报错信息: Error installing Manj ...

  5. JavaScript 页面渲染

    1. 从输入url到得到html的详细过程 1.1 加载资源的形式      输入 URL 或跳转页面 加载 html 1.2 加载一个资源的过程 浏览器根据DNS服务器得到域名的IP地址 向这个IP ...

  6. Lua 学习之基础篇十<Lua 常见的语法规则>

    下面讲一些lua 常见的用法和规则,可以为学习理解lua带来帮助,最后附上的部分是lua的基本操作,基本包含所有常用语法语句. 1. if判断 lua把 nil 和false 视为"假&qu ...

  7. hbase实践之flush and compaction

    本文主要涉及flush流程,探讨flush流程过程中引入的问题并阐述2种解决策略,最后简要说明Flush执行策略. 对于Compaction,本文主要探讨Compaction要解决的本质问题以及由Co ...

  8. python的变量命名规范

    一.python变量名命名规则: 1.变量名通常由字母,数字,下划线组成; 2.数字不能作为变量名开头; 3.不能以python中的关键字命名; 4.变量名要有意义; 5.不要用汉字和拼音去命名; 6 ...

  9. centos7.0利用yum快速安装mysql8.0

    我这里直接使用MySQL Yum存储库的方式快速安装: 抽象 MySQL Yum存储库提供用于在Linux平台上安装MySQL服务器,客户端和其他组件的RPM包.这些软件包还可以升级和替换从Linux ...

  10. C# 任务、线程、同步(五)

    1.数据流使用  TPL Data Flow 类库 class Program { static void Main(string[] args) { // ActionBlock(); // Sou ...