文章目录
- 可以创建 Servlet , 并且调用 Servlet 的相关生命周期方法
- JSP,Filter,Listener,Tag … 等的软件环境
Servlet 生命周期的方法
- 构造器:
<mark>只被调用一次</mark>,
只有<mark>第一次</mark>请求 Servlet 时,创建 Servlet 的实例,调用构造器,
<mark>这说明 Sevlet 是单例的!</mark> - init 方法:
<mark>只被调用一次</mark>,
在创建好实例后立即被调用,
用于用于初始化<mark>当前</mark> Servlet - service:
被多次调用,每次请求都会调用 service 方法,
实际用于响应请求 - 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
可以使用 * 通配符,
但是只能有两种固定的格式:- “
*.扩展名
” - 以正斜杠(
/
)开头并以"/*
"结尾
- “
<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 接口 ( 重要!)
- 可以由 ServletConfig 获取
- 该对象当前 Web 应用: 可以认为认为 ServletConetxt 是当前 Web 应用的一个大管家。
可以从中获取到当前 Web 应用的各个方面的信息。- 获取当前 Web 应用的初始化参数
getInitParameterNames
、getInitParameter
- 可以被所有 Servlet 获取
- 获取当前 Web 应用的某一个文件的绝对路径:
getRealPath
- 获取 当前 WEB 应用的名称
getContextPath()
- 获取当前 WEB 应用的某一个文件对应的输入流
- 获取当前 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);
↑↑↑