#重定向与转发的区别

开发Web应用中会遇到从一个页面跳转到另一个页面的问题,在JSP中有两种跳转方式:

1.重定向

2.转发(转向)

重定向:首先服务器受到浏览器客户端请求之后,服务器发送新的链接到客户端浏览器,浏览器接收到新的链接之后又重新请求收到的链接地址,在整个过程中完成之后在客户端浏览器看来是发生了一次跳转,其实是客户端浏览器请求了两次而已,所以在浏览器的地址栏里网络地址自然就会改变成新的连接

转发:服务器接收到客户端的请求之后,服务器把控制权交到另一个JSP页面手里,新的JSP页面接收到请求之后根据情况是继续转交控制权或者显示页面由自己决定,到最后显示页面的整个过程就是一个页面跳转过程,在这个过程中,服务器可以把请求的数据在经过的页面进行传递,而不会担心数据的丢失

重定向:

response.sendRedirect("success.jsp");

转发(转向):

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

转向(Forward)是通过RequestDispatcher对象的forward(HttpServletRequest req,HttpServletResponse res)方法来实现的。RequestDispatcher可以通过HttpServletRequest的getRequestDispacher()方法获得。例如,下面的代码跳转到另一个Servlet:

RequestDispatcher dispatcher=

request.getRequestDispatcher(“/servlet/LifeCycleServlet”);

dispatcher.forward(request,response);

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

servlet/LifeCycleServlet,则参数应为”/servlet/LifeCycleServlet”.

转向(Forward)是MVC框架中常用的一种技术。Forward不仅可以跳转到本应用的另一个Servlet,JSP页面,也可以跳转到另外一个文件,甚至WEB-INF文件夹下的文件。其中跳转到Servlet与JSP页面是最常见的。框架中常使用一个Servlet来集中处理请求然后跳转到响应的Servlet,或者在Servlet中处理业务逻辑,然后跳转到JSP页面中显示处理结果。

注意:当执行forward动作的时候不能有任何输出到达客户端,否则会抛出IllegalStateException.也就是在forward之前尽量不要使用out.println()语句向客户端输出结果。

重定向(Redirect)是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器端会返回一个状态码。服务器端通过HttpServletResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。状态码代表的含义如下表所示:

301、302都表示重定向,区别是301是永久性重定向,302是临时性重定向。下面的代码将访问该Servlet的请求重定向到另一个网址。

//设置状态码为302

response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);

//新网址

response.setHeader(“Location”,”http://www.hello.com”);

HttpServletResponse类中把常用的状态码都封装成了静态的常量。

HttpServletResponse把setStatus与setHeader方法封装成另一个方法

sendRedirect(Stringlocation),只需要调用sendRedirection()就可以实现。

下面总结一下两者的区别:

1.请求的次数的不同,重定向总共请求了两次服务器;转发则是用户请求一次可能经过N个JSP页面由返回到用户浏览器中,是一次请求多次处理的过程;

2.跳转过程中链接的变化,重定向在跳转中请求了两次服务器并且是两次不同的链接地址,在浏览器的地址栏可以看到两次是有变化的;转发在跳转过程中浏览器请求了一次服务器,服务器经过了n个JSP页面并没有改变请求的链接地址,因为用户只请求了一次,所以在整个跳转过程中链接地址是没有改变的,在浏览器的地址栏就可以看到

3.目的不同,重定向只是简单的让用户访问一个新的链接,而转发是服务器要得到用户的请求内容并需要进行一部分处理的,所以两者目的是不同的

1.转发在服务器端完成的;重定向是在客户端完成的

2.转发的速度快;重定向速度慢

3.转发的是同一次请求;重定向是两次不同请求

4.转发不会执行转发后的代码;重定向会执行重定向之后的代码

5.转发地址栏没有变化;重定向地址栏有变化

6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

自动刷新(Refresh):

自动刷新不仅可以实现一段时间之后自动跳转到另外一个页面,还可以实现一段时间之后自动刷新本页面。Servlet中通过HttpServletResponse对象设置Header属性实现自动刷新效果,例如:

response.setHeader(“Refresh”,

”1000;URL=http://localhost:8080/servlet/example.html”);

其中1000为时间,单位毫秒。URL参数指定的网址就是1秒钟之后跳转的页面。

当URL设置的路径为Servlet自己的路径时,就会每隔1秒钟自动刷新本页面一次。提示:自动刷新与重定向原理是差不多的。如果把时间设为0,把URL设为另外一个网址,效果就是重定向。

Servlet不是线程安全的,多个客户端请求同一个Servlet时,会出现多线程并发的读写导致数据不同步的问题。解决的办法是尽量不要在Servlet中定义全局属性,若需要则定义到doGet()与doPost()方法内。虽然使用synchronized(){}语句块也可以解决问题,但是会造成线程的等待,不是很科学的办法。多线程并发的读写Servlet类属性会导致数据不同步。但是如果只是并发地读取属性而不写入,则不存在数据不同步问题。因此,Servlet里的只读属性最好定义为final类型的。

#同一用户的不同页面如何共享数据:

1.  cookie技术

2.  sendRedirect()转向

3.  隐藏表单

4.  session技术

#session实现计数器功能:

HttpSession hs =request.getSession(true);

String heading;

Integer accessCount =(Integer)session.getAttribute(“accessCount”);

If(accessCount==null){

accessCount= new Integer(0);

heading= “Welcome,Newcomer!”;

}else{

Heading= “Welcome Back”;

accessCount= new Integer(accessCount.intValue()+1);

}

session.setAttribute(“accessCount”,accessCount);

Servlet 学习总结-2的更多相关文章

  1. JSP&Servlet学习手册

    JSP&Servlet学习手册 沙琪玛 书 目录 JSP 指令... 3 书写方式... 3 指令列表... 3 JSP 内置对象... 3 内置对象特点... 3 常用内置对象... 3 o ...

  2. Servlet 学习笔记

    Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...

  3. Servlet学习:(三)Servlet3.0 上传文件

    转: Servlet学习:(三)Servlet3.0 上传文件 2018年08月03日 11:57:58 iDark_CSDN 阅读数:362   一.注意事项 客户端(浏览器) 表单的提交方法必须是 ...

  4. Servlet学习(九)——request

    request运行流程在Servlet学习(四)——response已介绍,不再赘述 1.通过抓包工具获取Http请求 因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行, ...

  5. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

  6. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  7. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  8. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

  9. servlet 学习(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  10. JavaWeb学习总结-04 Servlet 学习和使用

    一 Servlet 1 Servlet概念 Servlet时运行在服务器端的Java程序. Servlet的框架核心是 javax.servlet.Servlet 接口. 所有自定义的Servlet都 ...

随机推荐

  1. css3实现手机qq空间菜单按钮

    工作之余写的一个类似于QQzone的菜单效果 先上截图: 图一为点击按钮前界面: 图二为点击按钮后的界面 下面上代码: <!--css部分--> <style type=" ...

  2. [Head First Python]4. pickle.dump pickle.load

    sketch.py #--*-- coding:utf-8 --*-- import pickle import nester man = [] other = [] try: data = open ...

  3. spl_autoload_register()

    5.3版本增加了命名空间prepend函数   <?php // function __autoload($class) {//     include 'classes/' . $class  ...

  4. PHP读取EXCEL时写入数据乱码解决办法

    第一步排除excel读取的数据是不是乱码 EXCEL读取时经常会出现乱码,而我们常用的字符集是UTF-8 ,GB2312(GBK) ,这就需要对编码进行转换,但是又不能对纯数字和英文字符转换,否则会乱 ...

  5. python运维开发(十八)----Django(二)

    内容目录 路由系统 模版 Ajax model数据库操作,ORM 路由系统 django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对 ...

  6. python之安装

    1.python控制软件pyenv 依赖软件:git [root@localhost ~]# curl https://raw.github.com/yyuu/pyenv-installer/mast ...

  7. python:利用urllib查找计算机二级准考证号

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaYAAAEACAIAAAB3VkWnAAAgAElEQVR4nOydZ3gUR9bv+WhExhHnDH

  8. eclipse 使用mvn模块化开发

    1.创建maven父工程步骤:new-->other-->选择maven project-->next-->勾选create a simple project-->nex ...

  9. ubuntu安装配置gradle

    在Ubuntu安装Gradle也是很简单.切记请勿使用apt-get安装Gradle.因为Ubuntu源的Gradle实在太旧.安装好基本不能用. 下面是安装步骤: 1.在官网下载最新的Gradle版 ...

  10. 验证abc三列数字符合我的小弟要求

    需求好像是: 1.第一列数据有重复的找出来,并且找出它的重复位置 2.第三列根据第一列得出的位置,取出相应位置的数据进行相加 3.相加的结果 是否等同于第二列的对应位置数据 <!DOCTYPE ...