(1)Servlet 对象,通过生命周期托管的方式实现单例设计模式
(2) 默认效果是延迟加载
以 Tomcat9 为例,需要在 web.xml 配置文件中为操作资源配置配置八行代码
<servlet>
<servlet-name>xxxservlet-name>
<servlet-class>controller.XxxControllerservlet-class>
servlet>
<servlet-mapping>
<servlet-name>xxxservlet-name>
<url-pattern>/xxxurl-pattern>
servlet-mapping>
为什么需要配置两部分,将请求名字与真实类名分开?
因为如果服务器启动时加载全部 Servlet 对象,成本压力非常大,所以采用延迟加载方式。Tomcat 启动时,读取 web.xml 配置文件,获取请求名与真实类名的对应关系;等到需要调用这个类时才生成对象。
(3)Servlet 对象生命周期:
Tomcat9 为了更好的管理对象的产生和销毁,提供了三个方法标识 Servlet 对象的生命周期
init()
service()
destroy()
如果你在控制层对象中重写了 init()
方法,你会发现该方法是在浏览器请求到该资源的时候才启动,也从侧面印证了Servlet 对象是延迟加载的。
(4)Servlet 加载方式改为立即加载
以 Tomcat9 为例,在 web.xml 配置文件中添加一行内容:
<servlet>
...
<load-on-startup>优先级load-on-startup>
servlet>
<servlet-mapping>
...
servlet-mapping>
这一行内容,无论优先级数字是大还是小,都是立即加载方式。优先级数字的大小是控制多个 Servlet 对象的立即加载顺序而已(5)Servlet 对象加载时,可以携带信息
以 Tomcat9 为例,在 web.xml 配置文件中添加以下内容:
<servlet>
...
<init-param>
<param-name>key1param-name>
<param-value>value1param-value>
init-param>
...
<init-param>
<param-name>keyNparam-name>
<param-value>valueNparam-value>
init-param>
servlet>
<servlet-mapping>
...
servlet-mapping>
与此对应的,Servlet 对象生命周期的 init()
方法有一个重载方法读取 Servlet 对象加载时携带的信息
public void init(ServletConfig config){
String value = config.getInitParameter("key");//某一个key对应的value
Enumeration en = config.getInitParameterNames();//获取全部的key
String name = config.getServletName();//获取当前Servlet类名
ServletContext application = config.getServletContext();//获取全局上下文对象,JSP九大内置对象之一
}
(6)Servlet 类的继承关系
接口 ServletConfig,源码
public interface ServletConfig {
String getServletName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration<String> getInitParameterNames();
}
接口 Servlet,源码
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
ServletConfig getServletConfig();
void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
String getServletInfo();
void destroy();
}
抽象类 GenericServlet,源码
实现三个接口,体现了缺省适配器模式;从接口中继承了全部方法,总共9个,其中8个方法都进行了方法重写(添加具体实现),除了 service()
方法,子类必须重写:
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
多了一个 init()
无参的重载方法,
public void init() throws ServletException {}
和两个 log()
方法
public void log(String message) {
this.getServletContext().log(this.getServletName() + ": " + message);
}
public void log(String message, Throwable t) {
this.getServletContext().log(this.getServletName() + ": " + message, t);
}
抽象类 HttpServlet
体现了面向对象的编程思想(具体化的说明和体现)肯定是跟HTTP协议有关
request.getMethod();
获取请求的方式 get/post/xxx我们自己写的 Servlet 类