`
xiaomogui
  • 浏览: 239249 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jsp基础之Servlet

    博客分类:
  • jsp
阅读更多

     Servlet是一个接口,但是接口中是没有具体实现。
     HttpServlet是Servlet的一个具体实现。要创建一个 HTTP Servlet,要继承 HttpServlet 类,该类是用专门的方法来处理 HTML 表单的GenericServlet 的一个子类。

     Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行。如果servlet配置多个servlet-mapping,且servlet-name名字相同,则生成多个servlet。

    

    要创建一个servlet,我们须要实现这个接口的5种方法

public class Hello {
        public void destroy(){....} 
        public ServletConfig getServletConfig(){....} 
        public String getServletInfo(){....} 
        public void init(ServletConfig sc)throws ServletException{....} 
        public void service(ServletRequest req,ServletResponse resp)throws                  SevletException,IOException   {....}
}

       GenericServlet类,实现了除service方法以外的其他4种方法。我们创建servlet时只需要继承他,再加上实现一个service()方法就可以了 。
public class Hello extends GenericServlet {
         public void service(ServletRequest greq,ServletResponse gresp)throws....{....}
}

 

      ServletRequest 和ServletResponse 是由容器生产商(tomcat或weblogic等等)按照ServletRequest接口的定义,在容器中自动实例化生成的一个请求对象。这个对象能用该接口定义的15个方法进行操作。当然不同的生产商,实例化出来的对象都会有所不同,只不过我们不关心不同的那些部分,只关心共同的这15个操作方法(他还有什么别的方法我也不管)。

      这个servlet要实现什么功能,就都写在这个service里了。这样做的最大好处是,可以编写不限于HTTP的其他应用,比如FTP,MAIL等等。

     在GenericServlet类之下,有一个HttpServlet类。

     我们大多数时候,只需要继承HttpServlet类就行了。当然这时候我们要写的代码就是

public class Hello extends HttpServlet {
        public void service(HttpServletRequest req,HttpServletResponse resp)throws ....{....}
}

 

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet extends HttpServlet {

	private int g_count = 0;
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doGet(req, resp);
		g_count ++;
		System.out.println(" doGet====="+ g_count);
	}

	@Override
	protected void doPut(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.doPut(req, resp);
	}

	/**
	 *  每次请求都执行
	 */
	@Override
	protected void service(HttpServletRequest arg0, HttpServletResponse arg1)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		super.service(arg0, arg1);
		int t_count=0;
		g_count ++;
		System.out.println(" service_g_count====="+ g_count);
		System.out.println(" service_t_count====="+ t_count);
	}

	/**
	 *  destroy 方法并不是销毁一个servlet,而是容器在销毁一个servlet之前,
	 *  运行程序员执行一些操作,比如关闭数据库连接...
	 *  
	 */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
	}

	/**
	 *  init方法在第一个httpServlet请求的时候初始化,
	 *  第二个httpServlet请求的时候不执行这个方法
	 */
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
		g_count ++;
		System.out.println(" init====="+ g_count);
	}

}

     对于第一次请求g_count加上3。init,service,do**()。

     对于第二次及其以后的请求每次加2,   service,do**()。

     如:当第一次打开浏览器A输出: init=====1

                                                service_g_count=====2

                                                service_t_count=====0

                                                doGet=====3

 

            A当刷新一次浏览器输出:

                                                service_g_count=====4

                                                service_t_count=====0

                                                doGet=====5

            

             当关闭当前浏览器A,重新打开一个浏览器B:

                                                service_g_count=====6

                                                service_t_count=====0

                                                doGet=====7

            重启tomcat以后,刷新浏览器B:

                                               init=====1

                                                service_g_count=====2

                                                service_t_count=====0

                                                doGet=====3

     注意:当关闭当前浏览器,重新打开一个浏览器 原因是tomcat默认情况下是缓存客户端的session,这个是可以设置的,不同的tomcat版本可能不同,我用的是tocat5.0测试的。

     当第一个客户请求到达时,Web容器会根据配置文件(web.xml)找到相应的Servlet类,进行实例化。Servlet的执行过程也就是Servlet的生命周期:

一、初始化时期

  该时期调用了init()方法,当Servlet被Servlet引擎载入后,接下来就会执行init()这个方法,因此我们可以重载这个方法以做一些我们自己的初始化的工作。但不要忘记,自己的init()结束后,要记得呼叫super.init()以完成系统的初始化。

  在Servlet的生命期中,init()方法只被执行一次,init()方法仅在服务器实例化Servlet时被执行,此后无论有多少客户机访问这个Servlet,init()都不会被重复执行。

  当init()抛出异常或在规定的一个时间周期内没有返回值时,init()失败,Servlet将无法被服务器装入。

  重载init()方法的基本格式是:

public   void   init(ServletConfig   config)   throws   ServletException   {...}
 

二、执行时期

  在Servlet被载入后,主要通过service()方法对外响应,该方法可以被同时、多次地呼叫。

  由于HttpServlet类有它自己的service()方法,所以对于HttpServlet类而言,它所使用的是自己的service()方法,我们一般所指的service()方法也是指HttpServlet类中的service()方法,当它接收到一个OPTIONS请求时,它会调用doOption()方法,同样,当它接收到一个TRACE请求时,它会调用doTrace()方法。service()方法一般不被重载。通过doOption()方法会决定相应地调用doGet()、doPost()、doPut()、doDelete()这些方法的一种或几种。doOption()方法和doTrace()方法通常也不被重载。

 

三、结束时期

  当服务器卸载一个Servlet时,它将调用destroy()方法。这个方法给Servlet一个时机清除控制的任何资源(比如内存、文件句柄、线程)。如果你需要在结束时,关闭一些资源,你也可以重载这个方法,同样的,自己的destroy()结束后,要记得呼叫super.destroy()。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics