一、新建一个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 敲错了