likes
comments
collection
share

【JavaWeb】一文了解 Servlet 那点事

作者站长头像
站长
· 阅读数 36

一、概述

  1. Servlet(Server Applet)是 Java Servlet 的简称,称为小服务程序或服务连接器,使用 Java 语言编写的服务器端程序。从狭义上来讲,Servlet 是 Java 语言实现的一个接口;从广义上来讲,Servlet 是任何实现了 Servlet 接口的类。

  2. 特性:Servlet 独立于平台和协议

  3. 作用

    • 开发动态资源(Servlet 也是服务器的一种资源,可供外界访问,比如浏览器)
    • 接收浏览器请求并响应数据给浏览器

二、开发步骤

  1. 创建一个类并实现 javax.servlet.Servlet 接口

  2. 实现接口中的所有方法

  3. 在 service() 方法中处理请求和响应数据

    • 配置 Servlet 访问地址,即配置 web.xml 文件(Servlet 2.5)

      【JavaWeb】一文了解 Servlet 那点事

    • 使用注解(Servlet 3.0),即@WebServlet(要求Servlet 3.0 +、Tomcat 8 +、Java EE 6.0 +)

      @WebServlet():标记在类上 name:servlet名字,等价于<servlet-name></servlet-name> urlPatterns:访问地址,等价于<url-pattern></url-pattern> value:与urlPatterns相同,只有一个属性时,可省略

三、生命周期

在介绍 Servlet 之前,先提出四个问题(答案在最后):

  1. Servlet 对象由谁负责创建?
  2. Servlet 对象什么时候创建?
  3. Servlet 对象什么时候销毁?
  4. Servlet 是单例还是多例?

Servlet 的生命周期可以分为四个:

  • 实例化:Servlet 容器 Tomcat 创建 Servlet 的实例
  • 初始化:由容器调用 init() 方法,调用1次
  • 请求与响应处理:若请求 Servlet,则容器调用 service() 方法,可调用多次
  • 服务终止:正常关闭服务器时调用 destroy() 方法,调用1次
总结

首次访问 Servlet 创建对象并调用 init() 方法,然后调用 service() 方法,非首次访问则直接调用 service() 方法,正常关闭服务时调用 destroy() 方法

相关方法

  • 构造方法:对象实例化时执行,必须是公共无参(1次)
  • void init(ServletConfig config):初始化时执行(1次)
  • void init(ServletConfig config):每次请求都会执行(n次)
  • void destroy():服务器正常关闭时执行(1次)

四、请求流程

  1. 浏览器发送请求,Tomcat 接收到请求后解析请求地址,获取要访问的项目和资源路径

  2. Tomcat 服务器内部扫描该项目下的所有 Servlet ,并将每一个资源路径和对应类的全限定名存入 Map 中

    // 资源路径作为key,全限定名作为value
    Map<String, String> map1 = new HashMap<>()
    
  3. 通过资源路径,从 map1 中获取对应类的全限定名

  4. 判断是否为第一次访问

    // Servlet实例缓存池:
    Map<String, Servlet> map2 = new HashMap<>();
    if (map2.get("全限定名") == null) {
        // 没有找到,则为第一次访问,跳到第五步
    } else {
        // 找到,则不为第一次访问,跳到第七步
    }
    
  5. 通过反射创建该 Servlet 实例对象并存入实例缓存池

  6. 创建 ServletConfig 对象,并调用 init() 方法

  7. 创建 request 和 response 对象

  8. 调用 service() 方法,并将 request 和 response 作为参数传递进来,通过 service() 中的 response 对象将数据传给浏览器,并在浏览器上显示

  9. 等待下一次访问

请求流程图:

【JavaWeb】一文了解 Servlet 那点事

五、请求与响应对象

1. 请求对象

  • 作用:获取用户提交的请求参数
  • 常用 API:
Request 相关 API描述
String getMethod()获取请求方式(get/post)
String getRequestURI()获取统一资源标识符(资源名字)/demo
StringBuffer getRequestURL获取统一资源定位符(访问地址)http://localhost/demo
String getProtocol()获取协议和版本
String getContextPath()获取上下文路径(项目名 path)
String getHeader(String headName)获取指定请求头的值
String getParameter(String name)通过参数名获取一项参数值
String[] getParameterValues(String name)通过参数名获取一组同名的值(复选框、下列列表多选)
Enumeration getParameterNames()获得所有的参数名
Map getParameterMap()获取表单所有的参数键和值,封装成 Map 对象
setCharacterEncoding()设置编码格式
Enumeration 相关 API描述
boolean hasMoreElements()如果还有其它元素,返回 true
E nextElement()返回下一个元素

2. 响应对象

  • 作用:用于响应数据(响应行,响 应头,响应体)给浏览器

  • 常用 API

Response 相关 API描述
OutputStream getOutputStream()字节输出流(图片等)
PrintWriter getWriter()字符打印流
PrintWriterServletOutputStream
write不指定文本类型,√不指定文本类型,×
println不指定文本类型,√浏览器没有显示

五、其它

(1)继承体系

【JavaWeb】一文了解 Servlet 那点事

GenericServlet 是一个通用的 Servlet,可以用来处理各种协议发出的请求和响应。

HttpServlet 是专门用来处理 HTTP 协议发送的请求

  • 创建类继承 HttpServlet
  • 重写参数以 Http 开头的 service 方法,进行请求处理和响应数据
    • 不要调用父类的 service 方法,否则,报405错误

(2)ServletConfig对象

  1. 作用:用来封装Servlet初始化时的一些配置信息(解决硬编码问题)

  2. 常用方法

    String getInitParameter("参数名"):通过指定参数名获取参数值

    【JavaWeb】一文了解 Servlet 那点事

(3)loadOnStartup属性

  1. 作用:让 Web 服务器启动时创建并初始化 Servlet

  2. 用法:

    • 配置文件 【JavaWeb】一文了解 Servlet 那点事

    • 注解:@ WebServlet(loadOnStartup = 1)

  3. 说明:取值范围为1-10,值越小越先被加载,默认为-1

(4)通配符

通配符有两种,可以使用 /* 或 *.后缀名

/的优先级高于.后缀名 匹配规则:精确匹配,哪个更匹配就使用哪个

(5)映射

servlet-name 不能使用 default 和 jsp。原因是 default 和 jsp 已经被 Tomcat 使用,若以这两个命名,则会覆盖掉Tomcat中的。

  1. Servlet 对象由谁负责创建?Web 服务器(Tomcat)
  2. Servlet 对象什么时候创建?用户第一次访问时
  3. Servlet 对象什么时候销毁?服务器正常关闭或重启时
  4. Servlet 是单例还是多例?Servlet 值在第一次访问时创建对象,因此是单例的
转载自:https://juejin.cn/post/7135040811644764168
评论
请登录