目录
四、ServletConfig和ServletContext
一、基本概念
- 什么是 Servlet
1、 Servlet 是 JavaEE 规范之一。 规范就是接口
2、 Servlet 就 JavaWeb 三大组件之一。 三大组件分别是: Servlet 程序、 Filter 过滤器、 Listener 监听器。
3、 Servlet 是运行在服务器上的一个 java 小程序, 它可以接收客户端发送过来的请求, 并响应数据给客户端
4.在整个Web应用中,Servlet主要负责处理请求、协调调度功能。我们可以把Servlet称为Web应用中的『控制器』
二、 Servlet的继承关系
1) 继承关系: HttpServlet -> GenericServlet -> Servlet
2) Servlet中的核心方法: init() , service() , destroy()
3) 服务方法: 当有请求过来时,service方法会自动响应(其实是tomcat容器调用的)
在HttpServlet中我们会去分析请求的方式:到底是get、post、head还是delete等等,然后再决定调用的是哪个do开头的方法。
而在HttpServlet中这些do方法默认都是405的实现风格-需要我们子类去实现对应的方法,否则默认会报405错误
4) 因此,我们在新建Servlet时,我们才会去考虑请求方法,从而决定重写哪个do方法
三、 Servlet的生命周期
1) 生命周期对应Servlet中的三个方法:init(), service(), destroy()
2) 默认情况下:
第一次接收请求时,这个Servlet会进行实例化(调用构造方法)、初始化(调用init())、然后服务(调用service())
从第二次请求开始,每一次都是服务
当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法
3) 通过案例我们发现:
- Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应。
- 默认情况下,第一次请求时,tomcat才会去实例化,初始化,然后再服务.这样的好处是什么? 提高系统的启动速度 。
这样的缺点是什么? 第一次请求时,耗时较长。
- 如果需要提高系统的启动速度,当前默认情况就是这样。如果需要提高响应速度,我们应该设置Servlet的初始化时机。
4) Servlet的初始化时机:
- 默认是第一次接收请求时,实例化,初始化
- 我们可以通过<load-on-startup>来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0
5) Servlet在容器中是:单例的、线程不安全的
- 单例:所有的请求都是同一个实例去响应
- 线程不安全:一个线程需要根据这个实例中的某个成员变量值去做逻辑判断。但是在中间某个时机,另一个线程改变了这个成员变量的值,从而导致第一个线程的执行路径发生了变化
四、ServletConfig和ServletContext
4.1 ServletConfig
- ServletConfig 类从类名上来看, 就知道是 Servlet 程序的配置信息类。
- Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建, 我们负责使用。
- Servlet 程序默认是第一次访问的时候创建, ServletConfig 是每个 Servlet 程序创建时, 就创建一个对应的 ServletConfig 对象。
- ServletConfig 类的三大作用
1、 可以获取 Servlet 程序的别名 servlet-name 的值 .getServletName();
2、 获取初始化参数 init-param .getInitParameter("String str");
3、 获取 ServletContext 对象 .getServletContext( );
<!-- 配置Servlet本身 -->
<servlet>
... ...
<!-- 配置初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>value</param-value>
</init-param>
</servlet>
4.2 ServletContext
- 1、 ServletContext 是一个接口, 它表示 Servlet 上下文对象
- 2、 一个 web 工程, 只有一个 ServletContext 对象实例。
- 3、 ServletContext 对象是一个域对象。
- 4、 ServletContext 是在 web 工程部署启动的时候创建。 在 web 工程停止的时候销毁。
- ServletContext 类的四个作用
1、 获取 web.xml 中配置的上下文参数 context-param .getInitParameter("String str");
2、 获取当前的工程路径, 格式: /工程路径 .getContextPath();
3、 获取工程部署后在服务器硬盘上的绝对路径 .getRealPath("/");
4、 像 Map 一样存取数据,操作域对象
setAttribute(k,v); getAttribute(k); removeAttribute(k);
<servlet>
… ...
<!--context-param 是上下文参数(它属于整个 web 工程)-->
<context-param>
<param-name>username</param-name>
<param-value>context</param-value>
</context-param>
… ...
</servlet>
五、基本使用
- 通过继承 HttpServlet 实现 Servlet 程序
一般在实际项目开发中, 都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。
1、 编写一个类去继承 HttpServlet 类
2、 根据业务需要重写 doGet 或 doPost 方法
3、 到 web.xml 中的配置 Servlet 程序的访问地址
<servlet>
<servlet-name>ServletName</servlet-name>
<servlet-class>LocationOfServletClass</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletName</servlet-name>
<url-pattern>/name</url-pattern>
</servlet-mapping>