目录
Servlet生命周期的四个阶段
servlet的生命周期就是从servlet出现到销毁的全过程。
加载类—>实例化(为对象分配空间)—>初始化(为对象的属性赋值)—>请求处理(服务阶段)—>销毁
实例化
servlet容器创建servlet对象。当发送servlet对应的请求,才会进行对象的创建。
初始化
servlet实例化后就会调用init()方法,只能调用一次,且是在进行第一次实例化servlet对象时调用。
执行状态
service()方法是执行实际任务的主要方法,Web服务器将调用service方法处理客户端(浏览器)的请求,然后将格式化的数据响应给浏览器客户端。每当客户端向服务端发送一个请求时,服务端都会产生一个新的线程调用服务。service方法将会检测客户端发送给服务端的HTTP请求协议的类型,从而调用service方法中的 doGet、doPost、doPut、doDelete 等方法进行实际任务的逻辑处理,注意此时不会重新创建servlet实例,也不会调用init()方法。
销毁状态
servlet生命周期结束时将会调用destroy()方法,并且只会调用一次。destroy方法可以让我们的servlet关闭数据库连接,把后台线程关闭。当调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除。
设置对应servlet的优先级(loadOnStartup)
如果需要某个servlet随着容器加载时就创建,而不是在使用时才创建。可以通过load-on-startup=6设置,正数数值越低优先级别越高,优先实例化。
方式一:注解方式验证
@WebServlet(urlPatterns = {"ServletLifeCycle01"},loadOnStartup = 6)
public class ServletLifeCycle01 extends HttpServlet {
private static final long serialVersionUID = -8456388106455722944L;
// 实例化
public ServletLifeCycle01() {
System.out.println("ServletLifeCycle01实例化 ServletLifeCycle01()");
}
// 初始化
@Override
public void init() throws ServletException {
System.out.println("ServletLifeCycle01初始化 init()");
}
// 执行
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletLifeCycle01 执行代码 service()");
}
// 销毁
@Override
public void destroy() {
System.out.println("ServletLifeCycle01销毁 destroy()");
}
}
方式二:配置web.xml文件进行实例化
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletLifeCycle02</servlet-name>
<!--servlet类完全限定名-->
<servlet-class>com.lihaozhe.servlet.lifecycle.ServletLifeCycle02</servlet-class>
<!--
服务启动时是实例化Servlet类 注意 load-on-startup必须配在配置行的最末行 参数为非负整数
数值越小的正整数 越趋近于零 优先级越高 零的优先级别最高
-->
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletLifeCycle02</servlet-name>
<!--地址栏映射-->
<url-pattern>/ServletLifeCycle02.action</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletLifeCycle02</servlet-name>
<!--地址栏映射-->
<url-pattern>/ServletLifeCycle02.do</url-pattern>
</servlet-mapping>
</web-app>
public class ServletLifeCycle02 extends HttpServlet {
private static final long serialVersionUID = 7270727006887688108L;
public ServletLifeCycle02() {
System.out.println("ServletLifeCycle02实例化 ServletLifeCycle02()");
}
@Override
public void init() throws ServletException {
System.out.println("ServletLifeCycle02初始化 init()");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletLifeCycle02 执行代码 service()");
}
@Override
public void destroy() {
System.out.println("ServletLifeCycle02销毁 destroy()");
}
}
初始化参数配置
HttpServlet继承了GenericServlet,
GenericServlet实现了Servlet接口和ServletConfig接口
ServletConfig
getServletConfig()方法来获取ServletConfig对象,ServletConfig对象可以获取到Servlet的一些信息,ServletName、ServletContext、InitParameter、InitParameterNames等。
注解方式
@WebServlet(name = "ServletConfig01", value = "/ServletConfig01",initParams = @WebInitParam(name="zs",value="zhangsan"))
public class ServletConfig01 extends HttpServlet {
private static final long serialVersionUID = -5651439538417317409L;
private ServletConfig config;
public ServletConfig01() {
System.out.println("ServletConfig01实例化 ServletConfig01()");
}
@Override
public void init() throws ServletException {
System.out.println("ServletConfig01初始化 init()");
}
@Override
public void init(ServletConfig config) throws ServletException {
this.config= config;
System.out.println("ServletConfig01初始化 init(config)");
String zs = config.getInitParameter("zs");
System.out.println("ServletConfig01 init(config) 获取参数" + zs);
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletConfig01执行 service()");
String zs = config.getInitParameter("zs");
System.out.println("ServletConfig01 service() 获取参数" + zs);
}
@Override
public void destroy() {
super.destroy();
}
}
返回
ServletConfig01实例化 ServletConfig01()
ServletConfig01初始化 init(config)
ServletConfig01 init(config) 获取参数zhangsan
ServletConfig01执行 service()
ServletConfig01 service() 获取参数zhangsan
@WebServlet(name = "ServletConfig02", value = "/ServletConfig02",initParams = @WebInitParam(name="zs",value="zhangsan"))
public class ServletConfig02 extends HttpServlet {
private static final long serialVersionUID = 6435828475163018742L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletConfig02 执行 service()");
ServletConfig config = this.getServletConfig();
String zs = config.getInitParameter("zs");
System.out.println("ServletConfig02 service() 获取参数"+zs);
}
}
返回
ServletConfig02 执行 service()
ServletConfig02 service() 获取参数zhangsan
配置web.xml方式
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<servlet>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletConfig03</servlet-name>
<!--servlet类完全限定名-->
<servlet-class>com.lihaozhe.servlet.config.ServletConfig03</servlet-class>
<init-param>
<param-name>zs</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>ls</param-name>
<param-value>lisi</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletConfig03</servlet-name>
<!--地址栏映射-->
<url-pattern>/ServletConfig03</url-pattern>
</servlet-mapping>
<servlet>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletConfig04</servlet-name>
<!--servlet类完全限定名-->
<servlet-class>com.lihaozhe.servlet.config.ServletConfig04</servlet-class>
</servlet>
<servlet-mapping>
<!--别名 使用简短的名字来表示servlet类完全限定名-->
<servlet-name>ServletConfig04</servlet-name>
<!--地址栏映射-->
<url-pattern>/ServletConfig04</url-pattern>
</servlet-mapping>
</web-app>
public class ServletConfig03 extends HttpServlet {
private static final long serialVersionUID = -3771332345541718841L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletConfig03 执行 service()");
ServletConfig config = this.getServletConfig();
String zs = config.getInitParameter("zs");
String ls = config.getInitParameter("ls");
System.out.println("ServletConfig03 service() 获取参数 zs="+zs);
System.out.println("ServletConfig03 service() 获取参数 ls="+ls);
Enumeration<String> names = config.getInitParameterNames();
Iterator<String> it = names.asIterator();
while (it.hasNext()){
String name = it.next();
System.out.println(name + ">>>"+config.getInitParameter(name));
}
}
}
返回
ServletConfig03 执行 service()
ServletConfig03 service() 获取参数 zs=zhangsan
ServletConfig03 service() 获取参数 ls=lisi
zs>>>zhangsan
ls>>>lisi
public class ServletConfig04 extends HttpServlet {
private static final long serialVersionUID = -3771332345541718841L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletConfig04 执行 service()");
ServletConfig config = this.getServletConfig();
String zs = config.getInitParameter("zs");
String ls = config.getInitParameter("ls");
System.out.println("ServletConfig04 service() 获取参数 zs="+zs);
System.out.println("ServletConfig04 service() 获取参数 ls="+ls);
Enumeration<String> names = config.getInitParameterNames();
Iterator<String> it = names.asIterator();
while (it.hasNext()){
String name = it.next();
System.out.println(name + ">>>"+config.getInitParameter(name));
}
}
}
返回参数为null
ServletConfig04 执行 service()
ServletConfig04 service() 获取参数 zs=null
ServletConfig04 service() 获取参数 ls=null
注意:只对局部有效
ServletContext
ServletContext对象是servlet上下文对象,可以获取servlet的路径,等方法。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
version="5.0">
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql:///homewmall</param-value>
</context-param>
<context-param>
<param-name>username</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
</web-app>
@WebServlet(name = "ServletContext01", value = "/ServletContext01")
public class ServletContext01 extends HttpServlet {
private static final long serialVersionUID = 3061405452142996839L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletContext01");
ServletContext context = this.getServletContext();
String driver = context.getInitParameter("driver");
String url = context.getInitParameter("url");
String username = context.getInitParameter("username");
String password = context.getInitParameter("password");
System.out.println("driver >>> " + driver);
System.out.println("url >>> " + url);
System.out.println("username >>> " + username);
System.out.println("password >>> " + password);
}
}
返回
ServletContext01
driver >>> com.mysql.cj.jdbc.Driver
url >>> jdbc:mysql:///homewmall
username >>> admin
password >>> 123456
注意:配置context-param全局有效
获取路径
@WebServlet(name = "ServletContext02", value = "/ServletContext02")
public class ServletContext02 extends HttpServlet {
private static final long serialVersionUID = 6020470277660717008L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
// getContextPath() 获取上下文路径
System.out.println(context.getContextPath());
System.out.println(request.getContextPath());
// getRealPath(“/”) 获取项目在操作系统的绝对路径
System.out.println(context.getRealPath("/"));
System.out.println(request.getRealPath("/"));
}
}
返回
/lhz
/lhz
/home/lhz/IdeaProjects/javaweb/src/main/webapp
/home/lhz/IdeaProjects/javaweb/src/main/webapp