JavaWeb之Servlet生命周期

一、新建一个LifeServelt 类 implements Servlet 

public class LifeServelt implements Servlet {
	
	public LifeServelt() {
		System.out.println("LifeServelt构造方法");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init");
		
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service");
		
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy");
		
	}

}

  1、在web.xml中进行配置并发布到服务器上

  <servlet>
  	<servlet-name>LifeServelt</servlet-name>
  	<servlet-class>cn.jq.myservlet.LifeServelt</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>LifeServelt</servlet-name>
  	<url-pattern>/LifeServelt</url-pattern>
  </servlet-mapping>

     浏览器访问:http://127.0.0.1:8080/myservlet/LifeServelt   ,stop 服务器

    

2、Servlet生命周期相关方法,这些方法都是Servlet容器自动执行,和人为无关:

Servlet生命周期,即阐述Servlet从产生到毁灭的整个过程。
1)构造方法
       最先被执行,构造方法被执行意味着创建新的实例,且只会被执行一次,意味着Servlet是单例的,在整个Servlet容器中每个具体的Servlet实现类都只有一个实例! 


2)init方法
       在一个Servlet的生命周期中,构造方法执行之后,马上被执行,且只会执行一次,之后无论用户执行多少次请求,都不会在调用该方法。
       关于init方法的执行时机,有两种方式可选

      servlet默认是在用户第一次访问的时候创建而且只创建一个对象 是单例模式的(保证一个类只有一个对象产生),

      你也可以在web.xml中设置该Servlet在服务器启动后自动执行创建,这时创建的servlet对象也是单例模式。 


3)service方法
       当一个客户请求该Servlet时,实际的处理工作全部有service方法来完成,service方法用来处理客户端的请求,并生成格式化数据返回给客户端。

       每一次请求服务器都会开启一个新的线程并执行一次service方法,service根据客户端的请求类型,调用doGet、doPost等方法。 
       service是由web容器来调用的,我们无需对service具体内容做任何处理,service会自动的根据客户端的请求类型去调用doGet、doPost等方法,所以我们只需要做好doGet、doPost方法的实现就可以了。


4)destroy方法
        该方法在整个生命周期中,也是只会被调用一次,在Servlet对象被销毁是调用,在servlet中,我们可以做一些资源的释放等操作,执行destory方法之后的servlet对象,会等待jvm虚拟机的垃圾回收机制择时回收。


5)doGet、doPost方法
        实际的业务处理流程,service根据客户端的请求类型来自动匹配需要执行那个方法。

   

3、 web.xml中Servlet映射配置中<load-on-startup>整数</load-on-startup>
    整数若为0或正整数时表示web应用启动时,自动执行对应的Servlet,整数越小,越优先执行,只执行一次随web应用启动时。
    若为负数,则会在第一次请求时被执行对象的Servler(和不配置一样)。

  <servlet>
  	<servlet-name>LifeServelt</servlet-name>
  	<servlet-class>cn.jq.myservlet.LifeServelt</servlet-class>
  	<!-- 服务器启动时servlet对象就创建 -->
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>LifeServelt</servlet-name>
  	<url-pattern>/LifeServelt</url-pattern>
  </servlet-mapping>

 服务器启动时servlet对象就被创建,执行了初始化方法,然后访问url就会执行service方法

    

二、 ServletConfig对象

1、public void init (ServletConfig servletConfig)
      ServletConfig:Servlet配置,ServletConfig是一个接口,具体的实现是由Servlet容器开发商(如tomcat)实现的,初始化参数值在web.xml配置文件中配置,通过init方法可以获取。

      <init-param>标签为某一个单独的servlet加配置信息

  <servlet>
  	<servlet-name>LifeServelt</servlet-name>
  	<servlet-class>cn.jq.myservlet.LifeServelt</servlet-class>
	<init-param> <!-- 配置该servelt的初始化参数(键值对)  -->
		<param-name>username</param-name>
		<param-value>admin</param-value>
	</init-param>
	<init-param>
		<param-name>password</param-name>
		<param-value>admin123</param-value>
	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>LifeServelt</servlet-name>
  	<url-pattern>/LifeServelt</url-pattern>
  </servlet-mapping>

  ServletConfig接口的定义的方法

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init---");
		//获取当前Servlet在web.xml中配置的名字
		String ServeltName = arg0.getServletName();
		System.out.println(ServeltName);
		
		//获取当前Servlet指定名称的初始化参数的值
		String usernameValue = arg0.getInitParameter("username");
		System.out.println(usernameValue);
		
		//获取当前Servlet所有初始化参数的名字组成的枚举
		Enumeration enumeration = arg0.getInitParameterNames();
		while(enumeration.hasMoreElements()) {
			String name = (String) enumeration.nextElement();
			String value = arg0.getInitParameter(name);
			System.out.println(name + ":" + value);
		}
		
		//获取代表当前web应用的ServletContext对象
		System.out.println(arg0.getServletContext());
	}

  

三、ServletContext域对象

1、ServletContext域对象可以在整个web应用范围内共享数据。
     1)作用范围:
           整个web应用范围内共享数据
     2)生命周期:
           当服务器启动web应用加载后创建出ServletContext域对象。当web应用被移除出容器或服务器关闭时随着web应用的销毁域销毁。

2、<context-param>标签(与Servlet标签并列)为整个Web应用配置属性信息,所有的Servlet都能访问里面的参数。

  <context-param>
  		<param-name>username</param-name>
		<param-value>admin</param-value>
  </context-param>
  <context-param>
  	<param-name>password</param-name>
  	<param-value>admin123</param-value>
  </context-param>
  
  <servlet>
  	<servlet-name>LifeServelt</servlet-name>
  	<servlet-class>cn.jq.myservlet.LifeServelt</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>LifeServelt</servlet-name>
  	<url-pattern>/LifeServelt</url-pattern>
  </servlet-mapping>
public class LifeServelt implements Servlet {
	private ServletContext servletContext;
	
	public LifeServelt() {
		System.out.println("LifeServelt构造方法");
	}

	@Override
	public ServletConfig getServletConfig() {
		return null;
	}

	@Override
	public String getServletInfo() {
		return null;
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("init---");
		//获取代表当前web应用的ServletContext对象
		this.servletContext=arg0.getServletContext();
	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service---");
		// 获取单个的Context里面的初始化参数
		String value1 = servletContext.getInitParameter("username");
		String value2 = servletContext.getInitParameter("password");
		System.out.println(value1 + ";" + value2);

		// 一次性获取Context里所有的初始化参数
		Enumeration enumeration = servletContext.getInitParameterNames();
		while (enumeration.hasMoreElements()) {
			String name = (String) enumeration.nextElement();
			String value = servletContext.getInitParameter(name);
			System.out.println(name + ";" + value);
		}

                //获取当前WEB应用的名称
		System.out.println(servletContext.getContextPath());
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy");
		
	}

}

    浏览器访问:http://127.0.0.1:8080/myservlet/LifeServelt  

       

手误 servlet 敲错了

猜你喜欢

转载自blog.csdn.net/qq_42402854/article/details/85012295
今日推荐