Servlet深入
(一)Servlet的生命周期
一、Servlet的生命周期概述
1、什么是生命周期
生命周期:一个对象从创建到销毁的过程
2、Servlet的生命周期
(1)Servlet生命周期:Servlet对象从创建到销毁的过程
(2)Servlet中有init、service、destroy方法,这几个方法称为是生命周期相关的方法
1)Servlet是在第一次被访问的时候会被实例化,只要Servlet一被实例化,那么Servlet中的init方法就会执行(init只会执行一次)
2)之后再有任何一次从客户端发送来的请求,那么Servlet中的service方法就会执行(在service方法的内部,会根据请求的方式不同,调用不同的doXxx方法)
3)当Servlet从服务器中移除,或者服务器关闭的时候,Servlet对象就被销毁,里面的destroy方法就会执行,然后垃圾回收就会将其回收掉
3、代码演示Servlet的生命周期
(二)Servlet的启动时加载
一、为什么使用启动时加载
Servlet对象是第一次被访问的时候会被创建的,init方法就会执行,假设在init方法中做了一些比较耗时的操作(比如:加载了一些配置文件,并且解析可能需要花费3秒钟,那么第一个用户第一次访问这个Servlet的时候,需要等待3秒钟),如何使第一个用户在第一次访问的时候,不需要花费这么长时间?就需要我们的Servlet在启动时加载
二、什么是启动时加载
Servlet默认是在第一次访问的时候创建的对象,现在通过一个配置,将Servlet的实例化的过程,放在服务器启动的时候(让服务器启动的时候就创建Servlet的对象)。
如果这样做,那么之前耗时花费的时间就会在服务器启动的时候一起消耗掉了。对于用户来讲,就不需要额外花费这个时间了
三、配置完成启动时加载
优先级:数字越小越优先,不能比tomcat默认的Servlet优先级(1)大
(三)Servlet的访问路径的配置
一、Servlet中的urlPatter的配置
1、完全路径匹配
以/开始,比如:/ServletDemo1 /aaa/ServletDemo2
http://localhost:8080/web01/ServletDemo5
2、目录匹配
以/开始,以/*结束,比如:/* /aaa/* /aaa/bbb/*
http://localhost:8080/web01/aaa/asdf
3、扩展名匹配
不能以/开始,以*开始,比如:*.action *.do *.jsp
http://localhost:8080/web01/asdf.abc
二、访问的优先级
完全路径匹配 > 目录匹配 > 扩展名匹配
(四)ServletConfig对象(了解)
一、ServletConfig对象的概述
ServletConfig是用来获取Servlet的相关配置的对象
二、获得ServletConfig对象
getServletConfig()方法
三、ServletConfig对象的API
获得Servlet的初始化参数
获得ServletContext对象
获得Servlet的名称
四、演示ServletConfig的API
在web.xml中配置初始化参数
在Servlet中的代码实现
(五)ServletContext对象之获取web项目信息
一、ServletContext对象概述
1、什么是ServletContext
ServletContext:Servlet的上下文对象。ServletContext对象对Servlet之前和之后的内容都知道,这个对象一个Web项目只有一个。在服务器启动的时候,为每个Web项目创建一个单独的ServletContext对象
2、ServletContext对象的作用
(1)作用一:用来获取Web项目信息
1)因为一个Web项目只有一个ServletContext对象,所以这个对象对整个项目的相关内容都是了解的
2)方法:
获取文件的MIME的类型
getMimeType(String file)
获取Web项目请求的工程名
getContextPath()
获取Web项目的全局初始化参数
getInitParameter(String name)
getInitParameterNames()
(2)作用二:读取Web项目下的文件
之前使用IO流就可以读取文件(Java项目中),现在是一个Web项目,Web项目需要发布到Tomcat下才能访问的。获取Web项目下的文件,如果仍使用传统的IO流,就会出现问题了。问题产生的原因,是由于我们使用的是相对路径,相对的是JRE环境
传统方式读取文件会报500错误
3、ServletContext对象之作为域对象存取数据
(1)域对象概述
什么是域对象
域对象:指的是将数据存入到域对象中,这个数据就会有一定的作用范围。域指的是一定的作用范围
(2)ServletContext作为域对象
ServletContext作为域对象的API:
存入数据的方法:
setAttribute(String name, Object object)
获取数据的方法:
getAttribute(String name)
移除数据的方法:
removeAttribute(String name)
(3)ServletContext作为域对象的作用范围
在服务器启动的时候,为每个Web项目都会单独创建一个ServletContext对象,当Web项目从服务器中移除,或者是关闭服务器的时候,ServletContext对象就会被销毁。所以,向ServletContext中保存的数据会一直存在,直到服务器关闭的时候,ServletContext对象被销毁,里面的数据才会失效。所以它的作用范围是整个Web应用
(4)ServletContext域对象代码演示
package com.servlet.demo3;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo2 implements Servlet{
//Servlet对象被实例化的时候init方法就会执行,而且只执行一次
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("servlet初始化了...");
}
//任何一次请求都会执行service方法,可以执行多次
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("servlet执行了...");
}
//servlet从服务器中移除或者服务器关闭的时候,会销毁servlet,销毁时执行,只执行一次
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("servlet销毁了...");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-gene
rated method stub
return null;
}
}