Servlet的生命周期

摘要

虽然在大学的jsp专业课里“听说”过Servlet,但当时对Servlet的认识,的的确确停只是留在“听说”的阶段。还记得刚到公司实习那时,报了个Servlet的错,师傅问我Servlet配置对了吗

        虽然在大学的jsp专业课里“听说”过Servlet,但当时对Servlet的认识,的的确确停只是留在“听说”的阶段。还记得刚到公司实习那时,报了个Servlet的错,师傅问我Servlet配置对了吗?我来了一句:“什么配置?”,原来前几天在做DRP的过程中,渐渐加深了对Servlet的认识。下面谈一下对Servlet的理解。overview4.gif

       (文章中用登陆的业务逻辑来说明。)

       起初,java web 开发中,Client与Server的工作方式是客户端向Servlet提交请求(如提交用户名、密码),Servlet处理(如调用业务逻辑),将处理结果拼接成HTML格式返回到客户端:


       

            

            Client:login.html        

<html>
    <head>Servlet Test</head>
    <body>
        <form method="post" action="/servlet/LoginServlet">
            <input type="input" name="userName"/>
            <input type="input" name="password"/>
            <input type="submit" name="submit"/>
        </form>
    </body>
</html>



 Servlet:LoginServlet.java

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;

/**
 * 登陆
 * @author Danny
 */
public class LoginServlet extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		super.doGet(request, response);
		
response.setContentType("text/html;chartset=utf-8");
		String userName=request.getParameter("userName");
		String password=request.getParameter("password");
		boolean isLoginSuccessful=Manager.Login(userName,password);
		if(isLoginSuccessful){
		response.getWriter().print("登陆成功!");
		}else{
		response.getWriter().print("登陆失败!");
		}	
	}
}

          


          Manager代码省略~~
          

          除此之外还要在web.xml中配置Servlet:

  <servlet>
  	<servlet-name>LoginServlet</servlet-name> <!--Servlet的名字,可以任意命名-->
  	<servlet-class>com.danny.servlet.LoginServlet</servlet-class> <!--Servlet所在的真实路径-->
  </servlet>
  <servlet-mapping>
  	<servlet-name>ClientIdValidateServlet</servlet-name> <!--Servlet名字,必须与上面Servlet的名字一致-->
  	<url-pattern>/servlet/LoginServlet</url-pattern><!--Servlet虚拟路径,可以任意命名,form的action的属性值就是它-->
  </servlet-mapping>

       (web.xml配置文件中每个标签的含义可以看后面的注释)

        每个Servlet都是一个java类,都要继承javax.servlet包下的GenerateServlet类。其生命周期如下:

⑴ 客户端发送请求之后,Servlet容器(如Tomcat)读取配置文件,将Servlet加载到内存并实例化(一个Servlet只实例化一次)。

         Servlet有两种实例化的方式:

         ①在Tomcat启动时实例化,在配置文件<servlet></servlet>标签中加入<load-on-startup>1</load-on-startup>。Servlet容器按属性值由小到大进行实例化,也就是<load-on-startup>属性值越小越先被实例化,值为0的Servlet最后被实例化。因为Servlet实例化需要较长的时间,所以这种方法的好处是用户等待时间较少。

         ②调用Servlet时进行实例化,<load-on-startup>属性值小于0时,Tomcat启动时不对Servlet进行实例化,<load-on-startup>属性值默认小于0。

⑵ 实例化时,调用init()方法(此方法继承自GenerateServlet类)进行初始化。

⑶ 创建HttpResponse、HttpRequest对象,执行Service(HttpServletRequest req,HttpServletResponse res)方法,根据客户端请求的类型(post/get)来判断是接下来是调用doPost()方法还是调用doGet()方法。(HttpServletRequest负责接收页面传过来的数据,HttpServletResponse负责向页面写数据)

⑷ 服务器停止时,调用destory()方法,销毁Servlet实例。


IT家园
IT家园

网友最新评论 (0)