﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Hello Java-随笔分类-J2EE</title><link>http://www.blogjava.net/doulei/category/12182.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:33:28 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:33:28 GMT</pubDate><ttl>60</ttl><item><title>Servlet 2.4规范阅读笔记(2-3章)</title><link>http://www.blogjava.net/doulei/archive/2006/06/14/52866.html</link><dc:creator>Hello Java</dc:creator><author>Hello Java</author><pubDate>Wed, 14 Jun 2006 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/doulei/archive/2006/06/14/52866.html</guid><wfw:comment>http://www.blogjava.net/doulei/comments/52866.html</wfw:comment><comments>http://www.blogjava.net/doulei/archive/2006/06/14/52866.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/doulei/comments/commentRss/52866.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/doulei/services/trackbacks/52866.html</trackback:ping><description><![CDATA[
		<div style="text-align: center;">
				<font size="3">
						<span style="font-weight: bold;">
								<font size="6">第2章 The servlet Interface</font>
						</span>
				</font>
				<br />
				<font size="3">
						<span style="font-weight: bold;">
						</span>
				</font>
		</div>
		<font size="3">
				<span style="font-weight: bold;">
				</span>所有Servlet实现同一接口：Servlet,它有两个直接的子类：GenericServlet和HttpServlet.<br /><span style="font-weight: bold;"> 2.1 Request Handle method<br /></span>基本的Servlet使用service()方法处理请求,因为可能有多个客户的请求在service()中工作，所以开发者必须要考虑到并发的情况。<span style="font-weight: bold;"><br />SRV.2.1.1 HTTP Specific Request Handling Methods</span><br />HttpServlet定义了以下7个方法：</font>
		<br />
		<ul>
				<li>
						<font size="3">
doGet for handling HTTP GET requests</font>
				</li>
				<li>
						<font size="3">
doPost for handling HTTP POST requests</font>
				</li>
				<li>
						<font size="3">
doPut for handling HTTP PUT requests</font>
				</li>
				<li>
						<font size="3">
doDelete for handling HTTP DELETE requests</font>
				</li>
				<li>
						<font size="3">
doHead for handling HTTP HEAD requests</font>
				</li>
				<li>
						<font size="3">
doOptions for handling HTTP OPTIONS requests</font>
				</li>
				<li>
						<font size="3">
doTrace for handling HTTP TRACE requests</font>
				</li>
		</ul>
		<font size="3">
				<span style="font-weight: bold;">SRV.2.1.2 Additional Methods<br />    </span>关于Http的几个附加命令HEAD,DELETE,PUT,OPTIONS,TRACE。<br /><span style="font-weight: bold;">SRV.2.1.3 Conditional GET Support<br /></span>这个”Conditional GET“指的是这样的请求：只有所请求的资源在一个特定时间之后被修改过，才被发送给客户端。<br />
HttpServlet里的getLastModified()方法提供了这方面的支持。<span style="font-weight: bold;"><br /></span><span style="font-weight: bold;"></span><span style="font-weight: bold;">SRV.2.2 Number of Instances</span><br />
    在2.4之前的版本中，Servlet有两种方式：<br />
    第一种方式是对于一个Servlet，只有一个实例，这个实例可以同时服务多个用户，这是默认的。<br />
    另一种方式是一个Servlet的实例只能服务一个客户，这样就需要一个Servlet的Pool，当多个用户连接时，需要建立多个Servlet实例。这种方式需要Servlet实现SingleThreadModel接口。<br />
    以上两种方式的比较：第一种方式需要考虑同步问题（因为一个Servlet的实例服务多个用户，Servlet中的数据成员需要同步),第二种方式不需要考虑同步问题。<br />
   <br /><span style="font-weight: bold;">SRV.2.3 Servlet Life Cycle</span><br />
 <span style="font-weight: bold;">   1.载入：   </span><br />
    应用服务器可能在启动时载入Servlet或者在第一个请求到来时延迟加载,载入的方式也是使用类装载器，和普通的Java Object没有什么区别。<br /><span style="font-weight: bold;">     2.初始化： </span><br />
    初始化时可能遇到错误，这时会抛出ServletException或者UnaviliableException异常<br />
    <span style="font-weight: bold;">3.多线程：</span><br />
    需要注意的一点是，最好不要对service()方法进行synchronize修饰。这样的话就不能使用线程池，而必须对request序列化<br />
    <span style="font-weight: bold;">4.处理请求时的错误处理：</span><br />   
如果在这时发生异常，可以发送UnavailableException或者ServletException,如果发送了
ServletException,服务器必须要想办法清除request。如果发送了UnavailableException,有两种选择，如果是永
久的的无效，需要调用destroy()，并摧毁Servlet，如果这时客户端访问此Servlet，它将会收到404错误。如果是临时的无效，容器需
要拒绝任何到此Servlet的请求，并且返回503错误<br />
  <span style="font-weight: bold;"> 5.线程安全的话题</span><br />
    request和response这两个对象不是线程安全的，所以不要在service()方法外面使用它们，它们的引用不应该传给另一个线程中的对象，如果一定要访问它们，必须对使用这两个对象的代码进行同步。<br style="font-weight: bold; text-decoration: underline;" /><span style="font-weight: bold;">    6.服务的结束</span><span style="font-weight: bold; text-decoration: underline;"><br /></span>   Servlet容器并不需要一直保持一个Servlet处于运行状态，在释放一个servlet时，会调用destroy方法，当调用destroy方法之前，容器会一直等到所有的线程都完成了在service()方法中的工作。<br /></font>
		<div style="text-align: center;">
				<font style="font-weight: bold;" size="6">第3章 Servlet Context<br /></font>
				<div style="text-align: left;">
						<font size="3">
								<span style="font-weight: bold;">SRV.3.1 Introduction to the ServletContext Interface</span>
								<br />
    Servlet Context，从Servlet的角度来看，可以理解为它所属Web应用程序，ServletContext是一个接口，Servlet容器的提供商必须要实现这个接口。<br />
    ServletContext能做什么呢？它可以把事件记录到日志中，获得资源的URL，还可以利用ServletContext存放一些所有Servlet都能共享的数据。<br />
    ServletContext有一个路径，例如http://www.mycorp.com/catalog，这里的cataqlog就是ServletContext的路径，所有的对catalog的请求都会关联到这个ServletContext.<br /><span style="font-weight: bold;">SRV.3.2 Scope of a ServletContext Interface</span><br /></font>
				</div>
		</div>
		<br />
		<font size="3">在Servlet容器中，每个ServletContext通常只有一个实例。当Web容器是分布式的部署在多台机器上时，那一个ServletContext在每个JVM上都有一个实例。<br />
在Servlet容器中，但没有部署的Servlet也是允许的，这种Servlet属于一个缺省的ServletContext，这种缺省的ServletContext不能被分布到多个JVM上。<br /><span style="font-weight: bold;">SRV.3.3 Initialization Parameters<br /></span>在ServletContext接口中，有两个方法可以用来获得初始化参数：<span style="font-weight: bold;"><br /></span>• getInitParameter<br />
• getInitParameterNames<br /><span style="font-weight: bold;">SRV.3.4 Context Attributes<br /></span>在ServletContext中，有4个方法可以用来设置和管理ServletContext的属性：<span style="font-weight: bold;"><br /></span>• setAttribute<br />
• getAttribute<br />
• getAttributeNames<br />
• removeAttribute<br /><span style="font-weight: bold;">SRV.3.4.1 Context Attributes in a Distributed Container<br /></span>ServletContext中的属性只在本地的JVM中有效，不能被分布式环境中运行于其它JVM中的Servlet访问，如果需要在分布式环境中共享数据，可以把数据存放在Session，数据库或EJB中。<br /><span style="font-weight: bold;">SRV.3.5 Resources</span><br /><span style="font-weight: bold;"></span>资源指的是在Web应用程序中的一些静态的内容，如静态HTML页面，图片等等。ServletContext提供了两个方法来访问这些资源：<br />
• getResource<br />
• getResourceAsStream<br />
这两个方法都接受一个String型参数，它指定了一个以"/"开头的相对于这个ServletContext的资源路径。资源可以放在同一服务器上，或者不同服务器上，或者在一个Web应用程序的WAR包中。<br />
需要注意的是，这两个方法不能用来获取动态内容，如果我们用这两个方法去取一个JSP页面，返回的将是JSP页面的源代码。<br />
getResourcePaths(String path)方法可以用来获取一个资源列表。<br /><span style="font-weight: bold;">SRV.3.6 Multiple Hosts and Servlet Contexts<br /></span>Web服务器可能支持多个域名分享一个IP地址，这种配置叫做“虚拟主机”。在这种情况下，每个虚拟主机必须要有自己的ServletContext，而不能共享一个ServletContext。<br /><span style="font-weight: bold;">SRV.3.7 Reloading Considerations<br /></span>所有的Servlet和它们引用的类必须都处于一个类装载器范围内。<br /><span style="font-weight: bold;">SRV.3.7.1 Temporary Working Directories</span><br /><span style="font-weight: bold;"></span>每一个ServletContext都需要一个临时目录，并且通过
javax.servlet.context.tempdir属性指定。Servlet容器不需要管理这个临时路径的内容，但是要确保一个
ServletContext的临时目录对其他的ServletContext是不可见的。<br /><span style="font-weight: bold;"></span><span style="font-weight: bold;"></span></font>
<img src ="http://www.blogjava.net/doulei/aggbug/52866.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/doulei/" target="_blank">Hello Java</a> 2006-06-14 23:43 <a href="http://www.blogjava.net/doulei/archive/2006/06/14/52866.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>