1. Servlet
2. 继承GenericServlet
继承GenericServlet
重写 serviece 方法
在web.xml中配置 servlet
<!-- 声明-->
<servlet>
<!-- 类名-->
<servlet-name>servletDemo</servlet-name>
<!-- 类路径-->
<servlet-class>com.example.demo.demo</servlet-class>
</servlet>
<!-- 映射-->
<servlet-mapping>
<!-- 与类名一致-->
<servlet-name>servletDemo</servlet-name>
<!-- 网页访问链接路径-->
<url-pattern>/demo</url-pattern>
</servlet-mapping>
- 重启项目
3. 继承 HttpServlet
- 继承HttpServlet
- 重写 doGet 和 doPost 方法 (可以在doPost中调用doGet方法)
- 在web.xml中配置 servlet
- 重启项目
4. 生命周期
- 出生 init()
- 过程 doGet serviece
- 销毁 destroy()
5. 线程安全问题
serviece 采用是单例模式, 整个应用中只有一个实例对象,我们称为单例模式
- 如果只是使用而不修改
- 将变量级别降到 局部变量 在doget中
- 使用 synchronized 同步代码块
6. 映射方式
完整名称
/开头 + 通配符 以什么什么开头
<servlet-name>/demo/*</servlet-name>
通配符 + 固定结尾 以什么什么结尾
<servlet-name>*.qwq</servlet-name>
7. 创建时机
第一次访问时创建
- 减少对服务器内存的浪费,访问时才创建
服务器加载时创建
- 提前创建好对象,提高首次执行的效率 对内容占用较大
在web.xml中配置 servlet 的 load-on-startup
<servlet>
<servlet-name>servletDemo</servlet-name>
<servlet-class>com.example.demo.demo</servlet-class>
<!-- 正整数为加载时创建值越大优先级越高 负数或不写为第一次访问时创建 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>servletDemo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
8. ServletConfig
在servlet标签中 通过init-param标签 来配置
以键值对方式配置 param-name 和 param-value
<servlet>
<servlet-name>servletDemo</servlet-name>
<servlet-class>com.example.demo.demo</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
8.1. 获取方法
获取ServletConfig对象
private ServletConfig config;
// 在init方法中
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>
进行配置
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee">
<context-param>
<param-name>key</param-name>
<param-value>value</param-value>
</context-param>
</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
在该类上面使用
@WebServlet(name = "helloServlet", value = "/hello-servlet")
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(访问路径)
- 重启项目