Servlet

来源:互联网 发布:mysql租用 编辑:程序博客网 时间:2024/06/11 09:58

   JavaServlet是和平台无关的服务器端组建,它运行在Servlet容器中。


   Servlet是纯java语言,擅长于处理流程和业务逻辑

  Servlet的框架由两个Java包组成:
 -javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
 -java.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。

 

  Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一个接口。

  每一个Servlet都必须要实现Servlet接口,GenericServlet是个通用的,不特定与任何协议的Servlet,它实现了Servlet接口,而HttpServlet又继承于GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要继承HttpServlet即可。

Servlet接口中定义了service方法,HttpServlet对该方法进行了实现,实现的方法就是将ServletRequest与ServletResponse转换成HttpServletRequest和HttpServletResponse。


转换完毕后,会调用HttpServlet自己声明的service方法。在该service方法中,首先获得到请求的方法名,然后根据方法名调用对应的doXXX方法,比如说请求方法为GET,那么就去调用doGET方法。


在HttpServlet类中所提供的doGET,doPost等方法都是直接返回错误信息,所以我们需要在自己定义的Servlet中override这些方法。

在下列时刻Servlet容器装载Servlet:
 1.Servlet容器启动时,自动装载某些Servlet
 设置容器启动时,自动装载
 <servlet>
  <servlet-name>  </servlet-name>
  <servlet-class>  </servlet-class>
  <load-on-startup> 9</load-on-startup>
 </servlet>
 数字9代表一个优先级,可以是1 ,2 等。用于如果有多个自动装载的,哪个优先。 越小越先启动。
 2.在Servlet容器启动后,客户首次向Servlet发出请求
 3.类文件被更新后,重新装载Servlet。

对于Tomcat来说,它会将客户传递过来的参数放在一个HashTable中,该Hashtable的定义是: 


这是一个String-->String[]的键值映射。

当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destory方法。

某些Servlet在web.xml文件中只有<servlet>元素,而没有<servlet-mapping>元素,这样我们就无法通过url的方式访问这个Servlet了,这种Servlet通常会在<servlet>元素中配置一个<load-0n-startup>子元素,让容器在启动的时候自动加载该Servlet,并调用其init方法完成一些全局性的初始化工作。


Servlet的多线程同步问题
    Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。
    由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程同步问题。
    如果在编写Servlet/JSP程序时不注意到多线程同步的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫名其妙的问题,对于这类随机性的问题调试的难度也很大。

    Servlet的多线程同步问题:Servlet本身是单实例的,这样当有多个用户同时访问某个Servlet时,会访问该唯一的Servlet实例中的成员变量,如果对成员变量进行写入操作,就会导致Servlet的多线程问题, 即数据不一致。

    解决Servlet同步问题的方案:
      .去除实际变量,使用局部变量。(最好的方案)
      .使用同步代码块:
        synchronized{...}