﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-fun</title><link>http://www.blogjava.net/wangfun/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 19:02:51 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 19:02:51 GMT</pubDate><ttl>60</ttl><item><title>大规模网站架构ppt</title><link>http://www.blogjava.net/wangfun/archive/2009/11/06/301484.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Fri, 06 Nov 2009 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/11/06/301484.html</guid><wfw:comment>http://www.blogjava.net/wangfun/comments/301484.html</wfw:comment><comments>http://www.blogjava.net/wangfun/archive/2009/11/06/301484.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/wangfun/comments/commentRss/301484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangfun/services/trackbacks/301484.html</trackback:ping><description><![CDATA[<span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px" class="Apple-style-span">
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">为公司讲解的一个PPT，相关内容如下:<br />
</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;http://www.bt285.cn BT下载 有300W部BT种子.<br />
http://www.5a520.cn 小说520网 有300W部小说</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">CAP原则<br />
BASE策略<br />
异步(MessageQueue)<br />
<strong style="font-weight: bold">数据库<br />
</strong>&nbsp;&nbsp; 数据的水平切分及垂直切分<br />
&nbsp;&nbsp;&nbsp; 数据库读写分离<br />
&nbsp;&nbsp;&nbsp; 避免分布式事务<br />
&nbsp;&nbsp;&nbsp; 反范式的数据库设计<br />
<strong style="font-weight: bold">负载均衡<br />
</strong>&nbsp;&nbsp;&nbsp; DNS负载均衡<br />
&nbsp;&nbsp;&nbsp; 反向代理负载均衡<br />
&nbsp;&nbsp;&nbsp;&nbsp; LVS<br />
<strong style="font-weight: bold">缓存<br />
</strong>&nbsp;&nbsp;&nbsp; 数据库缓存<br />
&nbsp;&nbsp;&nbsp;&nbsp; 服务器缓存/页面缓存/数据缓存/静态化<br />
&nbsp;&nbsp;&nbsp; 反向代理缓存</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><strong style="font-weight: bold">HA<br />
</strong>Session</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">Share Nothing Architecture架构<br />
<strong style="font-weight: bold">浏览器优化</strong><br />
&nbsp;&nbsp;&nbsp; 浏览器缓存/CDN/小图片合并<br />
分布式文件系统(MogileFS)<br />
<br />
</p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">下载地址为：<a href="http://www.bt285.cn/soft/res.ppt">http://www.bt285.cn/soft/res.ppt</a></p>
<p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;</p>
</span></span>
<img src ="http://www.blogjava.net/wangfun/aggbug/301484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-11-06 19:44 <a href="http://www.blogjava.net/wangfun/archive/2009/11/06/301484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置成https方式访问（用单向认证）</title><link>http://www.blogjava.net/wangfun/archive/2009/05/12/270169.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Tue, 12 May 2009 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/12/270169.html</guid><description><![CDATA[在命令提示符窗口，进入Tomcat目录，执行以下命令： <br />
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore -validity 3600 <br />
通过以上步骤生成server.keystore证书文件、 <br />
<br />
将servlet.xml一下的的注释打开（最好拷贝此段） <br />
&lt;!-- Define a SSL HTTP/1.1 Connector on port 8443 --&gt;&nbsp;&nbsp; <br />
&lt;Connector protocol="org.apache.coyote.http11.Http11Protocol"&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8443" maxHttpHeaderSize="8192"&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="server.keystore"&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="changeit"/&gt;&nbsp; <br />
到这一步访问https;//ip:8443/item <br />
<br />
一般Tomcat默认的SSL端口号是8443，但是对于SSL标准端口号是443，这样在访问网页的时候，直接使用https而不需要输入端口号就可以访问，如<a href="http://www.bt285.cn">http://www.bt285.cn</a> <br />
想要修改端口号，需要修改Tomcat的server.xml文件： <br />
1.non-SSL HTTP/1.1 Connector定义的地方，一般如下： <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Connector port="80" maxHttpHeaderSize="8192" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="500" minSpareThreads="25" maxSpareThreads="75" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="443" acceptCount="100" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" /&gt; <br />
将其中的redirectPort端口号改为：443 <br />
2.SSL HTTP/1.1 Connector定义的地方，修改端口号为：443，如下： <br />
&lt;Connector&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; port="443" maxHttpHeaderSize="8192" <br />
&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" <br />
&nbsp;&nbsp; maxSpareThreads="75" <br />
&nbsp;&nbsp; enableLookups="false" <br />
&nbsp;&nbsp; disableUploadTimeout="true" <br />
&nbsp;&nbsp; acceptCount="100" scheme="https" <br />
&nbsp;&nbsp; secure="true" <br />
&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp; keystoreFile="conf/tomcat.keystore" <br />
&nbsp;&nbsp; keystorePass="123456" /&gt; <br />
3.AJP 1.3 Connector定义的地方，修改redirectPort为443，如下： <br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Connector port="8009" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="443" protocol="AJP/1.3" /&gt; <br />
<br />
重新启动Tomcat就可以了。到这一步可以形成访问方式 <a href="http://www.5a520.cn">http://www.5a520.cn</a> /item <br />
<br />
到tomcat下面的webapps下面的ROOT下面的index.jsp文件的内容 <br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br />
&nbsp; &lt;%response.sendRedirect("/item");%&gt; <br />
<br />
修改web.xml文件的内容 <br />
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" <br />
&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <br />
&nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" <br />
&nbsp;&nbsp;&nbsp; version="2.4"&gt; <br />
<br />
&nbsp; &lt;display-name&gt;Welcome to Tomcat&lt;/display-name&gt; <br />
&nbsp; &lt;description&gt;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.feng123.com">http://www.feng123.com</a> 蜂蜜交易网<br />
&nbsp; &lt;/description&gt; <br />
<br />
&nbsp; &lt;welcome-file-list&gt; <br />
&nbsp;&nbsp; &lt;welcome-file&gt;/index.jsp&lt;/welcome-file&gt; <br />
&nbsp; &lt;/welcome-file-list&gt; <br />
&lt;/web-app&gt; <br />
删除lib目录下的lib文件 <br />
重启Tomcat服务器，在这一步可以直接通过https:ip来访问项目 <br />
<img src ="http://www.blogjava.net/wangfun/aggbug/270169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-12 11:35 <a href="http://www.blogjava.net/wangfun/archive/2009/05/12/270169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>10分钟学懂Struts 2.0 拦截器</title><link>http://www.blogjava.net/wangfun/archive/2009/05/08/269677.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Fri, 08 May 2009 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/08/269677.html</guid><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-align: center" align="center"><strong><span style="font-size: 16pt"><span style="font-family: Times New Roman">Struts 2.0</span></span></strong><strong><span style="font-size: medium">拦截器</span></strong></p>
<table style="background: #6699ff; border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr style="height: 22.7pt">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; border-bottom-color: #ece9d8; padding-bottom: 0cm; width: 426.1pt; border-top-color: #ece9d8; padding-top: 0cm; height: 22.7pt; background-color: transparent; border-right-color: #ece9d8" width="568">
            <p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><strong>简介</strong></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt">在<span style="font-size: 9pt"><span style="font-family: Times New Roman">Struts 2.0 </span></span>中的拦截器，要实现<span style="font-size: 9pt"><span style="font-family: Times New Roman">com.opensymphony.xwork2.interceptor.Interceptor</span></span>接口，在<span style="font-size: 9pt"><span style="font-family: Times New Roman">struts.xml</span></span>中配置。可以用拦截器来完成调用<span style="font-size: 9pt"><span style="font-family: Times New Roman">Action</span></span>业务逻辑之前的预处理或是之后的善后处理。还可以通过配置多个拦截器来满足<span style="font-size: 9pt"><span style="font-family: Times New Roman">action</span></span>需求。</p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt"><span style="font-family: Times New Roman">Interceptor&nbsp;stack</span></span>是由多个拦截器组成的拦截器组，在拦截器组中可以对每一个拦截器映射。所有进行配置拦截器时，不必对每一个拦截器进行配置，而只需对<span style="font-size: 9pt"><span style="font-family: Times New Roman">interceptor stack</span></span>进行配置即可。在<span style="font-size: 9pt"><span style="font-family: Times New Roman">struts 2</span></span>中默认配置了一个全局<span style="font-size: 9pt"><span style="font-family: Times New Roman">interceptor stack</span></span>，包括<span style="font-size: 9pt"><span style="font-family: Times New Roman">Exception Interceptor</span></span>、<span style="font-size: 9pt"><span style="font-family: Times New Roman">Validation Interceptor</span></span>等。</p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt">&nbsp;</span></p>
<table style="background: #6699ff; border-collapse: collapse" cellspacing="0" cellpadding="0" border="0">
    <tbody>
        <tr style="height: 22.7pt">
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; border-bottom-color: #ece9d8; padding-bottom: 0cm; width: 426.1pt; border-top-color: #ece9d8; padding-top: 0cm; height: 22.7pt; background-color: transparent; border-right-color: #ece9d8" width="568">
            <p style="margin: 0cm 0cm 0pt"><span style="font-size: small"><strong>实例</strong></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt">&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt">在这个实例当中，我将配置一个时间拦截器，用来统计每个<span style="font-size: 9pt"><span style="font-family: Times New Roman">action</span></span>的请求时间。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;interceptor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionInvocation;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.interceptor.Interceptor;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_150_206_Open_Image" onclick="this.style.display='none'; Codehighlighter1_150_206_Open_Text.style.display='none'; Codehighlighter1_150_206_Closed_Image.style.display='inline'; Codehighlighter1_150_206_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_150_206_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_150_206_Closed_Text.style.display='none'; Codehighlighter1_150_206_Open_Image.style.display='inline'; Codehighlighter1_150_206_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_150_206_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_150_206_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*author&nbsp;by&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.bt285.cn</span><span style="color: #008000">&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.5a520.cn</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_260_736_Open_Image" onclick="this.style.display='none'; Codehighlighter1_260_736_Open_Text.style.display='none'; Codehighlighter1_260_736_Closed_Image.style.display='inline'; Codehighlighter1_260_736_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_260_736_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_260_736_Closed_Text.style.display='none'; Codehighlighter1_260_736_Open_Image.style.display='inline'; Codehighlighter1_260_736_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ActionTimer&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Interceptor</span><span id="Codehighlighter1_260_736_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_260_736_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_336_628_Open_Image" onclick="this.style.display='none'; Codehighlighter1_336_628_Open_Text.style.display='none'; Codehighlighter1_336_628_Closed_Image.style.display='inline'; Codehighlighter1_336_628_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_336_628_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_336_628_Closed_Text.style.display='none'; Codehighlighter1_336_628_Open_Image.style.display='inline'; Codehighlighter1_336_628_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;intercept(ActionInvocation&nbsp;next)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_336_628_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_336_628_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;t1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.currentTimeMillis();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;next.invoke();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;t2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.currentTimeMillis();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Action&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">next.getAction().getClass().getName()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;took&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">(t2</span><span style="color: #000000">-</span><span style="color: #000000">t1)</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;millisecs</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_670_682_Open_Image" onclick="this.style.display='none'; Codehighlighter1_670_682_Open_Text.style.display='none'; Codehighlighter1_670_682_Closed_Image.style.display='inline'; Codehighlighter1_670_682_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_670_682_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_670_682_Closed_Text.style.display='none'; Codehighlighter1_670_682_Open_Image.style.display='inline'; Codehighlighter1_670_682_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init()&nbsp;</span><span id="Codehighlighter1_670_682_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_670_682_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_716_728_Open_Image" onclick="this.style.display='none'; Codehighlighter1_716_728_Open_Text.style.display='none'; Codehighlighter1_716_728_Closed_Image.style.display='inline'; Codehighlighter1_716_728_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_716_728_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_716_728_Closed_Text.style.display='none'; Codehighlighter1_716_728_Open_Image.style.display='inline'; Codehighlighter1_716_728_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy()&nbsp;</span><span id="Codehighlighter1_716_728_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_716_728_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<span lang="EN-US" style="font-size: 9pt"><span style="font-family: Times New Roman">struts.xml</span></span><span>：</span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;struts&nbsp;PUBLIC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptor"</span><span style="color: #ff0000">&nbsp;extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="actiontimer"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="interceptor.ActionTimer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-stack&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demostack"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="actiontimer"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptor-stack</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">interceptors</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">default-interceptor-ref&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="demostack"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="InterceptorDemo"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="interceptor.action.InterceptorDemo"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.bt285.cn&nbsp;/interceptor/interceptordemo.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span></div>
<p><span lang="EN-US" style="font-size: 9pt"><span style="font-family: Times New Roman">interceptordemo.jsp</span></span><span>：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/wangfun/aggbug/269677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-08 20:31 <a href="http://www.blogjava.net/wangfun/archive/2009/05/08/269677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中的定时任务介绍</title><link>http://www.blogjava.net/wangfun/archive/2009/05/07/269468.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Thu, 07 May 2009 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/07/269468.html</guid><description><![CDATA[<p>下面我们来看一下Spring中提供的定时任务开发： <br />
在Spring中开发定时任务，分为3个步骤。 <br />
1 创建定时任务 <br />
2 注册定时任务 <br />
3 启动定时任务 <br />
分别来看一下 <br />
1 创建定时任务： <br />
<br />
package org.jnotnull; <br />
import java.util.TimerTask; <br />
public class MyTesk extends TimerTask{ <br />
.... <br />
public void run(){ <br />
//添加任务 <br />
} <br />
.... <br />
} <br />
</p>
<p>2 注册定时任务，并设置参数 <br />
我们来配置TimerConfig.xml防御WEB-INF下 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="myTesk"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="edu.cumt.jnotnull.action.TaskAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="newsManageService"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="newsManageService"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="stTask"</span><span style="color: #ff0000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.scheduling.timer.ScheduledTimerTask"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="delay"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">20000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="period"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">30000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timerTask"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="myTesk"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="timerFactory"</span><span style="color: #ff0000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.scheduling.timer.TimerFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="scheduledTimerTasks"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="stTask"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />3&nbsp;启动定时任务&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">PRE&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">=xml&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="code"</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">contextConfigLocation</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.bt285.cn&nbsp;/WEB-INF/TimerConfig.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;org.springframework.web.context.ContextLoaderListener&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">PRE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">下面我们再来看看在Spring中如何使用Quartz实现定时功能&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1&nbsp;创建定时任务：&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">PRE&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">=java&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="code"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">package&nbsp;org.jnotnull;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />import&nbsp;java.util.TimerTask;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />/**<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />*http://www.5a520.cn<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />*/<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />public&nbsp;class&nbsp;MyTesk&nbsp;extends&nbsp;TimerTask{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />public&nbsp;void&nbsp;excute(){&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />//添加任务&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />}&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />}&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">PRE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">2&nbsp;注册定时任务，并设置参数&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">我们来配置TimerConfig.xml防御WEB-INF下&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BR</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">PRE&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">=xml&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="code"</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;!DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />"http://www.springframework.org/dtd/spring-beans.dtd"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;beans&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;bean&nbsp;id&nbsp;="myTesk"&nbsp;class="org.jnotnull.MyTesk"/&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;bean&nbsp;id&nbsp;="myJob"&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;property&nbsp;name="targetObject"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;ref&nbsp;bean="myTask"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/property&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;propertyproperty&nbsp;="targetMethod"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;value&gt;execute&lt;/value&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/property&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/bean&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;bean&nbsp;id&nbsp;="timeTrigger"&nbsp;class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;property&nbsp;name="jobDetail"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&lt;ref&nbsp;bean="myJob"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/property&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;property&nbsp;name="cronExpression"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;value&gt;12,23****?&lt;/value&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/property&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/bean&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;bean&nbsp;id&nbsp;="timerFactory"&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />class="org.springframework.scheduling.quartz.ScheduleFactoryBean"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;property&nbsp;name="triggers"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;list&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;refref="timeTrigger"&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/list&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/property&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/bean&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/beans&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;/PRE&gt;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;BR&gt;3&nbsp;启动定时任务&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&lt;BR&gt;&lt;PRE&nbsp;class=xml&nbsp;name="code"&gt;&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">contextConfigLocation</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;http://www.bt285.cn&nbsp;/WEB-INF/TimerConfig.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">context-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;org.springframework.web.context.ContextLoaderListener&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">PRE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/wangfun/aggbug/269468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-07 18:59 <a href="http://www.blogjava.net/wangfun/archive/2009/05/07/269468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图文介绍log4j</title><link>http://www.blogjava.net/wangfun/archive/2009/05/06/269218.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Wed, 06 May 2009 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/06/269218.html</guid><description><![CDATA[<p>log4j是一个非常强大的log记录软件，下面我们就来看看在项目中如何使log4j。</p>
<p>&nbsp;</p>
<p>首先当然是得到log4j的jar档，推荐使用1.2.X版，下载地址：</p>
<p><a href="http://logging.apache.org/log4j/1.2/download.html">http://logging.apache.org/log4j/1.2/download.html</a> </p>
<p>&nbsp;</p>
<p>我们先看一个最简单的示例：</p>
<p><strong>【示例1】</strong> </p>
<p><span style="font-size: medium; color: #0000ff">项目结构：</span> </p>
<p><img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" alt="" src="http://www.javaeye.com/upload/attachment/99808/5429dd5f-c45b-350c-a40c-307f0a852358.png" /><br />
<br />
【注：<span style="color: #ff0000">由于这里的多个项目公用一个jar档，我们可以创建一个专门放置jar档的Java工程，然后将jar档放到lib目录下。在要使用的工程中按图所示进行引用</span> 】</p>
<p><br />
<img alt="" src="http://www.javaeye.com/upload/attachment/99810/d1c6ae94-2d53-3c7a-b867-78d07ac65ad2.png" /><br />
</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.coderdream.log4j;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.apache.log4j.Logger;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_74_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_152_Open_Text.style.display='none'; Codehighlighter1_74_152_Closed_Image.style.display='inline'; Codehighlighter1_74_152_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_74_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_74_152_Closed_Text.style.display='none'; Codehighlighter1_74_152_Open_Image.style.display='inline'; Codehighlighter1_74_152_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_74_152_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_74_152_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;author&nbsp;by&nbsp;&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.bt285.cn</span><span style="color: #008000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration: underline">http://www.5a520.cn</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img id="Codehighlighter1_180_631_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_631_Open_Text.style.display='none'; Codehighlighter1_180_631_Closed_Image.style.display='inline'; Codehighlighter1_180_631_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_180_631_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_180_631_Closed_Text.style.display='none'; Codehighlighter1_180_631_Open_Image.style.display='inline'; Codehighlighter1_180_631_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloLog4j&nbsp;</span><span id="Codehighlighter1_180_631_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_180_631_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Logger.getLogger(HelloLog4j.</span><span style="color: #0000ff">class</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_312_626_Open_Image" onclick="this.style.display='none'; Codehighlighter1_312_626_Open_Text.style.display='none'; Codehighlighter1_312_626_Closed_Image.style.display='inline'; Codehighlighter1_312_626_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_312_626_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_312_626_Closed_Text.style.display='none'; Codehighlighter1_312_626_Open_Image.style.display='inline'; Codehighlighter1_312_626_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_312_626_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_312_626_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;System.out.println("This&nbsp;is&nbsp;println&nbsp;message.");&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录debug级别的信息&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;debug&nbsp;message.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录info级别的信息&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;info&nbsp;message.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;记录error级别的信息&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;error&nbsp;message.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p>配置文件log4j.properties: </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Properties代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>#可以设置级别：debug&gt;info&gt;error &nbsp;&nbsp;</span></span>
    <li><span>#debug：显示debug、info、error &nbsp;&nbsp;</span>
    <li><span>#info：显示info、error &nbsp;&nbsp;</span>
    <li><span>#error：只error &nbsp;&nbsp;</span>
    <li><span>log4j.rootLogger=debug,appender1 &nbsp;&nbsp;</span>
    <li><span>#log4j.rootLogger=info,appender1 &nbsp;&nbsp;</span>
    <li><span>#log4j.rootLogger=error,appender1 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到控制台 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;</span>
    <li><span>#样式为TTCCLayout &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="properties" style="display: none" name="code">#可以设置级别：debug&gt;info&gt;error
#debug：显示debug、info、error
#info：显示info、error
#error：只error
log4j.rootLogger=debug,appender1
#log4j.rootLogger=info,appender1
#log4j.rootLogger=error,appender1
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#样式为TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout</pre>
<p><span style="font-size: small; color: #ff0000">输出结果：</span> </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Console代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>[main]&nbsp;DEBUG&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;-&nbsp;This&nbsp;is&nbsp;debug&nbsp;message. &nbsp;&nbsp;</span></span>
    <li><span>[main]&nbsp;INFO&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;-&nbsp;This&nbsp;is&nbsp;info&nbsp;message. &nbsp;&nbsp;</span>
    <li><span>[main]&nbsp;ERROR&nbsp;com.coderdream.log4j.HelloLog4j&nbsp;-&nbsp;This&nbsp;is&nbsp;error&nbsp;message.&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="Console" style="display: none" name="code">[main] DEBUG com.coderdream.log4j.HelloLog4j - This is debug message.
[main] INFO com.coderdream.log4j.HelloLog4j - This is info message.
[main] ERROR com.coderdream.log4j.HelloLog4j - This is error message.</pre>
<p>&nbsp; 通过配置文件可知，我们需要配置3个方面的内容：</p>
<p>1、根目录（级别和目的地）；</p>
<p>2、目的地（控制台、文件等等）；</p>
<p>3、输出样式。</p>
<p><strong><span style="font-size: medium; color: #0000ff"><br />
下面我们来看看Log4J的类图：</span> </strong></p>
<p><br />
<img style="border-right: black 1px solid; border-top: black 1px solid; border-left: black 1px solid; border-bottom: black 1px solid" alt="" src="http://www.javaeye.com/upload/attachment/99825/3889d0d4-9d5a-3af3-8b20-926b0a043666.png" /></p>
<p>&nbsp;</p>
<p><strong>Logger - 日志写出器，供程序员输出日志信息 </strong><br />
<strong>Appender - 日志目的地，把格式化好的日志信息输出到指定的地方去 </strong><br />
ConsoleAppender - 目的地为控制台的Appender <br />
FileAppender - 目的地为文件的Appender <br />
RollingFileAppender - 目的地为大小受限的文件的Appender <br />
<strong>Layout - 日志格式化器，用来把程序员的logging request格式化成字符串</strong> <br />
PatternLayout - 用指定的pattern格式化logging request的Layout </p>
<p><span lang="EN-US"><span><span style="font-size: medium"><strong><span style="color: #0000ff"><br />
<span style="color: #000000">Log4j基本使用方法</span> </span></strong></span><br />
<br />
　　Log4j由三个重要的组件构成：日志信息的优先级，日志信息的输出目的地，日志信息的输出格式。日志信息的优先级从高到低有ERROR、WARN、 INFO、DEBUG，分别用来指定这条日志信息的重要程度；日志信息的输出目的地指定了日志将打印到控制台还是文件中；而输出格式则控制了日志信息的显示内容。<br />
<br />
　　<strong><span style="font-size: medium; color: #0000ff">一、定义配置文件</span> </strong><br />
<br />
　　其实您也可以完全不使用配置文件，而是在代码中配置Log4j环境。但是，使用配置文件将使您的应用程序更加灵活。Log4j支持两种配置文件格式，一种是XML格式的文件，一种是Java特性文件（键=值）。下面我们介绍使用Java特性文件做为配置文件的方法：<br />
<br />
　　<span style="font-size: small; color: #0000ff">1.配置根Logger，其语法为：</span> <br />
<br />
　　log4j.rootLogger = [ level ] , appenderName, appenderName, &#8230;<br />
<br />
　　其中，level 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。 appenderName就是指B日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br />
<br />
　　<span style="font-size: small; color: #0000ff">2.配置日志信息输出目的地Appender，其语法为：</span> <br />
<br />
　　log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
　　log4j.appender.appenderName.option1 = value1<br />
　　&#8230;<br />
　　log4j.appender.appenderName.option = valueN<br />
<br />
　　其中，Log4j提供的appender有以下几种：<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 />
　　<span style="font-size: small; color: #0000ff">3.配置日志信息的格式（布局），其语法为：</span> <br />
<br />
　　log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
　　log4j.appender.appenderName.layout.option1 = value1<br />
　　&#8230;<br />
　　log4j.appender.appenderName.layout.option = valueN<br />
<br />
　　其中，Log4j提供的layout有以e几种：<br />
　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
<br />
　　Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，打印参数如下： %m 输出代码中指定的消息<br />
<br />
　　%p 输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL<br />
　　%r 输出自应用启动到输出该log信息耗费的毫秒数<br />
　　%c 输出所属的类目，通常就是所在类的全名<br />
　　%t 输出产生该日志事件的线程名<br />
　　%n 输出一个回车换行符，Windows平台为&#8220;rn&#8221;，Unix平台为&#8220;n&#8221;<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 />
　　<span style="color: #0000ff"><strong><span style="font-size: medium">二、在代码中使用Log4j</span> </strong></span><br />
<br />
　　<span style="font-size: medium; color: #0000ff">1.得到记录器</span> <br />
<br />
　　使用Log4j，第一步就是获取日志记录器，这个记录器将负责控制日志信息。其语法为：<br />
<br />
　　public static Logger getLogger( String name)<br />
<br />
　　通过指定的名字获得记录器，如果必要的话，则为这个名字创建一个新的记录器。Name一般取本类的名字，比如：<br />
<br />
　　static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )<br />
<br />
　　<span style="font-size: medium; color: #0000ff">2.读取配置文件</span> <br />
<br />
　　当获得了日志记录器之后，第二步将配置Log4j环境，其语法为：<br />
<br />
　　BasicConfigurator.configure ()： 自动快速地使用缺省Log4j环境。<br />
　　PropertyConfigurator.configure ( String configFilename) ：读取使用Java的特性文件编写的配置文件。<br />
　　DOMConfigurator.configure ( String filename ) ：读取XML形式的配置文件。<br />
<br />
　　<span style="font-size: medium; color: #0000ff">3.插入记录信息（格式化日志信息）</span> <br />
<br />
　　当上两个必要步骤执行完毕，您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方，其语法如下：<br />
<br />
　　Logger.debug ( Object message ) ;<br />
　　Logger.info ( Object message ) ;<br />
　　Logger.warn ( Object message ) ;<br />
　　Logger.error ( Object message ) ;</span> </span></p>
<p>&nbsp;</p>
<p><span style="font-size: medium"><strong>示例2～示例8</strong> </span></p>
<p>&nbsp;</p>
<p><strong>【示例2】</strong> 输出为文本文件或HTML文件</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Porperties代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>#设置级别： &nbsp;&nbsp;</span></span>
    <li><span>log4j.rootLogger=debug,appender1 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到文件(这里默认为追加方式) &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.FileAppender &nbsp;&nbsp;</span>
    <li><span>#设置文件输出路径 &nbsp;&nbsp;</span>
    <li><span>#【</span><span class="number">1</span><span>】文本文件 &nbsp;&nbsp;</span></span>
    <li><span>#log4j.appender.appender1.File=c:/Log4JDemo02.log &nbsp;&nbsp;</span>
    <li><span>#【</span><span class="number">2</span><span>】HTML文件 &nbsp;&nbsp;</span></span>
    <li><span>log4j.appender.appender1.File=c:/Log4JDemo02.html &nbsp;&nbsp;</span>
    <li><span>#设置文件输出样式 &nbsp;&nbsp;</span>
    <li><span>#log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.HTMLLayout&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="porperties" style="display: none" name="code">#设置级别：
log4j.rootLogger=debug,appender1
#输出到文件(这里默认为追加方式)
log4j.appender.appender1=org.apache.log4j.FileAppender
#设置文件输出路径
#【1】文本文件
#log4j.appender.appender1.File=http://www.bt285.cn/content.php?id=274912 :/Log4JDemo02.log
#【2】HTML文件
log4j.appender.appender1.File=http://www.bt285.cn/content.php?id=1196863 :/Log4JDemo02.html
#设置文件输出样式
#log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender1.layout=org.apache.log4j.HTMLLayout</pre>
<p>&nbsp;</p>
<p><strong>【</strong> <strong>示例3】</strong> 输出为文本文件或HTML文件</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Properties代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>#设置级别和多个目的地 &nbsp;&nbsp;</span></span>
    <li><span>log4j.rootLogger=debug,appender1,appender2 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到控制台 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;</span>
    <li><span>#设置输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到文件(这里默认为追加方式) &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2=org.apache.log4j.FileAppender &nbsp;&nbsp;</span>
    <li><span>#设置文件输出路径 &nbsp;&nbsp;</span>
    <li><span>#【</span><span class="number">1</span><span>】文本文件 &nbsp;&nbsp;</span></span>
    <li><span>#log4j.appender.appender2.File=c:/Log4JDemo02.log &nbsp;&nbsp;</span>
    <li><span>#【</span><span class="number">2</span><span>】HTML文件 &nbsp;&nbsp;</span></span>
    <li><span>log4j.appender.appender2.File=c:/Log4JDemo02.html &nbsp;&nbsp;</span>
    <li><span>#设置文件输出样式 &nbsp;&nbsp;</span>
    <li><span>#log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2.layout=org.apache.log4j.HTMLLayout&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="properties" style="display: none" name="code">#设置级别和多个目的地
log4j.rootLogger=debug,appender1,appender2
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
#输出到文件(这里默认为追加方式)
log4j.appender.appender2=org.apache.log4j.FileAppender
#设置文件输出路径
#【1】文本文件
#log4j.appender.appender2.File=c:/Log4JDemo02.log
#【2】HTML文件
log4j.appender.appender2.File=c:/Log4JDemo02.html
#设置文件输出样式
#log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender2.layout=org.apache.log4j.HTMLLayout</pre>
<p>&nbsp; </p>
<p><strong>【示例4】</strong> SimpleLayout样式</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Properties代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>#设置级别和目的地 &nbsp;&nbsp;</span></span>
    <li><span>log4j.rootLogger=debug,appender1 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到控制台 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;</span>
    <li><span>#设置输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="properties" style="display: none" name="code">#设置级别和目的地
log4j.rootLogger=debug,appender1
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.appender1.layout=org.apache.log4j.SimpleLayout</pre>
<p>&nbsp;<span style="color: #ff0000"><strong> </strong><span style="font-size: medium">输出结果：</span> </span></p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">控制台代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>DEBUG&nbsp;-&nbsp;This&nbsp;is&nbsp;debug&nbsp;message. &nbsp;&nbsp;</span></span>
    <li><span>INFO&nbsp;-&nbsp;This&nbsp;is&nbsp;info&nbsp;message. &nbsp;&nbsp;</span>
    <li><span>ERROR&nbsp;-&nbsp;This&nbsp;is&nbsp;error&nbsp;message.&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="控制台" style="display: none" name="code">DEBUG - This is debug message.
INFO - This is info message.
ERROR - This is error message.</pre>
<p>&nbsp; </p>
<p><strong>【示例5】</strong> 自定义样式</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>#设置级别和目的地 &nbsp;&nbsp;</span></span>
    <li><span>log4j.rootLogger=debug,appender1 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到控制台 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;</span>
    <li><span>#设置输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;</span>
    <li><span>#自定义样式 &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%r&nbsp;时间&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;</span></span>
    <li><span>#&nbsp;%t&nbsp;方法名&nbsp;main &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%p&nbsp;优先级&nbsp;DEBUG/INFO/ERROR &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%c&nbsp;所属类的全名(包括包名) &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%l&nbsp;发生的位置，在某个类的某行 &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%m&nbsp;输出代码中指定的讯息，如log(message)中的message &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%n&nbsp;输出一个换行 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout.ConversionPattern=%r&nbsp;[%t]&nbsp;[%p]&nbsp;-&nbsp;%c&nbsp;-%l&nbsp;-%m%n&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">#设置级别和目的地
log4j.rootLogger=debug,appender1
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
#自定义样式
# %r 时间 0
# %t 方法名 main
# %p 优先级 DEBUG/INFO/ERROR
# %c 所属类的全名(包括包名)
# %l 发生的位置，在某个类的某行
# %m 输出代码中指定的讯息，如log(message)中的message
# %n 输出一个换行
log4j.appender.appender1.layout.ConversionPattern=%r [%t] [%p] - %c -%l -%m%n</pre>
<p><span style="font-size: medium; color: #ff0000">输出结果：</span> </p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">控制台代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span class="number">0</span><span>&nbsp;[main]&nbsp;[DEBUG]&nbsp;-&nbsp;com.coderdream.log4j.HelloLog4j&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>-com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:</span><span class="number">16</span><span>)&nbsp;-This&nbsp;is&nbsp;debug&nbsp;message. &nbsp;&nbsp;</span></span>
    <li><span class="number">31</span><span>&nbsp;[main]&nbsp;[INFO]&nbsp;-&nbsp;com.coderdream.log4j.HelloLog4j&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>-com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:</span><span class="number">18</span><span>)&nbsp;-This&nbsp;is&nbsp;info&nbsp;message. &nbsp;&nbsp;</span></span>
    <li><span class="number">31</span><span>&nbsp;[main]&nbsp;[ERROR]&nbsp;-&nbsp;com.coderdream.log4j.HelloLog4j&nbsp; &nbsp;&nbsp;</span></span>
    <li><span>-com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:</span><span class="number">20</span><span>)&nbsp;-This&nbsp;is&nbsp;error&nbsp;message.&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="控制台" style="display: none" name="code">0 [main] [DEBUG] - com.coderdream.log4j.HelloLog4j
-com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:16) -This is debug message.
31 [main] [INFO] - com.coderdream.log4j.HelloLog4j
-com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:18) -This is info message.
31 [main] [ERROR] - com.coderdream.log4j.HelloLog4j
-com.coderdream.log4j.HelloLog4j.main(HelloLog4j.java:20) -This is error message.</pre>
<p>&nbsp; </p>
<p><strong>【示例6】</strong> 多目的地、自定义样式</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Properties代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>#设置级别和目的地 &nbsp;&nbsp;</span></span>
    <li><span>log4j.rootLogger=debug,appender1,appender2 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到控制台 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;</span>
    <li><span>#设置输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;</span>
    <li><span>#自定义样式 &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%r&nbsp;时间&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;</span></span>
    <li><span>#&nbsp;%t&nbsp;方法名&nbsp;main &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%p&nbsp;优先级&nbsp;DEBUG/INFO/ERROR &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%c&nbsp;所属类的全名(包括包名) &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%l&nbsp;发生的位置，在某个类的某行 &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%m&nbsp;输出代码中指定的讯息，如log(message)中的message &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%n&nbsp;输出一个换行符号 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd&nbsp;HH:mm:ss:SSS}][%C-%M]&nbsp;%m%n &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到文件(这里默认为追加方式) &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2=org.apache.log4j.FileAppender &nbsp;&nbsp;</span>
    <li><span>#设置文件输出路径 &nbsp;&nbsp;</span>
    <li><span>#【</span><span class="number">1</span><span>】文本文件 &nbsp;&nbsp;</span></span>
    <li><span>log4j.appender.appender2.File=c:/Log4JDemo06.log &nbsp;&nbsp;</span>
    <li><span>#设置文件输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M]&nbsp;-%m%n&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="properties" style="display: none" name="code">#设置级别和目的地
log4j.rootLogger=debug,appender1,appender2
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
#自定义样式
# %r 时间 0
# %t 方法名 main
# %p 优先级 DEBUG/INFO/ERROR
# %c 所属类的全名(包括包名)
# %l 发生的位置，在某个类的某行
# %m 输出代码中指定的讯息，如log(message)中的message
# %n 输出一个换行符号
log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n
#输出到文件(这里默认为追加方式)
log4j.appender.appender2=org.apache.log4j.FileAppender
#设置文件输出路径
#【1】文本文件
log4j.appender.appender2.File=c:/Log4JDemo06.log
#设置文件输出样式
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n</pre>
<p>&nbsp; </p>
<p><strong>【示例7】</strong> <span style="font-size: medium"><strong><span style="color: #0000ff">【企业应用】设置</span> <span style="color: #0000ff">特定包的级别和目的地</span> </strong></span></p>
<p>先增加一个包，新建一个类：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">package</span><span>&nbsp;com.coderdream.log4jDao; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="keyword">import</span><span>&nbsp;org.apache.log4j.Logger; &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;HelloDao&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;Logger.getLogger(HelloDao.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</span>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args </span>&nbsp;</span>
    <li><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;记录debug级别的信息 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span class="string">"This&nbsp;is&nbsp;debug&nbsp;message&nbsp;from&nbsp;Dao."</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;记录info级别的信息 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span class="string">"This&nbsp;is&nbsp;info&nbsp;message&nbsp;from&nbsp;Dao."</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;记录error级别的信息 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span class="string">"This&nbsp;is&nbsp;error&nbsp;message&nbsp;from&nbsp;Dao."</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">package com.coderdream.log4jDao;
import org.apache.log4j.Logger;
public class HelloDao {
private static Logger logger = Logger.getLogger(HelloDao.class);
/**
* @param args
*/
public static void main(String[] args) {
// 记录debug级别的信息
logger.debug("This is debug message from Dao.");
// 记录info级别的信息
logger.info("This is info message from Dao.");
// 记录error级别的信息
logger.error("This is error message from Dao.");
}
}</pre>
<p><span style="color: #0000ff"><strong>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: small">&nbsp; 如果这个类作为基类，如J2EE中的BaseDao、BaseAction、BaseService等等，则我们可以将各层的日志信息分类输出到各个文件。</span> </strong></span></p>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Properties代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-default">
    <li><span><span>#省略根，只设置特定包的级别和目的地 &nbsp;&nbsp;</span></span>
    <li><span>log4j.logger.com.coderdream.log4j=debug,appender1 &nbsp;&nbsp;</span>
    <li><span>log4j.logger.com.coderdream.log4jDao=info,appender1,appender2 &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到控制台 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1=org.apache.log4j.ConsoleAppender &nbsp;&nbsp;</span>
    <li><span>#设置输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;</span>
    <li><span>#自定义样式 &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%r&nbsp;时间&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;</span></span>
    <li><span>#&nbsp;%t&nbsp;方法名&nbsp;main &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%p&nbsp;优先级&nbsp;DEBUG/INFO/ERROR &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%c&nbsp;所属类的全名(包括包名) &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%l&nbsp;发生的位置，在某个类的某行 &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%m&nbsp;输出代码中指定的讯息，如log(message)中的message &nbsp;&nbsp;</span>
    <li><span>#&nbsp;%n&nbsp;输出一个换行符号 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd&nbsp;HH:mm:ss:SSS}][%C-%M]&nbsp;%m%n &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>#输出到文件(这里默认为追加方式) &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2=org.apache.log4j.FileAppender &nbsp;&nbsp;</span>
    <li><span>#设置文件输出路径 &nbsp;&nbsp;</span>
    <li><span>#【</span><span class="number">1</span><span>】文本文件 &nbsp;&nbsp;</span></span>
    <li><span>log4j.appender.appender2.File=c:/Log4JDemo07_Dao.log &nbsp;&nbsp;</span>
    <li><span>#设置文件输出样式 &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2.layout=org.apache.log4j.PatternLayout &nbsp;&nbsp;</span>
    <li><span>log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M]&nbsp;-%m%n&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="properties" style="display: none" name="code">#省略根，只设置特定包的级别和目的地
log4j.logger.com.coderdream.log4j=debug,appender1
log4j.logger.com.coderdream.log4jDao=info,appender1,appender2
#输出到控制台
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#设置输出样式
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
#自定义样式
# %r 时间 0
# %t 方法名 main
# %p 优先级 DEBUG/INFO/ERROR
# %c 所属类的全名(包括包名)
# %l 发生的位置，在某个类的某行
# %m 输出代码中指定的讯息，如log(message)中的message
# %n 输出一个换行符号
log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n
#输出到文件(这里默认为追加方式)
log4j.appender.appender2=org.apache.log4j.FileAppender
#设置文件输出路径
#【1】文本文件
log4j.appender.appender2.File=c:/Log4JDemo07_Dao.log
#设置文件输出样式
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n</pre>
<p>&nbsp; </p>
<p><strong>【示例8】</strong> log4j.xml的配置方式</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Xml代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-xml">
    <li><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&lt;!DOCTYPE&nbsp;log4j:configuration&nbsp;SYSTEM&nbsp;"log4j.dtd"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="tag">&lt;</span><span class="tag-name">log4j:configuration</span><span>&nbsp;</span><span class="attribute">xmlns:log4j</span><span>=</span><span class="attribute-value">"http://jakarta.apache.org/log4j/"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">appender</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"appender1"</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.log4j.RollingFileAppender"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"File"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"logfile08.html"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"MaxFileSize"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"1MB"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">param</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"MaxBackupIndex"</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"5"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">layout</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"org.apache.log4j.HTMLLayout"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">layout</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">appender</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">root</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">level</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">"debug"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">appender-ref</span><span>&nbsp;</span><span class="attribute">ref</span><span>=</span><span class="attribute-value">"appender1"</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">root</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li><span class="tag">&lt;/</span><span class="tag-name">log4j:configuration</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="xml" style="display: none" name="code">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"&gt;
&lt;log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"&gt;
&lt;appender name="appender1"
class="org.apache.log4j.RollingFileAppender"&gt;
&lt;param name="File" value="logfile08.html" /&gt;
&lt;param name="MaxFileSize" value="1MB" /&gt;
&lt;param name="MaxBackupIndex" value="5" /&gt;
&lt;layout class="org.apache.log4j.HTMLLayout"&gt;
&lt;/layout&gt;
&lt;/appender&gt;
&lt;root&gt;
&lt;level value="debug" /&gt;
&lt;appender-ref ref="appender1" /&gt;
&lt;/root&gt;
&lt;/log4j:configuration&gt;</pre>
<p>&nbsp;</p>
<p>为了提高效率，我们可以在写日志前增加判断：</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.javaeye.com/topic/378077#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="comment">//&nbsp;记录debug级别的信息 </span><span>&nbsp;&nbsp;</span></span>
    <li><span class="keyword">if</span><span>&nbsp;(logger.isDebugEnabled())&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span class="string">"This&nbsp;is&nbsp;debug&nbsp;message&nbsp;from&nbsp;Dao."</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="comment">//&nbsp;记录info级别的信息 </span><span>&nbsp;&nbsp;</span></span>
    <li><span class="keyword">if</span><span>&nbsp;(logger.isInfoEnabled())&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span class="string">"This&nbsp;is&nbsp;info&nbsp;message&nbsp;from&nbsp;Dao."</span><span>); &nbsp;&nbsp;</span></span>
    <li><span>} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span class="comment">//&nbsp;记录error级别的信息 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>logger.error(</span><span class="string">"This&nbsp;is&nbsp;error&nbsp;message&nbsp;from&nbsp;Dao."</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<img src ="http://www.blogjava.net/wangfun/aggbug/269218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-06 12:42 <a href="http://www.blogjava.net/wangfun/archive/2009/05/06/269218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>svn笔记之一</title><link>http://www.blogjava.net/wangfun/archive/2009/05/05/268945.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Tue, 05 May 2009 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/05/268945.html</guid><description><![CDATA[<div>今天读了subversion 的open book. <a href="http://www.subversion.org.cn/svnbook/nightly/svn.tour.cycle.html">http://www.subversion.org.cn/svnbook/nightly/svn.tour.cycle.html</a></div>
<div>&nbsp;</div>
<div>创建自己的版本库</div>
<div>&nbsp;</div>
<div>svnadmin create &#8211;fs-type fsfs /home/lmzhang/ <a href="http://www.bt285.cn">www.bt285.cn</a> .</div>
<div>svn import myproj <a href="file:///home/lmzhang/">file:///home/lmzhang/</a> <a href="http://www.bt285.cn">www.bt285.cn</a> . -m &#8220;&#8221;</div>
<div>svn ci -m &#8220;&#8221;</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>关于内置版本号.</div>
<div>HEAD - 最新版本号.</div>
<div>BASE - 当前工作版本的未修改版本.</div>
<div>COMMITTED - BASE - 1</div>
<div>PREV - COMMITTED - 1</div>
<div>&nbsp;</div>
<div>svn merge 的作用可以用语在任何两个版本之间的差异合并到某个工作版本的功能.</div>
<div>语法如下</div>
<div>&nbsp;</div>
<div>svn merger -r <a href="mailto:srouceurl@firstversion:sencondurl:secondversion">srouceurl@firstversion:sencondurl:secondversion</a> &nbsp; workingpath</div>
<div>&nbsp;</div>
<div>举例来说我有一个工作copy，内有一个1.txt 当前版本号是1.</div>
<div>内容是&nbsp; h动漫下载 http://www.bt285.cn/content.php?id=274912<br />
甜性涩爱下载 http://www.bt285.cn/content.php?id=1196863 (14260)<br />
色即是空2下载&nbsp; http://www.bt285.cn/sejishikong/ <br />
爱的色放下载 http://www.bt285.cn/aidesefang/<br />
http://www.bt285.cn/yazhou/ 亚洲BT&nbsp;&nbsp;</div>
<div>然后我添加为 first second. svn ci -m &#8220;&#8221;.</div>
<div>&nbsp;</div>
<div>然后我执行 svn merge -r HEAD:PREV 1.txt , svn将比较 HEAD版本和PREV版本的内容差异，然后将这个差异合并到 当前路径下的1.txt , 由于差异是减少了 second , 因此相当于回到了 版本1.</div>
<div>&nbsp;</div>
<div>
<p><span><strong>svn merge</strong></span>的语法允许非常灵活的指定参数，如下是一些例子：</p>
<pre>$ svn merge http://svn.example.com/repos/branch1@150 \
http://svn.example.com/repos/branch2@212 \
my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk my-working-copy
$ svn merge -r 100:200 http://svn.example.com/repos/trunk</pre>
<p>第一种语法使用<span class="emphasis"><em>URL@REV</em></span>的形式直接列出了所有参数，第二种语法可以用来作为比较同一个URL的不同版本的简略写法，最后一种语法表示工作拷贝是可选的，如果省略，默认是当前目录。</p>
</div>
<div>&nbsp;</div>
<div>svn 的分支创建倒是很容易.</div>
<div>&nbsp;</div>
<div>svn copy from to , 那么to就成为了from的一个copy，在svn的概念中就是分支或者tag.</div>
<div>&nbsp;</div>
<div>问题在于合并.</div>
<div>&nbsp;</div>
<div>svn 的概念中，分之合并实际上是将某个分之某个版本到另外一个版本之间的变化合并到某个目录的概念.</div>
<div>&nbsp;</div>
<div>比如 分支 b-1 从开始分支的版本 4 ,&nbsp; 到做了修改后的版本 9 .&nbsp; 想合并到主干上.</div>
<div>&nbsp;</div>
<div>那么进入主干的工作目录执行 svn merge -r 4:9 <a href="http://www.alisdn.com///..../b-1">file:///&#8230;./b-1</a> trunk 就ok.</div>
<div>&nbsp;</div>
<div>// 下面说明了，为什么要用上面这种做法，仅仅比较带合并的分支的信息.</div>
<div>(</div>
<div>
<p>但是要哪两个树进行比较呢？乍一看，回答很明确，只要比较最新的主干与分支。但是你要意识到—这个想法是<span class="emphasis"><em>错误的</em></span>，伤害了许多新用户！因为<span><strong>svn merge</strong></span>的操作很像<span><strong>svn diff</strong></span>，比较最新的主干和分支树不仅仅会描述你在分支上所作的修改，这样的比较会展示太多的不同，不仅包括分支上的增加，也包括了主干上的删除操作，而这些删除根本就没有在分支上发生过。</p>
<p>)</p>
<p>另外通过同一分支上的版本间merge可以执行反向操作，比如版本5对于版本4的修改是完全错误的，那么可以通过 svn merge -r 5:4 file.cpp working-copy 来达到在working-copy 中取消这个修改.</p>
<p>反向操作另外一个作用，加入你删除了head版本中的test.cpp , 但是又想找回来，那么你可以 svn log -v 察看test.cpp 是什么时候被删除的., -r 10 , 上一个版本 8 . 那么可以执行如下</p>
<p>svn merger -r 10:8 <a href="http://www.alisdn.com///.../">file:///&#8230;/</a>&nbsp; working-copy 就还原了.</p>
<p>当然svn copy -r 也可以.</p>
<p>&nbsp;</p>
</div>
<div>还有一种方式就是两个分支间直接进行合并.</div>
<div>svn merge <a href="mailto:trunk@10">trunk@10</a> <a href="mailto:b-1@9">b-1@9</a> trunk&nbsp; 表示将主干 -r 10 , 分支 -r 9 的差别合并到主干</div>
<div>&nbsp;</div>
<div>另外merge 有一个有用的参数，&#8211;dry-run 表示仅仅模拟本次合并的效果，实际上并不生效.</div>
<div>&nbsp;</div>
<div>举例来说</div>
<div>&nbsp;</div>
<div>svn merger <a href="http://www.alisdn.com///home/lmzhang/myrepos/calc@1">file:///home/lmzhang/myrepos/calc@1</a> <a href="http://www.alisdn.com///home/lmzhang/myrepos/calc/branches/b_1@4">file:///home/lmzhang/myrepos/calc/ www.5a520.cn /b_1@4</a> .</div>
<div>就表示将主干 v1 到分支b_1 v4 之间的差别进行列举合并到当前工作目录.</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>tag 本身和branch在svn 中的操方式是一样的，不过tag还有一个增强点，就是能够将当前工作目录直接进行tag.</div>
<div>&nbsp;</div>
<div>update 状态</div>
<div>
<dt><span class="term"><code><span>U foo</span></code></span>
<dd>文件<code><span>foo</span></code>更新了（从服务器收到修改）。
<p>&nbsp;</p>
<dt><span class="term"><code><span>A foo</span></code></span>
<dd>文件或目录<code><span>foo</span></code>被添加到工作拷贝。
<p>&nbsp;</p>
<dt><span class="term"><code><span>D foo</span></code></span>
<dd>文件或目录<code><span>foo</span></code>在工作拷贝被删除了。
<p>&nbsp;</p>
<dt><span class="term"><code><span>R foo</span></code></span>
<dd>文件或目录<code><span>foo</span></code>在工作拷贝已经被替换了，这是说，<code><span>foo</span></code>被删除，而一个新的同样名字的项目添加进来，它们具有同样的名字，但是版本库会把它们看作具备不同历史的不同对象。
<p>&nbsp;</p>
<dt><span class="term"><code><span>G foo</span></code></span>
<dd>文件<code><span>foo</span></code>接收到版本库的更改，你的本地版本也已经修改，但改变没有互相影响，Subversion成功的将版本库和本地文件合并，没有发生任何问题。
<p>&nbsp;</p>
<dt><span class="term"><code><span>C foo</span></code></span>
<dd>文件<code><span>foo</span></code>的修改与服务器冲突，服务器的修改与你的修改交迭在一起，不要恐慌，这种冲突需要人（你）来解决，我们在后面的章节讨论这种情况。
<p>&nbsp;</p>
</dd></div>
<div>svn status</div>
<pre>  L     some_dir            # svn已经在.svn目录锁定了some_dir
M       bar.c               # bar.c的内容已经在本地修改过了
M      baz.c               # baz.c属性有修改，但没有内容修改
X       3rd_party           # 这个目录是外部定义的一部分
?       foo.o               # svn并没有管理foo.o
!       some_dir            # svn管理这个，但它可能丢失或者不完
~       qux                 # 作为file/dir/link进行了版本控制，但类型已经改变
I       .screenrc           # svn不管理这个，配置确定要忽略它
A  +    moved_dir           # 包含历史的添加，历史记录了它的来历
M  +    moved_dir/README    # 包含历史的添加，并有了本地修改
D       stuff/fish.c        # 这个文件预定要删除
A       stuff/loot/bloo.h   # 这个文件预定要添加
C       stuff/loot/lump.c   # 这个文件在更新时发生冲突
C      stuff/loot/glub.c   # 文件在更新时发生属性冲突
R       xyz.c               # 这个文件预定要被替换
S   stuff/squawk        # 这个文件已经跳转到了分支
K  dog.jpg             # 文件在本地锁定；有锁定令牌
O  cat.jpg             # 文件在版本库被其他用户锁定
B  bird.jpg            # 文件本地锁定，但锁定发生错误
T  fish.jpg            # 文件本地锁定，但锁定丢失
第一列</pre>
<pre><dt><span class="term"><code><span>A item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>预定加入到版本库。
<dt><span class="term"><code><span>C item</span></code></span>
<dd>
文件<code><span>item</span></code>发生冲突，在从服务器更新时与本地版本发生交迭，在你提交到版本库前，必须手工的解决冲突。
<dt><span class="term"><code><span>D item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>预定从版本库中删除。
<dt><span class="term"><code><span>M item</span></code></span>
<dd>
文件<code><span>item</span></code>的内容被修改了。
<dt><span class="term"><code><span>R item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>预定将要替换版本库中的<code><span>item</span></code>，这意味着这个对象首先要被删除，另外一个同名的对象将要被添加，所有的操作发生在一个修订版本。
<dt><span class="term"><code><span>X item</span></code></span>
<dd>
目录没有版本化，但是与Subversion的外部定义关联，关于外部定义，可以看<a title="外部定义" href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.externals.html"><span>&#8220;外部定义&#8221;一节</span></a>。
<dt><span class="term"><code><span>? item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>不在版本控制之下，你可以通过使用<span><strong>svn status</strong></span>的<code><span>--quiet</span></code>（<code><span>-q</span></code>）参数或父目录的<code><span>svn:ignore</span></code>属性忽略这个问题，关于忽略文件的使用，见<a title="ignore" href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.props.html#svn.advanced.props.special.ignore"><span>&#8220;<code><span>svn:ignore</span></code>&#8221;一节</span></a>。
<dt><span class="term"><code><span>! item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>在版本控制之下，但是已经丢失或者不完整，这可能因为使用非Subversion命令删除造成的，如果是一个目录，有可能是检出或是更新时的中断造成的，使用<span><strong>svn update</strong></span>可以重新从版本库获得文件或者目录，也可以使用<span><strong>svn revert file</strong></span>恢复原来的文件。
<dt><span class="term"><code><span>~ item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>在版本库已经存在，但你的工作拷贝中的是另一个。举一个例子，你删除了一个版本库的文件，新建了一个在原来的位置，而且整个过程中没有使用<span><strong>svn delete</strong></span>或是<span><strong>svn add</strong></span>。
<dt><span class="term"><code><span>I item</span></code></span>
<dd>
文件、目录或是符号链<code><span>item</span></code>不在版本控制下，Subversion已经配置好了会在<span><strong>svn add</strong></span>、<span><strong>svn import</strong></span>和<span><strong>svn status</strong></span>命令忽略这个文件，关于忽略文件，见<a title="ignore" href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.props.html#svn.advanced.props.special.ignore"><span>&#8220;<code><span>svn:ignore</span></code>&#8221;一节</span></a>。注意，这个符号只会在使用<span><strong>svn status</strong></span>的参数<code><span>--no-ignore</span></code>时才会出现—否则这个文件会被忽略且不会显示！
</dd></pre>
<p>第二列说明文件或目录的属性的状态（更多细节可以看<a title="属性" href="http://www.subversion.org.cn/svnbook/nightly/svn.advanced.props.html"><span>&#8220;属性&#8221;一节</span></a>），如果一个<code><span>M</span></code>出现在第二列，说明属性被修改了，否则显示空白。</p>
<p>第三列只显示空白或者<code><span>L</span></code>，<code><span>L</span></code>表示Subversion已经锁定了这个目录的工作区域<code><span>.svn</span></code>，当你的<span><strong>svn commit</strong></span>正在运行的时候—也许正在输入log信息，运行<span><strong>svn status</strong></span>你可以看到<code><span>L</span></code>标记，如果这时候Subversion并没有运行，可以推测Subversion发生中断并且已经锁定，你必须运行<span><strong>svn cleanup</strong></span>来清除锁定（本节后面将有更多论述）。</p>
<div>第四列只会显示空白或<code><span>+</span></code>，<code><span>+</span></code>的意思是一个有附加历史信息的文件或目录预定添加或者修改到版本库，通常出现在<span><strong>svn move</strong></span>或是<span><strong>svn copy</strong></span>时，如果是看到<code><span>A&nbsp;&nbsp;+</span></code>就是说要包含历史的增加，它可以是一个文件或是拷贝的根目录。<code><span>+</span></code>表示它是即将包含历史增加到版本库的目录的一部分，也就是说他的父目录要拷贝，它只是跟着一起的。 <code><span>M&nbsp;&nbsp;+</span></code>表示将要包含历史的增加，并且已经更改了。当你提交时，首先会随父目录进行包含历史的增加，然后本地的修改提交到更改后的版本</div>
<div>&nbsp;</div>
<div>第五列只显示空白或是<code><span>S</span></code>，表示这个目录或文件已经转到了一个分支下了（使用<span><strong>svn switch</strong></span>）。</div>
<div>&nbsp;</div>
<div>
<p><span><strong>svn status</strong></span>也有一个<code><span>&#8211;verbose</span></code>（<code><span>-v</span></code>）选项，它可以显示工作拷贝中的<span class="emphasis"><em>所有</em></span>项目，即使没有改变过：</p>
<pre>$ svn status --verbose
M               44        23    sally     README
44        30    sally     INSTALL
M               44        20    harry     bar.c
44        18    ira       stuff
44        35    harry     stuff/trout.c
D               44        19    ira       stuff/fish.c
44        21    sally     stuff/things
A                0         ?     ?        stuff/things/bloo.h
44        36    harry     stuff/things/gloo.c</pre>
<pre>第一列保持相同，第二列显示一个工作版本号，第三和第四列显示最后一次修改的版本号和修改人。</pre>
</div>
<p>上面所有的<span><strong>svn status</strong></span>调用并没有联系版本库，只是与<code><span>.svn</span></code>中的元数据进行比较的结果，最后，是<code><span>&#8211;show-updates</span></code>（<code><span>-u</span></code>）参数，它将会联系版本库为已经过时的数据添加新信息：</p>
<pre>$ svn status --show-updates --verbose
M      *        44        23    sally     README
M               44        20    harry     bar.c
*        44        35    harry     stuff/trout.c
D               44        19    ira       stuff/fish.c
A                0         ?     ?        stuff/things/bloo.h
Status against revision:   46</pre>
<p>注意这两个星号：如果你现在执行<span><strong>svn update</strong></span>，你的<code><span>README</span></code>和<code><span>trout.c</span></code>会被更新，这告诉你许多有用的信息—你可以在提交之前，需要使用更新操作得到文件<code><span>README</span></code>的更新，或者说文件已经过时，版本库会拒绝了你的提交。</p>
<p>&nbsp;</p>
<p>输出的格式为<em>统一区别格式</em>（unified diff format），删除的行前面加一个<code><span>-</span></code>，添加的行前面有一个<code><span>+</span></code>，<span><strong>svn diff</strong></span>命令也打印文件名和<span><strong>打补丁</strong></span>需要的信息，所以你可以通过重定向一个区别文件来生成&#8220;<span class="quote">补丁</span>&#8221;：</p>
<pre>$ svn diff &gt; patchfile</pre>
<p>举个例子，你可以把补丁文件发送邮件到其他开发者，在提交之前审核和测试。</p>
<p>&nbsp;</p>
<div class="sidebar">
<p class="title"><strong>看！没有网络！</strong></p>
<p>这三个命令（<span><strong>svn status</strong></span>、<span><strong>svn diff</strong></span>和 <span><strong>svn revert</strong></span>）都可以在没有网络的情况下工作，这让你在没有网络连接时的管理修改过程更加简单，像在飞机上旅行，乘坐火车往返或是在海滩上奋力工作时。</p>
<p>Subversion通过在<code><span>.svn</span></code>管理区域使用原始的版本缓存来做到这一点，这使得恢复本地版本而<span class="emphasis"><em>不必访问网络</em></span>，这个缓存（叫做&#8220;<span class="quote">text-base</span>&#8221;）也允许Subversion可以根据原始版本生成一个压缩的增量（&#8220;<span class="quote">区别</span>&#8221;）提交—即使你有个非常快的网络，有这样一个缓存有极大的好处，非常的快，只向服务器提交修改的部分，这一点乍一看好像并不重要，但当你要提交一个400M大小的文件的修改时，你就会明白！</p>
<p>&nbsp;</p>
<li>对于每一个冲突的文件，Subversion放置三个额外的未版本化文件到你的工作拷贝：
<div class="variablelist">
<dl>
<dt><span class="term"><code><span>filename.mine</span></code></span>
<dd>你更新前的文件，没有冲突标志，只是你最新更改的内容。（如果Subversion认为这个文件不可以合并，<code><span>.mine</span></code>文件不会创建，因为它和工作文件相同。）
<p>&nbsp;</p>
<dt><span class="term"><code><span>filename.rOLDREV</span></code></span>
<dd>这是你的做更新操作以前的<code><span>BASE</span></code>版本文件，就是你在上次更新之后未作更改的版本。
<p>&nbsp;</p>
<dt><span class="term"><code><span>filename.rNEWREV</span></code></span>
<dd>这是你的Subversion客户端从服务器刚刚收到的版本，这个文件对应版本库的<code><span>HEAD</span></code>版本。
<p>&nbsp;</p>
</dd></dl></div>
<p>这里<code><span>OLDREV</span></code>是你的<code><span>.svn</span></code>目录中的修订版本号，<code><span>NEWREV</span></code>是版本库中<code><span>HEAD</span></code>的版本号。 </p>
</li>
</div>
<div>
<div>
<h3 class="title"><span><strong>svn cat</strong></span></h3>
</div>
</div>
<p>如果你只是希望检查一个过去的版本而不希望察看它们的区别，使用<span><strong>svn cat</strong></span>：</p>
<pre>$ svn cat --revision 2 rules.txt
Be kind to others
Freedom = Chocolate Ice Cream
Everything in moderation
Chew with your mouth open
$</pre>
<p>你可以重定向输出到一个文件：</p>
<pre>$ svn cat --revision 2 rules.txt &gt; rules.txt.v2</pre>
<pre>除了以上的命令，你可以使用带参数<code><span>--revision</span></code>的<span><strong>svn update</strong></span>和<span><strong>svn checkout</strong></span>来使整个工作拷贝&#8220;<span class="quote">回到过去</span>&#8221;<sup>[<a id="N10E95" href="http://www.subversion.org.cn/svnbook/nightly/svn.tour.history.html#ftn.N10E95"><span>7</span></a>]</sup>：
<pre>$ svn checkout --revision 1729 # Checks out a new working copy at r1729
&#8230;
$ svn update --revision 1729 # Updates an existing working copy to r1729
&#8230;</pre>
<pre>&nbsp;</pre>
<pre># 建立库</pre>
<pre>$ svnadmin create /usr/local/svn/newrepos</pre>
<pre># 建立分支</pre>
<pre>建立一个备份只是传递两个目录参数到<span><strong>svn copy</strong></span>命令：
<pre>$ cd bigwc
$ svn copy trunk branches/my-calc-branch
$ svn status
A  +   branches/my-calc-branch</pre>
<pre>&nbsp;</pre>
</pre>
</pre>
<div>
<p>现在，我们必须告诉你建立分支最简单的方法：<span><strong>svn copy</strong></span>可以直接对两个URL操作。</p>
<pre>$ svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
Committed revision 341.</pre>
</div>
<div>&nbsp;</div>
<div>锁定-修改-解锁问题</div>
<div>我们有两个共同工作者，Harry和Sally，他们想同时编辑版本库里的同一个文件，如果首先Harry保存它的修改，过了一会，Sally可能凑巧用自己的版本覆盖了这些文件，Harry的更改不会永远消失（因为系统记录了每次修改），Harry所有的修改<span class="emphasis"><em>不会</em></span>出现在Sally的文件中，所以Harry的工作还是丢失了—至少是从最新的版本中丢失了—而且是意外的，这就是我们要明确避免的情况！</div>
<div>&nbsp;</div>
<div>在这种情况下，我们应该明确对需要进行修改的目录进行锁定.</div>
<div>拷贝-修改-合并模型假定文件是可以根据上下文合并的：就是版本库的文件主要是以行为基础的文本文件（例如程序源代码）。但对于二进制格式，例如艺术品或声音，在这种情况下，十分有必要让用户轮流修改文件，如果没有线性的访问，有些人的许多工作就最终要被放弃。</div>
<img src ="http://www.blogjava.net/wangfun/aggbug/268945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-05 12:00 <a href="http://www.blogjava.net/wangfun/archive/2009/05/05/268945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js嵌入到java程序中</title><link>http://www.blogjava.net/wangfun/archive/2009/05/04/268876.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Mon, 04 May 2009 11:30:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/04/268876.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 随着java6.0的出现，向java嵌入javascript脚本变的特别容易。java6引入了一个新的javax.script包，为脚本化语言提供了一个通用接口。&nbsp;&nbsp;案例：http://www.5a520.cn &nbsp;小说520网java中嵌入javascript脚本的思路： 1.取得脚本解释器的管理器Manager 2.从管理器中取得js的...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangfun/archive/2009/05/04/268876.html'>阅读全文</a><img src ="http://www.blogjava.net/wangfun/aggbug/268876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-04 19:30 <a href="http://www.blogjava.net/wangfun/archive/2009/05/04/268876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常见开源key-value分布式存储系统</title><link>http://www.blogjava.net/wangfun/archive/2009/05/02/268588.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Sat, 02 May 2009 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/05/02/268588.html</guid><wfw:comment>http://www.blogjava.net/wangfun/comments/268588.html</wfw:comment><comments>http://www.blogjava.net/wangfun/archive/2009/05/02/268588.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/wangfun/comments/commentRss/268588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wangfun/services/trackbacks/268588.html</trackback:ping><description><![CDATA[<p>key-value分布式存储系统查询速度快、存放数据量大、支持高并发，非常适合通过主键进行查询，但不能进行复杂的条件查询。如果辅以Real- Time Search Engine（实时搜索引擎）进行复杂条件检索、全文检索，就可以替代并发性能较低的MySQL等关系型数据库，达到高并发、高性能，节省几十倍服务器数量的目的。以MemcacheDB、Tokyo Tyrant为代表的key-value分布式存储，在上万并发连接下，轻松地完成高速查询。而MySQL，在几百个并发连接下，就基本上崩溃了。<br />
<br />
　　虽然key-value分布式存储具有极高的性能，但是只能做类似于MySQL的SELECT * FROM table WHERE id = 123;简单主键查询。<br />
<br />
　　&#8220;搜索索引引擎＋key-value分布式存储&#8221;能够实现高并发的复杂条件查询、全文检索与数据显示。但是，由于索引更新需要时间，目前还不能实现完全意义上的Real-Time Search（实时搜索），只能称之为Near Real-Time Search（准实时搜索）。&#8220;搜索索引引擎＋key-value分布式存储&#8221;除了做全文检索外，还可以在允许的索引延迟范围内，取代MySQL进行复杂条件查询。<br />
<br />
　　我的文章《<a href="http://www.5a520.cn" target="_blank">亿级数据的高并发通用搜索引擎架构设计</a>》的程序编码已经完成，第一轮测试昨天已经结束，能够在高并发情况下实现1分钟内索引更新，属于&#8220;Near Real-Time Search Engine（准实时搜索引擎）＋key-value分布式存储&#8221;应用。其中，索引引擎采用Sphinx，存储采用key-value分布式数据库<a href="http://tokyocabinet.sourceforge.net/index.html" target="_blank">Tokyo Tyrant</a>。<br />
<br />
　　以下是常见的key-value分布式存储系统：<br />
<br />
　　<br />
<img class="magplus" title="点击查看原始大小图片" height="433" alt="" src="http://www.javaeye.com/upload/attachment/71663/c47026e2-c744-3526-bcbd-bd4f8829bcb4.jpg" width="650" /><br />
&nbsp;<br />
<br />
　　其中，以下几款值得关注：<br />
<br />
　　1、<a href="http://hypertable.org/" target="_blank">Hypertable</a>：它是搜索引擎公司Zvents根据Google的9位研究人员在2006年发表的一篇论文《<a href="http://labs.google.com/papers/bigtable.html" target="_blank">Bigtable：结构化数据的分布存储系统</a>》开发的一款开源分布式数据储存系统。Hypertable是按照1000节点比例设计，以 C++撰写，可架在 HDFS 和 KFS 上。尽管还在初期阶段，但已有不错的效能：写入 28M 列的资料，各节点写入速率可达7MB/s，读取速率可达 1M cells/s。Hypertable目前一直没有太多高负载和大存储的应用实例，但是最近，Hypertable项目得到了<a href="http://www.baidu.com/" target="_blank">百度</a>的赞助支持，相信其会有更好的发展，地址：<a href="http://www.bt285.cn">http://www.bt285.cn</a> &nbsp;BT下载。<br />
<br />
　　<a href="http://blog.s135.com/attachment/200901/hypertable_baidu.gif" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" alt="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200901/hypertable_baidu.gif" border="0" /></a></p>
<hr />
<p><br />
　　2、<a href="http://tokyocabinet.sourceforge.net/index.html" target="_blank">Tokyo Tyrant</a>：它是日本最大的SNS社交网站<a href="http://mixi.jp/" target="_blank">mixi.jp</a>开发的 Tokyo Cabinet key-value数据库网络接口。它拥有Memcached兼容协议，也可以通过HTTP协议进行数据交换。对任何原有Memcached客户端来讲，可以将Tokyo Tyrant看成是一个Memcached，但是，它的数据是可以持久存储的。Tokyo Tyrant 具有故障转移、日志文件体积小、大数据量下表现出色等优势，详见：<a href="http://www.bt285.cn/aidesefang/">http://www.bt285.cn/aidesefang/</a> <br />
　　Tokyo Cabinet 2009年1月18日发布的新版本（Version 1.4.0）已经实现 Table Database，将key-value数据库又扩展了一步，有了MySQL等关系型数据库的表和字段的概念，相信不久的将来，Tokyo Tyrant 也将支持这一功能。值得期待。详见：<a href="http://www.bt285.cn/sejishikong/">http://www.bt285.cn/sejishikong/</a> <br />
<br />
　　<a href="http://blog.s135.com/attachment/200901/tabledatabasecmp.png" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" alt="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200901/tabledatabasecmp.png" border="0" /></a></p>
<hr />
<p><br />
　　3、<a href="http://couchdb.apache.org/" target="_blank">CouchDB</a>：它是Apache社区基于 Erlang/OTP 构建的高性能、分布式容错非关系型数据库系统（NRDBMS）。它充分利用 Erlang 本身所提供的高并发、分布式容错基础平台，并且参考 Lotus Notes 数据库实现，采用简单的文档数据类型（document-oriented）。在其内部，文档数据均以 JSON 格式存储。对外，则通过基于 HTTP 的 REST 协议实现接口，可以用十几种语言进行自由操作。<br />
<br />
　　<a href="http://blog.s135.com/attachment/200901/sketch.png" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" alt="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200901/sketch.png" border="0" /></a></p>
<hr />
<p><br />
　　4、<a href="http://memcachedb.org/" target="_blank">MemcacheDB</a>：它是新浪互动社区事业部为在Memcached基础上，增加Berkeley DB存储层而开发一款支持高并发的分布式持久存储系统，对任何原有Memcached客户端来讲，它仍旧是个Memcached，但是，它的数据是可以持久存储的。<br />
<br />
　　<a href="http://blog.s135.com/attachment/200801/memcachedb.jpg" target="_blank"><img class="insertimage" title="点击在新窗口中浏览此图片" alt="点击在新窗口中浏览此图片" src="http://blog.s135.com/attachment/200801/memcachedb.jpg" border="0" /></a></p>
<div class="attachments">
<ul style="display: none">
    <li><a href="http://www.javaeye.com/upload/attachment/71663/c47026e2-c744-3526-bcbd-bd4f8829bcb4.jpg" target="_blank"><img class="magplus" title="点击查看原始大小图片" alt="C47026e2-c744-3526-bcbd-bd4f8829bcb4-thumb" src="http://www.javaeye.com/upload/attachment/71663/c47026e2-c744-3526-bcbd-bd4f8829bcb4-thumb.jpg?1233218218" /></a>
    <li>大小: 76.4 KB </li>
</ul>
</div>
<img src ="http://www.blogjava.net/wangfun/aggbug/268588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-05-02 10:16 <a href="http://www.blogjava.net/wangfun/archive/2009/05/02/268588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON学习笔记之一</title><link>http://www.blogjava.net/wangfun/archive/2009/04/27/267765.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Mon, 27 Apr 2009 11:07:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/04/27/267765.html</guid><description><![CDATA[<p>首先，使用JavaScript的eval()函数实现，将JSON数据串转换成为一个JavaScript对象数组。这里，在Servlet中访问数据库取得记录，并合成JSON串，发送到客户端。</p>
<p>一般，对于企业级应用，使用JavaScript的eval()函数，存在安全隐患问题。这个例子就是感受一下JSON数据串从服务器段被传送到客户端之后，将数据转换成为对象数组或者对象，从而方便地使用JavaScript来实现遍历。</p>
<p>看一下我的Permission实体的Hibernate映射文件：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>"&gt;</p>
<p>&lt;hibernate-mapping&gt;<br />
&lt;class name="model.xgb.vo.Permission" table="PERMISSION" lazy="false"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;composite-id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-property name="id" column="ID" type="integer"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-property name="term" column="TERM" type="string"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/composite-id&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="endDate" column="ENDDATE" type="date"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="start" column="START" type="date"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;many-to-one name="roles" class="model.xgb.vo.Role" lazy="false" unique="true" cascade="save-update"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ROLE_ID"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;many-to-one name="org" class="model.xgb.vo.Org" lazy="false" unique="true" cascade="save-update"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="ORG_ID"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;many-to-one name="operator" class="model.xgb.vo.Operator" lazy="false" unique="true" cascade="save-update"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="OPERATOR_ID"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="OPERATOR_NAME"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="OPERATOR_TYPE"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br />
&lt;/class&gt;<br />
&lt;/hibernate-mapping&gt;</p>
<p>现在，就是在Servlet中读取对应的记录，然后构造JSON数据，实现的Servlet为GetPermissions，如下所示：</p>
<p>package org.shirdrn.servlet;</p>
<p>import java.io.IOException;<br />
import java.io.PrintWriter;<br />
import java.util.List;</p>
<p>import javax.servlet.ServletException;<br />
import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;</p>
<p>import model.xgb.bo.ManagerService;<br />
import model.xgb.bo.impl.ManagerServiceImpl;<br />
import model.xgb.vo.Permission;<br />
import cn.edu.cust.levin.BusinessException;<br />
import cn.edu.cust.levin.business.BusinessFactory;<br />
</p>
<p>/** author <a href="http://www.bt285.cn">http://www.bt285.cn</a> <a href="http://www.5a520.cn">http://www.5a520.cn</a><br />
*/</p>
<p>public class GetPermissions extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {<br />
&nbsp;&nbsp; static final long serialVersionUID = 1L;</p>
<p>public GetPermissions() {<br />
&nbsp;&nbsp; super();<br />
}&nbsp;&nbsp; </p>
<p>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp; doPost(request,response);<br />
} <br />
<br />
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
&nbsp;&nbsp; request.setCharacterEncoding("utf-8");<br />
&nbsp;&nbsp; response.setCharacterEncoding("utf-8");<br />
&nbsp;&nbsp; response.setHeader("Cache-Control", "no-cache"); <br />
&nbsp;&nbsp; response.setContentType("text/json;charset=UTF-8");<br />
&nbsp;&nbsp; String semester = java.net.URLDecoder.decode(request.getParameter("semester"),"UTF-8");<br />
&nbsp;&nbsp; int orgId = Integer.parseInt(request.getParameter("orgId"));<br />
&nbsp;&nbsp; PrintWriter out = response.getWriter();<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; ManagerService managerService = (ManagerService)BusinessFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp; .getBusiness(ManagerServiceImpl.class);<br />
&nbsp;&nbsp;&nbsp; List permissionList = managerService.getPermissionByOrg(orgId, semester);<br />
&nbsp;&nbsp;&nbsp; String jsonString = "[";<br />
&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;permissionList.size();i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; Permission permission = (Permission)permissionList.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "{";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"id\":" + permission.getId() +",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"semester\":\"" + permission.getTerm() +"\",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"startTime\":\"" + permission.getStart().toLocaleString() +"\",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"endTime\":\"" + permission.getEndDate().toLocaleString() +"\",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"orgId\":" + permission.getOrg().getId() +",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"operatorId\":" + permission.getOperator().getId() +",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"operatorName\":\"" + permission.getOperator().getName() +"\",";<br />
&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "\"roleId\":" + permission.getRoles().getId();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(i != permissionList.size()-1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "},";<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jsonString += "}]";<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; out.print(jsonString);<br />
&nbsp;&nbsp;&nbsp; out.flush();<br />
&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp; } catch (BusinessException e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; }<br />
}&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <br />
}</p>
<p>用于显示记录的JSP页面如下所示：</p>
<p>&lt;%@ page language="java" import="java.util.*,model.xgb.vo.*" contentType="text/html; charset=utf-8"<br />
&nbsp;&nbsp;&nbsp; pageEncoding="utf-8"%&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>"&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;<br />
&lt;title&gt;Get Permissions&lt;/title&gt;<br />
&lt;script type="text/javascript" src="js/shirdrnPermission.js"&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body onLoad="pageLoad();"&gt;<br />
&lt;div id="list"&gt;&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>我通过使用onLoad事件，加载页面的时候，调用pageLoad()函数，该函数在js/shirdrnPermission.js中实现了，其中js/shirdrnPermission.js的实现如下所示：</p>
<p>var xmlHttp = null;</p>
<p>function pageLoad() {<br />
document.body.style.color = "yellow";<br />
showPermissions();<br />
}</p>
<p>function createXMLHttp() {<br />
if (typeof XMLHttpRequest != "undefined") {<br />
&nbsp;&nbsp; return new XMLHttpRequest();<br />
} else {<br />
&nbsp;&nbsp; if (window.ActiveXObject) {<br />
&nbsp;&nbsp;&nbsp; var aVersions = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];<br />
&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; aVersions.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ActiveXObject(aVersions[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; catch (e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert("error");<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}<br />
}</p>
<p>var permissionArray;<br />
var html = null;</p>
<p>function showPermissions() {<br />
html = "&lt;table bgcolor='green' border='1' width='100%'&gt;"<br />
&nbsp;&nbsp; + "&lt;tr&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;权限ID&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;学期&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;起始时间&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;截止时间&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;组织ID&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;操作ID&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;操作名称&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;th&gt;角色ID&lt;/th&gt;"<br />
&nbsp;&nbsp; + "&lt;/tr&gt;";<br />
if(xmlHttp == null) {<br />
&nbsp;&nbsp; xmlHttp = createXMLHttp();<br />
}<br />
var url = "&amp;semester=" + "2008-2009学年第一学期"<br />
&nbsp;&nbsp;&nbsp; + "&amp;orgId=" + 1;<br />
xmlHttp.open("GET","getPermissions.servlet?" + encodeURI(encodeURI(url)),true); <font color="#339966">// GetPermissions在web.xml中配置为&lt;url-pattern&gt;/getPermissions.servlet&lt;/url-pattern&gt;</font><br />
xmlHttp.onreadystatechange = function() {<br />
&nbsp;&nbsp; if(xmlHttp.readyState == 4 &amp;&amp; xmlHttp.status == 200) {<br />
&nbsp;&nbsp;&nbsp; permissionArray = eval("(" + xmlHttp.responseText + ")"); <font color="#339966">// 将从服务器请求得到的JSON串转换为JavaScript的数组(这里是对象数组)<br />
</font>&nbsp;&nbsp;&nbsp; for(var i=0;i&lt;permissionArray.length;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;tr&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].id +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].semester +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].startTime +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].endTime +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].orgId +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].operatorId +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].operatorName +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;td&gt;" + permissionArray[i].roleId +"&lt;/td&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp; html += "&lt;/tr&gt;";<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; html += "&lt;/table&gt;";<br />
&nbsp;&nbsp;&nbsp; var listContainer = document.getElementById("list");<br />
&nbsp;&nbsp;&nbsp; listContainer.innerHTML = html;<br />
&nbsp;&nbsp; }<br />
}<br />
xmlHttp.send(null);<br />
}</p>
<p>启动WEB服务器，访问链接<a href="http://localhost:8080/xgb/listPermissions.jsp">http://www.5a520.cn &nbsp;:8080/xgb/listPermissions.jsp</a>可以看到页面显示的结果，如下所示：</p>
<p align="center" forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/shirdrn/pic/item/3606b69bed0a8aa9c9eaf4e5.jpg" border="0" small="0"  alt="" /></p>
<p align="left" forimg="1"></p>
<p align="left" forimg="1">使用JSON进行数据传送，比之于XML自然有很大的优势，至少JSON更加精简，将无关紧要的数据尽量压缩，所以速度比XML要快。</p>
<p align="left" forimg="1">另外，JSON上面的这种使用方式就是使用JavaScript中的eval()函数来实现数据到类型的转换，使用JavaScript的数组或者对象就能遍历数据，而XML还要在JavaScript中使用XML DOM操作。</p>
<img src ="http://www.blogjava.net/wangfun/aggbug/267765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-04-27 19:07 <a href="http://www.blogjava.net/wangfun/archive/2009/04/27/267765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>activeMQ笔记之一 </title><link>http://www.blogjava.net/wangfun/archive/2009/04/26/267588.html</link><dc:creator>fun</dc:creator><author>fun</author><pubDate>Sun, 26 Apr 2009 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/wangfun/archive/2009/04/26/267588.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.JMS介绍 &nbsp;&nbsp;&nbsp; JMS源于企业应用对于消息中间件的需求，使应用程序可以通过消息进行异步处理而互不影响。Sun公司和它的合作伙伴设计的JMS API定义了一组公共的应用程序接口和相应语法，使得Java程序能够和其他消息组件进行通信。JMS有四个组成部分：JMS服务提供者、消息管理对象、消息的生产者消费者和消息本身。 1)JMS服务提供者实现消息队列和通知...&nbsp;&nbsp;<a href='http://www.blogjava.net/wangfun/archive/2009/04/26/267588.html'>阅读全文</a><img src ="http://www.blogjava.net/wangfun/aggbug/267588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wangfun/" target="_blank">fun</a> 2009-04-26 17:47 <a href="http://www.blogjava.net/wangfun/archive/2009/04/26/267588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>