JavaWeb:Servlet 生命周期——创建对象,初始化,服务,销毁

配置 Servlet

  1. XML 配置 Servlet
<servlet>
	<servlet-name>HelloServletservlet-name>
	<servlet-class>com.gem.servlet.HelloServletservlet-class>
	<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
	<servlet-name>HelloServletservlet-name>
	<url-pattern>/hellourl-pattern>
servlet-mapping>
  1. 注解配置 Servlet
@WebServlet(name = "HelloServlet",urlPatterns = "/hello") //1.第一种
@WebServlet(name = "HelloServlet", urlPatterns = "/Hello", loadOnStartup = 1, initParams = {
	@WebInitParam(name = "username", value = "root"), @WebInitParam(name = "password", value = "123456") }) //2.第二种
@WebServlet("/hello") //3.第三种

创建对象

1.创建对象,调用构造方法 (多线程安全)

默认情况下,当第一次访问到达服务器时,将调用构造方法创建对象,且只创建一次(单例)。

可以通过配置 load-on-startup 来调节 Servlet 的创建时机,loadOnStartup 表示 Servlet 的创建时间,正数表示服务器启动时就创建对象,值越小,越优先创建,0表示不在乎创建顺序,负数表示默认情况,表示当第一次访问到达时创建。

public class HelloServlet extends HttpServlet {

	private static final long serialVersionUID = 5421250232115386554L;
	
    public HelloServlet() {
		
	}

初始化

2.初始化 (多线程安全)

当调用完构造方法创建 Servlet 对象后,紧接着调用 init 初始化方法,init 方法一般用于初始化数据,执行费时费力的重量级代码,还可以通过 xml 或者注解方式配置初始化参数,然后通过 ServletConfig 对象来获取初始化参数。

注意:
Servlet 顶级接口中的 init(ServletConfig config) 是带参数的。
但是在 HttpServlet 中,重写了 init(ServletConfig config),并且追加了一个 init() 空参方法,这样我们在重写时就可以简单的重写 init() 方法即可。

	@Override
	public void init() throws ServletException {
		//Servlet初始化参数对象
		ServletConfig config = getServletConfig();

		//在XML或者注解中配置初始化参数,在此处进行提取
		String username = config.getInitParameter("username");
		System.out.println(username);

		String password = config.getInitParameter("password");
		System.out.println(password);
	}

服务

3.服务方法 (多线程非安全)

如果有必要的话,需要进行线程同步,保证多线程并发安全。

注意:
HttpServlet 对 service() 方法进行大量的细化,分成了各种服务方法。
例如:doGet() , doPost() , doDelete() , doPut() …

如果访问时,方式选择错误,则抛出错误码 405,请求方式错误。
doGet —— 浏览器地址栏敲回车,超链接页面跳转,form 表单提交 method=get
doPost —— form 表单提交 method=post

如果不清楚到底用哪种方式访问,那么可以:

  1. 用 service() 方法通配所有方式 (不推荐)
  2. 在 doGet() / doPost() 方法中调用对方即可 ( 不要再 doGet() 方法中再次调用本身 )
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
	}

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}

销毁

4.销毁 (多线程安全)

当卸载应用或服务器关闭时,服务器会调用 destory() 方法销毁当前Servlet的实例,一般用于释放资源,只执行一次。

注意:
如果当前 Servlet 实例没有提供任何服务,则可以被销毁。
如果当前 Servlet 实例正在提供服务,则调用 destory() 方法时,会等待一段时间,超时后再销毁。

	@Override
	public void destroy() {
		
	}
}

你可能感兴趣的:(日常记录,javaee,servlet)