Servlet

一、Java Web 开发核心知识点

1.1 - 什么是 Web 开发

  • Web 通信,指两台计算机通过计算机网络进行资源文件共享活动
  • Web开发确保本次通信顺利执行

1.2 - Web 通信中两台计算机之间的角色

  • 客户端:用于发送请求
  • 服务端:提供共享资源文件

1.3 - 资源文件

  • 理论上来说,计算机上所有的文件都是资源共享文件

1.3.1 - 静态资源文件

  • 文件内容是固定的,不能随请求的变化而变化
  • 服务端计算机直接将静态资源文件推给客户端,所有被共享的静态资源文件最终是在客户端运行

1.3.2 - 动态资源文件

  • 文件内容可以根据用户提供需求变化而产生不同变化内容
  • 服务端会调用执行动态资源文件,服务端将动态资源文件的运行结果交给客户端

1.4 - Web 通信中,两台计算机如何进行通信

1.4.1 - C/S 结构通信方式

C - Client,客户端计算机安装特定客户端程序,可以帮助客户端向指定服务器发送请求

S - Server,在服务端计算机安装一种特定资源调度软件接收特定客户端程序发送请求,将请求需要的资源文件推送回客户端上的客户端程序

优点

  • 可以有效的保护服务端计算机
  • 可以分摊服务端计算机工作压力

缺点

  • 增加客户获得服务的成本
  • 增加服务端维护成本

1.4.2 - B/S

B - Browser,可以帮助客户端向任意服务端发送请求

S - Server, 在服务端安装一种特定资源调度软件,可以接收所有浏览器发送的请求,将请求的资源文件推送给客户端浏览器

优点

  • 不会增加客户获得服务的成本
  • 不会增加客户端维护的成本

缺点

  • 无法有效保护服务端计算机
  • 无法通过客户端计算机分摊服务端的计算机压力

1.5 - 网络协议包

1.5.1 - 定义

用于包裹在网络中传输二进制

1.5.2 - 分类

  • FTP
  • HTTP

1.5.3 - 注意事项

B/S 到目前为止指使用HTTP 网络协议包

1.6 - HTTP 内部结构

1.6.1 - 请求协议包

  • 是浏览器在发送请求时创建的
  • 是浏览器负责将请求信息,写入到请求协议包
  • HTTP 请求协议包内部自上而下有四层结构

1.6.1.1 - 请求行

1
2
3
4
{
URL: 请求的资源文件地址
METHOD: 浏览器采用的请求方式
}

1.6.1.2 - 请求头

1
2
3
4
5
{
浏览器希望获得资源文件类型
浏览器希望获得资源文件内容依赖字符集
如果浏览器采用 GET 方式,本次关联请求参数需要保存在请求头
}

1.6.1.3 - 空白行

隔离层

1.6.1.4 - 请求体

1
2
3
{
如果浏览器采用 POST 方式发送请求,本次关联请求参数保存在请求体
}

1.6.2 - 响应协议包

  • 在服务端计算机的资源调度软件准备推送文件时负责创建
  • 响应协议包内容可以有资源调度软件写入,可以由 Java 命令写入
  • HTTP 请求协议包内部自上而下有四层结构

1.6.2.1 - 状态行

1
2
3
{
状态码
}

1.6.2.2 - 响应头

1
2
3
4
{
返回文件内容类型 (doc,text,html,text/html)
返回文件内容依赖字符集
}

1.6.2.3 - 空白行

1.6.2.4 - 响应体

1
2
3
{
静态资源文件也可能时动态资源文件运行结果 (二进制)
}

1.7 - 请求方式

1.7.1 - GET

  • 要求浏览器发送请求时,携带请求参数数量不能操作 4K
  • 要求浏览器将请求参数写入到请求头
  • 要求浏览器将请求参数信息在地址栏显示出来
  • 要求浏览器对接收的资源文件必须缓存到内存

1.7.2 - POST

  • 不会限制浏览器发送请求时,携带请求参数数量
  • 要求浏览器将请求参数写入请求体
  • 要求浏览器将请求参数在地址栏隐藏
  • 要求浏览器对接收的文件不能保存到缓存

1.8 - 控制浏览器的请求方式

1.8.1 - GET

  • 超链接
  • localtion 对象
  • 表单中的 Method 属性可以设置为 GET

1.8.2 - POST

  • 表单中的 Method 属性可以设置为 POST

二、HTTP 服务器

2.1 - 介绍

  • 安装在服务端计算机上的一种软件
  • 可以解析来自于浏览器发送的请求协议包
  • 调用服务端上被请求的资源共享文件
  • 负责生成一个响应协议包
  • 负责将文件内容或者文件运行结果写入到响应体
  • 负责将响应协议包推送给当前浏览器

2.2 - 分类

  • 德国 – SAP
  • IBM – WebLogic
  • JBOSS – JBOSS
  • Apache – Tomcat – 单位时间内大约 1200 次请求

2.3 - Tomcat 介绍

  • 是一个由 Java 应用程序编写的资源文件调度器
  • 可以调用服务端静态资源文件和动态资源文件
  • Tomcat 负责生成响应协议包,负责将响应协议包推送到浏览器
  • Tomcat 属于 Apache

2.4 - 网站

  • 全称:网络中的资源站点
  • 作用:仓库,存储可以共享静态资源文件动态资源文件
  • 文件管理:由 HTTP 服务器来调用内部共享资源文件
  • 本质:就是一个文件夹

2.5 - 网站分类

  • 静态资源网站:存储都是静态资源文件
  • 动态资源网站:存储的是静态资源和动态资源

三、Servlet 规范

3.1 - JavaEE 与 JavaSE 的区别

  • JavaEE – 企业级开发规范
  • JavaSE – 基本开发规范,制定了管理系统与 13 类系统之间的交流规则

3.2 - Servlet 规范

  • Servlet 规范是 JavaEE 规范中的一种
  • Servlet 规范中设置 JVMHttp 服务器的交流规则
    • 定义何种 Java 类可以被 HTTP 服务器调用
      • 只有 Servlet 的实现类才有资格作为**动态共享资源文件
      • Servlet 实现类由开发人员创建
    • HTTP 服务器应该如何管理 动态资源文件

3.3 - 创建 Servlet 实现类

  • 创建一个实现类,继承 HttpServlet
  • HttpServlet 存在于 Tomcat/lib/servlet-api.jar
  • 根据来访的浏览器采用的请求方式,重写对应 doGet 或者 doPost
  • WEB-INF/lib/web.xml 中注册实现类,并创建匹配的对外路径

3.4 - Tomcat 调用 Serlvet 接口实现类流程

浏览器向服务器发送请求

Tomcat 接收到这个请求

首先将请求资源文件作为动态资源文件。到 web.xml 进行文件定位。如果有则调用,如果没有找到对应的动态资源文件,此时 Tomcat 认为本次请求的是一个静态资源文件,从 web 下进行定位。如果有则返回,如果还是没有,则返回 404

Tomcat 定位到 web.xml 根据 <url-pattern/> 进行定位 <servlet-name/>

<servlet-name/> 定位 <servlet-class/> 找到本次请求的 Servlet

Tomcat 根据浏览器采用的请求方式,调用 ServletdoGet 或者 doPost 方法

doGet 或者 doPost 调用完毕,Tomcat 负责将相应包推送给浏览器

3.5 - Servlet 请求路径写法规则

3.5.1 - 具体请求路径

<url-parttern>/path</url-partter>

浏览器请求的 资源文件地址<url-partter/> 的内容完全一致

优先级最高

3.5.2 - 前置请求路径

<url-parttern>/path/*</url-partter>

浏览器请求的 资源文件地址<url-partter/> 的内容开头

优先级第二

3.5.3 - 后置请求路径

<url-parttern>*path</url-partter>

浏览器请求的 资源文件地址<url-parttern/> 的内容结尾

优先级最低

3.5.4 - 通配符请求路径

<url-parttern>/*</url-partter>

接收来自浏览器的所有请求

优先级第三

3.6 - Servlet 实例对象的生命周期

  • 项目中所有的 Servlet 的实例对象都是 Tomcat 创建的,开发人员没有权利创建

  • 创建时机

    • 默认情况:当第一个用户来访问这个 Servlet 时,Tomcat 负责创建

    • 人工干预:要求 Tomcat 在启动时,创建 Servlet 的实例对象

    1
    <load-on-startup>任一大于0的数</load-on-startup>
  • Tomcat 运行器件,一个 Servlet 实现类只能被创建一个对象

  • Tomcat 关闭时,由 Tomcat 负责销毁所有 Servlet 实例类对象

3.7 - 请求对象与响应对象生命周期

  • 都是由 Tomcat 负责创建
  • 每当一个 Tomcat 收到一个 请求协议包,就会为这个请求协议包创建一对 请求对象和响应对象
  • 一次请求对应一对 请求对象和响应对象
  • Tomcat 调用被请求的 Servlet 中的 doGetdoPost 方法时,负责将本次 请求对象和响应对象 作为参数传入到服务方法
  • 在服务方法完毕后,Tomcat 销毁本次请求相关的 requestresponse
  • 最后,Tomcat 负责将 相应包 推送到服务器上

四、HttpServletResponse

负责将运行结果写入到相应包

4.1 - 介绍

  • 一个来自于 Servlet 规范中的接口,由 Tomcat 负责提供这个接口实现类
  • 负责在 Servlet 运行完毕后,将相关的数据写入到 响应头响应体
  • 开发人员习惯于将 HttpServletResponse 接口修饰对象称为 响应对象

4.2 - 方法

.setCharacterEncoding()

设置字符编码

key – 字符编码

.getWriter()

获取输出流

.setContentType()

设置响应的类型

key – 内容类型,一般为 text/html;charset='UTF-8'

.setCharacterEncoding() 的不同处在于 settContentType() 还可以设置内容类型

五、HttpServletRequest

负责读取请求协议包信息

5.1 - 介绍

  • 来自于 Servlet 规范中的一个接口,接口实现类由 Tomcat 负责提供
  • HttpServletRequest 接口修饰对象,可以帮助开发人员读取 请求协议包 信息
  • 一般习惯于将 HttpServletRequest 接口修饰的丢向称为 请求对象

5.2 - 方法

.getRequestURL()

获取请求的 URL

.getMethod()

获取请求使用的方法

.getParameterNames();

将请求头或请求体中所有的请求参数的名字取出来,保存到一个 Enumeration -枚举类中

.getParameter()

根据参数名获取参数

.getParameterValues()

根据参数名,获取该参数名对应的所有请求值,放入一个 String[]

.setCharacterEncoding()

设置字符编码

5.3 - 中文乱码问题

  • 如果浏览器以GET方式发送请求,请求参数请求头 存放在请求协议包到达服务端之后,请求头 内容是由Tomcat负责解析,Tomcat在解析数据时,默认采用的字符集utf-8,所以如果浏览器以GET方式发送中文参数,此时在服务端不会出现中文乱码问题
  • 如果浏览器以POST方式发送请求,请求参数请求体 存放在请求协议包到达服务端之后,请求体 内容是由对应请求对象request负责解码的。request对 象默认使用IS0-8859-1 字符集所以如果浏览器以post方式发送中文参数,此时在服务端必须会出现中文乱码问题

六、ServletContext

可以为当前网站中所有的 Servlet 提供 共享数据

6.1 - 介绍

  • Servlet 规范中的一个接口,接口实现类由 Tomcat 提供
  • 负责为当前工程所有 Servlet 提供 共享数据
  • 开发人员习惯于将 ServletContext 接口修饰对象称为 全局作用域对象

6.2 - 生命周期

  • 全局作用域对象Tomcat 启动时,由 Tomcat 为当前网站来创建
  • 一个网站只能由一个全局作用域对象
  • 从网站启动开始,一直到网站关闭,由 Tomcat 负责销毁当前网站的全局作用域对象

6.3 - 方法

ServletContext application = request.getServletContext()

获取 全局作用域对象

applicaion.getAttribute()

获取后来由程序写入的对象

applicaiont.getInitParameter()

获取由配置文件配置的对象

6.4 - 配置文件方式创建

1
2
3
4
5
6
<context-param>
<param-name>···</param-name>
<param-value>···</param-value>
</context-param>

- 只能读,不能写

6.5 - 程序存入来创建

1
2
3
4
ServletContext application = request.getServletContext();
application.setAttribute("param-name", "param-value");

- 能读能写

七、Cookie

在一次会话过程中,存储浏览器在服务端产生的私人数据

7.1 - 什么是会话

  • 定义:一个浏览器与一个服务端的一次完整的交流
  • 特点:
    • 在一次会话过程中,经历多次请求与响应
    • 在一次会话过程中,同一个浏览器往往访问多个 Servlet
  • 需求:在一次会话过程中,在浏览器要访问的 Servlet 之间进行数据共享

7.2 - 介绍

  • CookieServlet 规范提供一个工具类
  • 在参与一个会话过程中 Servlet 之间,进行 数据共享
  • Cookie 存储在浏览器上,保存本次会话的 共享数据

7.3 - 工作原理

  • 在浏览器向 Servlet 发送请求时,Servlet 在处理期间,将当前浏览器产生的私人数据保存到 Cookie,然后推送到浏览器
  • 当浏览器再次来访问当前网站时,会无条件将服务端之前推送的 Cookie 附带上,这样服务器的 Servlet 就会得到客户端之前的私人信息

7.4 - 方法

一个 Cookie 只能由一个键值对,且只能存储 String

response.addCookie(c)

Cookie 写入响应头

从请求中读取 Cookie 数组

.setMaxAge()

设置Cookie 的存活时间

7.5 - 生命周期

  • 默认情况 – Cookie 保存在浏览器内存,浏览器关闭时,Cookie 会被 Windows 销毁
  • 人工干预 – 将 Cookie 保存在客户端存储器上,同时设置 Cookie 的存活时间 (单位:s)

八、HttpSession

在一次会话过程中,存储浏览器在服务端产生的私人数据

8.1 - 介绍

  • 来自于 Servlet 规范中的接口,接口实现类来自于 Tomcat
  • 为参与同一个会话的 Servlet 之间提供共享数据
  • 开发人员习惯于将 HttpSession 接口修饰的对象称为 会话作用域对象session对象

相同点

  • 为参与同一个会话的 Servlet 之间提供共享数据

不同点

  • Cookie 存在于客户端的浏览器或存储器
  • HttpSession存在于服务端计算机的内存
  • Cookie 只能存储 String
  • HttpSession 可以存储任意类型
  • Cookie 只能存储一个键值对
  • HttpSession 可以存储任意个数的键值对

8.3 - 方法

  • 在浏览器来访时,Tomcat不会主动为当前浏览器创建对应的HttpSession对象
  • 只有一个浏览器所访问的 ServletTomcat 提出要求时,Tomcat 才会为当前浏览器创建一个HttpSession 对象
  • 如何在Servlet中为当前浏览器申请一个HttpSession对象

.getSession() / .getSession(true)

  • 如果当前浏览器在服务端已经有了一个Session,则将这个Session对象返回,否则创建一个全新的Session对象返回
  • 一般用于用户身份已经确认合法的情况下

.getSession(false)

  • 如果当前浏览器在服务端已经有了一个Session,则将这个Session对象返回,否则返回一个null
  • 一般用于用户身份不确认的情况下

.setAttribute(“key”, value)

将键值对放入 Session对象

.getAttribute(“key”)

根据keySeesion对象获取数据

九、HTTP 状态码

9.1 - 介绍

  • Http状态码是由一个三位数字组成的符号
  • Http 状态码由Tomcat 负责创建生成
  • Http 状态码由Tomcat 写入到状态行
  • Http 状态码通知浏览器在接到相应包之后的行为
  • Http 状态码通知浏览器服务端无法提供本次服务的原因

9.2 - 1××

通知浏览器本次返回的资源文件并不完整,需要浏览器继续向服务器发送申请

9.3 - 2××

通知浏览器,服务端将一个完整的文件推给了浏览器

  • 200 – 完美状态

9.4 - 3××

服务端推给浏览器的是一个网址,要求浏览器在接收到这个网址后立刻自动向这个网址发送请求

9.5 - 4××

通知浏览器服务端本次未能提供服务的原因,是由于服务端没有对应的资源文件

  • 404 - 服务端没有对应的资源文件
  • 405 - 服务端有本次请求对应的Servlet但是Servlet不负责处理这个请求

9.6 - 5××

通知浏览器服务端本次未能提供服务的原因,被调用Servlet在运行中出了异常

十、重定向与请求转发

10.1 - 前提

  • 一个Servlet只负责实现一个功能
  • 浏览器在一次请求时,只能请求一个资源文件
  • 如果浏览器的请求需要由多个Servlet协同完成,需要用户多次手动提交,这样降低服务质量

10.2 - 方案

  • 重定向方案
  • 请求转发方案

10.3 - 重定向

10.3.1 - 原理

在第一个Servlet工作完毕后,将第二个Servlet地址推送给浏览器,由用户浏览器根据这个地址来自动向第二个Servlet发送请求

10.3.2 - 特征

  • 发生为止 – 客户端浏览器
  • 浏览器发送的请求次数 – 多次
  • 地址栏变化 – 是
  • 重定向采取的请求方式GET
  • 重定向时访问资源文件的范围 – 可以是同一个网站的资源,也可以是其他网站的资源

10.3.3 - response.sendRedirect(第二个 Servlet 地址);

将一个地址写入到 响应头Location ,浏览器接收到响应包之后,自动根据 Location 地址发送第二次请求,这样的好处是避免用户多次手动发送请求

10.4 - 请求转发

10.4.1 - 原理

  • 在第一个Servlet工作完毕后,代替当前浏览器向Tomcat申请调用第二个Servlet
  • Tomcat在接收到申请之后,调用第二个Servlet来完成本次请求中剩余任务

10.4.2 - 特征

  • 发生位置 – 服务器
  • 浏览器发送请求次数 – 一次
  • 地址栏变化 – 否
  • 调用文件范围 – 只能访问同一网站的内部资源文件
  • 请求转发的请求方式 – 与浏览器第一次发送的方式保持一致,参与同义词请求转发的所有Servlet接收的请求都是一样的
  • 如何共享数据 – 全局作用域对象、会话作用域对象、请求作用域对象

10.4.3 - request.getRequestDisoatcher(第二个 Servlet 地址).forward(request, response)

从响应头获取RequestDisoatcher对象,写入第二个Servlet地址并转发请求