<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JustOnly</title>
    <description>I am death?</description>
    <link>http://justonly.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Tomcat 数据源的使用(2)</title>
        <author>JustOnly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justonly.javaeye.com">JustOnly</a>&nbsp;
          链接：<a href="http://justonly.javaeye.com/blog/108670" style="color:red;">http://justonly.javaeye.com/blog/108670</a>&nbsp;
          发表时间: 2007年08月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div style="DISPLAY: none">&nbsp;八.在WEB中应用JNDI访问数据源</div>
<div style="DISPLAY: none">--java:comp/env是TOMCAT 固定的,Tomcat提供的JNDI绑定都必须加此前缀,</div>
<div style="DISPLAY: none">--jdbc/dstest 是定义数据源时的数据名</div>
<div style="DISPLAY: none">&nbsp;final String JNDINAME =&quot;java:comp/env/jdbc/dstest&quot;;</div>
<div style="DISPLAY: none">&nbsp;Context&nbsp; ctx = new InitalContext();</div>
<div style="DISPLAY: none">&nbsp;DataSource ds = (DataSource)ctx.lookup(JNDINAME);</div>
<div style="DISPLAY: none">&nbsp;Connection conn = ds.getConnection();</div>
<div style="DISPLAY: none">&nbsp;Statement stmt=conn.createrStatement();</div>
<div style="DISPLAY: none">&nbsp;ResultSet rs = stmt.executeQuery( &quot;sql 语句&quot;);</div>
<div style="DISPLAY: none">&nbsp;while(rs.next)</div>
<div style="DISPLAY: none">&nbsp;{}</div>
<div style="DISPLAY: none">---------</div>
<div style="DISPLAY: none">可通过修改server.xml文件来进行配置全局数据源,配置方式与局部数据源类似,只是修改的文件不同.</div>
<div style="DISPLAY: none">局部数据源只需要修改web应用的配置文件,而全局数据源需要修改Tomcat的系统文件.</div>
<div style="DISPLAY: none">一般尽量不使用全局数据源.</div>
          <br/>
          <span style="color:red;">
            <a href="http://justonly.javaeye.com/blog/108670#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 03 Aug 2007 20:57:27 +0800</pubDate>
        <link>http://justonly.javaeye.com/blog/108670</link>
        <guid>http://justonly.javaeye.com/blog/108670</guid>
      </item>
      <item>
        <title>Tomcat 的数据源使用(1)</title>
        <author>JustOnly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justonly.javaeye.com">JustOnly</a>&nbsp;
          链接：<a href="http://justonly.javaeye.com/blog/108300" style="color:red;">http://justonly.javaeye.com/blog/108300</a>&nbsp;
          发表时间: 2007年08月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一、<strong>数据源简介</strong>：
<p>　　在Java语言中，DataSource对象就是一个代表数据源实体的对象。一个数据源就是一个用来存储数据的工具，它可以是复杂的大型企业级数据库，也可以是简单得只有行和列的文件。数据源可以位于在服务器端，也可以位于客服端。</p>
<p>　　应用程序通过一个连接来访问数据源，那么一个DataSource对象就是用于提供连接数据源的工具。DataSource接口提供了两个方法用于建立和数据源的连接。</p>
<p>　　使用DataSource对象建立和数据库的连接比起使用DriverManager接口更加高效，虽然两者的使用范围都很相似，并且都提供了方法用于建立和数据库的连接，设置连接的最大超时时间，获取流、登录。<br />
&nbsp;&nbsp; <br />
　　但两者之间的区别更加明显。和DriverManager不同，一个DataSource对象能够识别和描述它所代表的数据源的属性，而且DataSource对象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的关系，DataSource的建立、发布、独立于应用程序的管理都依靠JNDI技术。<br />
&nbsp;&nbsp;&nbsp; <br />
　　在JDBC2.0或JDBC3.0中，所有的数据库驱动程序提供商必须提供一个实现了DataSource接口的类，要使用数据源必须首先在JNDI中注册该数据源对象。</p>
<p>　　如果在JNDI中注册了数据源对象，将会比起使用DriverManager来具有两个方面的优势：</p>
<p>　　首先程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码，程序员可以选择先在JNDI中注册这个数据源对象，然后在程序中使用一个逻辑名称来引用它，JNDI会自动根据你给出的名称找到与这个名称绑定的DataSource对象。然后就可以使用这个DataSource对象来建立和具体数据库的连接了。</p>
<p>　　其次，使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。</p>
<p><br />
　<strong>　二、JNDI简介：</strong></p>
<p>　　JNDI是用于向Java程序提供目录和命名功能的API。它被设计成独立于特定的目录服务，所以各种各样的目录都可以通过相同的方式进行访问。</p>
<p>　　可以简单地把JNDI理解为一种将对象和名字绑定的技术，对象工厂负责生产出对象，这些对象都和惟一的名字绑定。外部程序可以通过名字来获取对某个对象的引用。</p>
<p>　　在Intranets(企业内部网)和Internates（互联网）中目录服务(Directory service)扮演了一个非常重要的角色，它能够在众多的用户、机器、网络、服务、应用程序中访问各种各样的信息。目录服务提供了一系列的命名措施，用人类可以理解的命名方式来刻画各种各样的实体之间的关系。</p>
<p>　　一个企业式计算环境(computing environment)通常是由若干代表不同部分的命名复合而成。比如在一个企业级环境中DNS(Domain Name System)通常被当成顶层的命名方案(top-level namein facility)区分不同的部门或组织。而这些部门或组织自己又可以使用诸如LADP或NDS的目录服务。</p>
<p>　　从用户的角度来看，这些都是由不同的命名方案构成的复合名称。URL就是一个很典型的例子，它由多个命名方案构成。使用目录服务的应用程序必须支持这种复合构成方式。</p>
<p>　　使用目录服务API的Java开发人员获得的好处不仅在于API独立于特定的目录或命名服务，而且可以通过多层的命名方案无缝访问(seamless acess)目录对象。实际上，任何的应用程序都可以将自身的对象和特定的命名绑定起来，这种功能可以使到任何的Java程序查找和获取任何类型的对象。</p>
<p>　　终端用户可以方便地使用逻辑名称从而轻易地在网络上查找和识别各种不同的对象，目录服务的开发人员可以使用API方便地在不同的客服端之间切换而不需要作任何更改。</p>
<p><br />
　<strong>　三、数据源和连接池的关系：</strong></p>
<p>　　JDBC2.0提供了javax.sql.DataSource接口，它负责建立与数据库的连接，在应用程序访问数据库时不需要编写连接数据库的代码，可以直接从数据源获得数据库连接。<br />
　<br />
　　在DataSource中事先建立了多个数据库连接，这些数据库连接保存在连接池(Connect Pool)中。Java程序访问数据库时，只需要从连接池中取出空闲状态的数据库连接；当程序访问数据库结束，再将数据库连接放回连接池。</p>
<p><br />
　　<strong>四、数据源和JNDI的关系：</strong></p>
<p>　　DataSource对象是由Tomcat提供的，因此不能在程序中采用创建一个实例的方式来生产DataSource对象，而需要采用Java的另一个技术JNDI，来获得DataSource对象的引用。</p>
<p>　　Tomcat把DataSource作为一种可以配置的JNDI资源来处理。生成DataSource对象的工厂为org.apache.commons.dbcp.BasicDataSourceFactory。</p>
<p>　　在javax.naming包中提供了Context接口，该接口提供了将对象和名字绑定，以及通过名字检索对象的方法。Context中的主要方法有：</p>
<p>　　bind(String name,Object object)：将对象与一个名字绑定<br />
　　lookup(String name)：返回与指定的名字绑定的对象</p>
<p><strong>五、Tomcat中数据源的配置：</strong> </p>
<p>　　数据源的配置涉及修改server.xml和web.xml，在server.xml中加入定义数据源的元素<resource></resource>，在web.xml加入<resource-ref></resource-ref>元素，声明该Web应用所引用的数据。</p>
<p>　　A．在server.xml中加入<resource></resource>元素：<resource></resource>元素用来定义JNDI Resource。<br />
　　<br />
　　属性&nbsp;&nbsp;&nbsp; 描述<br />
　　name&nbsp;&nbsp;&nbsp; 指定Resource的JNDI名字<br />
　　auth&nbsp;&nbsp;&nbsp; 指定管理Resource的Manager，它有两个可选值：Container、Application<br />
　　type&nbsp;&nbsp;&nbsp; 指定Resource所属的Java类名</p>
<p>&nbsp;</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Resource name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">jdbc/BookDb</span><span style="COLOR: #000000">&quot;</span></font><font face="Arial"><span style="COLOR: #000000">　
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />auth </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">Container</span><span style="COLOR: #000000">&quot;</span></font><font face="Arial"><span style="COLOR: #000000">　
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />     　　　type </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">javax.sql.DataSource</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">/&gt;</span></font></div>
</pre>
</div>
<p>　　B．在<resource></resource>元素中加入<resourceparams></resourceparams>元素：<resourceparams></resourceparams>元素用来指定各种参数值<br />
　　<br />
　　属性&nbsp;&nbsp;&nbsp; 　　描述<br />
　　factory&nbsp;&nbsp;&nbsp; 指定生成的DataResource的factory类名<br />
　　maxActive&nbsp;&nbsp;&nbsp; 指定数据库连接池中处于活动状态的最大连接数目，0表示不受限制<br />
　　maxIdle&nbsp;&nbsp;&nbsp; 指定数据库连接池中处于空闲状态的最大连接数目，0表示不受限制<br />
　　maxWait&nbsp;&nbsp;&nbsp; 指定连接池中连接处于空闲状态的最长时间,超过会抛出异常，-1表示无限<br />
　　username&nbsp;&nbsp;&nbsp; 指定连接数据库的用户名<br />
　　password&nbsp;&nbsp;&nbsp; 指定连接数据库的口令<br />
　　driverClassName&nbsp;&nbsp;&nbsp; 指定连接数据库的JDBC驱动程序<br />
　　url　　指定连接数据库的URL<br />
</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ResourceParams name </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">jdbc/BookDb</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">factory</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">org.apache.commons.dbcp.BasicDataSourceFactory</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">maxActive</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">maxIdle</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">maxWait</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">10000</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">username</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">user</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">password</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">1234</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><font face="Arial"><span style="COLOR: #000000">
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">driverClassName</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">com.mysql.jdbc.Driver</span><span style="COLOR: #000000"><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />    </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />       </font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000"><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span></span></font><span style="COLOR: #000000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></font></span><font face="Arial"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">jdbc:mysql</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">localhost:3306/BookDb?autoReconnect=true</span></font><span style="COLOR: #008000">
<font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></font></span><font face="Arial"><span style="COLOR: #000000">    </span><span style="COLOR: #000000"><span style="COLOR: #000000">parameter</span><span style="COLOR: #000000">&gt;</span></span></font><font face="Arial"><span style="COLOR: #000000">
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />
</span><span style="COLOR: #000000"><span style="COLOR: #000000">ResourceParams</span><span style="COLOR: #000000">&gt;</span></span></font></div>
</pre>
</div>
<p>&nbsp;</p>
<p>　　C．在web.xml中加入<resource-ref></resource-ref>元素：<resource-ref></resource-ref>元素表示在Web应用中引用JNDI资源<br />
　　<br />
　　属性　　　　　　描述<br />
　　description&nbsp;&nbsp;&nbsp; 对所引用的资源的说明<br />
　　res-ref-name&nbsp;&nbsp;&nbsp; 指定所引用资源的JNDI名字，与<resource></resource>元素中的name属性对应<br />
　　res-type　　指定所引用资源的类名字，与<resource></resource>元素中的type属性对应<br />
　　res-auth　　指定所引用资源的Manager，与<resource></resource>元素中的auth属性对应</p>
<p><br />
　　<strong>六、在Web应用中使用数据源：</strong></p>
<p>　　javax.naming.Context提供了查找JNDI Resource的接口，可以通过三个步骤来使用数据源对象：</p>
<p>　　A．获得对数据源的引用：</p>
<p>&nbsp;</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="COLOR: #000000">　　　<font face="Arial">　Context ctx </font></span><font face="Arial"><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span></font><font face="Arial"><span style="COLOR: #000000"> InitalContext();
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />DataSource ds </span><span style="COLOR: #000000">=</span></font><font face="Arial"><span style="COLOR: #000000">
<img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" />(DataSource)ctx.lookup(</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">java:comp/env/jdbc/BookDb</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">);</span></font></div>
</pre>
</div>
<p>　　B．获得数据库连接对象：<br />
</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="COLOR: #000000">Connection con </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ds.getConnection();</span></font></div>
</pre>
</div>
<p>　　C．返回数据库连接到连接池：<br />
</p>
<div style="SCROLLBAR-HIGHLIGHT-COLOR: buttonhighlight; OVERFLOW: auto; WIDTH: 500px">
<pre style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: #ededed"><div><!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><img src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="COLOR: #000000">con.close();</span></font></div>
</pre>
</div>
<p>&nbsp;</p>
<p>　　在连接池中使用close()方法和在非连接池中使用close()方法的区别是：前者仅仅是把数据库连接对象返回到数据库连接池中，是连接对象又恢复到空闲状态，而非关闭数据库连接，而后者将直接关闭和数据库的连接。</p>
<p><br />
　<strong>　七、发布使用数据源的Web应用：</strong></p>
<p>　　如果直接同JDBC访问数据库，可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。<br />
　　<br />
　　如果通过数据源访问数据库，由于数据源由Servlet容器创建并维护，所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下，确保Servlet容器能够访问驱动程序。<br />
</p>
<div id="ParagraphCount" style="DISPLAY: none"></div>
<div style="DISPLAY: none">------------</div>
<div style="DISPLAY: none"></div>
<div style="DISPLAY: none">&nbsp;八.在WEB中应用JNDI访问数据源</div>
<div style="DISPLAY: none">--java:comp/env是TOMCAT 固定的,Tomcat提供的JNDI绑定都必须加此前缀,</div>
<div style="DISPLAY: none">--jdbc/dstest 是定义数据源时的数据名</div>
<div style="DISPLAY: none">&nbsp;final String JNDINAME =&quot;java:comp/env/jdbc/dstest&quot;;</div>
<div style="DISPLAY: none">&nbsp;Context&nbsp; ctx = new InitalContext();</div>
<div style="DISPLAY: none">&nbsp;DataSource ds = (DataSource)ctx.lookup(JNDINAME);</div>
<div style="DISPLAY: none">&nbsp;Connection conn = ds.getConnection();</div>
<div style="DISPLAY: none">&nbsp;Statement stmt=conn.createrStatement();</div>
<div style="DISPLAY: none">&nbsp;ResultSet rs = stmt.executeQuery( &quot;sql 语句&quot;);</div>
<div style="DISPLAY: none">&nbsp;while(rs.next)</div>
<div style="DISPLAY: none">&nbsp;{}</div>
<div style="DISPLAY: none">---------</div>
<div style="DISPLAY: none">可通过修改server.xml文件来进行配置全局数据源,配置方式与局部数据源类似,只是修改的文件不同.</div>
<div style="DISPLAY: none">局部数据源只需要修改web应用的配置文件,而全局数据源需要修改Tomcat的系统文件.</div>
<div style="DISPLAY: none">一般尽量不使用全局数据源.</div>
<div style="DISPLAY: none"></div>
<div style="DISPLAY: none">&nbsp;&nbsp; </div>
          <br/>
          <span style="color:red;">
            <a href="http://justonly.javaeye.com/blog/108300#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 02 Aug 2007 22:54:56 +0800</pubDate>
        <link>http://justonly.javaeye.com/blog/108300</link>
        <guid>http://justonly.javaeye.com/blog/108300</guid>
      </item>
      <item>
        <title>AJAX应用笔记(1)</title>
        <author>JustOnly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justonly.javaeye.com">JustOnly</a>&nbsp;
          链接：<a href="http://justonly.javaeye.com/blog/108293" style="color:red;">http://justonly.javaeye.com/blog/108293</a>&nbsp;
          发表时间: 2007年08月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1.AJAX（Asynchronous JavaScript and XML）定义<br />
&nbsp; AJAX的核心是JS对象XMLHttpRequest.<br />
&nbsp; AJAX其实是多种技术的综合，包括Javascript,XHTML和CSS,DOM,XML和XSTL,XMLHttpRequest</font><font face="Arial">。其中：使用XHTML和CSS标准化呈现，使用DOM实现动态显示和交互，使用XML和XSTL进行数据</font><font face="Arial">交换与处理，使用XMLHttpRequest对象进行异步数据读取，使用Javascript绑定和处理所有数</font><font face="Arial">据。在AJAX提出之前，业界对于上述技术都只是单独的使用，没有综合使用，也是由于之前的</font><font face="Arial">技术需求所决定的。随着应用的广泛，AJAX也成为香饽饽了。</font></p>
<p><font face="Arial">&nbsp; AJAX采用异步交互过程。AJAX在用户与服务器之间引入一个中间媒介，从而消除了网络交互</font><font face="Arial">过程中的处理&mdash;等待&mdash;处理&mdash;等待缺点。用户的浏览器在执行任务时即装载了AJAX引擎。AJAX</font><font face="Arial">引擎用JavaScript语言编写，通常藏在一个隐藏的框架中。它负责编译用户界面及与服务器之</font><font face="Arial">间的交互。AJAX引擎允许用户与应用软件之间的交互过程异步进行，独立于用户与网络服务器</font><font face="Arial">间的交流。现在，可以用Javascript调用AJAX引擎来代替产生一个HTTP的用户动作，内存中的</font><font face="Arial">数据编辑、页面导航、数据校验这些不需要重新载入整个页面的需求可以交给AJAX来执行。</font></p>
<p><font face="Arial">2.<font face="Arial">AJAX的缺陷<br />
&nbsp;&nbsp; AJAX不是完美的技术。使用AJAX，它的一些缺陷不得不权衡一下：</font></font></p>
<p>&nbsp;&nbsp; <font face="Arial"><font face="Arial">AJAX大量使用了Javascript和AJAX引擎，而这个取决于浏览器的支持。IE5.0及以上、Mozilla1.0、NetScape7及以上版本才支持，Mozilla虽然也支持AJAX，但是提供XMLHttpRequest的方式不一样。所以，使用AJAX的程序必须测试针对各个浏览器的兼容性。</font></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; <font face="Arial">AJAX更新页面内容的时候并没有刷新整个页面，因此，网页的后退功能是失效的；有的用户还经常搞不清楚现在的数据是旧的还是已经更新过的。这个就需要在明显位置提醒用户&ldquo;数据已更新&rdquo;。</font><font face="Arial"> </font></font></p>
<p><font face="Arial"><font face="Arial">&nbsp;&nbsp;&nbsp; 对流媒体的支持没有FLASH、Java Applet好。</font><font face="Arial">一些手持设备（如手机、PDA等）现在还不能很好的支持Ajax。<br />
</font></font></p>
<p>3.核心对象XMLHttpRequest</p>
<p>&nbsp;&nbsp;&nbsp; <font face="Arial">XMLHttpRequest是XMLHTTP组件的对象，通过这个对象，AJAX可以像桌面应用程序一样只同服务器进行数据层面的交换，而不用每次都刷新界面，也不用每次将数据处理的工作都交给服务器来做；这样既减轻了服务器负担又加快了响应速度、缩短了用户等待的时间。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; IE5.0开始，开发人员可以在Web页面内部使用XMLHTTP ActiveX组件扩展自身的功能，不用从当前的Web页面导航就可以直接传输数据到服务器或者从服务器接收数据。,Mozilla1.0以及NetScape7则是创建继承XML的代理类XMLHttpRequest；对于大多数情况，XMLHttpRequest对象和XMLHTTP组件很相似，方法和属性类似，只是部分属性不同。</font></p>
<p><font face="Arial">XMLHttpRequest对象初始化：</font><font face="Arial"><br />
XMLHttpRequest对象的方法：</font></p>
<p>
<table class="MsoTableGrid" cellspacing="0" border="1" cellpadding="0" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: dash-small-gap windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt dash-small-gap windowtext; mso-border-insidev: .5pt dash-small-gap windowtext">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt dashed; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; mso-border-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">方法</span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt dashed; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">描述</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">abort()</font></span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">停止当前请求</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">getAllResponseHeaders()</font></span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">作为字符串返回完整的</span><span lang="EN-US"><font face="Times New Roman">headers</font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 3">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">getResponseHeader(&quot;headerLabel&quot;)</font></span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">作为字符串返回单个的</span><span lang="EN-US"><font face="Times New Roman">header</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">标签</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 4">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">open(&quot;method&quot;,&quot;URL&quot;[,asyncFlag[,&quot;userName&quot;[, &quot;password&quot;]]])</font></span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">设置未决的请求的目标</span><span lang="EN-US"><font face="Times New Roman"> URL</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，方法，和其他参数</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 5">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">send(content)</font></span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">发送请求</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes">
            <td valign="top" width="391" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 293.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">setRequestHeader(&quot;label&quot;, &quot;value&quot;)</font></span></p>
            </td>
            <td valign="top" width="177" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 132.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">设置</span><span lang="EN-US"><font face="Times New Roman">header</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">并和请求一起发送</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">XMLHttpRequest</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">对象的属性：</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
<table class="MsoTableGrid" cellspacing="0" border="1" cellpadding="0" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: dash-small-gap windowtext .5pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt dash-small-gap windowtext; mso-border-insidev: .5pt dash-small-gap windowtext">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt dashed; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; mso-border-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">属性</span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt dashed; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">描述</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">onreadystatechange</font></span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">状态改变的事件触发器</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">readyState</font></span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">对象状态</span><span lang="EN-US"><font face="Times New Roman">(integer):</font></span></p>
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">0 = </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">未初始化</span></p>
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">1 = </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">读取中</span></p>
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">2 = </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">已读取</span></p>
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">3 = </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">交互中</span></p>
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">4 = </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">完成</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 3">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">responseText</font></span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务器进程返回数据的文本版本</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 4">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">responseXML</font></span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务器进程返回数据的兼容</span><span lang="EN-US"><font face="Times New Roman">DOM</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的</span><span lang="EN-US"><font face="Times New Roman">XML</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文档对象</span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 5">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">status</font></span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务器返回的状态码</span><span lang="EN-US"><font face="Times New Roman">, </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">如：</span><span lang="EN-US"><font face="Times New Roman">404 = &quot;</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件未找到</span><span lang="EN-US"><font face="Times New Roman">&quot; </font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US"><font face="Times New Roman">200 =&quot;</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">成功</span><span lang="EN-US"><font face="Times New Roman">&quot;</font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes">
            <td valign="top" width="127" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt dashed; WIDTH: 95.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><font face="Times New Roman">statusText</font></span></p>
            </td>
            <td valign="top" width="441" style="BORDER-RIGHT: windowtext 1pt dashed; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 330.7pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt dashed; BACKGROUND-COLOR: transparent; mso-border-alt: dash-small-gap windowtext .5pt; mso-border-left-alt: dash-small-gap windowtext .5pt; mso-border-top-alt: dash-small-gap windowtext .5pt">
            <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务器返回的状态文本信息</span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>4.AJAX框架基础</p>
<p>&nbsp;&nbsp;&nbsp;AJAX实质上也是遵循Request/Server模式，所以这个框架基本的流程也是：对象初始化-&gt;发送请求-&gt;服务器接收<span>-&gt;</span>服务器返回<span>-&gt;</span>户端接收-&gt;修改客户端页面内容。只不过这个过程是异步的。</p>
<p>&nbsp;&nbsp; (1)实例化XMLHttpRequest 并兼容浏览器</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<font face="Arial">初始化对象并发出XMLHttpRequest请求为了让Javascript可以向服务器发送HTTP请求，必须使用XMLHttpRequest对象。使用之前，要先将XMLHttpRequest对象实例化。之前说过，各个浏览器对这个实例化过程实现不同。IE以ActiveX控件的形式提供，而Mozilla等浏览器则直接以XMLHttpRequest类的形式提供。为了让编写的程序能够跨浏览器运行，要这样写：</font></p>
<font face="Arial">
<p>&nbsp; if (window.XMLHttpRequest) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// Mozilla, Safari, ...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_request = new XMLHttpRequest();</p>
<p>&nbsp;&nbsp;&nbsp; } else if &nbsp;( window.ActiveXObject) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// IE</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_request = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 有些版本的Mozilla浏览器处理服务器返回的未包含XML mime-type头部信息的内容时会出错。因此，要确保返回的内容包含text/xml信息。<br />
http_request = new XMLHttpRequest();</p>
<p>http_request.overrideMimeType('text/xml');</p>
<p>&nbsp; (2)指定响应处理函数</p>
<p>&nbsp;&nbsp;&nbsp;<font face="Arial">接下来要指定当服务器返回信息时客户端的处理方式。只要将相应的处理函数名称赋给XMLHttpRequest对象的onreadystatechange属性就可以了。比如：</font><font face="Arial"><br />
http_request.onreadystatechange = processRequest;</font><font face="Arial"><br />
需要指出的时，这个函数名称不加括号，不指定参数。也可以用Javascript即时定义函数的方式定义响应函数。比如：<br />
http_request.onreadystatechange = function( ) { //(4)处理服务器返回的信息&nbsp;};</font>&nbsp;(3)发送HTTP请求</p>
<p>&nbsp;</p>
<p><font face="Arial">&nbsp;&nbsp;发出HTTP请求指定响应处理函数之后，就可以向服务器发出HTTP请求了。这一步调用XMLHttpRequest对象的open和send方法。</font></p>
<p><font face="Arial">http_request.open('GET', 'http://www.example.org/some.file', true);</font></p>
<p><font face="Arial">http_request.send(null);</font></p>
<p>&nbsp;&nbsp; open的第一个参数是HTTP请求的方法，为Get、Post或者Head。</p>
<p>&nbsp;&nbsp; 第二个参数是目标URL。基于安全考虑，这个URL只能是同网域的，否则会提示&ldquo;没有权限&rdquo;的错误。这个URL可以是任何的URL，包括需要服务器解释执行的页面，不仅仅是静态页面。</p>
<p>&nbsp;&nbsp;&nbsp; 第三个参数只是指定在等待服务器返回信息的时间内是否继续执行下面的代码。如果为True，则不会继续执行，直到服务器返回信息。默认为True。</p>
<p>&nbsp;&nbsp;&nbsp; 按照顺序，open调用完毕之后要调用send方法。send的参数如果是以Post方式发出的话，可以是任何想传给服务器的内容。不过，跟form一样，如果要传文件给服务器，必须先调用setRequestHeader方法，修改MIME类别。如下：</p>
<p>&nbsp;&nbsp;&nbsp; http_request.setRequestHeader(&ldquo;Content-Type&rdquo;,&rdquo;application/x-www-form-urlencoded&rdquo;);<br />
</p>
<p>(4)处理服务器返回的信息</p>
<p>&nbsp;&nbsp;&nbsp;a.定义<font face="Arial">指定的响应处理函数( processRequest).</font></p>
<p><font face="Arial">&nbsp;&nbsp; b.</font><font face="Arial">检查XMLHttpRequest对象的readyState值，判断请求目前的状态。参照前文的属性表可以知道，readyState值为4的时候，代表服务器已经传回所有的信息，可以开始处理信息并更新页面内容了。如下：</font></p>
<p><font face="Arial">&nbsp; if (http_request.readyState == 4) {</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; // 信息已经返回，可以开始处理</font></p>
<p><font face="Arial">&nbsp; } else {</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; // 信息还没有返回，等待</font></p>
<p><font face="Arial">&nbsp; }</font></p>
<p><font face="Arial">服务器返回信息后，还需要判断返回的HTTP状态码，确定返回的页面没有错误。所有的状态码都可以在W3C的官方网站上查到。其中，200代表页面正常。</font></p>
<font face="Arial">
<p><br />
if (http_request.status == 200) {</p>
<p>&nbsp;&nbsp;&nbsp; // 页面正常，可以开始处理信息</p>
<p>} else {</p>
<p>&nbsp;&nbsp;&nbsp; // 页面有问题</p>
<p>}</p>
<p>XMLHttpRequest对成功返回的信息有两种处理方式：</p>
<p>responseText：将传回的信息当字符串使用；</p>
<p>responseXML：将传回的信息当XML文档使用，可以用DOM处理。</p>
<p>
<base href="&lt;%=basePath%&gt;&lt;/base&gt;" /><font face="Arial">--------------</font>
</p>
<p>备注:一切源于网络,个人资料积木.</p>
<p>&nbsp;</p>
<p>使用TOMCAT的数据源方式</p>
<p>数据库为SQL SERVER的 Northwind中的Customers表</p>
<p>index.jsp ,easy.jsp</p>
<p>---存储过程- test_get_customer----</p>
<p><font face="Arial">create procedure test_get_customer @id nchar(5)<br />
as<br />
begin<br />
&nbsp;select * from Customers where CustomerID = @id<br />
end</font></p>
<p><font face="Arial">GO<br />
</font></p>
</font>&nbsp;5.简单实例</font>
          <br/>
          <span style="color:red;">
            <a href="http://justonly.javaeye.com/blog/108293#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 02 Aug 2007 22:24:05 +0800</pubDate>
        <link>http://justonly.javaeye.com/blog/108293</link>
        <guid>http://justonly.javaeye.com/blog/108293</guid>
      </item>
      <item>
        <title>log4j的使用（1）</title>
        <author>JustOnly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://justonly.javaeye.com">JustOnly</a>&nbsp;
          链接：<a href="http://justonly.javaeye.com/blog/105081" style="color:red;">http://justonly.javaeye.com/blog/105081</a>&nbsp;
          发表时间: 2007年07月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          log4j简介<br />
&nbsp;&nbsp;&nbsp; 在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。<br />
&nbsp;&nbsp; 简单的说log4j就是帮助开发人员进行日志输出管理的API类库。它最重要的特点就是可以配置文件灵活的设置日志信息的优先级、日志信息的输出目的地以及日志信息的输出格式。<br />
&nbsp;&nbsp; Log4j除了可以记录程序运行日志信息外还有一重要的功能就是用来显示调试信息。程序员经常会遇到脱离java ide环境调试程序的情况，这时大多数人会选择使用System.out.println语句输出某个变量值的方法进行调试。这样会带来一个非常麻烦的问题：一旦哪天程序员决定不要显示这些System.out.println的东西了就只能一行行的把这些垃圾语句注释掉。若哪天又需调试变量值，则只能再一行行去掉这些注释恢复System.out.println语句。使用log4j可以很好的处理类似情况。<br />
&nbsp;&nbsp;&nbsp; 一般的记录的样式为 [日志信息]-[操作开始的时间]-[日志级别]-[日志类别]-[用户名]-[操作名]-[消息]。<br />
<p>log4j的特性列表：</p>
<ul>
    <li>在运行速度方面进行了优化 </li>
    <li>使用基于名称的日志(logger)层次结构 </li>
    <li>是fail-stop的 </li>
    <li>是线程安全的 </li>
    <li>不受限于预定义的实用工具集 </li>
    <li>可以在运行时使用property和xml两种格式的文件来配置日志记录的行为 </li>
    <li>在一开始就设计为能够处理Java异常 </li>
    <li>能够定向输出到文件(file)、控制台(console)、java.io.OutputStream、java.io.Writer、远程服务器、远程Unix Syslog守护者、远程JMS监听者、NT EventLog或者发送e-mail </li>
    <li>使用DEBUG、INFO、WARN、ERROR和FATAL五5个级别 </li>
    <li>可以容易的改变日志记录的布局(Layout) </li>
    <li>输出日志记录的目的地和写策略可以通过实现Appender接口来改变 </li>
    <li>支持为每个日志(logger)附加多个目的地(appender) </li>
    <li>提供国际化支持 </li>
</ul>
<br />
<br />
log4j使用方法<br />
1.定义配置文件<br />
&nbsp;&nbsp; Log4j的初始化，通常使用配置文件灵活配置log日志的输出方式（输出优先级、输出目的地、输出格式）。<br />
&nbsp;&nbsp; Log4j支持两种配置文件格式，一种是XML 格式的文件log4j.xml，一种是Java特性文件log4j.properties（键=值）。<br />
&nbsp;&nbsp; 需把log4j.jar和Log4j.properties（或者log4j.xml）放入classpath，log4j默认会在classpath中寻找log4j的配置文件。<br />
&nbsp; 可指定配置文件位置如：<br />
&nbsp; set JAVA_OPTS=%JAVA_OPTS% -Dlog4j.configuration=<br />
&nbsp;&nbsp; 或在程序中指定 &nbsp; log4j.xml&nbsp; －－PropertyConfigurator.configure()(DOMConfigurator.configure()).<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4j.properties －－PropertyConfigurator.configure(&quot;String path&quot;);<br />
<br />
2.组成部分<br />
&nbsp;&nbsp; Log4j中有三个主要的组件，它们分别是Logger、Appender和Layout.<br />
&nbsp;&nbsp; (1)logger指定log的名字，打印级别和采用哪种或者哪几种Appender。<br />
&nbsp;&nbsp; (2)Appender用来指明log信息打印到什么地方（如控制台，文件等）.<br />
&nbsp;&nbsp; (3)Layout的作用是控制Log信息的输出格式.<br />
&nbsp;&nbsp; <br />
2.1 配置Logger<br />
log4j.rootLogger = [ level ] , appenderName, appenderName, &hellip;<br />
<br />
&nbsp;&nbsp;&nbsp; Logger的名称是区分大小写的，依据名称可以确定其层次结构(即父子关系)，规则如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如果Logger A的名称后跟一个点(.)是Logger B的名称的前缀就认为Logger A是Logger B的祖先。<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如果在Logger A和Logger B之间，Logger B没有任何其它的祖先就认为Logger A是Logger B的父亲。 <br />
&nbsp;&nbsp;&nbsp; 在Logger的层次结构的最顶层是rootLogger，它会永远存在，而且不能通过名字取到。 即 所有的logger都是继承于rootLogger，如果某个logger没有被分配level，那么它将从一个被分配了级别的最接近它的父logger那里继承level。因此在定义日志的时候通常会给rootLogger赋予一个level。<br />
<br />
&nbsp;&nbsp;&nbsp; level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。<br />
&nbsp;&nbsp;&nbsp; Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。<br />
&nbsp;&nbsp;&nbsp; appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的地。<br />
<br />
&nbsp;&nbsp;&nbsp; Logger选择日志记录请求(log request)的规则：&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 假设Logger M具有q级的Level，这个Level可能是设置的也可能是继承到的。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 如果向Logger M发出一个Level为p的日志记录请求，那么只有满足p&gt;=q时这个日志记录请求才会被处理。<br />
&nbsp;&nbsp;&nbsp; 比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 <br />
<br />
&nbsp;&nbsp;&nbsp; 另一种说法：<br />
&nbsp;&nbsp;&nbsp; 当某个logger的logging request(即printing method(error(),info()..))的级别高于或者等于该logger的级别(即在log4j.properties或者 log4j.xml中定义)的时候，该logging request就为enable. 一旦该logger的logging request为enable，那么该logging request将总会打印到该logger所有的appender中包括它的所有父logger的appender。（而不会管父logger的级别如何）。除非该logger的父logger的additivity设置为false，默认的情况下为true。<br />
&nbsp;&nbsp;&nbsp; 某个logger的additivity设置为false，表示log只打印到本log的appender中，而不再打印到其父logger的appender。<br />
<br />
图示 1. Logger的层次结构图（附件中）<br />
<img src="file:///G:/hierarchy.gif" alt="" />&nbsp;&nbsp;&nbsp; Loger x.y是Logger x.y.z的祖先，因为x.y.是x.y.z的前缀，这符合规则的前一条。另外在Logger x.y和Logger x.y.z之间，Logger x.y.z没有其它的祖先，因此Logger x.y是Logger x.y.z的父亲，这符合规则的后一条。这样我们依据上面的规则就可以构造出如图1所示的Logger的层次结构。<br />
<p> &nbsp;&nbsp;&nbsp; 从图1中我们还可以看到每一个Logger都有一个Level，根据该Level的值Logger决定是否处理对应的日志请求。如果Level没有被设置，就象图1中的Logger x.y一样，又该怎么办呢？答案是可以从祖先那里继承。<br />
&nbsp;&nbsp;&nbsp; 如 果Logger C没有被设置Level，那么它将沿着它的层次结构向上查找,如果找到就继承并结束，否则会一直查找到root logger结束。因为log4j在设计时保证root logger会被设置一个默认的Level,所以任何logger都可以继承到Level。<br />
&nbsp;&nbsp;&nbsp; 图1中的Logger x.y没有被设置Level，但是根据上面的继承规则，Logger x.y继承了root logger的Level。</p>
<br />
2.2 配置Appender<br />
&nbsp;&nbsp;&nbsp; log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
log4j.appender.appenderName.option1 = value1<br />
&hellip;<br />
log4j.appender.appenderName.option = valueN<br />
<br />
其中，Log4j提供的appender有以下几种：<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.ConsoleAppender（控制台），<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.FileAppender（文件），<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
<br />
&nbsp;&nbsp;&nbsp; 每个Logger可以有多个Appender，但是相同的Appender只会被添加一次。<br />
&nbsp;&nbsp;&nbsp; Appender的附加性意味着 Logger C会将日志记录发给它的和它祖先的所有Appender。在图1中Logger a会将日志记录发给它自己的JDBCAppender和它的祖先root logger的ConsoleAppender和FileAppender。Logger x.y.z自己没有Appender，它将把日志记录发给它的祖先root logger的ConsoleAppender和FileAppender，如果Logger x.y也含有Appender，那么它们也会包括在内。<br />
&nbsp;&nbsp;&nbsp; Appender的附加性是可以被中断的。假设Logger C的一个祖先为Logger P，如果Logger P的附加性标志(additivity flag)设置为假，那么Logger C会将日志记录只发给它的和在它和Logger P之间的祖先(包括Logger P)的Appender，而不会发给Logger P的祖先的Appender。Logger的附加性标志(additivity flag)默认值为ture。<br />
&nbsp;&nbsp;&nbsp; 在图1中如果没有设置 Logger a的附加性标志(additivity flag)，而是使用默认值true，那么Logger a会将日志记录发给它自己的JDBCAppender和它祖先root logger的ConsoleAppender和FileAppender，这和上面的描述相同。如果设置Logger a的附加性标志(additivity flag)的值false，那么Logger a会将日志记录发给它自己的JDBCAppender而不会在发给它祖先root logger的ConsoleAppender和FileAppender了。 <br />
<br />
2.3 配置layout&nbsp; -- 日志信息的格式（布局）<br />
&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
log4j.appender.appenderName.layout.option1 = value1<br />
&hellip;<br />
log4j.appender.appenderName.layout.option = valueN<br />
<br />
其中，Log4j提供的layout有以下几种：<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
<br />
&nbsp;&nbsp;&nbsp; Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; %m 输出代码中指定的消息<br />
%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL<br />
%r 输出自应用启动到输出该log信息耗费的毫秒数<br />
%c 输出所属的类目，通常就是所在类的全名<br />
%t 输出产生该日志事件的线程名<br />
%n 输出一个回车换行符，Windows平台为&ldquo;\r\n&rdquo;，Unix平台为&ldquo;\n&rdquo;<br />
%d 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />
%l 输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)<br />
<br />
<br />
3.在代码中使用Log4j<br />
&nbsp;&nbsp;&nbsp; (1)获取日志记录器，这个记录器将负责控制日志信息。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public static Logger getLogger( String name)&nbsp; <br />
&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; log4j是线程安全的，所以一般建议定义logger时采用static<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;<br />
<br />
&nbsp;&nbsp;&nbsp; (2)读取配置文件<br />
当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />
PropertyConfigurator.configure ( String configFilename) ：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 读取使用Java的特性文件编写的配置文件，但是要注意日志记录先前的配置不会被清除和重设。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 例：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(&quot;.\\src\\log4j.properties&quot;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：在web程序中使用log4j注意问题<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; －－由于jsp或servlet在执行状态时没有当前路径概念，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 所以使用PropertyConfigurator.configure（String）语句找log4j.properties文件时，<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 要给出相对于当前jsp或servlet的路径转化成为一个绝对的文件系统路径。<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 方法是使用servletcontext.getrealpath(string)语句。如下：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //得到当前jsp路径<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String prefix =&nbsp; getServletContext().getRealPath(&quot;/&quot;);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //读取log4j.properties<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(prefix+&quot;\\WEB-INF\\log4j.properties&quot;);<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; －－相应的log4j.properties设置某个属性时也要在程序中设置绝对路径。例：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log4j.appender.R.File属性设置日志文件存放位置。我们可以用读写.properties配置文件的方法进行灵活设置。<br />
<br />
(3)插入记录信息（格式化日志信息）<br />
&nbsp;&nbsp;&nbsp; Logger.debug ( Object message ) ;<br />
&nbsp; &nbsp; Logger.info ( Object message ) ;<br />
&nbsp;&nbsp;&nbsp; Logger.warn ( Object message ) ;<br />
&nbsp;&nbsp;&nbsp; Logger.error ( Object message ) ;<br />
<br />
4.性能优化：<br />
&nbsp;&nbsp;&nbsp; if&nbsp; (logger.isDebugEnabled())<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug(&quot;hello&quot; + i + j);&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 而不是直接在程序中调用：<br />
&nbsp;&nbsp;&nbsp; logger.debug(&quot;hello&quot; + i + j);<br />
&nbsp;&nbsp;&nbsp; log类提供isTraceEnable（）、isDebugEnable()、isInfoEnable()等判断当前调试级别是否大于设置级别，如果大于或等于则返回真。这样在logger打印条件不满足的情况下就不用执行字符串的操作。<br />
&nbsp;&nbsp;&nbsp; 实际开发过程中，我们通常会使用Jakarta Commons Logging (JCL)，它提供的是一个日志(Log)接口(interface)，允许程序开发人员使用不同的具体日志实现工具：Log4J, JDK 1.4等。<br />
&nbsp;&nbsp;&nbsp; 如果应用程序的classpath中有log4j, Commons Logging则使用相关的包装(wrapper)类(Log4JLogger)<br />
&nbsp;&nbsp;&nbsp; 如果应用程序运行在jdk1.4的系统中， Commons Logging使用相关的包装类(Jdk14Logger) <br />
<br />
5. 其他相关程序配置<br />
&nbsp;&nbsp;&nbsp; Log4j提供了BasicConfigurator，它只是为root logger添加Appender。其中，
<ul>
    <li>BasicConfigurator.configure()为root logger添加一个关联着PatternLayout.TTCC_CONVERSION_PATTERN的ConsoleAppender </li>
    <li>BasicConfigurator.configure(Appender appender)为root logger添加指定的Appender </li>
</ul>
&nbsp;&nbsp;&nbsp; 我们可以把BasicConfigurator看成是一个简单的使用程序配置Log4j环境的示例。<br />
&nbsp;&nbsp;&nbsp; 例如，要给root logger添加两个Appender(A和B)，下面的代码分别完成了这个要求。<br />
&nbsp;&nbsp;&nbsp; 不使用BasicConfigurator：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Logger root = Logger.getRootLogger();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root.addAppender(A);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; root.addAppender(B);<br />
&nbsp;&nbsp;&nbsp; 使用BasicConfigurator：<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BasicConfigurator.configure(A);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; BasicConfigurator.configure(B);
<p>6.log4j.propertiest配置<br />
Property文件是由key=value这样的键值对所组成的，可以使用#或!作为注释行的开始。下面给出了两个简单的示例：</p>
<p>非常简单的示例1：</p>
<p>log4j.rootLogger=DEBUG, A1<br />
log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n	<br />
</p>
稍显复杂的示例2:<br />
log4j.rootLogger=, A1, A2<br />
log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-17c{2}(%13F:%L)%3x - %m%n<br />
log4j.appender.A2=org.apache.log4j.FileAppender<br />
log4j.appender.A2.File=filename.loglog4j.appender.A2.Append=false<br />
log4j.appender.A2.layout=org.apache.log4j.PatternLayout<br />
log4j.appender.A2.layout.ConversionPattern=%-5r %-5p [%t] %c{2} - %m%n&nbsp;&nbsp;&nbsp; <br />
<br />
注：log4j.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...<br />
&nbsp;&nbsp;&nbsp; 上面只有INHERITED和NULL需要说明一下，其它部分和root logger相同。INHERITED和NULL的意义是相同的。如果我们使用了它们，意味着这个logger将不在使用自己的Level而是从它的祖先那里继承。<br />
&nbsp;&nbsp;&nbsp; Logger的附加性标志(additivity flag)可以使用log4j.additivity.logger_name=[false|true]来配置。
<p>ObjectRenderer配置：我们可以通过ObjectRenderer来定义将消息对象转换成字符串的方式。语法为 log4j.renderer.fully.qualified.name.of.rendered.class=fully.qualified.name.of.rendering.class。如：<br />
//my.Fruit类型的消息对象将由my.FruitRenderer转换成字符串<br />
log4j.renderer.my.Fruit=my.FruitRenderer<br />
对上面的各个配置元素的语法理解之后，在来看示例1和2就很容易了。<br />
PropertyConfigurator不支持Filter的配置。<br />
如果要支持Filter您可以使用DOMConfigurator，即使用XML文件的方式配置。<br />
<br />
XML文件配置<br />
要使用DOMConfigurator.configure()来读取XML格式的配置文件。<br />
XML文件格式的定义是通过org/apache/log4j/xml/log4j.dtd来完成的，各个配置元素的嵌套关系如下：<br />
<!--ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)--><br />
这里没有给出更为详细的内容，要了解详细的内容需要查阅log4j.dtd。<br />
下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识：<br />
</p>
<p class="MsoNormal"><span lang="EN-US"><!--ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)--><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">这里没有给出更为详细的内容，要了解详细的内容需要查阅</span><span lang="EN-US">log4j.dtd</span><span style="font-family: 宋体;">。</span><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面这个简单的示例可以使您对</span><span lang="EN-US">XML</span><span lang="EN-US">配置文件的格式有一个基本的认识：</span></p>
<pre><!--ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)--></pre>
<p>这里没有给出更为详细的内容，要了解详细的内容需要查阅log4j.dtd。</p>
<p>下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识：</p>
-&lt;-!-ELEMENT log4j:configuration (renderer*, appender*,(category|logger)*,root?,categoryFactory?)-&gt;<br />
这里没有给出更为详细的内容，要了解详细的内容需要查阅log4j.dtd。<br />
下面这个简单的示例可以使您对XML配置文件的格式有一个基本的认识：<br />
-&lt;-?-xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; -?-&gt;<br />
-&lt;-!-DOCTYPE log4j SYSTEM &quot;log4j.dtd&quot;-&gt;<br />
-&lt;-log4j-&gt; <br />
&nbsp;-&lt;-appender name=&quot;A1&quot; class=&quot;org.apache.log4j.FileAppender&quot;-&gt;<br />
&nbsp;-&lt;-layout class=&quot;org.apache.log4j.PatternLayout&quot;-&gt;<br />
&nbsp;-&lt;-param name=&quot;ConversionPattern&quot; value=&quot;%-5p %c{2} - %m-n&quot;-/-&gt;<br />
&nbsp;-&lt;-/layout-&gt;<br />
&nbsp;-&lt;-/appender-&gt;<br />
&nbsp;-&lt;-appender name=&quot;A2&quot; class=&quot;org.apache.log4j.FileAppender&quot;-&gt;<br />
&nbsp;-&lt;-layout class=&quot;org.apache.log4j.TTCCLayout&quot;-&gt;<br />
&nbsp;-&lt;-param name=&quot;DateFormat&quot; value=&quot;ISO8601&quot; -/-&gt;<br />
&nbsp;-&lt;-/layout-&gt;<br />
&nbsp;-&lt;-param name=&quot;File&quot; value=&quot;warning.log&quot; -/-&gt;<br />
&nbsp;-&lt;-param name=&quot;Append&quot; value=&quot;false&quot; -/-&gt;<br />
&nbsp;-&lt;-/appender-&gt;<br />
&nbsp;-&lt;-category name=&quot;org.apache.log4j.xml&quot; priority=&quot;debug&quot;-&gt;<br />
&nbsp;-&lt;-appender-ref ref=&quot;A1&quot; -/-&gt;<br />
&nbsp;-&lt;-/category-&gt;<br />
&nbsp;-&lt;-root priority=&quot;debug&quot;-&gt;<br />
&nbsp;-&lt;-appender-ref ref=&quot;A1&quot; -/-&gt;<br />
&nbsp;-&lt;-appender-ref ref=&quot;A2&quot; -/-&gt;<br />
&nbsp;-&lt;-/root-&gt;<br />
-&lt;-/log4j&gt;<br />
<br />
默认初始化过程在LogManager类的静态初始化器中完成。具体步骤如下<br />
&nbsp;&nbsp;&nbsp; 检查系统属性log4j.defaultInitOverride，如果值为false则执行初始化过程，否则跳过初始化过程。<br />
&nbsp;&nbsp;&nbsp; 将系统属性log4j.configuration的值赋给变量resource。<br />
&nbsp;&nbsp;&nbsp; 如果log4j.configuration没有被定义则使用默认值log4j.properties。     &nbsp;&nbsp;&nbsp; 试图转换变量resource到一个url。     &nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 如果变量resource不能转换成一个url，<br />
&nbsp;&nbsp;&nbsp; 那么将使用org.apache.log4j.helpers.Loader.getResource(resource, Logger.class)得到一个url。     <br />
&nbsp;&nbsp;&nbsp; 如果还是得不到url，将忽略默认初始化过程。<br />
&nbsp;&nbsp;&nbsp; 如果得到url将使用PropertyConfigurator或DOMConfigurator来配置，也可以使用自定义的XXXConfigurator。
<pre><div>参考资料    <br /><a href="http://www.solol.org/technologic/java/j-tomcatarch/" title="图解 Tomcat 体系结构">图解 Tomcat 体系结构</a>      <br /><a href="http://logging.apache.org/">Apache Log4j</a>项目主页      <br /><a href="http://logging.apache.org/log4j/docs/documentation.html">Log4j Documentation</a>，这里的资源非常的丰富。     <br />一切源于网络，个人资料拼图，谢谢合作。</div></pre>
          <br/>
          <span style="color:red;">
            <a href="http://justonly.javaeye.com/blog/105081#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jul 2007 00:23:19 +0800</pubDate>
        <link>http://justonly.javaeye.com/blog/105081</link>
        <guid>http://justonly.javaeye.com/blog/105081</guid>
      </item>
  </channel>
</rss>