Servlet 接口笔记

一、ServletConfig 接口

什么是 ServletConfig?

​ServletConfig :获取 Servlet 程序的配置信息接口,封装着初始化配置信息获取的一系列方法。

​Servlet 程序和 SeervletConfig 对象都是由 Tomcat 负责创建,程序员负责使用。

​Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象(即每一个 Servlet 程序对应一个自己的 ServletConfig 对象,各 Servlet 程序之间的 ServletConfig 对象相互独立)。

ServletConfig 接口的三大作用

  1. 可以获取 Servlet 程序的别名 servlet-name 对应的值
  2. 获取初始化参数 init-parpam 对应的值
  3. 获取 ServletContext 对象

对应方法:

getServletName(): 获取 Servlet 程序别名,即 配置文件中 servlet 标签中的 servlet-name 文本信息

getInitParameter(<"参数名">): 获取配置文件中 init-param 标签的参数名对应的值

getServletContext(): 获取 ServletContext 对象

在一个 Servlert 程序中可以通过调用 getServletConfig() 来获取属于 Servlet 程序自己的 ServletConfig 对象实例。在重写 init 方法时需要注意调用 super 方法来继承父类 GenericServlet 的 init 方法,因为在父类 GenericServlet 中的 init 对 config 对象进行了赋值操作,这样才使得子类调用 getServletConfig() 方法时成功获取 ServletConfig 实例对象。

ServletContext 接口

什么是 ServletContext?

  1. ServletContext:它表示 Servlet 上下文对象

  2. 一个 Web 工程只有一个 ServletContext 对象实例。

  3. ServletContext 对象是一个域对象。(这里的域表示存取数据的操作范围,此时范围即为整个 Web 工程)

  4. ServletContext 对象是在 Web 工程部署启动时创建,在 Web 工程停止时销毁。

ServetContext 的四个作用

  1. 获取 web.xml 中配置的上下文参数 (context-param)
  2. 获取当前的工程路径,格式:/工程路径
  3. 获取工程部署后在服务器硬盘上的绝对路径
  4. 像 Map 一样进行存储数据

可以通过对 ServletConfig 对象调用 getServletContext() 获取 ServletContext 对象 或直接调用 getServletContext() 函数来获取(该方法本质就是通过前者获取的 ServletContext 对象)。

对应方法:

getInitParameter(<"参数名">): 获取 web.xml 中配置的上下文参数 (context-param)

getContextPath(): 获取当前工程路径(例:/test)

getRealPath("/"):获取工程部署在服务器上的绝对路径

setAttribute(<"key">, <"value">): 向 ServletContext 对象中存入数据

getAttribute(<"key">): 获取 ServletContext 对象中 key 对应的值

HTTP 协议

​HTTP 是无状态的:服务器无法判断两次请求是否来自同一个客户端,所以需要通过会话技术来解决此问题

① 请求的 HTTP 协议

GET 请求

  1. 请求行

    (1) 请求的方式

    (2) 请求的资源路径

    (3) 请求的协议的版本号

  2. 请求体GET 没有请求体,但是有 QueryString

  3. 请求头

    key:value 组成不同的键值对,表示不同的涵义

POST 请求

  1. 请求行

    (1) 请求的方式

    (2) 请求的资源路径

    (3) 请求的协议的版本号

  2. 请求头

    key:value 组成不同的键值对,表示不同的涵义

  3. –空行–

  4. 请求体

    发送给服务器的数据

常用请求头说明

Accept: 表示客户端可以接收的数据类型

Accept-Languege: 表示客户端可以接收的语言类型

User-Agent: 表示客户端浏览器的信息

Host: 表示服务器的 ip 和 端口号

区分 GET 、POST 请求使用场景

Get 请求使用场景

form 标签 method 属性值为 get
a 标签
link标签引入 css
Script 标签引入 js 文件
img 标签引入图片
iframe 引入 html 页面
在浏览器地址栏中输入地址然后回车

Post 请求使用场景

​from 标签 method 属性值为 post

② 响应的 HTTP 协议

  1. 响应行

    1. 响应的协议和版本号
    2. 响应状态码
    3. 响应状态描述符
  2. 响应头

    key:value 组成不同的键值对,表示不同的涵义

  3. – 空行 –

  4. 响应体

    回传给客户端的数据

常用的响应码说明

​ 200 表示请求成功

​ 302 表示请求重定向

​ 404 表示请求服务器已收到,但你所需要的数据不存在(请求地址不存在)

​ 405 表示服务器不支持当前请求类型(没重写 do* 对应方法同样会导致此错误)

​ 500 表示服务器已收到请求,但是服务器内部出现错误(大部分为代码错误)

MIME 类型说明

MIME 是HTTP 协议中数据类型。
MIME 的英文全称是 “Multipurpose Internet Mail Extensions” 多功能 Internet 邮件扩充服务。MIME 类型的格式是 “大类型/小
类型”,并与某一种文件的扩展名相对应。

HttpServletRequest 类

HttpServletRequest 类的作用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析后封装到 Request 对象中。然后传递到 service 方法(doGet 和 doPost)中给我们使用,我们可以通过 HttpServletRequest 对象,获取到所有请求信息。

该类常用方法

getRequestURI()

​获取请求的资源路径

getRequestURL()

​获取请求的统一资源定位符(绝对路径)

getRemoteHost()

​获取客户端 ip 地址

​在 IDEA 中,使用 localhost 和 127.0.0.1 访问时,得到的客户端 IP 均为:127.0.0.1

​在 IDEA 中,使用 真实IP 访问时,得到的客户端 IP 即为真实的客户端 IP 地址

getHeader(key)

​获取请求头中 key 对应的值

getParameter()

​获取请求的参数

getParameterValues()

​获取请求的参数(多值时使用)

​**getParameter(), getParameterValues() 需要注意:** 当请求为 Post 请求时,一定要注意编码问题,且设置编码需要在获取请求参数之前进行设置,否则编码设置无效

​设置请求体的字符集编码方法:setCharacterEncoding()

​获取请求体的字符集编码方法:getCharacterEncoding()

getMethod()

​获取请求的方式 Get 或 Post

setAttribute(key, value)

​设置域数据

getAttribute(key)

​获取域数据

getRequestDispatcher()

​获取请求转发对象

请求转发

请求转发是指服务器收到请求后,从一个资源跳到同个Web工程内的另一个资源叫请求转发

请求转发的特点:

  1. 浏览器地址栏没有发生改变

  2. 他们是一次请求

  3. 他们共享 Request 域中的数据

  4. 可以转发得到 WEB-INF 目录下

  5. 不否可以访问工程以外的资源

Web 中 “/“ 的不同含义

在 web 中单斜杠 “/“ 是一种绝对路径

当 / 被浏览器解析时,得到的地址是:http://ip:port/

当 / 被服务器解析时,得到的地址是:http://ip:port/工程路径

例:

<url-pattern> /servlet1 </url-pattern>

servletContext.getRealPath("/");

request.getRequestDispatcher("/");

特殊情况: response.sendRediect("/"); 将斜杠发送给浏览器解析后返回浏览器解析后的结果,即 http://ip:port/

HttpServletResponse 类

HttpServletResponse 类的作用

HttpServletResponse 类和 HttpServletRequest 类一样,每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。 HttpServletRequest 表示请求过来的信息, HttpServletResponse 表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过 HttpSErvletResponse 对象来进行设置。

两个输出流的说明

字节流 getOutputStream() 常用于下载(传递二进制数据)

字符流 getWriter() 常用于回传字符串

注意:两个流只能使用一个

如何往客户端回传字符串数据

1
2
PrintWriter writer = resp.getWriter();
writer.write("response's content!!!");

响应的乱码的解决方法

方式一

​响应的默认字符集为: ISO-8859-1 不支持中文字符

​需要重新设置服务器响应字符集:setCharacterEncoding("UTF-8");

​但只设置服务器响应的字符集在浏览器上有可能还是乱码,原因是浏览器的字符集和服务器传递来的字符编码不一致导致的

​所以还需要再响应头中告知浏览器解析时使用的字符集:setHeader("Content-Type", "text/html; charset=UTF-8");

方式二

​调用 setContentType("text/html; charset=UTF-8") 方法

​它会同时设置服务器和客户端都使用 UTF-8 字符串,同时还设置了响应头

​但需要注意的是,此方法一定要在获取流对象之前调用才有效

请求重定向

请求重定向,是指客户端给服务器发送请求,然后服务器返回给客户端一个新的地址,让客户端再去访问新地址。

请求重定向的特点:

  1. 浏览器地址栏会发生改变
  2. 共发送了两次请求
  3. 不共享 Request 域中的数据
  4. 不能访问 WEB-INF 下的资源
  5. 可以访问工程外的资源

请求重定向方法一(不推荐使用):

1
2
3
4
// 设置响应状态码 302,表示重定向
resp.setStatus(302);
// 设置响应头,设置新地址位置
resp.setHeader("Location", "http://localhost:8080/工程名/新资源路径")

请求重定向方法二(推荐使用):

1
2
// 重定向响应码即为 302,该方法已自动设置为 302 不需要用户设置响应状态码
resp.sendRedirect("新资源路径")

补充

  • Servlet 实例 Tomcat 只会创建一个,所有的请求都是这个实例去响应的。且默认情况下,只有第一次请求时,Tomcat 才会去初始化,然后在服务。

    • 优点:提高系统的启动速度,因为只需要实例一个对象提供使用
    • 缺点:因为默认情况第一次请求才进行初始化,所以导致第一个用户请求发出时,服务器才开始初始化,导致速度变慢,这对第一个访问的用户很不公平
  • 可以通过配置 web.xml 文件中 servlet 标签中的 <load-on-startup> 标签来使得在服务器启动时同时将 servlet 程序初始化,而且可以设置 servlet 启动的先后顺序,值越小,越靠前,最小值为 0

    • 这样设置会导致服务器启动速度变慢,但优点显而易见,提高了用户的体验感
  • 需要注意的是 servlet 程序是:

    • 单例的
    • 线程不安全的
  • 因为线程不安全,所以尽量不要在 Servlet 中定义成员变量,若不得不建立成员变量,则就不要去修改成员变量的值,以及不要将成员变量拿去条件判断