1. Servlet

2. 继承GenericServlet

  • 继承GenericServlet

  • 重写 serviece 方法

  • 在web.xml中配置 servlet

      1. <!-- 声明-->
      2. <servlet>
      3. <!-- 类名-->
      4. <servlet-name>servletDemo</servlet-name>
      5. <!-- 类路径-->
      6. <servlet-class>com.example.demo.demo</servlet-class>
      7. </servlet>
      8. <!-- 映射-->
      9. <servlet-mapping>
      10. <!-- 与类名一致-->
      11. <servlet-name>servletDemo</servlet-name>
      12. <!-- 网页访问链接路径-->
      13. <url-pattern>/demo</url-pattern>
      14. </servlet-mapping>
  • 重启项目

3. 继承 HttpServlet

  • 继承HttpServlet
  • 重写 doGet 和 doPost 方法 (可以在doPost中调用doGet方法)
  • 在web.xml中配置 servlet
  • 重启项目

4. 生命周期

  • 出生 init()
  • 过程 doGet serviece
  • 销毁 destroy()

5. 线程安全问题

serviece 采用是单例模式, 整个应用中只有一个实例对象,我们称为单例模式

  • 如果只是使用而不修改
  • 将变量级别降到 局部变量 在doget中
  • 使用 synchronized 同步代码块

6. 映射方式

  • 完整名称

  • /开头 + 通配符 以什么什么开头

      1. <servlet-name>/demo/*</servlet-name>
  • 通配符 + 固定结尾 以什么什么结尾

      1. <servlet-name>*.qwq</servlet-name>

7. 创建时机

  • 第一次访问时创建

    • 减少对服务器内存的浪费,访问时才创建
  • 服务器加载时创建

    • 提前创建好对象,提高首次执行的效率 对内容占用较大

在web.xml中配置 servlet 的 load-on-startup

  1. <servlet>
  2. <servlet-name>servletDemo</servlet-name>
  3. <servlet-class>com.example.demo.demo</servlet-class>
  4. <!-- 正整数为加载时创建值越大优先级越高 负数或不写为第一次访问时创建 -->
  5. <load-on-startup>1</load-on-startup>
  6. </servlet>
  7. <servlet-mapping>
  8. <servlet-name>servletDemo</servlet-name>
  9. <url-pattern>/demo</url-pattern>
  10. </servlet-mapping>

8. ServletConfig

在servlet标签中 通过init-param标签 来配置

以键值对方式配置 param-name 和 param-value

  1. <servlet>
  2. <servlet-name>servletDemo</servlet-name>
  3. <servlet-class>com.example.demo.demo</servlet-class>
  4. <init-param>
  5. <param-name>encoding</param-name>
  6. <param-value>UTF-8</param-value>
  7. </init-param>
  8. <load-on-startup>1</load-on-startup>
  9. </servlet>

8.1. 获取方法

  • 获取ServletConfig对象

      1. private ServletConfig config;
      2. // 在init方法中
      3. public void init(ServletConfig config) { }
  • getInitParameter(String name) 根据key获取value

  • getInitParmeterNames() 获取所有参数名称的枚举

  • getServletName() 获取Servlet,名称

  • getServltContext() 获取ServltContext对象

9. ServletContext

ServletContext是应用上下文对象(应用域对象).每个应用只有一个ServletContext对象

9.1. 配置

<web-app> 标签中 通过 <context-param>标签进行配置

以键值对 <param-name><param-value> 进行配置

  1. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee">
  2. <context-param>
  3. <param-name>key</param-name>
  4. <param-value>value</param-value>
  5. </context-param>
  6. </web-app>

9.2. 方法

  • getServletContext() 获取当前应用的ServletContext对象
  • getInitparameter(String name) 根据名称获取全局配置参数
  • getContextPath() 获取当前应用访问的虚拟目录
  • getRealPath(String path) 根据虚拟目录获取绝对路径
  • setAttribute(String name,Object value) 向应用域对象中存储数据
  • getAttribute(string name) 根据名称获取应用域中的数据
  • removeAttribute(string name) 根据名称移除应用域中的数据

9.3. 注解

Servlet 3.0 支持 注解和XML配置, 要求tomcat 9 和 javaee8

以前我们写一个类需要在xml中配置该类的路径、名称、链接

  • @WebServlet 注解配置Servlet

  • 在该类上面使用

    1. @WebServlet(name = "helloServlet", value = "/hello-servlet")
  • 45. Servlet - 图1

9.4. 手动创建容器

  • 定义一个类 继承HttpServlet
  • 重写 doget和dopost方法
  • 定义一个类 实现 ServletContainerInitializer 接口
  • 在src目录下创建一个 META-INF 包
  • 在 META-INF 包 创建一个services 包
  • 在 services 包 下创建一个 javax.servlet.ServletContainerInitializer 的文件 无后缀文件
  • 文件中的内容为容器实现类的全类名
  • 在容器实现类中 的 onStarup 方法 中完成注册 Servlet

    • 创建要注册的servlet对象
    • res = serveletContext.addServlet(name,对象)
    • res.addMapping(访问路径)
  • 重启项目