Servlet简单总结
最近在补充java web方面的只是,所以第一期选择进行servlet方面的文章的总结。
简单得说,servlet的作用就是为客户提供服务,也就是接受一个客户的请求,然后做出反应再返回。servlet能够完成基本的http请求处理。也就是客户端传过来一些参数,然后servlet接受并且使用这些参数,然后迅速地做出响应。
下面我将从servlet的生命周期,处理客户请求的线程模型,继承体系,优缺点四个方面对servlet进行一个笼统的介绍。
1.servlet的生命周期
//详情请见https://www.cnblogs.com/lgk8023/p/6427977.html
(1)加载servlet类
在客户端向web服务器发出请求后,Web服务器进行请求的接收,然后再将请求发送给servlet,这时servlet容器需要进行servlet类的加载。在进行servlet类加载时需要知道servlet类的地址(本地地址或者网络地址),通过地址的引导找到类再进行类的加载。
(2)实例化
在加载完servlet类后,需要进行实例化。也就是进行servlet构造方法的调用,值得注意的是,在这是并没有生成servlet对象。
(3)初始化
在构造方法调用完毕后,会进行servlet的init()函数的调用,这个方法在servlet一生中只会调用一次,在这一步才会生成servlet对象。
(4)请求处理
在这一步,会调用servlet的service()方法(GenericServlet类与HttpServlet类不同,GenericServlet类无论是get还是post都使用service(),HttpServlet在使用get方法时使用doGet()方法,在使用post方法时使用doPost()方法),rvlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。
(5)服务终止
在这一步,会调用destroy()方法进行服务的终止。
2.处理客户请求的线程模型
//详情请见https://www.cnblogs.com/GtShare/p/8033637.html
Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程。
当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,
容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。 Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
3.继承体系
任何一个类继承了servlet接口就是一个servlet程序,在实际使用中继承有两种继承,分别是GenericServlet与HttpServlet,这两种都是Servlet接口的实现,只不过GenericServlet类与HttpServlet类不同,GenericServlet类无论是get还是post都使用service(),HttpServlet在使用get方法时使用doGet()方法,在使用post方法时使用doPost()方法。
4.优缺点
优点:servlet相比于传统的CGI(通用网关接口)编程,具有更高的效率,更容易使用,功能更强大,具有更好的移植性,更节省投资。
缺点:web.xml配置量太多(servlet3.0不需要配置web.xml);servlet具有容器依赖性,不利于单元测试;请求很局限;页面内容展示极差。
<!--本人小白一个,有什么错请大神指教-->