现在的位置: 首页 > 综合 > 正文

Servlet——Java EE应用中另一种常用的组件

2013年06月08日 ⁄ 综合 ⁄ 共 2787字 ⁄ 字号 评论关闭

1、Servlet是Java EE应用中另一种常用的组件,是继JDBC后,Java EE技术的第二个重要发明。

2、JSP与Servlet的区别:

JSP是嵌入Java代码的HTML页面,JSP页面是转换为Servlet来执行的。

Servlet是嵌入了HTML的Java类。

3、Servlet执行请求和响应的处理。

4、在Web应用程序中,<servlet>元素是用于描述Servlet的基本元素。<servlet>可以有下面的子元素:

·<icon>
·<servlet-name>:定义一个用户友好的名称,用于表示所用到的资源。
·<display-name>
·<description>
·< servlet -class>:定义Servlet类的完整路径名。
·<jsp-file>:定义JSP文件类的完整路径名。
·<init-paran>:定义Servlet的参数
·<load-on-startup>:用一个整数表明服务器启动时应该调用的Servlet的相对次序:具有小值的Servlet排在具有大值的Servlet的前面,相同值得Servlet会按照任意顺序调用。
·<run-as>
·<security-role-ref>

注意:必须要有的元素<servlet-name>以及< servlet -class>或者<jsp-file>之一。

5、<servlet-mapping>:用于一给定的Servlet名称与相应请求URI之间的映射。

6、因为Servlet容器只能调用Servlet类的无参的构造函数,同时当你的Servlet类没提过任何一个构造函数是,Java会自动提过一个无参数的构造函数,所以不必为Servlet类编写任何构造函数。

7、Servlet的生命周期:

1)、载入和实例化:Servlet容器赌气每个部署描述文件Web.xml文件,之后载入部署描述文件中指定的Servlet类。然后调用无参的构造函数来实例化每个Servlet类。

2)、初始化:Servlet容器调用Servlet类的init(ServletConfig)方法实现初始化。这个方法是用父类GenericServlet提供的。

·  init()方法的作用:读取Servlet的初始化参数或配置数据、初始化外部资源(如数据库连接),以及执行其他一次性的动作。

·  GenericServlet类的init()有一下两种形式:

    publicvoid init() throws ServletException

    publicvoid init(ServletConfig) throws ServletException

·  第二个方法中ServletConfig对象来自:如上第4点提到的<Servlet>的子元素<init-paran>元素定义Servlet的参数,Servlet容器从Web.xml文件读取这些参数,然后把它们按“名/值对”保存到ServletConfig对象中。

·  init(ServletConfig),首先保存ServletConfig引用,然后调用init()方法。init()方法可以访问ServletConfig引用中的所有初始化参数。

·  如果在自定义的Servlet中实现init(ServletConfig),那么一定要调用超类的init(ServletConfig)方法。如果实现init(ServletConfig)的时候没调用super. 实现init(ServletConfig)方法,那么ServletConfig引用不会被保存下来,而且Servlet或其父类不能在后续生命周期中访问ServletConfig对象。

·  如果在init()的过程中遇到问题,应当抛出ServletException类或其子类UnavailableExcption。这会告诉容器在初始化过程中存在问题,并且不应该使用这个Servlet来处理请求。使用UnavailableExcption可以设定Servlet的无效时长,过了这个时长,容器将去重新调用init()。

·  UnavailableExcption有以下构造函数

    public UnavailableExcption(Stringmsg, int seconds)

    其中int参数是一个整数:负数和零值表示不能判断该Servlet什么时候可以再用。正      整数值则说明服务器应当在若干秒之后再去重新初始化这个Servlet。

3)、请求的处理:Servlet容器调用service()方法。跟init()方法方法一样会抛出ServletException类或其子类UnavailableExcption异常,不同的是这里创建的UnavailableExcption无指定的无效时长,所以一旦抛出异常Servlet容器必须终止Servlet的生命周期。

4)、声明周期结束:Servlet容器调用destroy()方法。但是容器必须等到仍在运行的请求处理线程结束之后或服务器定义的超出时间结束时,才调用destroy()方法。这个方法也是GenericServlet父类实现的,如果你的Servlet实例不需要执行任何收尾工作,无需实现这个方法。在destroy()方法执行之后,容器释放对该Servlet实例的引用。

注意:destroy()方法并不的销毁Servlet或引发对它的垃圾收集。它只是在恰当的实际简单地清除Servlet所使用和打开的资源。显然,在调用这个方法之后,容器将不再给这个Servlet转发任何请求。

8、如何使得Servlet的线程安全:

1)、用方法变量保存请求中的专有数据。

         数据保存在方法变量中,即局部变量。这时,进入这个方法的每个线程都有自己的一份方法变量拷贝。因此,任何线程都不会修改其他线程的数据成员。如果要在不同的请求之间保存一份数据,那么应该用会话(session)来存储这类数据。

2)、只用Servlet成员变量保存那么不会改变的数据。

         这类数据保存查询数据库连接名称、其他资源的路径、其他Web组件的路径等等。

3)、同步访问你那些可能请求修改的成员变量。

4)、如果Servlet访问外部资源,那么需要同步访问这些资源。

         例如文件访问本身不是线程安全的,所以必须编写同步访问这个资源的代码。

注意:

1)、实现SingleThreadModel接口并不能保证Servlet线程安全。

2)、不要通过同步doPost()、doGet()、或Service()达到Servlet线程安全。因为随着请求数量的不断增加,原来越多的客户端就会处于不停的等待状态。

3)、尽量在最小的代码块范围上进行同步,同步代码越少,Servlet执行得才越好。

9、servlet响应过程:


抱歉!评论已关闭.