• 可以创建 Servlet , 并且调用 Servlet 的相关生命周期方法
  • JSP,Filter,Listener,Tag … 等的软件环境

Servlet 生命周期的方法

  1. 构造器
    <mark>只被调用一次</mark>,
    只有<mark>第一次</mark>请求 Servlet 时,创建 Servlet 的实例,调用构造器,
    <mark>这说明 Sevlet 是单例的!</mark>
  2. init 方法
    <mark>只被调用一次</mark>,
    在创建好实例后立即被调用,
    用于用于初始化<mark>当前</mark> Servlet
  3. service
    被多次调用,每次请求都会调用 service 方法,
    实际用于响应请求
  4. destroy
    只被调用一次,
    在当前 Servlet 所在的 WEB 应用被卸载当前调用
    用于释放当前 Servlet 所占用的资源。

(<mark>以上方法 都是 Servlet 容器负责调用。</mark>)

load-on-startup 参数:

<mark>可以指定 Servlet 被创建的时机</mark>

  • 越小越早启动
  • -1 时候,服务器启动时候不启动,只有被请求时候才启动
  <servlet>
    <description></description>
    <!-- Servlet 注册的名字 -->
    <servlet-name>HelloServlet</servlet-name>
    <!-- Servlet 的全类名 -->
    <servlet-class>cn.edut.day30.HelloServlet</servlet-class>
    <!-- 可以指定 Servlet 被创建的时机 -->
    <load-on-startup>1</load-on-startup> <---------- 这里
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

Servlet 映射的细节

  • 一个 servlet 可以有多个 servlet-mapping

  • servlet-mapping 可以使用 * 通配符,
    但是只能有两种固定的格式:

    1. *.扩展名
    2. 以正斜杠(/)开头并以"/*"结尾
<servlet-mapping>
	<servlet-name>HelloServlet</servlet-name>
	<url-pattern>*.html</url-pattern>
</servlet-mapping>

<mark>带扩展名的 不能带斜杠</mark> ,即(/*.html 不合法)

<servlet-mapping>
	<servlet-name>HelloServlet</servlet-name>
	<url-pattern>/*</url-pattern>
</servlet-mapping>

ServletConfig

封装了 Servlet 的配置信息,并且可以获取 ServletContext 对象


配置 Servlet 的初始化参数

  <servlet>
  	<servlet-name>hs</servlet-name>
  	<servlet-class>com.edut.HelloServlet</servlet-class>
  	<!-- 配置 Servlet 的初始化参数。 且该节点必须在 load-on-startup 节点的前面 -->
  	<init-param>
  		<param-name>user</param-name>
  		<param-value>root</param-value>
  	</init-param>
  	<init-param>
  		<param-name>password</param-name>
  		<param-value>root</param-value>
  	</init-param>
  	
  	<!-- 可以指定 Servlet 被创建的时机 -->
  	<load-on-startup>-1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>hs</servlet-name>
  	<url-pattern>/hs</url-pattern>
  </servlet-mapping>  

getInitParameter 、 getInitParameterNames

获取初始化参数:

  • getInitParameter(String name):获取指定参数名的初始化参数
  • getInitParameterNames获取参数名组成的 Enumeration 对象。

Enum - n. 枚举
Enumeration

	/* * Servlet 的实现中 ... */
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("initing...");
		String user = config.getInitParameter("user");
		System.out.println(user);
		
		Enumeration<String> ee = config.getInitParameterNames();
		while (ee.hasMoreElements()) {
			String key = (String) ee.nextElement();
			String value = config.getInitParameter(key);
			System.out.println(key + " : " + value);
		}
		
	}

String name = config.getServletName();

ServletContext 接口 ( <mstyle mathcolor="&#35;f01"> </mstyle> \color{#f01}{重要!}

  • 可以由 ServletConfig 获取
  • 该对象当前 Web 应用: 可以认为认为 ServletConetxt 是当前 Web 应用的一个大管家。
    可以从中获取到当前 Web 应用的各个方面的信息。
    • 获取当前 Web 应用的初始化参数 getInitParameterNamesgetInitParameter
      • 可以被所有 Servlet 获取
    • 获取当前 Web 应用的某一个文件的绝对路径:getRealPath
    • 获取 当前 WEB 应用的名称 getContextPath()
    • 获取当前 WEB 应用的某一个文件对应的输入流

		//获取 ServletContext 对象
		ServletContext servletContext = config.getServletContext() ;
		String driver = servletContext.getInitParameter("driver");
		System.out.println("driver:"+driver);
		
		Enumeration<String> ps = servletContext.getInitParameterNames();
		while(ps.hasMoreElements()) {
			String key = ps.nextElement();
			String value = servletContext.getInitParameter(key);
			System.out.println("key:"+key+" - "+ "value:"+ value);
		}

↑↑↑

		System.out.println("-------------------");
		//获取部署后,的绝对路径(在服务器上的绝对路径)
		String realPath = servletContext.getRealPath("/index.jsp");
		System.out.println(realPath);
		

↑↑↑

		System.out.println("-------------------");
		//获取当前WEB应用的名称
		String contextPath = servletContext.getContextPath();
		System.out.println(contextPath);

↑↑↑

		System.out.println("-------------------");
		System.out.println("class.getResource:"+getClass().getResource(""));
		System.out.println("class.getResource/:"+getClass().getResource("/"));
		System.out.println("classloader.getResource:"+getClass().getClassLoader().getResource(""));
		System.out.println("classloader.getResource/:"+getClass().getClassLoader().getResource("/"));
		InputStream in = getClass().getClassLoader().getResourceAsStream("c3p0.properties");
		System.out.println("1..." + in);
		
		InputStream in2 = servletContext.getResourceAsStream("/WEB-INF/classes/c3p0.properties");
		InputStream in3 = servletContext.getResourceAsStream("classpath:c3p0.properties");
		System.out.println("2..."+in2);
		System.out.println("3..."+in3);

↑↑↑