<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>tiantao</title>
    <description>我感觉，我像一只小鸟。
忙忙碌碌，飞来飞去。
不知道在哪片树叶背后，捡来一只小虫，
不知道在哪个偏僻的角落，捡来一粒米。
不会有人把我关进笼子，
因为我的羽毛实在不怎么美丽；
不会有人把我送进动物园，
因为我的种族实在不怎么珍奇；
不值得猎取，
没有人采集,于是我享有了一片安宁的土地.
不值得娇宠,没有人调理.
于是我保存了我自己.
我感觉我确实像一只小鸟,忙忙碌碌，飞来飞去。
去寻找我的小虫,去啄食我的米......</description>
    <link>http://tiantao.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>Struts-config.xml</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/190950" style="color:red;">http://tiantao.javaeye.com/blog/190950</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>一、下载必要的jar包。有四个包要下载（网上有贴子说只要下面前三个包就可以了，但我在配置的时候如果没有第四个包会报错）。</strong> <br /><span style="color: blue">http://apache.linuxforum.net/dist/jakarta/commons/dbcp/binaries/commons-dbcp-1.2.zip <br />http://apache.linuxforum.net/dist/jakarta/commons/pool/binaries/commons-pool-1.2.zip <br />http://apache.linuxforum.net/dist/jakarta/struts/struts-legacy/struts-legacy-1.0.zip <br />http://apache.linuxforum.net/dist/jakarta/commons/collections/binaries/commons-collections-3.1.zip </span><br /><strong>把这四个jar包放到web应用的WEB-INF/lib目录下，还有要把DB2的驱动程序包也放到这里（在Tomcat也可以把数据库的驱动包放到%Tomcat_Home%/common/lib目录下或%Resin_Home%/lib目录下，这样在启动Web服务器的时候就会加载这个包，服务器和Web应用都可以使用驱动程序类。Websphere还不太清楚，摸索中……） <br /><br />二、在struts-config.xml中添加Data Source </strong><br /><br /><strong>Xml代码 </strong>&lt;data-sources>      <br />    <span style="color: green">&lt;data-source key="datasource" type="org.apache.commons.dbcp.BasicDataSource">      <br />      &lt;set-property property="password" value="db2admin" />      <br />      &lt;set-property property="minCount" value="3" />      <br />      &lt;set-property property="maxCount" value="10" />      <br />      &lt;set-property property="username" value="db2admin" />      <br />      &lt;set-property property="driverClassName"    <br />                        value="COM.ibm.db2.jdbc.net.DB2Driver"/>      <br />      &lt;set-property property="description" value="test" />      <br />      &lt;set-property property="url"    <br />                        value="jdbc:db2://localhost:6789/DB2ADMIN.TEST" />      <br />      &lt;set-property property="readOnly" value="false" />      <br />      &lt;set-property property="autoCommit" value="true" />      <br />    &lt;/data-source>      <br />  &lt;/data-sources>    <br /><br />&lt;data-sources>   <br />    &lt;data-source key="datasource" type="org.apache.commons.dbcp.BasicDataSource">   <br />      &lt;set-property property="password" value="db2admin" />   <br />      &lt;set-property property="minCount" value="3" />   <br />      &lt;set-property property="maxCount" value="10" />   <br />      &lt;set-property property="username" value="db2admin" />   <br />      &lt;set-property property="driverClassName" <br />                        value="COM.ibm.db2.jdbc.net.DB2Driver"/>   <br />      &lt;set-property property="description" value="test" />   <br />      &lt;set-property property="url" <br />                        value="jdbc:db2://localhost:6789/DB2ADMIN.TEST" />   <br />      &lt;set-property property="readOnly" value="false" />   <br />      &lt;set-property property="autoCommit" value="true" />   <br />    &lt;/data-source>   <br />  &lt;/data-sources> </span> <br /><strong>如果要配置多个data source，可以给每个data source指定不同的key，然后在程序中根据key指定要引用的数据源。 <br /><br />三、测试数据源。配置好以后就可以在ActionServlet中使用了 [color]<br /><br />Java代码</strong>DataSource ds = getDataSource(request,"datasource");       <br />Connection conn = ds.getConnection();       <br />Statement stmt = conn.createStatement();       <br />ResultSet rs = stmt.executeQuery("SQL String");  <br /><br />  DataSource ds = getDataSource(request,"datasource");    <br />  Connection conn = ds.getConnection();    <br />  Statement stmt = conn.createStatement();    <br />  ResultSet rs = stmt.executeQuery("SQL String");<br />[/color]<br /><strong>附： Struts1.1中struts-config.xml的配置(as follows)： <br />Xml代码 </strong><br />[color]<br />&lt;data-sources >      <br />    &lt;data-source key="datasource" type="org.apache.struts.util.GenericDataSource">      <br />      &lt;set-property property="password" value="db2admin" />      <br />      &lt;set-property property="minCount" value="2" />      <br />      &lt;set-property property="maxCount" value="10" />      <br />      &lt;set-property property="user" value="db2admin" />      <br />      &lt;set-property property="driverClass"    <br />                        value="COM.ibm.db2.jdbc.net.DB2Driver"/>      <br />      &lt;set-property property="description" value="test" />      <br />      &lt;set-property property="url"    <br />                        value="jdbc:db2://localhost:6789/DB2ADMIN.TEST" />      <br />      &lt;set-property property="readOnly" value="false" />      <br />      &lt;set-property property="autoCommit" value="true" />      <br />    &lt;/data-source>      <br />  &lt;/data-sources>     <br /><br />&lt;data-sources >   <br />    &lt;data-source key="datasource" type="org.apache.struts.util.GenericDataSource">   <br />      &lt;set-property property="password" value="db2admin" />   <br />      &lt;set-property property="minCount" value="2" />   <br />      &lt;set-property property="maxCount" value="10" />   <br />      &lt;set-property property="user" value="db2admin" />   <br />      &lt;set-property property="driverClass" <br />                        value="COM.ibm.db2.jdbc.net.DB2Driver"/>   <br />      &lt;set-property property="description" value="test" />   <br />      &lt;set-property property="url" <br />                        value="jdbc:db2://localhost:6789/DB2ADMIN.TEST" />   <br />      &lt;set-property property="readOnly" value="false" />   <br />      &lt;set-property property="autoCommit" value="true" />   <br />    &lt;/data-source>   <br />  &lt;/data-sources>[/color]   <br /><strong>注意：1.2和1.1在配置上不一样的地方 <br />Java代码 </strong><br /><span style="color: green">&lt;data-source key="datasource" type="org.apache.commons.dbcp.BasicDataSource">      <br />&lt;set-property property="username" value="db2admin" />      <br />&lt;set-property property="driverClassName" value="COM.ibm.db2.jdbc.net.DB2Driver" /> </span>
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/190950#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 10:42:51 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/190950</link>
        <guid>http://tiantao.javaeye.com/blog/190950</guid>
      </item>
      <item>
        <title>System.getProperty()学习</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/190187" style="color:red;">http://tiantao.javaeye.com/blog/190187</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>java.version</strong> <span style="color: blue">Java Runtime Environment version </span><br /><strong>java.vendor</strong> Java Runtime Environment vendor <br /><strong>java.vendor.url</strong> Java vendor URL <br /><strong>java.home</strong> Java installation directory <br /><strong>java.vm.specification.version </strong>Java Virtual Machine specification version <br /><strong>java.vm.specification.vendor</strong> Java Virtual Machine specification vendor <br /><strong>java.vm.specification.name</strong> Java Virtual Machine specification name <br /><strong>java.vm.version </strong>Java Virtual Machine implementation version <br /><strong>java.vm.vendor</strong> Java Virtual Machine implementation vendor <br /><strong>java.vm.name</strong> Java Virtual Machine implementation name <br /><strong>java.specification.version</strong> Java Runtime Environment specification version <br /><strong>java.specification.vendor</strong> Java Runtime Environment specification vendor <br /><strong>java.specification.name</strong> Java Runtime Environment specification name <br /><strong>java.class.version</strong> Java class format version number <br /><strong>java.class.path</strong> Java class path <br /><strong>java.library.path</strong> List of paths to search when loading libraries <br /><strong>java.io.tmpdir </strong>Default temp file path <br /><strong>java.compiler</strong> Name of JIT compiler to use <br /><strong>java.ext.dirs</strong> Path of extension directory or directories <br /><strong>os.name</strong> Operating system name <br /><strong>os.arch</strong> Operating system architecture <br /><strong>os.version</strong> Operating system version <br /><strong>file.separator</strong> File separator ("/" on UNIX) <br /><strong>path.separator</strong> Path separator (":" on UNIX) <br /><strong>line.separator</strong> Line separator ("\n" on UNIX) <br /><strong>user.name</strong> User's account name <br /><strong>user.home</strong> User's home directory <br /><strong>user.dir</strong> User's current working directory
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/190187#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 14:02:33 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/190187</link>
        <guid>http://tiantao.javaeye.com/blog/190187</guid>
      </item>
      <item>
        <title>Java关键字new和newInstance的区别方法</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/184878" style="color:red;">http://tiantao.javaeye.com/blog/184878</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在初始化一个类，生成一个实例的时候，newInstance()方法和new关键字除了一个是方法，一个是关键字外，最主要有什么区别?它们的区别在于创建对象的方式不一样，前者是使用类加载机制，后者是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。<br /><br />　　Java中工厂模式经常使用newInstance()方法来创建对象，因此从为什么要使用工厂模式上可以找到具体答案。 例如：<br /><br />　　 class c = Class.forName(“Example”); <br />　　factory = (ExampleInterface)c.newInstance(); <br /><br />　　其中ExampleInterface是Example的接口，可以写成如下形式：<br /><br />　　 String className = "Example"; <br />　　class c = Class.forName(className); <br /><br />　　factory = (ExampleInterface)c.newInstance(); <br /><br />　　进一步可以写成如下形式：<br /><br />　　 String className = readfromXMlConfig; //从xml 配置文件中获得字符串 <br />　　class c = Class.forName(className); <br /><br />　　factory = (ExampleInterface)c.newInstance(); <br /><br />　　上面代码已经不存在Example的类名称，它的优点是，无论Example类怎么变化，上述代码不变，甚至可以更换Example的兄弟类Example2 , Example3 , Example4……，只要他们继承ExampleInterface就可以。<br /><br />　　从JVM的角度看，我们使用关键字new创建一个类的时候，这个类可以没有被加载。但是使用newInstance()方法的时候，就必须保证：1、这个类已经加载; 2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法forName()所完成的，这个静态方法调用了启动类加载器，即加载java API的那个加载器。<br /><br />　　现在可以看出，newInstance()实际上是把new这个方式分解为两步，即首先调用Class加载方法加载某个类，然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性，提供给了一种降耦的手段。<br /><br />　　最后用最简单的描述来区分new关键字和newInstance()方法的区别：<br /><br />　　newInstance: 弱类型。低效率。只能调用无参构造。<br /><br />　　new: 强类型。相对高效。能调用任何public构造
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/184878#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 13:01:22 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/184878</link>
        <guid>http://tiantao.javaeye.com/blog/184878</guid>
      </item>
      <item>
        <title>SQL(ORACLE)常用的SQL语句</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/184078" style="color:red;">http://tiantao.javaeye.com/blog/184078</a>&nbsp;
          发表时间: 2008年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>--创建用户--</strong><br />Create User 'UserNam' Identified By 'PassWord' Profile Default Default Tablespace users Temporary Tablespace 'TableSpaceName' Account Unlock;<br /><strong>--查看表空间，分配大小--</strong><br />Select t.tablespace_name,round(sum(bytes/(1024*1024)),0) ts_size From dba_tablespaces t,dba_data_files d where t.tablespace_name = d.tablespace_name group by t.tablespace_name; <br /><strong>--查看表空间使用情况--</strong><br />Select sum(bytes)/(1024*1024) as free_space,tablespace_name from dba_free_space Group by tablespace_name;<br /><strong>--查看数据库创建时间--</strong><br />Select Created,Log_Mode,Log_Mode From V$Database;<br /><strong>--查看数据库版本--</strong><br />Select version FROM Product_component_version Where SUBSTR(PRODUCT,1,6)='Oracle';<br /><strong>--查看还没有提交的事务--</strong><br />Select * from v$transaction;<br /><strong>--查看锁住的进程的操作系统进程--</strong><br />select * from v$locked_object;  <br /><strong>--导出数据表---</strong><br />exp statuser/wonderstat@stat file=E:\060227_statuser_bak.dmp owner=statuser direct=y log=E:\exp.log<br /><strong>--导入数据表---</strong><br /> <em>**不需要指定表**</em><br />   imp statuser/wonderstat@WONDER_DEVLOP file=c:\temp\Macro_Indr(2008-04-14).dmp ignore=y fromuser=statuser touser=statuser<br /> <em>**需要指定表**</em><br />   imp statuser/wonderstat@WONDER_DEVLOP touser=statuser ignore=y tables=(macro_data) file=f:\Macro_data_2008_02_25.dmp
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/184078#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Apr 2008 13:40:51 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/184078</link>
        <guid>http://tiantao.javaeye.com/blog/184078</guid>
      </item>
      <item>
        <title>JDBC游标超过限制出现ORA-01000的问题 </title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/182894" style="color:red;">http://tiantao.javaeye.com/blog/182894</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近一个项目测试时经常出这个错，应该是jdbc问题，但不是连接未关闭导致达到最大连接数，因为这是oracle数据库报错，说明已经连上数据库，估计是某些程序中statement未关闭。以下是网络上关于这个问题的帖子：<br /><br /><br />    [TIP]关于Java开发中使用Oracle数据库的一点注意事项<br /><br />    很多朋友在Java开发中，使用Oracle数据库的时候，经常会碰到有ORA-01000: maximum open cursors exceeded.的错误。<br /><br />    实际上，这个错误的原因，主要还是代码问题引起的。<br />    ora-01000: maximum open cursors exceeded.<br />    表示已经达到一个进程打开的最大游标数。<br /><br />    这样的错误很容易出现在Java代码中的主要原因是：Java代码在执行conn.createStatement()和 conn.prepareStatement()的时候，实际上都是相当与在数据库中打开了一个cursor。尤其是，如果你的 createStatement和prepareStatement是在一个循环里面的话，就会非常容易出现这个问题。因为游标一直在不停的打开，而且没有关闭。<br /><br />    一般来说，我们在写Java代码的时候，createStatement和prepareStatement都应该要放在循环外面，而且使用了这些Statment后，及时关闭。最好是在执行了一次executeQuery、executeUpdate等之后，如果不需要使用结果集（ResultSet）的数据，就马上将Statment关闭。<br /><br />    对于出现ORA-01000错误这种情况，单纯的加大open_cursors并不是好办法，那只是治标不治本。实际上，代码中的隐患并没有解除。<br />    而且，绝大部分情况下，open_cursors只需要设置一个比较小的值，就足够使用了，除非有非常特别的要求。<br /><br />    ---<br /><br />    如果你不使用连接池，那么就没有什么问题，一旦Connection关闭，数据库物理连接就被释放，所有相关Java资源也可以被GC回收了。<br /><br />    但是如果你使用连接池，那么请注意，Connection关闭并不是物理关闭，只是归还连接池，所以PreparedStatement和 ResultSet都被持有，并且实际占用相关的数据库的游标资源，在这种情况下，只要长期运行，往往就会报“游标超出数据库允许的最大值”的错误，导致程序无法正常访问数据库。<br /><br />    ---<br />    这个关不关和使用不使用conn pool没有关系，一般操作是会是这样，线程从外界获取一个conn，然后创建自己地stmt,rs,然后执行逻辑操作，然后将conn返回给pool。如果程序员忘记手动关地话。当这个线程执行完以后，stmt，rs都成垃圾，当他们被垃圾搜集地时候，gc会替我们把它们给关闭地。这就是很多代码没有关闭，仍然正常运行。<br />    但是这样会有一个潜在地问题。就是gc无法确定什么时候运行。如果free地内存很多，很可能有些gc就不会被启动，这样stmt迟迟没有被关闭，执行一段时间会报错。<br />    所以健壮地代码应该手工把rs,stmt都关闭
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/182894#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 14:04:05 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/182894</link>
        <guid>http://tiantao.javaeye.com/blog/182894</guid>
      </item>
      <item>
        <title>Validator中javascript的使用</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/182863" style="color:red;">http://tiantao.javaeye.com/blog/182863</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.    在struts-config.xml中加入validator的plug-in.<br /><br /><br /><br />  &lt;!-- Validator的配置--><br /><br />  &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"><br /><br />&lt;set-property property="pathnames"<br /><br />value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/><br /><br />  &lt;/plug-in><br /><br /> 2.在文件/WEB-INF/validation.xml中是我们要定义自己的验证规则<br /><br /> &lt;form-validation><br /><br />    &lt;!-- ========== Default Global Definitions ===================== --><br />     &lt;global><br />      &lt;constant><br />        &lt;constant-name>userID&lt;/constant-name><br />        &lt;constant-value>^\d{5}\d*$&lt;/constant-value><br />      &lt;/constant><br />      &lt;constant><br />        &lt;constant-name>password&lt;/constant-name><br />        &lt;constant-value>&lt;/constant-value><br />      &lt;/constant><br />    &lt;/global><br />    <br />&lt;!-- ========== Default Language Form Definitions ===================== --><br />   <br />      &lt;formset><br /><br />        <br />        &lt;form name="loginActionForm"><br />          &lt;field<br />                property="userID"<br />                depends="required"><br />                &lt;arg0 key="login.jsp.prompt.username"/><br />             &lt;/field><br />          &lt;field<br />                property="password"<br />                depends="required,mask"><br />                &lt;arg0 key="login.jsp.prompt.password"/><br />            &lt;var><br />                &lt;var-name>mask&lt;/var-name><br />                &lt;var-value>^[0-9a-zA-Z]*$&lt;/var-value><br />            &lt;/var><br />         &lt;/field><br />        &lt;/form><br />        <br /><br />    &lt;/formset><br />    <br />&lt;/form-validation><br /><br />3.   在浏览器端使用JavaScript进行验证<br />&lt;%@ page contentType="text/html; charset=UTF-8" %><br />&lt;%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %><br />&lt;%@ taglib uri="/WEB-INF/struts-template.tld" prefix="template" %><br />&lt;%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><br />&lt;%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><br />&lt;%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><br /><br />&lt;html:javascript formName="loginActionForm"/><br />&lt;html:html><br />&lt;head><br />&lt;title>&lt;bean:message key="login.jsp.title"/>&lt;/title><br />&lt;html:base/><br />&lt;/head><br />&lt;body><br />&lt;html:form action="/loginAction.do" focus="userid" onsubmit="return validateLoginActionForm(this);" method="post"><br />  &lt;div align="center"><br />    &lt;table width="22%"  border="4"><br />      &lt;tr><br />        &lt;td height="208">&lt;div align="left"><br />          &lt;table width="69%"  border="0"><br />              &lt;tr><br />                &lt;td>&lt;font color="#000080">&lt;font color="#000000">&lt;bean:message key="login.jsp.prompt.username"/>&lt;/font>&lt;strong> <br />                  &lt;/strong>&lt;/font>&lt;/td><br />              &lt;/tr><br />              &lt;tr><br />                &lt;td>&lt;div align="left"><br />                  &lt;html:text property="userID" maxlength="40"/><br />                &lt;/div>&lt;/td><br />              &lt;/tr><br />              &lt;tr><br />                &lt;td height="18">&lt;font color="#000080">&lt;font color="#000000">&lt;bean:message key="login.jsp.prompt.password"/>&lt;strong> <br />                  &lt;/strong>&lt;/font>&lt;/font>&nbsp;&lt;/td><br />              &lt;/tr><br />              &lt;tr><br />                &lt;td>&lt;div align="center"><br />                    &lt;html:password property="password" maxlength="10"/><br />                &lt;/div>&lt;/td><br />              &lt;/tr><br />                  &lt;/table><br />          &lt;table width="69%"  border="0"><br />            &lt;tr><br />              &lt;td height="38">&lt;div align="right"><br />                  &lt;html:submit>&lt;bean:message key="login.jsp.prompt.submit"/>&lt;/html:submit><br />              &lt;/div>&lt;/td><br />              &lt;td>&lt;html:button property="close" onclick="window.close()">&lt;bean:message key="login.jsp.prompt.close"/>&lt;/html:button>&lt;/td><br />            &lt;/tr><br />          &lt;/table><br />    <br />        &lt;/div>&lt;/td><br /><br />    &lt;/table><br />  &lt;/div> <br /><br />&lt;/html:form><br /><br />&lt;/body><br />&lt;/html:html>
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/182863#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 12:47:42 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/182863</link>
        <guid>http://tiantao.javaeye.com/blog/182863</guid>
      </item>
      <item>
        <title>Log4j详细解</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/179991" style="color:red;">http://tiantao.javaeye.com/blog/179991</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.1. 背景<br />　　在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。<br />　　最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。<br />1.2. Log4j简介<br />　　在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。<br />　 　Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。<br />　　此外，通过Log4j其他语言接口，您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通 过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。<br /><strong>Log4j有三个主要的组件：</strong><br />   Loggers(记录器)，Appenders (输出源)和Layouts(布局)，这里可简单理解为日志类别，日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和 级别，并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明：<br />1、 Loggers<br />　 　Loggers组件在此系统中被分为五个级别：DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的，DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL，分别用来指定这条日志信息的重要程度,明白这一点很重要，这里Log4j有一个规则：假设Loggers级别为P，如果在Loggers中发 生了一个级别Q比P高，则可以启动，否则屏蔽掉。<br />假设你定义的级别是info，那么error和warn的日志可以显示而比他低的debug信息就不显示了。<br />Java程序举例来说：<br />　　 ***建立Logger的一个实例，命名为“com.foo”***<br />　　　Logger　logger = Logger.getLogger("com.foo"); <br />    ***"com.foo"是实例进行命名，也可以任意***<br />　　 ***设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。***<br />　　logger.setLevel(Level.INFO);<br />　　Logger barlogger = Logger.getLogger("com.foo.Bar");<br />　　***下面这个请求可用，因为WARN >= INFO***<br />　　logger.warn("Low fuel level.");<br />　　***下面这个请求不可用，因为DEBUG &lt; INFO***<br />　　logger.debug("Starting search for nearest gas station.");<br />　　***命名为“com.foo.bar”的实例barlogger会继承实例“com.foo”的级别。因此，下面这个请求可用，因为INFO >= INFO***<br />　　barlogger.info("Located nearest gas station.");<br />　　***下面这个请求不可用，因为DEBUG &lt; INFO***<br />　　barlogger.debug("Exiting gas station search");<br />　　这里“是否可用”的意思是能否输出Logger信息。<br />　　　　在对Logger实例进行命名时，没有限制，可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例，这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息，便于管理。比如：<br />　　static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());<br />2、Appenders<br />　　禁用与使用日志请求只是Log4j其中的一个小小的地方，Log4j日志系统允许把日志输出到不同的地方，如控制台（Console）、文件（Files）、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。<br />　　<br />　　其语法表示为：<br />　　<br />　　org.apache.log4j.ConsoleAppender（控制台）<br />　　org.apache.log4j.FileAppender（文件）<br />　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />　　<br />　　配置时使用方式为：<br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />　　log4j.appender.appenderName.option1 = value1<br />　　…<br />log4j.appender.appenderName.option = valueN<br />　　这样就为日志的输出提供了相当大的便利。<br />3、Layouts<br />　 　有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了 四种日志输出样式，如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。<br />　　<br />　　其语法表示为：<br />　　<br />　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />　　<br />　　配置时使用方式为：<br />　　<br />　　log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class<br />　　log4j.appender.appenderName.layout.option1 = value1<br />　　…<br />　　log4j.appender.appenderName.layout.option = valueN<br />4 . Log4j的配置 　<br />　　以上是从原理方面说明Log4j的使用方法，在具体Java编程使用Log4j可以参照以下示例：<br />　　1、 建立Logger实例：<br />　　语法表示：public static Logger getLogger( String name)<br />　　实际使用：static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;<br />　　2、 读取配置文件：<br />　　获得了Logger的实例之后，接下来将配置Log4j使用环境：<br />　　语法表示：<br />　　BasicConfigurator.configure()：自动快速地使用缺省Log4j环境。<br />　　PropertyConfigurator.configure(String configFilename)：读取使用Java的特性文件编写的配置文件。<br />　　DOMConfigurator.configure(String filename)：读取XML形式的配置文件。<br />　　实际使用：<br />PropertyConfigurator.configure("ServerWithLog4j.properties");<br />　　3、 插入日志信息<br />　　完成了以上连个步骤以后，下面就可以按日志的不同级别插入到你要记录日志的任何地方了。<br />　　语法表示：<br />　　Logger.debug(Object message);//调试信息<br />　　Logger.info(Object message);//一般信息<br />　　Logger.warn(Object message);//警告信息<br />　　Logger.error(Object message);//错误信息<br />　　Logger.fatal(Object message);//致命错误信息<br />　　实际使用：logger.info("ServerSocket before accept: " + server);<br /><br />5. 配置过程 <br /><br />　在实际编程时，要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。<br />Log4j支持两种配置文件格式，一种是XML格式的文件，一种是java properties（key=value）【Java特性文件（键=值）】。下面我们介绍使用Java特性文件做为配置文件的方法<br />具体如下：<br />　　<br />　　1、配置根Logger，其语法为：<br />　　log4j.rootLogger = [ level ] , appenderName1, appenderName2, …<br />level : 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优 先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。<br />　　 appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br />例如：log4j.rootLogger＝info,A1,B2,C3<br />　　<br />　　2、配置日志信息输出目的地，其语法为：<br />　　log4j.appender.appenderName = fully.qualified.name.of.appender.class //<br />　　 "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个：<br />1.org.apache.log4j.ConsoleAppender（控制台）<br />2.org.apache.log4j.FileAppender（文件）<br />3.org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />4.org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />5.org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />1.ConsoleAppender选项<br />Threshold=WARN:指定日志消息的输出最低层次。<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />Target=System.err：默认情况下是：System.out,指定输出控制台<br />2.FileAppender 选项<br />Threshold=WARN:指定日志消息的输出最低层次。<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />File=mylog.txt:指定消息输出到mylog.txt文件。<br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />3.DailyRollingFileAppender 选项<br />Threshold=WARN:指定日志消息的输出最低层次。<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />File=mylog.txt:指定消息输出到mylog.txt文件。<br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下：<br />1)'.'yyyy-MM: 每月<br />2)'.'yyyy-ww: 每周 <br />3)'.'yyyy-MM-dd: 每天<br />4)'.'yyyy-MM-dd-a: 每天两次<br />5)'.'yyyy-MM-dd-HH: 每小时<br />6)'.'yyyy-MM-dd-HH-mm: 每分钟<br />4.RollingFileAppender 选项<br />Threshold=WARN:指定日志消息的输出最低层次。<br />ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />File=mylog.txt:指定消息输出到mylog.txt文件。<br />Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。<br />MaxBackupIndex=2:指定可以产生的滚动文件的最大数。<br />实际应用：<br />　　log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender<br />　　<br />　　3、配置日志信息的格式，其语法为：<br />　　A. log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个：<br />1.org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />　　 2.org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />　　 3.org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />　　 4.org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />1.HTMLLayout 选项<br />LocationInfo=true:默认值是false,输出java文件名称和行号<br />Title=my app file: 默认值是 Log4J Log Messages.<br />2.PatternLayout 选项<br />ConversionPattern=%m%n :指定怎样格式化指定的消息。<br />3.XMLLayout 选项<br />LocationInfo=true:默认值是false,输出java文件和行号<br />实际应用：<br />　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />B. log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />这里需要说明的就是日志信息格式中几个符号所代表的含义：<br />　　 －X号: X信息输出时左对齐；<br />%p: 输出日志信息优先级，即DEBUG，INFO，WARN，ERROR，FATAL,<br />%d: 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />%r: 输出自应用启动到输出该log信息耗费的毫秒数<br />%c: 输出日志信息所属的类目，通常就是所在类的全名<br />%t: 输出产生该日志事件的线程名<br />%l: 输出日志事件的发生位置，相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)<br />%x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。<br />%%: 输出一个"%"字符<br />%F: 输出日志消息产生时所在的文件名称<br />%L: 输出代码中的行号<br />%m: 输出代码中指定的消息,产生的日志具体信息<br />%n: 输出一个回车换行符，Windows平台为"\r\n"，Unix平台为"\n"输出日志信息换行<br />可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如：<br />1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。<br />2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。<br />3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。<br />4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符，就从左边交远销出的字符截掉。<br />　　这里上面三个步骤是对前面Log4j组件说明的一个简化；下面给出一个具体配置例子，在程序中可以参照执行：<br />　　log4j.rootLogger=INFO,A1，B2<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 %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />　　根据上面的日志格式，某一个程序的输出结果如下：<br />　　0　　INFO　2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]<br />16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'<br />　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT<br /><br />4. # 当输出信息于回滚文件时<br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender //指定以文件的方式输出日志<br />log4j.appender.ROLLING_FILE.Threshold=ERROR <br />log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log<br />log4j.appender.ROLLING_FILE.Append=true <br />log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸<br />log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数<br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n<br /><br />6. Log4j比较全面的配置<br />  LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， <br />log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />log4j.addivity.org.apache=true <br /># 应用于控制台 <br />log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />log4j.appender.Threshold=DEBUG <br />log4j.appender.CONSOLE.Target=System.out <br />log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread] n%c[CATEGORY]%n%m[MESSAGE]%n%n <br />#应用于文件 <br />log4j.appender.FILE=org.apache.log4j.FileAppender <br />log4j.appender.FILE.File=file.log <br />log4j.appender.FILE.Append=false <br />log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /># Use this layout for LogFactor 5 analysis <br /># 应用于文件回滚 <br />log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />log4j.appender.ROLLING_FILE.Threshold=ERROR <br />log4j.appender.ROLLING_FILE.File=rolling.log //文件位置,也可以用变量${java.home}、rolling.log<br />log4j.appender.ROLLING_FILE.Append=true //true:添加 false:覆盖<br />log4j.appender.ROLLING_FILE.MaxFileSize=10KB //文件最大尺寸<br />log4j.appender.ROLLING_FILE.MaxBackupIndex=1 //备份数<br />log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /><br />#应用于socket <br />log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />log4j.appender.SOCKET.RemoteHost=localhost <br />log4j.appender.SOCKET.Port=5001 <br />log4j.appender.SOCKET.LocationInfo=true <br /># Set up for Log Facter 5 <br />log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[thread]%n%c[CATEGORY]%n%m[MESSAGE]%n%n <br /><br /># Log Factor 5 Appender <br />log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 <br /># 发送日志给邮件 <br />log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />log4j.appender.MAIL.Threshold=FATAL <br />log4j.appender.MAIL.BufferSize=10 <br />log4j.appender.MAIL.From=web@www.wuset.com <br />log4j.appender.MAIL.SMTPHost=www.wusetu.com <br />log4j.appender.MAIL.Subject=Log4J Message <br />log4j.appender.MAIL.To=web@www.wusetu.com <br />log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /># 用于数据库 <br />log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />log4j.appender.DATABASE.user=root <br />log4j.appender.DATABASE.password= <br />log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') <br />log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br /><br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />log4j.appender.A1.File=SampleMessages.log4j <br />log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout <br />#自定义Appender <br />log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender <br />log4j.appender.im.host = mail.cybercorlin.net <br />log4j.appender.im.username = username <br />log4j.appender.im.password = password <br />log4j.appender.im.recipient = corlin@cybercorlin.net <br />log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/179991#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Apr 2008 09:41:20 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/179991</link>
        <guid>http://tiantao.javaeye.com/blog/179991</guid>
      </item>
      <item>
        <title>Tomcat详解</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/178672" style="color:red;">http://tiantao.javaeye.com/blog/178672</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Tomcat笔记(1)<br /><br />Tomcat启动分析 <br /><br />1 - Tomcat Server的组成部分 <br />1.1 - Server <br />A Server element represents the entire Catalina servlet container. (Singleton) <br />1.2 - Service <br />A Service element represents the combination of one or more Connector components that share a single Engine<br />Service是这样一个集合：它由一个或者多个Connector组成，以及一个Engine，负责处理所有Connector所获得的客户请求<br />1.3 - Connector <br />一个Connector将在某个指定端口上侦听客户请求，并将获得的请求交给Engine来处理，从Engine处获得回应并返回客户<br />TOMCAT有两个典型的Connector，一个直接侦听来自browser的http请求，一个侦听来自其它WebServer的请求<br />Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求<br />Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求<br />1.4 - Engine <br />The Engine element represents the entire request processing machinery associated with a particular Service<br />It receives and processes all requests from one or more Connectors<br />and returns the completed response to the Connector for ultimate transmission back to the client<br />Engine下可以配置多个虚拟主机Virtual Host，每个虚拟主机都有一个域名<br />当Engine获得一个请求时，它把该请求匹配到某个Host上，然后把该请求交给该Host来处理<br />Engine有一个默认虚拟主机，当请求无法匹配到任何一个Host上的时候，将交给该默认Host来处理<br />1.5 - Host <br />代表一个Virtual Host，虚拟主机，每个虚拟主机和某个网络域名Domain Name相匹配<br />每个虚拟主机下都可以部署(deploy)一个或者多个Web App，每个Web App对应于一个Context，有一个Context path<br />当Host获得一个请求时，将把该请求匹配到某个Context上，然后把该请求交给该Context来处理<br />匹配的方法是“最长匹配”，所以一个path==""的Context将成为该Host的默认Context<br />所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配<br />1.6 - Context <br />一个Context对应于一个Web Application，一个Web Application由一个或者多个Servlet组成<br />Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类<br />当Context获得请求时，将在自己的映射表(mapping table)中寻找相匹配的Servlet类<br />如果找到，则执行该类，获得请求的回应，并返回<br />2 - Tomcat Server的结构图 <br /> <br />3 - 配置文件$CATALINA_HOME/conf/server.xml的说明 <br />该文件描述了如何启动Tomcat Server <br /><br /><br />&lt;!-- 启动Server<br />     在端口8005处等待关闭命令<br />     如果接受到"SHUTDOWN"字符串则关闭服务器<br />     --><br /><br />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"><br /><br /><br />  &lt;!-- Listener ???<br />       目前没有看到这里<br />       --><br /><br />  &lt;Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/><br />  &lt;Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/><br /><br /><br />  &lt;!-- Global JNDI resources ???<br />       目前没有看到这里，先略去<br />       --><br /><br />  &lt;GlobalNamingResources><br />    ... ... ... ...<br />  &lt;/GlobalNamingResources><br /><br /><br />  &lt;!-- Tomcat的Standalone Service<br />       Service是一组Connector的集合<br />       它们共用一个Engine来处理所有Connector收到的请求<br />       --><br /><br />  &lt;Service name="Tomcat-Standalone"><br /><br /><br />    &lt;!-- Coyote HTTP/1.1 Connector<br />         className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector<br />         port : 在端口号8080处侦听来自客户browser的HTTP1.1请求<br />         minProcessors : 该Connector先创建5个线程等待客户请求，每个请求由一个线程负责<br />         maxProcessors : 当现有的线程不够服务客户请求时，若线程总数不足75个，则创建新线程来处理请求<br />         acceptCount : 当现有线程已经达到最大数75时，为客户请求排队<br />                       当队列中请求数超过100时，后来的请求返回Connection refused错误<br />         redirectport : 当客户请求是https时，把该请求转发到端口8443去<br />         其它属性略<br />         --><br /><br />    &lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector" <br />               port="8080" <br />               minProcessors="5" maxProcessors="75" acceptCount="100" <br />               enableLookups="true" <br />               redirectPort="8443" <br />               debug="0" <br />               connectionTimeout="20000" <br />               useURIValidationHack="false" <br />               disableUploadTimeout="true" /><br /><br /><br />    &lt;!-- Engine用来处理Connector收到的Http请求<br />         它将匹配请求和自己的虚拟主机，并把请求转交给对应的Host来处理<br />         默认虚拟主机是localhost<br />         --><br /><br />    &lt;Engine name="Standalone" defaultHost="localhost" debug="0"><br />    <br /><br />      &lt;!-- 日志类，目前没有看到，略去先 --><br /><br />      &lt;Logger className="org.apache.catalina.logger.FileLogger" .../><br /><br />      &lt;!-- Realm，目前没有看到，略去先 --><br /><br />      &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../><br /><br /><br />      &lt;!-- 虚拟主机localhost<br />           appBase : 该虚拟主机的根目录是webapps/<br />           它将匹配请求和自己的Context的路径，并把请求转交给对应的Context来处理<br />           --><br /><br />      &lt;Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"><br />      <br /><br />        &lt;!-- 日志类，目前没有看到，略去先 --><br /><br />        &lt;Logger className="org.apache.catalina.logger.FileLogger" .../><br />      <br /><br />        &lt;!-- Context，对应于一个Web App<br />             path : 该Context的路径名是""，故该Context是该Host的默认Context<br />             docBase : 该Context的根目录是webapps/mycontext/<br />             --><br /><br />        &lt;Context path="" docBase="mycontext" debug="0"/><br />        <br /><br />        &lt;!-- 另外一个Context，路径名是/wsota --><br /><br />        &lt;Context path="/wsota" docBase="wsotaProject" debug="0"/><br />             <br />        <br />      &lt;/Host><br />      <br />    &lt;/Engine><br /><br />  &lt;/Service><br /><br />&lt;/Server><br /><br /><br />&lt;!-----------------------------------------------------------------------------------------------><br /><br />4 - Context的部署配置文件web.xml的说明 <br />一个Context对应于一个Web App，每个Web App是由一个或者多个servlet组成的<br />当一个Web App被初始化的时候，它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类<br />它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类<br />然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类<br />web.xml文件有两部分：servlet类定义和servlet映射定义<br />每个被载入的servlet类都有一个名字，且被填入该Context的映射表(mapping table)中，和某种URL PATTERN对应<br />当该Context获得请求时，将查询mapping table，找到被请求的servlet，并执行以获得请求回应<br />分析一下所有的Context共享的web.xml文件，在其中定义的servlet被所有的Web App载入<br /><br />&lt;!-----------------------------------------------------------------------------------------------><br /><br /><br />&lt;web-app><br /><br /><br />  &lt;!-- 概述：<br />       该文件是所有的WEB APP共用的部署配置文件，<br />       每当一个WEB APP被DEPLOY，该文件都将先被处理，然后才是WEB APP自己的/WEB-INF/web.xml<br />       --><br /><br /><br /><br />  &lt;!--  +-------------------------+  --><br />  &lt;!--  |    servlet类定义部分    |  --><br />  &lt;!--  +-------------------------+  --><br /><br />  <br /><br />  &lt;!-- DefaultServlet<br />       当用户的HTTP请求无法匹配任何一个servlet的时候，该servlet被执行<br />       URL PATTERN MAPPING : /<br />       --><br /><br />    &lt;servlet><br />        &lt;servlet-name>default&lt;/servlet-name><br />        &lt;servlet-class><br />          org.apache.catalina.servlets.DefaultServlet<br />        &lt;/servlet-class><br />        &lt;init-param><br />            &lt;param-name>debug&lt;/param-name><br />            &lt;param-value>0&lt;/param-value><br />        &lt;/init-param><br />        &lt;init-param><br />            &lt;param-name>listings&lt;/param-name><br />            &lt;param-value>true&lt;/param-value><br />        &lt;/init-param><br />        &lt;load-on-startup>1&lt;/load-on-startup><br />    &lt;/servlet><br /><br /><br />  &lt;!-- InvokerServlet<br />       处理一个WEB APP中的匿名servlet<br />       当一个servlet被编写并编译放入/WEB-INF/classes/中，却没有在/WEB-INF/web.xml中定义的时候<br />       该servlet被调用，把匿名servlet映射成/servlet/ClassName的形式<br />       URL PATTERN MAPPING : /servlet/*<br />       --><br /><br />    &lt;servlet><br />        &lt;servlet-name>invoker&lt;/servlet-name><br />        &lt;servlet-class><br />          org.apache.catalina.servlets.InvokerServlet<br />        &lt;/servlet-class><br />        &lt;init-param><br />            &lt;param-name>debug&lt;/param-name><br />            &lt;param-value>0&lt;/param-value><br />        &lt;/init-param><br />        &lt;load-on-startup>2&lt;/load-on-startup><br />    &lt;/servlet><br /><br /><br />  &lt;!-- JspServlet<br />       当请求的是一个JSP页面的时候（*.jsp）该servlet被调用<br />       它是一个JSP编译器，将请求的JSP页面编译成为servlet再执行<br />       URL PATTERN MAPPING : *.jsp<br />       --><br /><br />    &lt;servlet><br />        &lt;servlet-name>jsp&lt;/servlet-name><br />        &lt;servlet-class>org.apache.jasper.servlet.JspServlet&lt;/servlet-class><br />        &lt;init-param><br />            &lt;param-name>logVerbosityLevel&lt;/param-name><br />            &lt;param-value>WARNING&lt;/param-value><br />        &lt;/init-param><br />        &lt;load-on-startup>3&lt;/load-on-startup><br />    &lt;/servlet><br /><br /><br /><br />  &lt;!--  +---------------------------+  --><br />  &lt;!--  |    servlet映射定义部分    |  --><br />  &lt;!--  +---------------------------+  --><br /><br />    <br />    &lt;servlet-mapping><br />        &lt;servlet-name>default&lt;/servlet-name><br />        &lt;url-pattern>/&lt;/url-pattern><br />    &lt;/servlet-mapping><br /><br />    &lt;servlet-mapping><br />        &lt;servlet-name>invoker&lt;/servlet-name><br />        &lt;url-pattern>/servlet/*&lt;/url-pattern><br />    &lt;/servlet-mapping><br /><br />    &lt;servlet-mapping><br />        &lt;servlet-name>jsp&lt;/servlet-name><br />        &lt;url-pattern>*.jsp&lt;/url-pattern><br />    &lt;/servlet-mapping><br /><br /><br />  &lt;!--  +------------------------+  --><br />  &lt;!--  |    其它部分，略去先    |  --><br />  &lt;!--  +------------------------+  --><br /><br />    ... ... ... ...<br /><br />&lt;/web-app><br /><br /><br />&lt;!-----------------------------------------------------------------------------------------------><br /><br />5 - Tomcat Server处理一个http请求的过程 <br />假设来自客户的请求为：<br />http://localhost:8080/wsota/wsota_index.jsp<br />1) 请求被发送到本机端口8080，被在那里侦听的Coyote HTTP/1.1 Connector获得<br />2) Connector把该请求交给它所在的Service的Engine来处理，并等待来自Engine的回应<br />3) Engine获得请求localhost/wsota/wsota_index.jsp，匹配它所拥有的所有虚拟主机Host<br />4) Engine匹配到名为localhost的Host（即使匹配不到也把请求交给该Host处理，因为该Host被定义为该Engine的默认主机）<br />5) localhost Host获得请求/wsota/wsota_index.jsp，匹配它所拥有的所有Context<br />6) Host匹配到路径为/wsota的Context（如果匹配不到就把该请求交给路径名为""的Context去处理）<br />7) path="/wsota"的Context获得请求/wsota_index.jsp，在它的mapping table中寻找对应的servlet<br />8) Context匹配到URL PATTERN为*.jsp的servlet，对应于JspServlet类<br />9) 构造HttpServletRequest对象和HttpServletResponse对象，作为参数调用JspServlet的doGet或doPost方法<br />10)Context把执行完了之后的HttpServletResponse对象返回给Host<br />11)Host把HttpServletResponse对象返回给Engine<br />12)Engine把HttpServletResponse对象返回给Connector<br />13)Connector把HttpServletResponse对象返回给客户browser<br /><br />一、Tomcat背景<br />　　自从JSP发布之后，推出了各式各样的JSP引擎。Apache Group在完成GNUJSP1.0的开发以后，开始考虑在SUN的JSWDK基础上开发一个可以直接提供Web服务的JSP服务器，当然同时也支持Servlet, 这样Tomcat就诞生了。Tomcat是jakarta项目中的一个重要的子项目，其被JavaWorld杂志的编辑选为2001年度最具创新的java产品，同时它又是sun公司官方推荐的servlet和jsp容器，因此其越来越多的受到软件公司和开发人员的喜爱。servlet和jsp的最新规范都可以在tomcat的新版本中得到实现。其次，Tomcat是完全免费的软件，任何人都可以从互联网上自由地下载。Tomcat与Apache的组合相当完美。<br /> <br />二、Tomcat目录<br />tomcat<br />|---bin Tomcat：存放启动和关闭tomcat脚本；<br />|---conf Tomcat：存放不同的配置文件（server.xml和web.xml）；<br />|---doc：存放Tomcat文档；<br />|---lib/japser/common：存放Tomcat运行需要的库文件（JARS）；<br />|---logs：存放Tomcat执行时的LOG文件；<br />|---src：存放Tomcat的源代码；<br />|---webapps：Tomcat的主要Web发布目录（包括应用程序示例）；<br />|---work：存放jsp编译后产生的class文件；<br /><br /><br />三、Tomcat类加载<br />    Bootstrap($JAVA_HOME/jre/lib/ext/*.jar) <br />System($CLASSPATH/*.class和指定的jar) <br />Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录) <br />Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)<br />&Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)<br /><br /><br />加载类和资源的顺序为：<br />1、/Web-INF/classes <br />2、/Web-INF/lib/*.jar <br />3、Bootstrap <br />4、System <br />5、$CATALINA_HOME/common/classes<br />6、$CATALINA_HOME/common/endores/*.jar <br />7、$CATALINA_HOME/common/lib/*.jar <br />8、$CATALINA_HOME/shared/classes<br />9、$CATALINA_HOME/shared/lib/*.jar<br /> <br />四、server.xml配置简介：<br />下面讲述这个文件中的基本配置信息，更具体的配置信息请参考tomcat的文档：<br />    server: <br />          1、port 指定一个端口，这个端口负责监听关闭tomcat的请求 <br />          2、shutdown 指定向端口发送的命令字符串 <br />    service: <br />          1、name 指定service的名字 <br />    Connector (表示客户端和service之间的连接)：<br />          1、port 指定服务器端要创建的端口号，并在这个断口监听来自客户端的请求 <br />          2、minProcessors 服务器启动时创建的处理请求的线程数 <br />          3、maxProcessors 最大可以创建的处理请求的线程数 <br />          4、enableLookups 如果为true，则可以通过调用request.getRemoteHost()进行DNS查<br />询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip<br />地址 <br />          5、redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的<br />端口号 <br />          6、acceptCount 指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理<br />队列中的请求数，超过这个数的请求将不予处理 <br />          7、connectionTimeout 指定超时的时间数(以毫秒为单位) <br />    Engine (表示指定service中的请求处理机，接收和处理来自Connector的请求)：<br />          1、defaultHost 指定缺省的处理请求的主机名，它至少与其中的一个host元素的name<br />属性值是一样的 <br />    Context (表示一个web应用程序)：<br />          1、docBase 应用程序的路径或者是WAR文件存放的路径 <br />          2、path 表示此web应用程序的url的前缀，这样请求的url为<br />http://localhost:8080/path/**** <br />          3、reloadable 这个属性非常重要，如果为true，则tomcat会自动检测应用程序的<br />/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可<br />以在不重起tomcat的情况下改变应用程序 <br />    host (表示一个虚拟主机)：<br />          1、name 指定主机名 <br />          2、appBase 应用程序基本目录，即存放应用程序的目录 <br />          3、unpackWARs 如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接<br />从WAR文件中运行应用程序 <br />    Logger (表示日志，调试和错误信息)：<br />          1、className 指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口 <br />          2、prefix 指定log文件的前缀 <br />          3、suffix 指定log文件的后缀 <br />          4、timestamp 如果为true，则log文件名中要加入时间，如下<br />例:localhost_log.2001-10-04.txt <br />   Realm (表示存放用户名，密码及role的数据库)：<br />          1、className 指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口 <br />   Valve (功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样)：<br />          1、className 指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve<br />类可以记录应用程序的访问信息 <br />    directory（指定log文件存放的位置）：<br />    1、pattern 有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行<br />请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记<br />录的值更多<br /> <br />五、web.xml配置简介：<br />1、默认(欢迎)文件的设置<br /> 在tomcat4\conf\web.xml中，&lt;welcome-file-list>与IIS中的默认文件意思相同。<br /> &lt;welcome-file-list> <br /> &lt;welcome-file>index.html&lt;/welcome-file> <br /> &lt;welcome-file>index.htm&lt;/welcome-file> <br /> &lt;welcome-file>index.jsp&lt;/welcome-file><br /> &lt;/welcome-file-list><br /> <br />2、报错文件的设置<br />&lt;error-page> <br />&lt;error-code>404&lt;/error-code><br />&lt;location>/notFileFound.jsp&lt;/location><br />&lt;/error-page><br />&lt;error-page><br />&lt;exception-type>java.lang.NullPointerException&lt;/exception-type> <br />&lt;location>/null.jsp&lt;/location><br />&lt;/error-page><br />如果某文件资源没有找到，服务器要报404错误，按上述配置则会调用\webapps\ROOT\notFileFound.jsp。<br />如果执行的某个JSP文件产生NullPointException ，则会调用\webapps\ROOT\null.jsp<br /> <br />3、会话超时的设置<br />设置session 的过期时间，单位是分钟；<br />&lt;session-config> <br />&lt;session-timeout>30&lt;/session-timeout> <br />&lt;/session-config><br /> <br />4、过滤器的设置<br />&lt;filter><br />&lt;filter-name>FilterSource&lt;/filter-name><br />&lt;filter-class>project4. FilterSource &lt;/filter-class><br />&lt;/filter><br />&lt;filter-mapping><br />&lt;filter-name>FilterSource&lt;/filter-name><br />&lt;url-pattern>/WwwServlet&lt;/url-pattern><br />(&lt;url-pattern>/haha/*&lt;/url-pattern>)<br />&lt;/filter-mapping><br /> <br />过滤：<br />1) 身份验证的过滤Authentication Filters<br />2) 日志和审核的过滤Logging and Auditing Filters<br />3) 图片转化的过滤Image conversion Filters<br />4) 数据压缩的过滤Data compression Filters<br />5) 加密过滤Encryption Filters<br />6) Tokenizing Filters<br />7) 资源访问事件触发的过滤Filters that trigger resource access events XSL/T 过滤XSL/T filters<br />9) 内容类型的过滤Mime-type chain Filter 注意监听器的顺序，如：先安全过滤，然后资源，<br />然后内容类型等，这个顺序可以自己定。<br /> <br />六、管理 <br />    1、用户配置 <br />      在进行具体Tomcat管理之前，先给tomcat添加一个用户，使这个用户有权限来进行管理。 <br />      打开conf目录下的tomcat-users.xml文件，在相应的位置添加下面一行： <br />    &lt;user name="user" password="user" roles="standard,manager"/> <br />    然后重起tomcat，在浏览器中输入http://localhost:8080/manager/，会弹出对话框，输入上面的用户<br />名和密码即可。 <br /><br />    2、应用程序列表 <br />      在浏览器中输入http://localhost:8080/manager/list，浏览器将会显示如下的信息： <br />    OK - Listed applications for virtual host localhost <br />    /ex:running:1 <br />    /examples:running:1 <br />    /webdav:running:0 <br />    /tomcat-docs:running:0 <br />    /manager:running:0 <br />    /:running:0 <br />     上面显示的信息分别为：应用程序的路径、当前状态、连接这个程序的session数<br /><br />   3、重新装载应用程序 <br />      在浏览器中输入 http://localhost:8080/manager/reload?path=/examples，浏览器显示如下： <br />    OK - Reloaded application at context path /examples    <br />这表示example应用程序装载成功，如果我们将server.xml的Context元素的reloadable属性设为true，则没必要利用这种方式重新装载应用程序，因为tomcat会自动装载。 <br /> <br />4、显示session信息 <br />    在浏览器中输入http://localhost:8080/manager/sessions?path=/examples，浏览器显示如下： <br />    OK - Session information for application at context path /examples Default maximum session inactive <br />interval 30 minutes <br /><br />5、启动和关闭应用程序 <br />   在浏览器中输入http://localhost:8080/manager/start?path=/examples和<br />http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/178672#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 09:39:43 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/178672</link>
        <guid>http://tiantao.javaeye.com/blog/178672</guid>
      </item>
      <item>
        <title>网络协议</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/178670" style="color:red;">http://tiantao.javaeye.com/blog/178670</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          DHCP是BOOTP的扩展，是基于C/S模式的，它提供了一种动态指定IP地址和配置参数的机制。这主要用于大型网络环境和配置比较困难的地方。DHCP服务器自动为客户机指定IP地址，指定的配置参数有些和IP协议并不相关，但这必没有关系，它的配置参数使得网络上的计算机通信变得方便而容易实现了。DHCP使IP地址的可以租用，对于许多拥有许多台计算机的大型网络来说，每台计算机拥有一个IP地址有时候可能是不必要的。租期从1分钟到100年不定，当租期到了的时候，服务器可以把这个IP地址分配给别的机器使用。客户也可以请求使用自己喜欢的网络地址及相应的配置参数。<br /><br />DHCP是对BOOTP的扩展，它的包格式和BOOTP也一样，这样它就可以使用BOOTP的中转发代理来发送DHCP包了，这使得BOOTP和DHCP之间可以实现互操作。对于BOOTP转发代理来说，发的是DHCP包还是BOOTP包，它根本分不清楚。它们使用的服务器端口号是67和68，但是有些地方还有些不同：<br />DHCP定义了一种可以使IP地址使用一段有限时间的机制，在客户期限到了的时候可以重新分配这个IP地址。<br />DHCP为用户提供所有IP配置参数。<br />DHCP包长度比BOOTP包长度稍长。既然包比BOOTP的长，那也不是白带的，这多出的长度里包括了网络配置参数。<br />DHCP的包都比BOOTP的长，那协议也复杂了。DHCP有七种消息类型，而BOOTP只有两种。<br />下图中我们可以清楚地看到客户机请求获得网络地址和配置参数的最初几个步骤：<br />第一步的时候客户发出包的名称叫DHCPDISCOVER，而服务器返回包的名称叫DHCPOFFER。<br />1.BOOTP转发代理接收到请求包，并负责向DHCP其它网络内的DHCP服务器转发。<br />2.DHCP服务器以DHCPOFFER响应客户的要求，这个包内包括可用的IP地址和参数。<br />3.BOOTP转发代理接收包，并对它进行检查。如果它觉得没有问题，就向客户转发。<br />4.如果客户在发出DHCPOFFER包后一段时间内没有接收到回应，它有机会重新发送请求10次，否则就通知用户。客户机可以同时接收到许多个服务器的应答，它可以自己决定用哪一个。下图是客户决定了以后，向服务器发送应答时的情况。<br />5.当客户选定了某个目标服务器后，它会广播DHCPREQUEST包，用以通知选定的服务器和未选定的服务器。<br />6.转发工作仍然由BOOTP转发担任。<br />7.收到DHCPREQUEST包服务器会检查收到的包，如果包内的地址和提供的地址一致，证明现在客户机选择的是这台服务器提供的地址，如果不是，自己提供的地址被拒绝了。<br />8.被选定的服务器在接收到DHCPREQUEST包以后，因为某些原因可能不能向客户提供这个网络地址或参数，它可以向客户发送DHCPNAK包，如果可以提供则可以发送DHCPACK包。<br />客户在收到包后，检查内部的网络地址和租用时间，如果客户觉得这个包有问题，它可以发送DHCPDECLINE包拒绝这个地址，然后重新发送DHCPDISCOVER包。如果觉得没有问题，就可以接受这个配置参数。同样当客户接收到DHCPNAK包时，它也可以发送DHCPDISCOVER包。客户可以在租期到期之前释放网络地址，这通过发送DHCPRELEASE包来实现。<br />用户下一次可以再次获得相同的IP地址。在这一过程中，许多步骤就可以不用麻烦了，老客户当然要方便一点了。<br />1.客户在发送的DHCPREQUEST包内包括自己以前使用的IP地址。<br />2.此包由BOOTP转发代理转发。<br />3.DHCP服务器检查DHCPREQUEST包内包括的配置参数。<br />4.它如果是原来提供这个网络地址的参数的服务器，它会认出这些数来，并以DHCPACK包回应。<br />5.客户接收到DHCPACK包后，它可以接收或拒绝，如果拒绝它可以申请新的网络地址。<br />当然了，如果服务器觉得客户的请求是无效的，服务器会以DHCPNAK包响应，客户接收到这个包后，会重新会获得网络地址而发送DHCPDISCOVER包。
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/178670#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 09:37:45 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/178670</link>
        <guid>http://tiantao.javaeye.com/blog/178670</guid>
      </item>
      <item>
        <title>websphere,weblogic,tomcat区别</title>
        <author>wangyu336</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tiantao.javaeye.com">wangyu336</a>&nbsp;
          链接：<a href="http://tiantao.javaeye.com/blog/173986" style="color:red;">http://tiantao.javaeye.com/blog/173986</a>&nbsp;
          发表时间: 2008年03月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">概述:</span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp;&nbsp;&nbsp;工作虽然不是很长,但是有很多很多东西想和大家来分享,分享我在开发中自己认为很有价值的经验和疑问.所以怎么也要抽出时间来谈谈.java从再基本被广大开发者认同到现在也已经有很长时间了,越来月多的开发者加入了这个开源组织,从最开始的java基础编程语言j2se(c/s架构) 到如今特别火的网络编程j2ee(b/s).下面我门就开谈谈关于网络编程最火的服务器组织.所以出现了一批不用的web服务应用.这里我们主要争对最典型最流行的三个weblogic<span style="font-size: 9pt; font-family: 宋体">和</span><span style="font-size: 9pt; font-family: Tahoma">websphere,tomcat.</span>web服务器来谈:</span></span></span><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp;</span></span></span><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;</span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp; j2ee开发主要是一种浏览器和服务器之间交互的一种结构.处理所有逻辑都是在后台处理,然后在传输给浏览器.可以看的出服务器在这种架构很重要.所以,碌碌须须出现了</span></span></span></p><p><span style="font-family: 宋体"></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp; 共同:</span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">weblogic<span style="font-size: 9pt; font-family: 宋体">和</span><span style="font-size: 9pt; font-family: Tahoma">websphere,<span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">tomcat 都是基于java的基础架构来满足实时处理需求,不同的版本与jdk版本兼容和有所不同;他们都基于sun公司的servlet来实现的.</span></span></span></span></span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma"><span style="font-size: 9pt; font-family: Tahoma"><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp; 不同:</span></span></span></span></span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma"><span style="font-size: 9pt; font-family: Tahoma"><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp;&nbsp;&nbsp; 1.创造者</span></span></span></span></span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma"><span style="font-size: 9pt; font-family: Tahoma"><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; weblogic是BEA系统有限公司(NASDAQ：BEAS)是全球企业基础架构软件公司开发的,最新版本<span class="604181603-09082005">WebLogic Server 9.0 是迄今为止发布的最卓越的BEA应用服务器。它与J2EE 1.4完全兼容，通过交付高可靠性的、永不宕机的、可量测的、针对关键任务的整合解决方案，降低管理与运营的整体成本，以解决企业目前所面临的各种重大挑战。</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 9pt; font-family: Tahoma">websphere</span><span style="font-size: 9pt; font-family: 宋体">是号称IT巨人的IBM公司开发的.WebSphere 提供了开发人员所需要的各种工具来创建、测试、部署、注册或发布、以及使用 Web services</span></span></span></span></span></span></span></span></p><p><span style="font-family: 宋体"><span style="font-size: small"><span style="font-size: 9pt; font-family: Tahoma">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tomcat</span><span style="font-size: 9pt; font-family: 宋体">是Apache组织开发提供免费开源的</span><span style="font-size: 9pt; font-family: Tahoma">jsp,servlet</span><span style="font-size: 9pt; font-family: 宋体">引擎，可以用它来开发驱动</span></span></span><span style="font-size: 9pt; font-family: Tahoma"><span style="font-size: large"><span style="font-size: small; font-family: 宋体">jsp</span>&nbsp;,</span></span></p><p><span style="font-size: 9pt; font-family: Tahoma"><span style="font-size: large"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; weblogic</span><span style="font-size: 9pt; font-family: 宋体">和</span><span style="font-size: 9pt; font-family: Tahoma">websphere</span><span style="font-size: 9pt; font-family: 宋体">是</span><span style="font-size: 9pt; font-family: Tahoma">j2ee</span><span style="font-size: 9pt; font-family: 宋体">的应用服务器，包括</span><span style="font-size: 9pt; font-family: Tahoma">ejb &nbsp; ,jsp,servlet,jms</span><span style="font-size: 9pt; font-family: 宋体">等等，全能型的。</span><span style="font-size: 9pt; font-family: Tahoma">&nbsp;</span><span style="font-size: 9pt; font-family: 宋体">不过</span><span style="font-size: 9pt; font-family: Tahoma">tomcat</span><span style="font-size: 9pt; font-family: 宋体">配合</span><span style="font-size: 9pt; font-family: Tahoma">jboss</span><span style="font-size: 9pt; font-family: 宋体">和</span><span style="font-size: 9pt; font-family: Tahoma">apache</span><span style="font-size: 9pt; font-family: 宋体">可以实现</span><span style="font-size: 9pt; font-family: Tahoma">j2ee</span><span style="font-size: 9pt; font-family: 宋体">应用服务器功能</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://tiantao.javaeye.com/blog/173986#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Mar 2008 10:14:26 +0800</pubDate>
        <link>http://tiantao.javaeye.com/blog/173986</link>
        <guid>http://tiantao.javaeye.com/blog/173986</guid>
      </item>
  </channel>
</rss>