重定向

服务器向浏览器发送一个302状态码以及一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向的地址发出请求,使用相应对象的API方法实现(response.sendRedirect(String url)).

一般应用场景:

  • 解决互联网上2个网站之间的跳转问题
  • 一个项目中2个独立的组件之间的跳转问题
  • 增删改后重定向到查询

重定向的特点

  • 重定向的地址可以是任意的地址
  • 重定向后浏览器的地址栏会改变
  • 重定向过程中涉及到的web组件并不会共享同一个request和response对象

转发

一个web组件(Servlet/jsp)将未完成的处理通过容器转交给另外一个web组件继续完成

转发的步骤:

  • 1.绑定数据到request对象 
    绑定 request.setAttribute(String name,Object obj)
    读取 request.getAttribute(String name)
    namme:绑定名 Obj:绑定值,读取的时候如果绑定名对应的值不存在,返回Null

  • 2.获得转发器
    RequestDispatcher rd = request.getRequestDispatcher(String uri);
    uri:转发的目标地址

  • 3.转发
    rd.forward(request,response);

转发的特点

  • 转发之后地址栏地址不会变,因为转发是在服务器内部进行的,浏览器并不知道
  • 转发所涉及的各个web组件会共享同一个request和response对象
  • 转发的目的地必须是同一个应用内部的某个地址

重定向和转发的区别

  • 重定向是浏览器发送请求并收到响应以后再次向一个新地址发送请求,地址栏地址会发生改变;转发是服务器收到请求后为了完成响应转到一个新的地址,地址栏地址不会变。
  • 重定向的新地址可以是任意地址,转发的新地址必须是同一个应用内的某地址
  • 重定向有两次请求对象,互相不共享数据,转发只产生一次请求对象且在组件间共享数据

Servlet 生命周期

1.实例化

容器调用Servlet构造器,创建一个Servlet对象

2.初始化

容器在创建好Servlet对象之后,会立即调用该对象的init方法,init方法只会执行一次

3.处理业务请求

容器收到请求之后调用Servlet对象的service()来处理请求

4.销毁

容器调用destroy()方法,然后删除Servlet对象。只会执行一次 ,当应用程序卸载时一定会调用destroy方法。

Servlet Context

容器启动之后会为每一个web应用创建唯一的一个符合Servlet Context接口要求的对象,该对象被称之为Servlet上下文。具有唯一性和持久性(只要容器不关闭应用没有被卸载删除)。

获取上下文的几种方式

  • 通过GenericServlet提供的 getServletContext()
  • 通过ServletConfig提供的 getServletContext()
  • 通过HttpSession提供的 getServletContext()
  • 通过FilterConfig提供的 getServletContext()

作用及特点

  • 使用setAttribute绑定数据
  • 使用removeAttribute移除绑定数据
  • 使用getAttribute获取绑定数据
  • 特点:绑定的数据可以被整个应用上的所有组件共享,并且一直可以访问。

线程安全问题

容器收到请求后,会启动一个县城来进行相应的处理。默认情况下,容器会为每个Servlet创建一个实例,如果同时有多个请求访问同一个Servlet,则肯定会有多个线程访问这个Servlet实例。如果这些线程都要修改Servlet实例的属性,就有可能发生线程安全问题。我们可以使用synchronized对代码加锁即可;

Servlet(三)的更多相关文章

  1. Cookie&Seesion会话 共享数据 工作流程 持久化 Servlet三个作用域 会话机制

    Day37 Cookie&Seesion会话 1.1.1 什么是cookie 当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中.这样,当该浏览器 ...

  2. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  3. 浅谈Servlet(三)

    一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,sessio ...

  4. servlet三种实现方式之三通过继承HttpServlet开发servlet

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第三种: import java.io.*; i ...

  5. 开发servlet三种方式

    第一种:实现Servlet接口 ServletDemo类 实现Servlet接口 public class ServletDemo implements Servlet { //初始化该servlet ...

  6. web开发之Servlet 三

    昨天我们学习了Servlet的运行过程和生命周期,那么今天我们学习下Servlet中非常重要的两个类:ServletConfig  ServletContext 我们可以看到,与顶层Servlet主动 ...

  7. servlet三种方式实现servlet接口

    简单介绍 Servlet接口实现类 1.Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet.HttpServlet. 2.HttpServlet指能够处理HTTP请 ...

  8. Servlet 三种创建方式

    servlet 是运行在 Web 服务器(tomcat)中的小型 Java 程序(即:服务器端的小应用程序) (其实就是一个java类,只不过不用再new了).servlet 通常通过 HTTP(超文 ...

  9. Servlet三种创建方式

    直接实现 Servlet 接口不太方便,所以 Servlet 又内置了两个 Servlet 接口的实现类(抽象类),分别为 GenericServlet 和 HttpServlet,因此,创建 Ser ...

  10. Tomcat深入浅出——Servlet(三)

    零.HttpServletRequest 上一篇已经介绍了这个接口,现在补充些内容 首先介绍一下作用域: jakarta.servlet.jsp.PageContext pageContext 页面作 ...

随机推荐

  1. [LeetCode#204]Factorial Trailing Zeroes

    Problem: Description: Count the number of prime numbers less than a non-negative number, n. Analysis ...

  2. HDU-4089 Activation

    http://acm.hdu.edu.cn/showproblem.php?pid=4089 Activation Time Limit: 20000/10000 MS (Java/Others)   ...

  3. 使用Sql按日期条件查询

    --查询当天(1: select * from ShopOrder where datediff(day,ordTime,getdate()-1)=0 --查询当天(2:select * from i ...

  4. mac下的改装人生——关于ssd

    这两天研究了很多关于ssd的东西,想想还是写下来把,毕竟花了这么多时间进去. 先说一下我自己的电脑把.前几天,因为嫌我的电脑是在是太卡了,准备来次升级,然后先买了个8g的内存装上,发现的确是没有死机的 ...

  5. 《A First Course in Probability》-chaper5-连续型随机变量-随机变量函数的期望

    在关于离散型随机变量函数的期望的讨论中,我们很容易就得到了如下的等式: 那么推广到连续型随机变量,是否也存在类似的规律呢? 即对于连续型随机变量函数的期望,有: 这里给出一个局部的证明过程,完整的证明 ...

  6. zabbix 飞信集成配置

    1.环境说明: (Gentoo Linux环境) # uname -a Linux Crob 2.6.34-gentoo #1 SMP Mon May 31 15:45:25 CST 2010 x86 ...

  7. win2008 ent r2 开启端口

    你好.win2008r2 ent 可以用以下命令行来实现,当然也可以用防火墙来配置 比如打开8080端口方法如下: netsh firewall add portopening TCP 8080 My ...

  8. 29. Divide Two Integers

    用加减法模拟除法. 除法本质就是 被除数 - 商个除数相加 = 0 如果你电脑足够好,可以无限减..但是这个题肯定不是这么简单. 最快的方法还是 减去 商乘以除数. 但是这里不能使用乘法,那只好用BI ...

  9. Maven 打胖jar

    自己去看原版:http://www.mkyong.com/maven/create-a-fat-jar-file-maven-assembly-plugin/ 一个Eclipse的工程,在pom中配置 ...

  10. Python - 元组(tuple) 详解 及 代码

    元组(tuple) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17290967 元组是存放任意元素集合,不能修 ...