Servlet配置及生命周期
1.设置Ecilipse快捷 file new
2.创建Servlet程序
1). 创建一个 Servlet 接口的实现类.
public class HelloServlet implements Servlet
2). 在 web.xml 文件中配置和映射这个 Servlet
HelloServlet.java
package com.aff.javaweb; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class HelloServlet implements Servlet { @Override public void destroy() { System.out.println("destory"); } @Override public ServletConfig getServletConfig() { System.out.println("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"); } public HelloServlet() { System.out.println("HelloServlet的构造器"); } }
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!--配置和映射servlet --> <servlet> <!-- Servlet 注册的名字 --> <servlet-name>HelloServlet</servlet-name> <!--Servlet的全类名 --> <servlet-class>com.aff.javaweb.HelloServlet</servlet-class> </servlet> <servlet-mapping> <!-- 需要和某一个 servlet 节点的 serlvet-name 子节点的文本节点一致 --> <servlet-name>HelloServlet</servlet-name> <!-- 映射具体的访问路径: / 代表当前 WEB 应用的根目录. --> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
运行:
服务关闭调用destory方法
配置和映射servlet
3. Servlet 容器: 运行 Servlet、JSP、Filter 等的软件环境.
1). 可以来创建 Servlet, 并调用 Servlet 的相关生命周期方法.
2). JSP, Filter, Listener, Tag ...
4. Servlet 生命周期的方法: 以下方法都是由 Serlvet 容器负责调用.
1). 构造器: 只被调用一次. 只有第一次请求 Servlet 时, 创建 Servlet 的实例. 调用构造器.
这说明 Serlvet 的单实例的!(说明存在线程安全的问题)
2). init 方法: 只被调用一次. 在创建好实例后立即被调用. 用于初始化当前 Servlet.
3). service: 被多次调用. 每次请求都会调用 service 方法. 实际用于响应请求的.
4). destroy: 只被调用一次. 在当前 Servlet 所在的 WEB 应用被卸载前调用. 用于释放当前
Servlet 所占用的资源.
5. load-on-startup 参数:
1). 配置在 servlet 节点中:
<servlet> <!-- Servlet 注册的名字 --> <servlet-name>secondServlet</servlet-name> <!-- Servlet 的全类名 --> <servlet-class>com.atguigu.javaweb.SecondServlet</servlet-class> <!-- 可以指定 Servlet 被创建的时机 --> <load-on-startup>2</load-on-startup> </servlet>
2). load-on-startup: 可以指定 Serlvet 被创建的时机.若为负数, 则在第一次请求时被创建.
若为 0 或正数, 则在当前 WEB 应用被Serlvet 容器加载时创建实例,
且数组越小越早被创建.
6.Servlet容器响应客户请求的过程
①Servlet引擎检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象:调用该 Servlet 的构造器
③调用Servlet实例对象的init()方法。
④创建一个用于封装请求的ServletRequest对象和一个代表响应消息的ServletResponse对象,
然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,
并在卸载之前调用Servlet的destroy()方法。
7. 关于 serlvet-mapping:
1). 同一个Servlet可以被映射到多个URL上,
即多个 <servlet-mapping> 元素的<servlet-name>子元素的设置值可以是同一个
Servlet的注册名。
2). 在Servlet映射到的URL中也可以使用 * 通配符,但是只能有两种固定的格式:
一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。
<servlet-mapping> <servlet-name>secondServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
OR
<servlet-mapping> <servlet-name>secondServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
注意: 既带 / 又带扩展名的不合法.