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

来源:互联网 发布:网络直播培训 编辑:程序博客网 时间:2024/06/02 21:06

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

Servlet的执行过程

每个Servlet作为Web应用程序的一个组件部署到容器中。当它被客户请求时,容器控制着它的执行。
Servlet的执行过程如图2.2所示:

在说一下servlet的生命周期:

读取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请求的类型(GETPOST等)并调用相应的doGet()doPost()等方法。
销毁和卸载Servlet
Servlet容器决定不再需要Servlet实例,它将在Servlet实例上调用destroy()方法,在该方法中,Servlet应该释放资源,如它在init()方法中获得的数据库连接。
在调用destroy()方法之前,容器会等待其他执行Servletservice()方法的线程结束。
如果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

配置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多了一个路径名

解决方式有两种:

第一种:

<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本身提供的方法。

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

1.初始化:正常情况下只有一次初始化。
        |-publicvoid init()throwsServletException:如果不需要取得初始化参数应用此方法。
        |-publicvoid init(ServletConfigconfig)throwsServletException:可以取得初始化参数
2.服务:一个Servlet程序肯定会服务多次,如果一个程序长时间不服务,则认为没用了,等待销毁。
publicvoid service(ServletRequestreq,ServletResponse res)
throwsServletException,IOException
一般情况下不覆写此方法,一般情况下覆写doGet()方法和doPost()方法
     publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,IOException
publicvoid doPost(HttpServletRequestreq,HttpServletResponseresp) throwsServletException,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>


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>

解释如图:



原创粉丝点击