zoukankan      html  css  js  c++  java
  • Servlet的一些细节

    由于客户端是通过URL地址访问web服务器的中的资源的,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<serv;et-mapping>元素完成。

    <servlet>元素用于注册Servlet,它包含两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置servlet的注册名称和servlet的完整类名。

    一个<servlet-mapping>元素用于映射一个已注册的servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定servlet的注册名称和servlet的对外访问路径。

    例如

    1 <servlet>
    2     <servlet-name>ServletDemo4</servlet-name>
    3     <servlet-class>cn.itcast.servlet.ServletDemo4</servlet-class>
    4   </servlet>
    5   <servlet-mapping>
    6     <servlet-name>ServletDemo4</servlet-name>
    7     <url-pattern>/ServletDemo4</url-pattern>
    8   </servlet-mapping>

     同一个servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个servlet的注册名。

    在servlet映射到的URL中也可以使用*通配符,但是只能有两种固定格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。

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

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

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

    如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建servlet的实例对象,以及调用servlet实例对象的init()方法。

    举例:

    <servlet>

      <servlet-name>invoker</servlet-name>

      <servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>

      <load-on-start>2</load-on-start>

    <servlet>

    用途:为web应用写一个Initservlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。

    如果缺在某个servlet的映射路径仅仅为一个斜杠(/),那么这个servlet就成为当前Web应用程序的缺省servlet。

    凡是在web.xml文件中找不到配置的<servlet-mapping>元素的url,他们的访问请求都将交给缺省的servlet处理,也就是说,缺省的servlet用于处理所有其他servlet都不处理的访问请求。

    在<tomcat的安装目录>confweb.xml文件中,注册了一个名称为org.appache.catalina.servlets.DefaultServlet的servlet,并将这个servlet设置为了缺省servlet。

    当访问tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省servlet。

    线程安全问题

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

    如果某个servlet实现了SingleThreadModel接口,那么servlet引擎将以单线程模式来调用其service方法。

    SingleThreadModel接口中没有定义任何方法,只要servlet类的定义的定义中增加实现SingleThreadModel接口的声明即可。

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

    实现SingleThreadModel接口并不能真正解决servlet的线程安全问题,因为servlet引擎会创建多个servlet实例对象,而真正意义上解决多线程安全问题是指一个servlet实例对象被多个线程同时调用的问题。事实上,在servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。

    标记接口,作用是打一个标签

    Serializable

    Cloneable

    SingleThreadModel

    子类不能比父类抛更多的异常

  • 相关阅读:
    设计模式之适配器模式
    设计模式之装饰者模式
    设计模式之原型模式
    【转】SQL Server中的事务与锁
    【转修正】sql server行版本控制的隔离级别
    【转】数据库系统异常排查之DMV
    【转】SQLServerDBA十大必备工具---让生活轻松点
    Jekens 配置多项目SCM GitLab+Jenkins持续集成环境
    Jekens Source Code Management None 源码管理没有Git
    Spring容器事件、自定义事件
  • 原文地址:https://www.cnblogs.com/LoganChen/p/6374364.html
Copyright © 2011-2022 走看看