﻿<?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-每天学习8小时！</title><link>http://www.blogjava.net/tij/</link><description>本BLOG文章全部来自互联网，版权归原作者所有。</description><language>zh-cn</language><lastBuildDate>Fri, 19 Jun 2026 03:16:48 GMT</lastBuildDate><pubDate>Fri, 19 Jun 2026 03:16:48 GMT</pubDate><ttl>60</ttl><item><title>2008年5月7号</title><link>http://www.blogjava.net/tij/archive/2008/05/08/199106.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Wed, 07 May 2008 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2008/05/08/199106.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/199106.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2008/05/08/199106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/199106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/199106.html</trackback:ping><description><![CDATA[1.找到并学会用日历组件<span style="color: #99cc00"><span style="color: #008000">//未完成<br />
</span></span>2.日志文件中的事件ID<span style="color: #008000">//这个比较重要，去图书馆查未果,如果这个不是我想象的那样，我这几天的工作就白做了。</span><br />
3.用JAVATIMER组件做的东西<span style="color: #008000">//eggtimer完成，算是2的一个后路<br />
</span>4.JAVA连接SQLSERVER<span style="color: #008000">//完成，下了一个sp4,也在softhit下的，就在我下sqlserver2000的目录旁边..安装了一下原来就有的DJ反编译器，嘿嘿<br />
</span>5.c#监视进程<span style="color: #008000">？//未完成<br />
</span>6.NT启动后，tomcat启动吗<span style="color: #008000">？//未完成<br />
</span>7.怎么判断哪一条是最新的日志<span style="color: #008000">？//这个比较搞笑，<span style="font-family: 宋体">怀疑效率太低，不愿意全部遍历，拜托</span>WY<span style="font-family: 宋体">在</span>MSDN<span style="font-family: 宋体">上面找，忽然灵感开窍&#8230;，原来</span>MS<span style="font-family: 宋体">默认按升序排列是有一定道理的，有了思路，却写不出来</span>..<span style="font-family: 宋体">自己还是面向过程的思维，后来想想</span>java<span style="font-family: 宋体">怎么写，终于写出了一个别扭的程序。跟人学了打包&#8230;又想到目录问题，就找了获得当前目录的方法。<br />
<span style="color: #000000">8.c#连接数据库</span>//因为考虑启动时候，sqlserver有可能未启动，就放弃</span></span>
<img src ="http://www.blogjava.net/tij/aggbug/199106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2008-05-08 01:15 <a href="http://www.blogjava.net/tij/archive/2008/05/08/199106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中一些有趣的名字</title><link>http://www.blogjava.net/tij/archive/2008/05/06/198692.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Tue, 06 May 2008 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2008/05/06/198692.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/198692.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2008/05/06/198692.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/198692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/198692.html</trackback:ping><description><![CDATA[<p>暂时想到了这么多：</p>
<p>eclilpse（日蚀, 月蚀） 与 sun</p>
<p>hibernate（冬眠） 与 spring</p>
<p>jakarta（雅加达）与java</p>
<p>tomcat里各个组件从上到下：catalina（远程轰炸机）tomcat（雄猫轰炸机f14）bootstap<br />
(引导）engine(发动机）host context<br />
</p>
<img src ="http://www.blogjava.net/tij/aggbug/198692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2008-05-06 14:11 <a href="http://www.blogjava.net/tij/archive/2008/05/06/198692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>checked exception和unchecked exception </title><link>http://www.blogjava.net/tij/archive/2008/05/06/198612.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Mon, 05 May 2008 18:03:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2008/05/06/198612.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/198612.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2008/05/06/198612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/198612.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/198612.html</trackback:ping><description><![CDATA[JAVA里的异常分为两大类的checked exception和unchecked exception <br />
unchecked exception也就是runtime excerption 它的抛出通常是因为我们程序自身的问题 也就是说 我们编的程序问有问题 我们不用抛出这类异常 编译器会帮我们抛出的 <br />
而checked exception就是像IOException这样的异常 通常是需要程序员抛出的 也是通过try catch或者throw来抛出的 <br />
<img src ="http://www.blogjava.net/tij/aggbug/198612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2008-05-06 02:03 <a href="http://www.blogjava.net/tij/archive/2008/05/06/198612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MessageResources</title><link>http://www.blogjava.net/tij/archive/2008/05/04/198115.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Sun, 04 May 2008 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2008/05/04/198115.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/198115.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2008/05/04/198115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/198115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/198115.html</trackback:ping><description><![CDATA[<p>1.usage of MessageResources</p>
<p>import org.apache.struts.util.MessageResources;</p>
<p>MessageResources messages =MessageResources.getMessageResources("cn/edu/ouc/ky2/ApplicationResources"); </p>
<p>messages.getMessage("experts.MAJOR_NAME")</p>
<p>2.普通的java类,这样更为通用一些</p>
<p>MessageResources resources =(MessageResources) pageContext.getServletContext().getAttribute(Globals.MESSAGES_KEY);<br />
out.println(resources.getMessage("experts.MAJOR_NAME"));<br />
<br />
</p>
<div class="blog_content">MessageResources&nbsp;messages&nbsp;=&nbsp;getResources(request);<br />
<br />
在Action类中定义了getResources(HttpServletRequest&nbsp;request)方法，该方法返回当前默认的MessageResources对象，它封装了Resource&nbsp;Bundle中的文本内容。接下来Action类就可以通过MessageResources对象来访问文本内容。例如，如果要读取消息key为&#8220;hello.jsp.title&#8221;对应的文本内容，可以调用MessageResources类的getMessage(String&nbsp;key)方法：<br />
String&nbsp;title=messages.getMessage("hello.jsp.title"); </div>
<img src ="http://www.blogjava.net/tij/aggbug/198115.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2008-05-04 15:35 <a href="http://www.blogjava.net/tij/archive/2008/05/04/198115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4j最简入门</title><link>http://www.blogjava.net/tij/archive/2008/05/04/198085.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Sun, 04 May 2008 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2008/05/04/198085.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/198085.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2008/05/04/198085.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/198085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/198085.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="text-align: center" align="center"><strong><span lang="EN-US" style="font-size: 14pt">Log4j</span></strong><strong><span style="font-size: 14pt; font-family: 宋体">最简入门</span></strong></p>
<p class="MsoNormal" style="text-align: center" align="center"><strong>by zhlmmc</strong><strong></strong><strong><span lang="EN-US" style="font-size: 14pt"><O:P></O:P></span></strong></p>
<p class="MsoNormal"><span lang="EN-US">Log4j</span><span style="font-family: 宋体">实在是很熟悉，几乎所有的</span><span lang="EN-US">Java</span><span style="font-family: 宋体">项目都用它啊。但是我确一直没有搞明白。终于有一天我受不了了，定下心去看了一把文档，才两个小时，我终于搞明白了。一般情况下</span><span lang="EN-US">Log4j</span><span style="font-family: 宋体">总是和</span><span lang="EN-US">Apache Commons-logging</span><span style="font-family: 宋体">一起用的，我也就一起介绍吧。多了个东西不是更麻烦，而是更简单！</span></p>
<p class="MsoNormal"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt">&lt;!--[if !supportLists]--&gt;<span lang="EN-US"><span>一、</span></span>&lt;!--[endif]--&gt;<span lang="EN-US">Log4j</span><span style="font-family: 宋体">的简单思想</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US">Log4j</span><span style="font-family: 宋体">真的很简单，简单到令人发指的地步。不是要记录日志吗？那就给你一个</span><span lang="EN-US">Log</span><span style="font-family: 宋体">，然后你用</span><span lang="EN-US">Log</span><span style="font-family: 宋体">来写东西就行了，先来一个完整类示例：</span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">package</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> test;</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">import</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> org.apache.commons.logging.Log;</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">import</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> org.apache.commons.logging.LogFactory;</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">public</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">class</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> Test {</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">static</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> Log </span><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> = LogFactory.<em>getLog</em>(Test.</span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">class</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">public</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">void</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> log(){</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">.debug(</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Debug info."</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">.info(</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Info info"</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">.warn(</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Warn info"</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">.error(</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Error info"</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">.fatal(</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Fatal info"</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>}</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">/**</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span><span>&nbsp;&nbsp; </span><span>&nbsp;</span></span><span lang="EN-US" style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">*</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,159,191); font-family: 'Courier New'">@param</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">args</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;</span><span>&nbsp;&nbsp; </span><span>&nbsp;</span></span><span lang="EN-US" style="font-size: 10pt; color: rgb(63,95,191); font-family: 'Courier New'">*/</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">public</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">static</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">void</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> main(String[] args) {</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>Test test = </span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">new</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> Test();</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'">test<span style="color: black">.log();</span><O:P></O:P></span></p>
<p class="MsoNormal" style="text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>}</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt" courier="" new=""><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">别怕，看完这篇文章你就会觉得很简单了。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Log4j</span><span style="font-family: 宋体">默认把日志信息分为五个等级</span></p>
<p class="MsoNormal"><span lang="EN-US"></span><span lang="EN-US" courier="" new="">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; debug &lt; info &lt; warn &lt; error &lt; fatal<O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">虽然可以自己添加等级，但是我觉得没有必要，五个够用了吧！你要写入信息的时候就把信息归为五个等级中的一个，然后调用相应的函数即可。</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal"><span lang="EN-US"></span><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 分五个等级到底有什么用呢？日志信息到底写到哪里去了？</span></p>
<p class="MsoNormal"><span lang="EN-US"></span><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; &#8220;</span><span lang="EN-US" style="font-size: 10pt" courier="" new="">LogFactory.<em>getLog</em>(Test.</span><strong><span lang="EN-US" style="font-size: 10pt" courier="" new="">class</span></strong><span lang="EN-US" style="font-size: 10pt" courier="" new="">)</span><span style="font-family: 宋体">&#8221;又是什么意思捏？接着往下看吧！</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US">Log4j</span><span style="font-family: 宋体">的关键之处在于它的继承思想。也就是一个</span><span lang="EN-US">Log</span><span style="font-family: 宋体">可以继承另外一个</span><span lang="EN-US">Log</span><span style="font-family: 宋体">的属性（输出到哪里，日志等级，日志格式等等）。怎么继承？</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US">Log4j</span><span style="font-family: 宋体">是根据</span><span lang="EN-US">Log</span><span style="font-family: 宋体">的名字来判断继承关系的，比如：</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">名字为&#8220;</span><span lang="EN-US">com.zhlmmc.lib</span><span style="font-family: 宋体">&#8221;的</span><span lang="EN-US">Log</span><span style="font-family: 宋体">就是&#8220;</span><span lang="EN-US">com.zhlmmc.lib.log</span><span style="font-family: 宋体">&#8221;的</span><span lang="EN-US">parent</span><span style="font-family: 宋体">，明白了吧！</span><span lang="EN-US">Log4j</span><span style="font-family: 宋体">还有一个</span><span lang="EN-US">rootLogger</span><span style="font-family: 宋体">，相当于</span><span lang="EN-US">Java</span><span style="font-family: 宋体">的</span><span lang="EN-US">Object</span><span style="font-family: 宋体">。</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">回过头来看&#8220;</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">LogFactory.<em>getLog</em>(Test.</span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">class</span></strong><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">)</span><span lang="EN-US" style="font-size: 10pt" courier="" new=""><span style="font-family: 宋体">&#8221;这里的&#8220;</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">Test.</span><strong><span lang="EN-US" style="font-size: 10pt; color: rgb(127,0,85); font-family: 'Courier New'">class</span></strong><strong></strong><span style="font-family: 宋体">&#8221;事实上传进去的是</span><span lang="EN-US">Test</span><span style="font-family: 宋体">这个类的完整路径（包名</span><span lang="EN-US">+</span><span style="font-family: 宋体">类名），&#8220;</span><span lang="EN-US">test.Test</span><span style="font-family: 宋体">&#8221;。这样如果存在&#8220;</span><span lang="EN-US">test</span><span style="font-family: 宋体">&#8221;这个</span><span lang="EN-US">Log</span><span style="font-family: 宋体">那么</span><span lang="EN-US">Test</span><span style="font-family: 宋体">这个</span><span lang="EN-US">Log</span><span style="font-family: 宋体">就继承它，否则就继承</span><span lang="EN-US">rootLogger</span><span style="font-family: 宋体">。</span></span>&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal"><span lang="EN-US"></span><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 那具体的</span><span lang="EN-US">Log</span><span style="font-family: 宋体">属性是在哪里定义的呢？</span></p>
<p class="MsoNormal"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt">&lt;!--[if !supportLists]--&gt;<span lang="EN-US"><span>二、</span></span>&lt;!--[endif]--&gt;<span style="font-family: 宋体">常见的配置文件</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">虽然可以用</span><span lang="EN-US">xml</span><span style="font-family: 宋体">或者在运行时用</span><span lang="EN-US">Java</span><span style="font-family: 宋体">来配置</span><span lang="EN-US">Log4j</span><span style="font-family: 宋体">，但还是</span><span lang="EN-US">properties</span><span style="font-family: 宋体">文件好用啊！</span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.rootLogger=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">info,</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">stdout</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.appender.stdout=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">org.apache.log4j.ConsoleAppender</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.appender.stdout.layout=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">org.apache.log4j.PatternLayout</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="text-indent: 21pt; text-align: left" align="left"><span lang="EN-US" style="font-size: 10pt; color: rgb(63,127,95); font-family: 'Courier New'"># Pattern to output the caller's file name and line number.</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Courier New'"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.appender.stdout.layout.ConversionPattern=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">%5p</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">[%t]</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">(%F</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">:</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">%L)</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">-</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">%m%n<O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt" courier="" new=""><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">分析一下：</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">第一行，配置</span><span lang="EN-US">log4j.rootLogger</span><span style="font-family: 宋体">你明白吧。应为它是根，总得配置一下，否则别的</span><span lang="EN-US">Log</span><span style="font-family: 宋体">继承什么啊。其他的</span><span lang="EN-US">Log</span><span style="font-family: 宋体">可以配置也可以不配置。等号后面的第一个参数表示日志级别，可以填五个级别中的一种，后面的参数都是让</span><span lang="EN-US">Log</span><span style="font-family: 宋体">知道输出到哪里，如果你想让日志输出到两个地方就加两个输出参数，比如：</span></p>
<p class="MsoNormal" style="margin-left: 21pt">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.rootLogger=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">info,</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'"> </span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">stdout, file</span></p>
<p class="MsoNormal" style="margin-left: 21pt"></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">这里的</span><span lang="EN-US">info</span><span style="font-family: 宋体">表示，该</span><span lang="EN-US">Log</span><span style="font-family: 宋体">的日志级别为</span><span lang="EN-US">info</span><span style="font-family: 宋体">，所有级别小于</span><span lang="EN-US">info</span><span style="font-family: 宋体">的日志都不会被记录。比如使用这个配置文件的话，我刚开始举的那个类中</span></p>
<p class="MsoNormal" style="margin-left: 21pt">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 21pt"><em><span lang="EN-US" style="font-size: 10pt; color: rgb(0,0,192); font-family: 'Courier New'">log</span></em><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">.debug(</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">"Debug info."</span><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt" courier="" new=""><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">这句话是不起作用的，因为</span><span lang="EN-US">debug</span><span style="font-family: 宋体">的级别小于</span><span lang="EN-US">info</span><span style="font-family: 宋体">。这样就很容易控制什么信息在调试的时候要显示，什么信息在发布的时候要去掉。这些都不用改代码，很方便吧。</span></p>
<p class="MsoNormal"><span lang="EN-US"></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">但，</span><span lang="EN-US">stdout</span><span style="font-family: 宋体">和</span><span lang="EN-US">file</span><span style="font-family: 宋体">又是什么呢？</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">接着往下看，就是配置</span><span lang="EN-US">stdout</span><span style="font-family: 宋体">了，这个名字是随便取的，你可以叫它</span><span lang="EN-US">A</span><span style="font-family: 宋体">：</span></p>
<p class="MsoNormal" style="margin-left: 21pt">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.appender.A=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">org.apache.log4j.ConsoleAppender</span></p>
<p class="MsoNormal" style="margin-left: 21pt"></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">那么上面的</span><span lang="EN-US">rootLogger</span><span style="font-family: 宋体">的参数</span><span lang="EN-US">stdout</span><span style="font-family: 宋体">也要改成</span><span lang="EN-US">A</span><span style="font-family: 宋体">，其他用到的地方当然也要改。这里的关键不是名字，而是</span><span lang="EN-US">appender</span><span style="font-family: 宋体">类型，比如这里的&#8220;</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">ConsoleAppender</span><span style="font-family: 宋体">&#8221;，看明白了吧，输出到</span><span lang="EN-US">Console</span><span style="font-family: 宋体">。后面两行都是设置日志格式的，一般情况下你就照抄吧。既然是最简入门关注于理解</span><span lang="EN-US">Log4j</span><span style="font-family: 宋体">的工作原理，我就不介绍</span><span lang="EN-US">file</span><span style="font-family: 宋体">类型的</span><span lang="EN-US">appender</span><span style="font-family: 宋体">了，一搜一大把。</span></p>
<p class="MsoNormal"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">在实际的项目开发中，很可能遇到所引用的包用</span><span lang="EN-US">Log4j</span><span style="font-family: 宋体">来记录日志，比如</span><span lang="EN-US">Hibernate</span><span style="font-family: 宋体">。那么在这里你可以很容易的控制这个包如何记录日志。比如在上面的配置文件中加一行：</span></p>
<p class="MsoNormal" style="margin-left: 21pt">&nbsp;</p>
<p class="MsoNormal" style="margin-left: 21pt"><span lang="EN-US" style="font-size: 10pt; color: black; font-family: 'Courier New'">log4j.logger.org.hibernate=</span><span lang="EN-US" style="font-size: 10pt; color: rgb(42,0,255); font-family: 'Courier New'">fatal</span></p>
<p class="MsoNormal" style="margin-left: 21pt"></p>
<p class="MsoNormal"><span lang="EN-US"></span><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; 那么所有</span><span lang="EN-US">org.hibernate</span><span style="font-family: 宋体">包下面的类就只会显示很少的信息，因为</span><span lang="EN-US">fatal</span><span style="font-family: 宋体">的级别最高啊。</span></p>
<p class="MsoNormal"><span lang="EN-US"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin-left: 21pt; text-indent: -21pt">&lt;!--[if !supportLists]--&gt;<span lang="EN-US"><span>三、</span></span>&lt;!--[endif]--&gt;<span style="font-family: 宋体">部署</span></p>
<p class="MsoNormal" style="margin-left: 21pt"><span style="font-family: 宋体">别怕，这可不是部署</span><span lang="EN-US">Tomcat</span><span style="font-family: 宋体">。把</span><span lang="EN-US">log4j</span><span style="font-family: 宋体">的包和</span><span lang="EN-US">commons-logging</span><span style="font-family: 宋体">的包（加在一起才两个）放到</span><span lang="EN-US">classpath</span><span style="font-family: 宋体">下面。然后把配置文件保存为</span><span lang="EN-US">log4j.properties</span><span style="font-family: 宋体">，也放在</span><span lang="EN-US">classpath</span><span style="font-family: 宋体">下面（如果用</span><span lang="EN-US">Eclipse</span><span style="font-family: 宋体">的话，放在</span><span lang="EN-US">src</span><span style="font-family: 宋体">目录下即可）。然后你就可以跑了。</span></p>
 <img src ="http://www.blogjava.net/tij/aggbug/198085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2008-05-04 15:05 <a href="http://www.blogjava.net/tij/archive/2008/05/04/198085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>actionMessages()，actionError()介绍</title><link>http://www.blogjava.net/tij/archive/2008/05/04/198077.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Sun, 04 May 2008 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2008/05/04/198077.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/198077.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2008/05/04/198077.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/198077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/198077.html</trackback:ping><description><![CDATA[<p>尽管Struts框架提供了有效的异常处理机制，但不能保证处理所有的错误，这时Struts框架会把错误抛给Web容器，在默认情况下Web容器会向用户浏览器直接返回原始信息。如果想避免直接让用户看到这些原始信息，可以在web.xml中配置&lt;error-page&gt;元素，以下代码演示了如何避免用户看到HTTP 404、HTTP 500错误和Exception异常。<br />
<br />
web.xml:<br />
&nbsp; &lt;error-page&gt;<br />
&nbsp; &nbsp; &lt;error-code&gt;404&lt;/error-code&gt;<br />
&nbsp; &nbsp; &lt;location&gt;/exception/error404.jsp&lt;/location&gt;<br />
&nbsp; &lt;/error-page&gt;<br />
&nbsp; &lt;error-page&gt;<br />
&nbsp; &nbsp; &lt;error-code&gt;500&lt;/error-code&gt;<br />
&nbsp; &nbsp; &lt;location&gt;/exception/error500.jsp&lt;/location&gt;<br />
&nbsp; &lt;/error-page&gt;<br />
&nbsp; &lt;error-page&gt;<br />
&nbsp; &nbsp; &lt;exception-type&gt;java.lang.Exception&lt;/exception-type&gt;<br />
&nbsp; &nbsp; &lt;location&gt;/exception/default.jsp&lt;/location&gt;<br />
&nbsp; &lt;/error-page&gt;<br />
当WEB容器捕获到exception-type或error-code指定的错误时将跳到由location指定的页面。<br />
<br />
 问题：当form bean 为动态bean时，在action中无法对form bean数据进行验证，因为formbean没有具体实现类。action中无法引用<br />
 ActionError/ActionErrors/ActionMessage/ActionMessages:<br />
<br />
有时候你需要向用户提供相关处理信息，包括表单验证时发现错误等。<br />
1. 相关类介绍：<br />
ActionMessage：用于保存一个与资源束对应的提示信息。主要构造函数如：<br />
ActionMessage(String message)；<br />
ActionMessage(String message,paramater)。<br />
<br />
ActionMessages:用于保存多个ActionMessage。并在html:errors 和html:messages中起作用。<br />
主要构造函数：<br />
ActionMessages().<br />
主要方法是add(String property,ActionMessage message)<br />
ActionMessages有一个HashMap类型messages保存多个ActionMessage对象，每个ActionMessage对象都有唯一的一个property标识。这个property可以是自定义的任意字符串，也可以由org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE指定<br />
html:messages/html:errors使用property属性访问某个资源<br />
<br />
ActionErrors：用于保存一个与资源束对应的错误信息。用法跟ActionMessages差不多。<br />
ActionError不赞成使用。<br />
<br />
<br />
2. 版本：<br />
struts1.1中用ActionErrors报告错误，用ActionMessages提供信息。<br />
在struts1.2中使用ActionMessages提供信息和错误，不赞成使用ActionError<br />
struts1.3中已经没有ActionError类了。<br />
<br />
3． AtionErrors和ActionMessages的区别<br />
<br />
1． ActionErrors是ActionMessages的一个子类，功能几乎相同，不同点在于标签&lt;html:errors/&gt;和&lt;html:messages&gt;的使用上的区别。<br />
html:errors指定了footer和header属性。默认值为errors.header和errors.footer,需要时可以自己指定。如果资源属性文件配置了 errors.header和errors.footer，则任何时候使用html:errors时开头和结尾都是这两个属性对应的资源信息。<br />
而html:message默认情况下没有errors.header和errors.footer值，当然可以自己指定。<br />
<br />
2． html:errors可以根据property属性指定显示一个错误信息。html:messages有一个必添项id。html:messages不能直接显示信息，它将选出的信息放入一个用id标识的Iterator对象里，然后在用ben:write或JSTL c:out标签显示每个信息.例如：<br />
&lt;html:messages message="true" id="msg"&gt;<br />
&nbsp; &nbsp; &lt;c:out value="${msg}"/&gt;&lt;br /&gt;<br />
&lt;/html:messages&gt;<br />
<br />
3. 具体的一个例子：<br />
接受输入页面input.jsp:<br />
<br />
&nbsp; &lt;html:form action="/errormessage/input"&gt;<br />
&nbsp; &nbsp; phoneNumber : &lt;html:text property="phoneNumber"/&gt; &lt;html:errors &nbsp; &nbsp; property="&lt;%=org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE %&gt;"/&gt;&lt;br/&gt;<br />
&nbsp; &lt;html:submit/&gt;&lt;html:cancel/&gt;<br />
&nbsp; &lt;/html:form&gt;<br />
<br />
struts-config.xml:<br />
&nbsp; &lt;form-beans &gt;<br />
&nbsp; &nbsp; &lt;form-bean name="inputForm" type="cn.rolia.struts.form.errorexception.InputForm" /&gt;<br />
&nbsp; &lt;/form-beans&gt;<br />
&nbsp; &lt;action-mappings &gt;<br />
&nbsp; &nbsp; &lt;action<br />
&nbsp; &nbsp; &nbsp; attribute="inputForm"<br />
&nbsp; &nbsp; &nbsp; input="/errormessage/input.jsp"<br />
&nbsp; &nbsp; &nbsp; name="inputForm"<br />
&nbsp; &nbsp; &nbsp; path="/errormessage/input"<br />
&nbsp; &nbsp; &nbsp; scope="request"<br />
&nbsp; &nbsp; &nbsp; type="com.yourcompany.struts.action.errormessage.InputAction"<br />
&nbsp; &nbsp; &nbsp; validate="false"&gt;<br />
&nbsp; &nbsp; &nbsp; &lt;forward name="success" path="/errormessage/success.jsp" /&gt;<br />
&nbsp; &nbsp; &lt;/action&gt;<br />
&nbsp; &lt;/action-mappings&gt;<br />
<br />
InputAction.java:<br />
<br />
public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp; &nbsp; HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp; cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub<br />
&nbsp; String phoneNumber = inputForm.getPhoneNumber();<br />
&nbsp; if(phoneNumber.length()&lt;4){<br />
&nbsp; ActionErrors messages = new ActionErrors();<br />
&nbsp; &nbsp; messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));<br />
&nbsp; &nbsp; this.saveErrors(request, messages);<br />
&nbsp; &nbsp; return mapping.getInputForward();<br />
&nbsp; }<br />
<br />
&nbsp; return mapping.findForward("success");<br />
}<br />
解说：用户输入手机号码，页面跳转到InputAction控制层进行处理，若输入数据小于4，则创建一个ActionMessage类存储相关错误信息。然后再创建ActionErrors类将此ActionMessage放入ActionErrors。再调用Action的saveErrors方法将此ActionErrors保存的request范围里，然后返回input.jsp页面要求重新输入并用html:errors提示错误信息。<br />
<br />
4. Action包含saveErrors()方法和saveMessages()方法。如果创建的ActionErrors则应该调用saveErrors()，若创建的是ActionMessages则应该调用saveMessages()方法。<br />
saveErrors()接收ActionMessages而不是ActionErrors;同时将其保存在request中并用一个由org.apache.struts.Globals.ERROR_KEY指定的常量&#8221; org.apache.struts.Globals.ERROR_KEY&#8221;标识这个ActionMessages，便于html:errors查找。saveMessages()方法接收ActionMessages同时将其保存在request中并用一个由org.apache.struts.Globals.MESSAGE_KEY指定的常量&#8221; org.apache.struts.Globals.MESSAGE_KEY&#8221;标识这个ActionMessages，进而让html:messages从常量Globals.ERROR_KEY中遍历获取信息。可以将其属性message设置为true，那么它将从常量Globals.MESSAGE_KEY中遍历获取信息。<br />
<br />
5. 默认情况下html:messages从<br />
如果你想将信息保存在session里而不是request，struts1.2提供了<br />
struts1.1没有的saveMessages(HttpSession session, ActionMessages messages)方法和saveErrors(javax.servlet.http.HttpSession session, ActionMessages errors)方法。<br />
InputAction.java:<br />
<br />
public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp; &nbsp; HttpServletRequest request, HttpServletResponse response) {<br />
cn.rolia.struts.form.errorexception.InputForm inputForm = (cn.rolia.struts.form.errorexception.InputForm) form;// TODO Auto-generated method stub<br />
&nbsp; String phoneNumber = inputForm.getPhoneNumber();<br />
&nbsp; if(phoneNumber.length()&lt;4){<br />
&nbsp; &nbsp; ActionErrors messages = new ActionErrors();<br />
&nbsp; &nbsp; messages.add(org.apache.struts.action.ActionMessages.GLOBAL_MESSAGE,new ActionMessage("error.errormessage.input"));<br />
&nbsp; &nbsp; this.saveErrors(request.getSession(true), messages);<br />
&nbsp; &nbsp; return mapping.getInputForward();<br />
&nbsp; }<br />
<br />
&nbsp; return mapping.findForward("success");<br />
} </p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/tij/aggbug/198077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2008-05-04 15:00 <a href="http://www.blogjava.net/tij/archive/2008/05/04/198077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING设计思想之工厂模式</title><link>http://www.blogjava.net/tij/archive/2007/11/11/159696.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Sun, 11 Nov 2007 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2007/11/11/159696.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/159696.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2007/11/11/159696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/159696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/159696.html</trackback:ping><description><![CDATA[<font style="background-color: #cce8cf">工厂模式：根据调用数据返回某个类的一个实例，此类可以是多个类的某一个类，通常，这些类满足共同的规则或父类。调用者只关心：是否满足某种规范和是否可供自己正常调用。<br />
厂模式定义<span lang="EN-US">:提供创建对象的接口.</span>
<p><strong><em>为何使用<span lang="EN-US">?</span></em></strong><span lang="EN-US"><br />
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式，工厂模式在Java程序系统可以说是随处可见。</span></p>
<p>为什么工厂模式是如此常用？因为工厂模式就相当于创建实例对象的<span lang="EN-US">new，我们经常要根据类Class生成实例对象，如A a=new A() 工厂模式也是用来创建实例对象的，所以以后new时就要多个心眼，是否可以考虑实用工厂模式，虽然这样做，可能多做一些工作，但会给你系统带来更大的可扩展性和尽量少的修改量。</span></p>
<p>我们以类<span lang="EN-US">Sample为例， 如果我们要创建Sample的实例对象:</span></p>
<p><span lang="EN-US">Sample sample=new Sample();</span></p>
<p>可是，实际情况是，通常我们都要在创建<span lang="EN-US">sample实例时做点初始化的工作,比如赋值 查询数据库等。</span></p>
<p>首先，我们想到的是，可以使用<span lang="EN-US">Sample的构造函数，这样生成实例就写成:</span></p>
<p><span lang="EN-US">Sample sample=new Sample(参数);</span></p>
<p>但是，如果创建<span lang="EN-US">sample实例时所做的初始化工作不是象赋值这样简单的事，可能是很长一段代码，如果也写入构造函数中，那你的代码很难看了（就需要Refactor重整）。</span></p>
<p>为什么说代码很难看，初学者可能没有这种感觉，我们分析如下，初始化工作如果是很长一段代码，说明要做的工作很多，将很多工作装入一个方法中，相当于将很多鸡蛋放在一个篮子里，是很危险的，这也是有背于<span lang="EN-US">Java面向对象的原则，面向对象的封装(Encapsulation)和分派(Delegation)告诉我们，尽量将长的代码分派&#8220;切割&#8221;成每段，将每段再&#8220;封装&#8221;起来(减少段和段之间偶合联系性)，这样，就会将风险分散，以后如果需要修改，只要更改每段，不会再发生牵一动百的事情。</span></p>
<p>在本例中，首先，我们需要将创建实例的工作与使用实例的工作分开<span lang="EN-US">, 也就是说，让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。</span></p>
<p>这时我们就需要<span lang="EN-US">Factory工厂模式来生成对象了，不能再用上面简单new Sample(参数)。</span>还有<span lang="EN-US">,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.</span>现在<span lang="EN-US">Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:</span></p>
<p><span lang="EN-US">Sample mysample=new MySample();<br />
Sample hissample=new HisSample();</span></p>
<p>随着项目的深入<span lang="EN-US">,Sample可能还会"生出很多儿子出来", 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.</span></p>
<p>但如果你一开始就有意识使用了工厂模式<span lang="EN-US">,这些麻烦就没有了.</span></p>
<p><strong>工厂方法<br />
</strong>你会建立一个专门生产<span lang="EN-US">Sample实例的工厂:</span></p>
<table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span lang="EN-US">public class Factory{</span></p>
            <p>　　<span lang="EN-US">public static Sample creator(int which){</span></p>
            <p>　　//getClass <span lang="EN-US">产生Sample 一般可使用动态类装载装入类。<br />
            　　if (which==1)<br />
            　　　　return new SampleA();<br />
            　　else if (which==2)<br />
            　　　　return new SampleB();</span></p>
            <p>　　<span lang="EN-US">}</span></p>
            <p><span lang="EN-US">}</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>那么在你的程序中<span lang="EN-US">,如果要实例化Sample时.就使用</span></p>
<p><span lang="EN-US">Sample sampleA=Factory.creator(1);</span></p>
<p>这样<span lang="EN-US">,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.</span></p>
<p>使用工厂方法 要注意几个角色，首先你要定义产品接口，如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类，用来生成产品Sample，如下图，最右边是生产的对象Sample：</p>
<p><img height="178" src="http://www.jdon.com/designpatterns/images/factory.jpg" width="526"  alt="" /></p>
<p>进一步稍微复杂一点，就是在工厂类上进行拓展，工厂类也有继承它的实现类concreteFactory了<strong><em>。</em></strong></p>
<p><span lang="EN-US"><strong>抽象工厂</strong><br />
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).</span></p>
<p style="margin-bottom: 12pt"><span lang="EN-US">这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.</span></p>
<p style="margin-bottom: 12pt">这里假设：Sample有两个concrete类SampleA和SamleB，而Sample2也有两个concrete类Sample2A和SampleB2</p>
<p style="margin-bottom: 12pt"><span lang="EN-US">那么，我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现，下面就是将上例中的Factory拓展成抽象工厂:</span></p>
<table style="width: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span lang="EN-US">public abstract class Factory{</span></p>
            <p>　　<span lang="EN-US">public abstract Sample creator();</span></p>
            <p>　　<span lang="EN-US">public abstract Sample2 creator(String name); </span></p>
            <p><span lang="EN-US">}</span></p>
            <p><span lang="EN-US">public class SimpleFactory extends Factory{</span></p>
            <p>　　<span lang="EN-US">public Sample creator(){<br />
            　　　　.........<br />
            　　　　return new SampleA</span><span lang="EN-US"><br />
            　　}</span></p>
            <p>　　<span lang="EN-US">public Sample2 creator(String name){<br />
            　　　　.........<br />
            　　　　return new Sample2A</span><span lang="EN-US"><br />
            　　}</span></p>
            <p><span lang="EN-US">}</span></p>
            <p><span lang="EN-US">public class BombFactory extends Factory{</span></p>
            <p>　　<span lang="EN-US">public Sample creator(){<br />
            　　　　......<br />
            　　　　return new SampleB</span><span lang="EN-US"> <br />
            　　}</span></p>
            <p>　　<span lang="EN-US">public Sample2 creator(String name){<br />
            　　　　......<br />
            　　　　return new Sample2B<br />
            　　}</span></p>
            <p><span lang="EN-US">}</span></p>
            <p><span lang="EN-US">&nbsp;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span lang="EN-US">从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问，为什么我不可以使用两个工厂方法来分别生产Sample和Sample2? </span></p>
<p><span lang="EN-US">抽象工厂还有另外一个关键要点，是因为 SimpleFactory内，生产Sample和生产Sample2的方法之间有一定联系，所以才要将这两个方法捆绑在一个类中，这个工厂类有其本身特征，也许制造过程是统一的，比如：制造工艺比较简单，所以名称叫SimpleFactory。</span><span lang="EN-US"><br />
</span></p>
<p>在实际应用中，工厂方法用得比较多一些，而且是和动态类装入器组合在一起应用，</p>
<p><span lang="EN-US"><strong>举例</strong><O:P></O:P></span></p>
<p>我们以<span lang="EN-US">Jive的ForumFactory为例，这个例子在前面的Singleton模式中我们讨论过，现在再讨论其工厂模式:</span></p>
<table style="width: 97%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="97%" border="0">
    <tbody>
        <tr>
            <td style="padding-right: 2.25pt; padding-left: 2.25pt; background: #cccccc; padding-bottom: 2.25pt; padding-top: 2.25pt">
            <p><span lang="EN-US">public abstract class ForumFactory {</span></p>
            <p>　　<span lang="EN-US">private static Object initLock = new Object();<br />
            　　private static String className = "com.jivesoftware.forum.database.DbForumFactory";<br />
            　　private static ForumFactory factory = null; </span></p>
            <p>　　<span lang="EN-US">public static ForumFactory getInstance(Authorization authorization) {<br />
            　　　　//If no valid authorization passed in, return null.<br />
            　　　　if (authorization == null) {<br />
            　　　　　　return null;<br />
            　　　　}<br />
            　　　　//以下使用了Singleton 单态模式<br />
            　　　　if (factory == null) {<br />
            　　　　　　synchronized(initLock) {<br />
            　　　　　　　　if (factory == null) {<br />
            　　　　　　　　　　　　...... </span></p>
            <p>　　　　　　　　　　<span lang="EN-US">try {<br />
            　　　　　　　　　　　　　　//动态转载类<br />
            　　　　　　　　　　　　　　Class c = Class.forName(className);<br />
            　　　　　　　　　　　　　　factory = (ForumFactory)c.newInstance();<br />
            　　　　　　　　　　}<br />
            　　　　　　　　　　catch (Exception e) {<br />
            　　　　　　　　　　　　　　return null;<br />
            　　　　　　　　　　}<br />
            　　　　　　　　}<br />
            　　　　　　}<br />
            　　　　}</span></p>
            <p>　　　　<span lang="EN-US">//Now, 返回 proxy.用来限制授权对forum的访问<br />
            　　　　return new ForumFactoryProxy(authorization, factory,<br />
            　　　　　　　　　　　　　　　　　　　　factory.getPermissions(authorization));<br />
            　　}</span></p>
            <p>　　<span lang="EN-US">//真正创建forum的方法由继承forumfactory的子类去完成.<br />
            　　public abstract Forum createForum(String name, String description)<br />
            　　throws UnauthorizedException, ForumAlreadyExistsException;</span></p>
            <p>　　<span lang="EN-US">....</span></p>
            <p><span lang="EN-US">}</span></p>
            <p><span lang="EN-US">&nbsp;</span></p>
            <p><span lang="EN-US">&nbsp;</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p>因为现在的<span lang="EN-US">Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:</span></p>
<p><span lang="EN-US">private static String className = "com.jivesoftware.forum.database.DbForumFactory";</span></p>
<p>你可以使用自己开发的创建<span lang="EN-US">forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.</span></p>
<p>在上面的一段代码中一共用了三种模式<span lang="EN-US">,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果. &nbsp;</span></p>
<p>看看<span lang="EN-US">Java宠物店中的CatalogDAOFactory:</span></p>
<table cellspacing="0" cellpadding="0" width="100%" bgcolor="#cccccc" border="0">
    <tbody>
        <tr>
            <td>public class CatalogDAOFactory {
            <p>&nbsp;</p>
            <p>　　/**</p>
            <p>　　* 本方法制定一个特别的子类来实现DAO模式。<br />
            　　* 具体子类定义是在J2EE的部署描述器中。<br />
            　　*/</p>
            <p>　　public static CatalogDAO getDAO() throws CatalogDAOSysException {</p>
            <p>　　　　CatalogDAO catDao = null;</p>
            <p>　　　　try {</p>
            <p>　　　　　　InitialContext ic = new InitialContext();<br />
            　　　　　　//动态装入CATALOG_DAO_CLASS<br />
            　　　　　　//可以定义自己的CATALOG_DAO_CLASS，从而在无需变更太多代码<br />
            　　　　　　//的前提下，完成系统的巨大变更。</p>
            <p>　　　　　　String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);</p>
            <p>　　　　　　catDao = (CatalogDAO) Class.forName(className).newInstance();</p>
            <p>　　　　} catch (NamingException ne) {</p>
            <p>　　　　　　throw new CatalogDAOSysException("<br />
            　　　　　　　　CatalogDAOFactory.getDAO: NamingException while <br />
            　　　　　　　　　　getting DAO type : \n" + ne.getMessage());</p>
            <p>　　　　} catch (Exception se) {</p>
            <p>　　　　　　throw new CatalogDAOSysException("<br />
            　　　　　　　　CatalogDAOFactory.getDAO: Exception while getting <br />
            　　　　　　　　　　DAO type : \n" + se.getMessage());</p>
            <p>　　　　}</p>
            <p>　　　　return catDao;</p>
            <p>　　}</p>
            <p>}<br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
<p><br style="mso-ignore: vglayout" clear="all" />
</p>
<p><span lang="EN-US">CatalogDAOFactory是典型的工厂方法，catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类，这个实现子类在Java宠物店是用来操作catalog数据库，用户可以根据数据库的类型不同，定制自己的具体实现子类，将自己的子类名给与CATALOG_DAO_CLASS变量就可以。</span></p>
<p>由此可见，工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制，只要我们更换一下具体的工厂方法，系统其他地方无需一点变换，就有可能将系统功能进行改头换面的变化。</p>
<p>设计模式如何在具体项目中应用见<a href="http://www.jdon.com/mybook/index.htm" target="_blank">《Java实用系统开发指南》</a></p>
</font>
 <img src ="http://www.blogjava.net/tij/aggbug/159696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2007-11-11 12:23 <a href="http://www.blogjava.net/tij/archive/2007/11/11/159696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>千里之行 始于足下</title><link>http://www.blogjava.net/tij/archive/2007/10/26/156229.html</link><dc:creator>神未必这么写</dc:creator><author>神未必这么写</author><pubDate>Fri, 26 Oct 2007 11:22:00 GMT</pubDate><guid>http://www.blogjava.net/tij/archive/2007/10/26/156229.html</guid><wfw:comment>http://www.blogjava.net/tij/comments/156229.html</wfw:comment><comments>http://www.blogjava.net/tij/archive/2007/10/26/156229.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/tij/comments/commentRss/156229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tij/services/trackbacks/156229.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">一觉醒来，你会不会茫然无措？觉得自己一无是处？</font></p>
<img src ="http://www.blogjava.net/tij/aggbug/156229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tij/" target="_blank">神未必这么写</a> 2007-10-26 19:22 <a href="http://www.blogjava.net/tij/archive/2007/10/26/156229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>