tomcat javaweb开发基础( 9 servlet(2))

一:首先介绍一下:servlet的执行过程和生命周期

Servlet的执行过程

每个 Servlet 作为 Web 应用程序的一个组件部署到容器中。当它被客户请求时,容器控制着它的执行。
Servlet 的执行过程如图 2.2 所示:
tomcat javaweb开发基础( 9 servlet(2))_第1张图片

在说一下servlet的生命周期:

tomcat javaweb开发基础( 9 servlet(2))_第2张图片

读取 web.xml 文件
Servlet 容器启动时,它将查找一组部署文件,这些配置文件描述了所有的 Web 应用程序
每个 Web 应用程序都有它自己的名为 web.xml 的部署描述文件,其中包括应用程序所使用的每个 Servlet 的入口。
一个入口指定了 Servlet 名称和对应的 Java 类名称
创建实例
对每个 Servlet 类, Servlet 容器使用

Class.forName(className).newInstance()

方法加载并创建一个实例。

1初始化
一旦容器创建了 servlet 实例,它将在新创建的实例上调用 init( ServletConfig ) 方法。
ServletConfig 对象包含了所有的在 web 应用程序的 DD 文件中指定的初始化参数。
init() 方法返回后, servlet 就被初始化了。
2预初始化
servlet 第一次被请求时才对它初始化,这叫做 延迟加载
优点 : 大大提高 servlet 容器的启动时间
缺点 : 如果在初始化时 servlet 要完成很多任务,如从数据库中缓存静态数据,则发送第一个请求的客户的响应时间会很长
servlet 规范定义了 <load-on-startup> 元素,它可以在部署描述文件中指定当 servlet 容器启动时装载并初始化 servlet
在任何请求达到之前装载 servlet 的过程称为 预装载或预初始化
3为客户请求服务
servlet 实例正常初始化后,它就准备为客户提供服务。
当容器接收到请求时, 都会创建一个新的线程,然后 调用

  service(ServletRequest,ServletResponse)方法。

service() 方法将检查 HTTP 请求的类型( GET POST 等)并调用相应的 doGet () doPost () 等方法。
销毁和卸载Servlet
Servlet 容器决定不再需要 Servlet 实例,它将在 Servlet 实例上调用 destroy() 方法,在该方法中, Servlet 应该释放资源,如它在 init() 方法中获得的数据库连接。
在调用 destroy() 方法之前,容器会等待其他执行 Servlet service() 方法的线程结束。
如果 Servlet 容器关闭,它也将销毁 Servlet
二;接受表单参数

package org.lxh.servlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class InputServlet extends HttpServlet{
	public void doGet(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
		String param = req.getParameter("ref") ;
		System.out.println("*************"+param) ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
		this.doGet(req,resp) ;
	}
};

在webdemo下面新建一个文件夹serdemo里面新建In.htm

tomcat javaweb开发基础( 9 servlet(2))_第3张图片

配置web.xml

<servlet>
   <servlet-name>inp</servlet-name>
   <servlet-class>org.lxh.servlet.InputServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>inp</servlet-name>
	<url-pattern>/input</url-pattern>
</servlet-mapping>
很明显路径错误:文件夹serdemo里面新建In.htm

所以这个路径inputservlet.java多了一个路径名

tomcat javaweb开发基础( 9 servlet(2))_第4张图片

tomcat javaweb开发基础( 9 servlet(2))_第5张图片

解决方式有两种:

第一种:

<form action=“../input" method="post">
	请输入参数:<input type="text" name="ref">
	<input type="submit" value="提交">
</form>
比较好的是第二中:

第二种


<servlet-mapping>
		<servlet-name>inp</servlet-name>
		<url-pattern>/serdemo/input</url-pattern>
	</servlet-mapping>

三: Servlet生命周期实例

之前简单给大家说了一下 servlet 的生命周期, WEB 容器负责 servlet 程序的生命周期,如果想要观察 servlet 的生命周期,则可以通过 servlet 本身提供的方法。
tomcat javaweb开发基础( 9 servlet(2))_第6张图片

Servlet本身也只关心初始化,服务和销毁三个操作。

1. 初始化:正常情况下只有一次初始化。
        |-publicvoid init()throws ServletException : 如果不需要取得初始化参数应用此方法。
        |-publicvoid init( ServletConfig config )throws ServletException :可以取得初始化参数
2. 服务:一个 Servlet 程序肯定会服务多次,如果一个程序长时间不服务,则认为没用了,等待销毁。
publicvoid service( ServletRequest req,ServletResponse res)
throws ServletException , IOException
一般情况下不覆写此方法,一般情况下覆写 doGet () 方法和 doPost () 方法
     publicvoid doGet ( HttpServletRequest req , HttpServletResponse resp ) throws ServletException,IOException
publicvoid doPost ( HttpServletRequest req , HttpServletResponse resp ) throws ServletException,IOException              
3. 销毁:正常情况下也只有一次,容器关闭时销毁。

                    public voiddestroy() ;

LifeCycleServlet.java
package org.lxh.servlet ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class LifeCycleServlet extends HttpServlet{
	public void init() throws ServletException{
		System.out.println("************** 初始化 **************") ;
	}
	public void doGet(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
		System.out.println("************** 服务 **************") ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,java.io.IOException{
		this.doGet(req,resp) ;
	}
	public void destroy(){
		System.out.println("************** 销毁 **************") ;
	}
};

编写web.xml进行配置
<servlet>
	<servlet-name>life</servlet-name>
	<servlet-class>org.lxh.servlet.LifeCycleServlet</servlet-class>
	</servlet>
<servlet-mapping>
	<servlet-name>life</servlet-name>
	<url-pattern>/life</url-pattern>
</servlet-mapping>

tomcat javaweb开发基础( 9 servlet(2))_第7张图片
public void destroy(){
		System.out.println("************** 销毁 **************") ;
	try{   
                Thread.sleep(3000);
  }catch(Exception e){ }
}

正常情况下,初始化是在一个Servlet第一次使用的时候进行的。每一次提交请求,就会触发服务的操作。
public void init(ServletConfig config) throws ServletException{
        System.out.println("*** 初始化"+config.getInitParameter("ref1")+" ***") ;
	}
public void service(ServletRequest req,ServletResponse res){
	System.out.println("************** service服务 **************") ;
	}

在web.xml中设置参数
<servlet>
	<servlet-name>life</servlet-name>
	<servlet-class>org.lxh.servlet.LifeCycleServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
	<init-param>
		<param-name>ref1</param-name>
		<param-value>MLDN</param-value>
	</init-param>
</servlet>

解释如图:
tomcat javaweb开发基础( 9 servlet(2))_第8张图片


你可能感兴趣的:(tomcat javaweb开发基础( 9 servlet(2)))