servlet

来源:互联网 发布:雷克萨斯rx200t 知乎 编辑:程序博客网 时间:2024/06/11 11:35

servlet简介

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
最早支持Servlet标准的是JavaSoft的Java Web Server,此后,一些其它的基于Java的Web服务器开始支持标准的Servlet。
实现过程:

  1. 客户端发送请求至服务器端;
  2. 服务器将请求信息发送至 Servlet;
  3. Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
  4. 服务器将响应返回给客户端。
生命周期
    ①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
    ②装载并创建该Servlet的一个实例对象。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,
用于在 Server 启动时强制装载和初始化特定的 Servlet。
    ③调用Servlet实例对象的init()方法。
    ④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,
然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。service()(根据请求方法不同调用doGet() 或者
doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。
    ⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。

servlet初始化阶段的工作:

     Servlet容器加载servlet类,把它的. Class文件中的数据读到内存中。

     Servlet容器创建servletConfig对象。servletConfig对象包含了servlet的初始化配置信息。

  此外servlet容器还会使得servletConfig对象与当前的web应用的servletContext对象关联。

     Servlet容器创建servlet对象。

     Servlet容器调用servlet对象的init(ServletConfig   config)方法。

  通过初始化步骤,创建了servlet对象和servletConfig对象,并且servlet对象与servletConfig对象关联,

  而servletConfig对象又与当前对象的servletContext对象关联。当servlet容器完成servlet后,

servlet对象只要通过getServletContext()方法就能得到web应用的servletContext对象。

注:servlet初始化的情况:

1)当web应用处于运行阶段时,特定的servlet被客户端首次请求访问。

2)在web.xml文件中为servlet设置了<load-on-startup>元素

<servlet><servlet-name>servlet1</servlet-name><servlet-class>servlet.servlet1</servlet-class><load-on-startup>0</load-on-startup></servlet>

说明

servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:

标记容器是否在启动的时候就加载这个servlet

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。

正数的值越小,启动该servlet的优先级越高。

3)当web应用被重新启动时,web应用中的所有servlet会在特定的时间被重新初始化。


servlet对多个请求的处理:
Servlet采用多线程来处理多个请求的同时访问。Servlet容器通过线程池来管理维护服务请求。
所谓线程池,相当于数据库连接池,实际上是等待执行代码的一组线程,叫做工作者线程。Servlet容器通过一个调度线程来管理工作者线程。

    · 当容器收到一个Servlet的访问请求,调度者线程就从线程池中选出一个工作者线程,将用户请求传递给该线程,然后由该线程处理Servletservice()方法;

    · 当这个线程在执行的时候,容器收到一个新的请求,调度者线程再次从线程池中选出一个新的工作者线程;

    · 当容器同时收到对同一个Servlet的多个请求时,那么Servletservice方法将在多线程中并发执行。

注意

    1.Servlet容器默认采用单实例多线程的方式来处理请求。这样减少了产生Servlet实例的开销,提升了对请求的响应时间;

    2.对于Tomcat容器来讲,可以在其server.xml中通过<Connector>中设置线程池中的线程数目。


如何开发线程安全的servlet

Servlet容器采用多线程来处理请求,提高性能的同时也造成了线程安全问题。要开发线程安全的Servlet应该从一下几个方面进行:

    1.变量的线程安全: 多线程并不共享局部变量,所以我们要尽可能的在Servlet中使用局部变量;

    2.代码块的线程安全; 使用同步块Synchronized,防止可能调用的代码块;但是要注意的是,要尽可能得缩小同步代码的方范围,

不要在service方法和响应方法上直接使用同步,这会严重影响性能。

    3.属性的线程安全;ServletContextHttpSessionServletRequest对象中属性;

    4.使用同步集合; 使用Vector代替ArrayList,使用HashTable代替HashMap

    5.不要在Servlet中创建自己的线程来完成某个功能;Servlet本身就是多线程的,如果再创建新的线程,将会导致线程执行复杂化,出现线程安全问题;

    6.在多个Servlet中,对外部对象,比如:文件;进行修改操作一定要加锁,做到互斥访问;


原创粉丝点击