[Java] Servlet

1. 什么是Servlet

Servlet是Sun公司提供的一门用于开发动态Web资源的技术。
Sun公司在其API中提供了一个Servlet接口,用户如果想开发一个动态Web资源,
需要完成以下2个步骤:
(1)编写一个Java类,实现Servlet接口。
(2)把开发好的Java类部署到Web服务器中。

通常我们也把实现了Servlet接口的Java程序,也称之为Servlet。

2. Web服务器处理请求的过程

Servlet程序由Web服务器调用,Web服务器收到客户端对Servlet的访问请求后:
(1)Web服务器首先检查是否已创建并装载了该Servlet的实例对象,是(4)否(2)
(2)创建并装载该Servlet的一个实例对象
(3)调用Servlet实例对象的init()方法
(4)创建一个用于封装HTTP请求消息的HttpServletRequest对象,和一个代表HTTP响应的HttpServletResponse对象。然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
(5)Web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法

3. HttpServlet的doGet与doPost方法

Servlet接口Sun公司定义了2个默认实现类,分别为:GenericServlet,HttpServlet
开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。
因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。

4. 多次请求共用一个Servlet实例

Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。

针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。

在Servlet的整个生命周期内,Servlet的init方法只被调用一次。
而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。
对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。

5. 线程安全性

当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。

针对Servlet的线程安全问题,Sun公司是提供有解决方案的:
让Servlet去实现一个SingleThreadModel接口。

对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。

6. ServletContext对象

WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。
ServletContext对象通常也被称之为context域对象。

servlet1:

ServletContext context = this.getServletConfig().getServletContext();
context.setAttribute("data", data);

servlet2:

ServletContext context = this.getServletContext();
tring data = (String) context.getAttribute("data");
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,430评论 11 349
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,901评论 18 399
  • 简书 賈小強转载请注明原创出处,谢谢! Servlet是一种允许响应请求的Java类。虽然Servlet可以响应任...
    賈小強阅读 13,593评论 1 44
  • Servlet编程需要使用到javax.servlet 和 javax.servlet.http两个包下面的类和...
    谁吃了我的薯条阅读 2,682评论 0 0
  • 1 如何开发一个Servlet(重点) 1.1 步骤: 1)编写java类,继承HttpServlet类 2)重新...
    yangliangliang阅读 2,817评论 0 0