servlet的生命周期:
- servlet的创建过程-----tomcat服务器
- servlet的初始化:init() init(ServletConfig config)
- servlet的服务方法:业务方法
- servlet的销毁过程
init
Servlet 的生命周期
——基于Java的反射机制
Class clazz = Class.forName("包名.类名");
// 获取构造器 getConstructor(Class<T>params...)
// 创建实例对象:newInstance();
// 获取Method对象:getDeclaredMethod(String name, 参数的class属性);
Method:里面的invoke(实例对象,实际参数);
// 初始化
Init(SerlvetConfig config)
Service(request, response):servlet的业务服务方法
doGet() / doPost()
Destory();servlet 的销毁方法
init(){…}:无参的init方法,再业务中初始化一些用户登录的次数 / 其他数据
package com.bite.servlet.b_init;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "InitDemo")
public class InitDemo extends HttpServlet {
/**
* servlet的生命周期的初始化
* @param config servlet的配置信息:初始化参数,或者servlet的加载
* @throws ServletException
*/
@Override
public void init(ServletConfig config) throws ServletException {
// 这个方法是获取配置信息用到的
}
/**
* 是servlet初始化的简便方法(用户自定义初始化的时候去使用)
* @throws ServletException
*/
@Override
public void init() throws ServletException {
// 获取用户session数据 ----> 初始化用户的登录次数/登录状态
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
服务方法及销毁过程
servlet对象被创建的过程中----其实是一种反射机制
- tomcat服务器启动的时候---- web.xml中先找到url-pattern:/life
- 再去servlet-mapping----- servlet-name:life
- 在servlet的配置信息中寻找LifeDemo
- 通过Class的forName(“com.bite.servlet.servlet_life.LifeDemo”):字节码文件对象
伪代码:
// 创建了当前的类对象
Class class = Class.forName("com.bite.servlet.servlet_life.LifeDemo");
// 通过 Constructor 对象:
public Constructor<T> getDeclareConstructor(Class<?>... parameterTypes)
Constructor con = class.getDeclaredConstructor();
Object obj = con.newInstace();
// 加载init方法
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
Methos m1 = class.getDeclaredMethod("init",ServletConfig.class)
m1.invoke(obj, config);
// 调用服务方法
Method m2 = class.getDeclaredMethod("service", HttpServletRequest.class, HttpServletResponse.class)
m2.invoke(obj, request, response);
...destory
System.exit(0); //jvm停止运行了
获取字节码文件对象的方式:
- Class.forName(“包名.类名…”) 推荐使用第一种,记载的一种字符串(配置文件中)
- 数据类型的class属性 String.class…
- Object类中getClass() ----> Class对象
package com.bite.servlet.a_life;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* servlet的生命周期
* service(ServletRequest req, ServletResponse res)
* init(ServletConfig config):初始化
* void destroy():销毁
*/
@WebServlet(name = "LifeDemo")
public class LifeDemo extends HttpServlet {
// 无参构造
public LifeDemo() {
System.out.println("servlet对象被调用了...");
}
/*
* 用户登录成功之前,应该先初始化一下用户登录次数
* @throws ServletException
*/
/*@Override
public void init() throws ServletException {
super.init();
}*/
/**
* 初始化
* @param config
* @throws ServletException
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("servlet被初始化了...");
}
/**
* 服务方法
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet的业务服务方法被调用了...");
}
/**
* 销毁
*/
@Override
public void destroy() {
System.out.println("servlet被销毁了...");
}