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()。
分享到:
相关推荐
jsp 与servlet基础 1:jsp概述 2:jsp基础 3:jsp隐含对象 4:jsp中使用数据库 5:jsp与javabean ...
了解jsp+servlet+数据库的基础简单项目源码
jsp 与servlet基础学习 ppt课件
JSP实验报告,完整,详尽。1. 系统概述 图书馆管理系统,具有登录、注册、图书的添加、修改、删除,个人信息查询、修改,退出等功能。
Java+Servlet和JSP基础教程 高清晰度
这个网上购物商城系统的教程适用于 基础入门的同学,其中前端采用了一些layui的框架的知识,数据库用的也是原生的JDBC做连接。往后学习,大家会碰到很多的框架,例如JDBC的配置类不需要自己写,用mybatis就可以做...
JSP Servlet基础知识测试题
林学良Jsp&Servlet学习笔记,html格式的,很基础的学习文档。
操作jsp servlet mvc 三层的基础
这是JSP+Servlet+MySql新闻管理系统,环境Eclipse+Mysql+Tomacat8.5运行的,里面libJAR包都有,jsp+servlet+jdbc实现新闻管理系统,这个视频值得看,很基础。...
初学者必须掌握的JSP+Servlet+JavaBean一些技术:JavaEE的概述、Servlet的基础、基于Servlet的会话跟踪、高级JDBC、JSP标准动作、EL表达式和JSTL
ACCP6.0 S2 使用JSP/Servlet/Ajax技术开发新闻发布系统答案
jsp+servlet+mysql java开发基础者练习使用
Servlet与JSP.ppt的基础知识,对初学者是一个很好的选择
书中内容由浅入深、循序渐进地介绍了JSP的基本运用,其中包括网页布局与修饰、JDBC应用、Servlet应用、JSP运用、EL表达式运用、自定义标签运用、标准标签库运用等。在讲解的过程中,引用了大量的实例,且每一部分...
本压缩包含有:第1章 背景知识简介;第2章 Java开发环境及开发工具;...第4章 JSP技术基础知识;第5章 Servlet技术基础知识。总计共5个pdf文档,从基础入手,适合初学者及中等水平!希望大家前来分享~
中国人用通俗易懂的语言为您解释什么是jsp,什么是servlet,中的最基础理论知识
JSP Servlet基础入门教程.chm
运用jsp+servlet+javabean的MVC模式开发,是比较好的参考实例。适合有一定的基础知识的读者