﻿<?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-思想比知识更重要 成长比成功更重要-随笔分类-Open Source</title><link>http://www.blogjava.net/renyangok/category/17024.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 17:48:10 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 17:48:10 GMT</pubDate><ttl>60</ttl><item><title>Log4j具体输出信息级别配置方法</title><link>http://www.blogjava.net/renyangok/archive/2007/01/22/95351.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 22 Jan 2007 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2007/01/22/95351.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/95351.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2007/01/22/95351.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/95351.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/95351.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" size="2">Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的，它可接key=value格式的设置或xml格式的设置信息。通过配置，可以创建出Log4J的运行环境。<br /><br /><strong>1. 配置文件</strong><br />Log4J配置文件的基本格式如下： </font>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial" size="2">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">#配置根Logger<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">[</span>
								<span style="COLOR: rgb(128,0,0)">level</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">]</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,0)">,</span>
								<span style="COLOR: rgb(0,0,0)"> appenderName1</span>
								<span style="COLOR: rgb(0,0,0)">,</span>
								<span style="COLOR: rgb(0,0,0)"> appenderName2</span>
								<span style="COLOR: rgb(0,0,0)">,</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> …<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#配置日志信息输出目的地Appender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.appenderName </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> fully.qualified.name.of.appender.class <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.option1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> value1 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.optionN </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> valueN <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />#配置日志信息的格式（布局）<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.appenderName.layout </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> fully.qualified.name.of.layout.class <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.layout.option1 </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> value1 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　log4j.appender.appenderName.layout.optionN </span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> valueN </span>
						</font>
				</font>
		</div>
		<p>
				<br />
				<font face="Arial" size="2">其中 <strong>[level] </strong>是日志输出级别，共有5级：<br /></font>
				<span style="COLOR: rgb(0,0,0)">
						<strong>
						</strong>
				</span>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial" size="2">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: rgb(0,0,0)">FATAL     </span>
						<span style="COLOR: rgb(0,0,0)">0</span>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />ERROR     </span>
								<span style="COLOR: rgb(0,0,0)">3</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />WARN      </span>
								<span style="COLOR: rgb(0,0,0)">4</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />INFO      </span>
								<span style="COLOR: rgb(0,0,0)">6</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />DEBUG     </span>
								<span style="COLOR: rgb(0,0,0)">7</span>
						</font>
				</font>
				<span style="COLOR: rgb(0,0,0)">
						<br />
						<font face="Arial" size="2">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</font>
				</span>
		</div>
		<p>
				<br />
				<font face="Arial" size="2">Appender </font>
				<font face="Arial" size="2">为日志输出目的地，Log4j提供的appender有以下几种：<br /></font>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial" size="2">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</font>
				<span style="COLOR: rgb(0,0,0)">
						<font face="Arial" size="2">org.apache.log4j.ConsoleAppender（控制台），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.FileAppender（文件），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方） </font>
				</span>
		</div>
		<p>
				<br />
				<font face="Arial">
						<font size="2">
								<strong>Layout</strong>：日志输出格式，Log4j提供的layout有以下几种：<br /></font>
				</font>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial" size="2">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</font>
				<span style="COLOR: rgb(0,0,0)">
						<font face="Arial" size="2">org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） </font>
				</span>
		</div>
		<p>
				<br />
				<font face="Arial">
						<font size="2">
								<strong>打印参数: </strong>Log4J采用类似C语言中的printf函数的打印格式格式化日志信息，如下:<br /></font>
				</font>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial" size="2">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">　　<strong>%m</strong>   输出代码中指定的消息<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%p</strong>   输出优先级，即DEBUG，INFO，WARN，ERROR，FATAL <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%r</strong>   输出自应用启动到输出该log信息耗费的毫秒数 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%c</strong>   输出所属的类目，通常就是所在类的全名 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%t</strong>   输出产生该日志事件的线程名 <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%n </strong>  输出一个回车换行符，Windows平台为“\r\n”，Unix平台为“\n” <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%d</strong>   输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss</span>
								<span style="COLOR: rgb(0,0,0)">,</span>
								<span style="COLOR: rgb(0,0,0)">SSS}，输出类似：2002年10月18日 </span>
								<span style="COLOR: rgb(0,0,0)">22</span>
								<span style="COLOR: rgb(0,0,0)">：</span>
								<span style="COLOR: rgb(0,0,0)">10</span>
								<span style="COLOR: rgb(0,0,0)">：</span>
								<span style="COLOR: rgb(0,0,0)">28</span>
								<span style="COLOR: rgb(0,0,0)">，</span>
								<span style="COLOR: rgb(0,0,0)">921</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />　　<strong>%l </strong>  输出日志事件的发生位置，包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:</span>
								<span style="COLOR: rgb(0,0,0)">10</span>
								<span style="COLOR: rgb(0,0,0)">) <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
						</font>
				</font>
		</div>
		<p>
				<br />
				<font face="Arial">
						<font size="2">
								<strong>2. 在代码中初始化Logger:</strong>
								<br />1）在程序中调用<strong>BasicConfigurator.configure()</strong>方法：给根记录器增加一个ConsoleAppender，输出格式通过PatternLayout设为<strong>"%-4r [%t] %-5p %c %x - %m%n"</strong>，还有根记录器的默认级别是<strong>Level.DEBUG</strong>. <br />2）配置放在文件里，通过命令行参数传递文件名字，通过<strong>PropertyConfigurator.configure(args[x])</strong>解析并配置；<br />3）配置放在文件里，通过环境变量传递文件名等信息，利用log4j默认的初始化过程解析并配置；<br />4）配置放在文件里，通过应用服务器配置传递文件名等信息，利用一个特殊的servlet来完成配置。<br /><br /><strong>3. 为不同的 Appender 设置日志输出级别：</strong><br />当调试系统时，我们往往注意的只是异常级别的日志输出，但是通常所有级别的输出都是放在一个文件里的，如果日志输出的级别是BUG！？那就慢慢去找吧。<br />这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以，Log4j已经提供了这样的功能，我们只需要在配置中修改<strong>Appender</strong>的<font color="#990000"><strong>Threshold</strong></font></font>
				</font>
				<font color="#000000">
						<font face="Arial" size="2">就能实现,比如下面的例子：<br /><br /><strong>[配置文件]</strong><br /></font>
				</font>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial" size="2">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">### set log levels ###<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.rootLogger</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)">debug</span>
								<span style="COLOR: rgb(0,0,0)">,</span>
								<span style="COLOR: rgb(0,0,0)"> stdout</span>
								<span style="COLOR: rgb(0,0,0)">,</span>
								<span style="COLOR: rgb(0,0,0)"> D</span>
								<span style="COLOR: rgb(0,0,0)">,</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> E<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />### 输出到控制台 ###<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">org.apache.log4j.ConsoleAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.Target</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">System.out<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.layout</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.stdout.layout.ConversionPattern</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)"> %d{ABSOLUTE} %5p %c{</span>
								<span style="COLOR: rgb(0,0,0)">1</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">}:%L - %m%n<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />### 输出到日志文件 ###<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">org.apache.log4j.DailyRollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.File</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">logs/log.log<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.Append</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">true<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.<strong><font color="#990000">Threshold</font></strong></span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">DEBUG <strong>## 输出DEBUG级别以上的日志</strong><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.layout</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.layout.ConversionPattern</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)">%-d{yyyy-MM-dd HH:mm:ss} </span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">[</span>
								<span style="COLOR: rgb(128,0,0)">%t:%r</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">]</span>
								<span style="COLOR: rgb(0,0,0)">-</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">[</span>
								<span style="COLOR: rgb(128,0,0)">%p</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">]</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)"> %m%n<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />### 保存异常信息到单独文件 ###<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">org.apache.log4j.DailyRollingFileAppender<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.File</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">logs/error.log ## 异常日志文件名<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.Append</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">true<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.<strong><font color="#990000">Threshold</font></strong></span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">ERROR<strong> ## 只输出ERROR级别以上的日志!!!<br /></strong><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.layout</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
						</font>
				</font>
				<font face="Arial">
						<font size="2">
								<span style="COLOR: rgb(0,0,0)">org.apache.log4j.PatternLayout<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />log4j.appender.D.layout.ConversionPattern</span>
								<span style="COLOR: rgb(0,0,0)">=</span>
								<span style="COLOR: rgb(0,0,0)">%-d{yyyy-MM-dd HH:mm:ss} </span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">[</span>
								<span style="COLOR: rgb(128,0,0)">%t:%r</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">]</span>
								<span style="COLOR: rgb(0,0,0)">-</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">[</span>
								<span style="COLOR: rgb(128,0,0)">%p</span>
								<span style="FONT-WEIGHT: bold; COLOR: rgb(128,0,0)">]</span>
								<span style="COLOR: rgb(0,0,0)"> %m%n</span>
						</font>
				</font>
		</div>
		<p>
				<br />
				<font face="Arial">
						<font size="2">
								<strong>[代码中使用]</strong>
								<br />
						</font>
				</font>
		</p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<font face="Arial">
						<font size="2">
								<img id="Codehighlighter1_23_240_Open_Image" style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_23_240_Open_Text.style.display='none'; Codehighlighter1_23_240_Closed_Image.style.display='inline'; Codehighlighter1_23_240_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_23_240_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_23_240_Closed_Text.style.display='none'; Codehighlighter1_23_240_Open_Image.style.display='inline'; Codehighlighter1_23_240_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
								<span style="COLOR: rgb(0,0,255)">public</span>
								<span style="COLOR: rgb(0,0,0)"> </span>
								<span style="COLOR: rgb(0,0,255)">class</span>
								<span style="COLOR: rgb(0,0,0)"> TestLog4j </span>
								<span id="Codehighlighter1_23_240_Closed_Text" style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
						</font>
				</font>
				<span id="Codehighlighter1_23_240_Open_Text" style="DISPLAY: inline">
						<font face="Arial">
								<font size="2">
										<span style="COLOR: rgb(0,0,0)">{<br /><img id="Codehighlighter1_65_238_Open_Image" style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_65_238_Open_Text.style.display='none'; Codehighlighter1_65_238_Closed_Image.style.display='inline'; Codehighlighter1_65_238_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_65_238_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_238_Closed_Text.style.display='none'; Codehighlighter1_65_238_Open_Image.style.display='inline'; Codehighlighter1_65_238_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
										<span style="COLOR: rgb(0,0,255)">public</span>
										<span style="COLOR: rgb(0,0,0)"> </span>
										<span style="COLOR: rgb(0,0,255)">static</span>
										<span style="COLOR: rgb(0,0,0)"> </span>
										<span style="COLOR: rgb(0,0,255)">void</span>
										<span style="COLOR: rgb(0,0,0)"> main(String[] args) </span>
										<span id="Codehighlighter1_65_238_Closed_Text" style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; DISPLAY: none; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">
												<img src="http://www.blogjava.net/images/dot.gif" />
										</span>
								</font>
						</font>
						<span id="Codehighlighter1_65_238_Open_Text" style="DISPLAY: inline">
								<font face="Arial">
										<font size="2">
												<span style="COLOR: rgb(0,0,0)">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        PropertyConfigurator.configure(</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
												<span style="COLOR: rgb(0,0,0)">D:/Code/conf/log4j.properties</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
										</font>
								</font>
								<font face="Arial">
										<font size="2">
												<span style="COLOR: rgb(0,0,0)">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Logger logger </span>
												<span style="COLOR: rgb(0,0,0)">=</span>
												<span style="COLOR: rgb(0,0,0)"> Logger.getLogger(TestLog4j.</span>
												<span style="COLOR: rgb(0,0,255)">class</span>
										</font>
								</font>
								<font face="Arial">
										<font size="2">
												<span style="COLOR: rgb(0,0,0)">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        logger.debug(</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
												<span style="COLOR: rgb(0,0,0)">debug</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
										</font>
								</font>
								<font face="Arial">
										<font size="2">
												<span style="COLOR: rgb(0,0,0)">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        logger.error(</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
												<span style="COLOR: rgb(0,0,0)">error</span>
												<span style="COLOR: rgb(0,0,0)">"</span>
										</font>
								</font>
								<span style="COLOR: rgb(0,0,0)">
										<font face="Arial" size="2">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</font>
								</span>
						</span>
						<span style="COLOR: rgb(0,0,0)">
								<br />
								<font face="Arial" size="2">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</font>
						</span>
				</span>
		</div>
		<p>
				<br />
				<font face="Arial" size="2">运行一下，看看异常信息是不是保存在了一个单独的文件error.log中。</font>
				<br />
				<br />
				<br />4、对不同的包设置不同输出信息级别<br />eg：<br />打印OppenSessionInViewFilter中debug级别信息方法：<br />log4j.logger.org.springframework.orm.hibernate3.support.OpenSessionInViewFilter=debug<br />打印Struts标签中warn级别信息的方法：<br />log4j.logger.org.apache.struts.util=WARN</p>
		<p>
				<br />原理：<br /> Suppose   we   are   no   longer   interested   in   seeing   the   output   of   any   component   belonging   to   the   com.foo   package.   The   following   configuration   file   shows   one   possible   way   of   achieving   this.     <br />    <br />  log4j.rootLogger=DEBUG,   A1   <br />  log4j.appender.A1=org.apache.log4j.ConsoleAppender   <br />  log4j.appender.A1.layout=org.apache.log4j.PatternLayout   <br />    <br />  #   Print   the   date   in   ISO   8601   format   <br />  log4j.appender.A1.layout.ConversionPattern=%d   [%t]   %-5p   %c   -   %m%n   <br />    <br />  #   Print   only   messages   of   level   WARN   or   above   in   the   package   com.foo.   <br />  log4j.logger.com.foo=WARN   </p>
<img src ="http://www.blogjava.net/renyangok/aggbug/95351.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2007-01-22 15:34 <a href="http://www.blogjava.net/renyangok/archive/2007/01/22/95351.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>appfuse学习笔记（不断更新）</title><link>http://www.blogjava.net/renyangok/archive/2006/12/18/88557.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Mon, 18 Dec 2006 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/18/88557.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/88557.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/18/88557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/88557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/88557.html</trackback:ping><description><![CDATA[一、<br />如何对Appfuse开发的系统进行性能优化： 
<ol><li>hibernate的优化。这步很关键。我把所有一对多的hbm文件里的lazy属性都设置成true，另外，hibernate的fecthsize设置成1。这样就系统的性能就好了不少。 
</li><li>设置jsp缓存。其实，appfuse本来就配置有oscache来缓存jsp的。但appfuse的作者觉得jsp缓存会影响jsp的调试，所以把oscache给禁止了。其实在生产环境里，用户是很少改动jsp的，所以应该打开jsp缓存。我们只需修改web.xml文件，把oscache的注释去掉就可以使用jsp缓存了。jsp缓存的效果非常好。 
</li><li>把clickstreamFilter去掉。clickstream是用来给管理员查看用户点击url的历史记录用的。如果不关心这个，完全可以把clickstreamFilter去掉。因为它捕获每次点击，并在内存里存储，还是有些影响性能的。</li></ol><p>二、<a id="viewpost1_TitleUrl" href="/liuwentao253/archive/2006/08/20/64602.html"><font color="#000080">spring 监听器　IntrospectorCleanupListener简介</font></a></p><p>spring中的提供了一个名为org.springframework.web.util.<font color="#0000ff"><strong>IntrospectorCleanupListener</strong></font>的监听器。它主要负责处理由　<br />JavaBeans  Introspector的使用而引起的<font color="#0000ff"><strong>缓冲泄露</strong></font>。spring中对它的描述如下：<br /> <br />它是一个在web应用关闭的时候,清除<font color="#0000ff"><strong>JavaBeans Introspector</strong></font>的监听器.在web.xml中注册这个listener.<u>可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它管理的类<br /></u> <br />如果你使用了JavaBeans Introspector来分析应用中的类，Introspector 缓冲中会保留这些类的引用.结果在你的应用关闭的时候,这些类以及web 应用相关的class loader没有被垃圾回收.<br /> <br />不幸的是,清除Introspector的唯一方式是刷新整个缓冲.这是因为我们没法判断哪些是属于你的应用的引用.所以删除被缓冲的introspection会导致把这台电脑上的所有应用的introspection都删掉.<br /> <br />需要注意的是,spring 托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javaBeans Introspector缓冲中清除掉.<br /> <br />应用程序中的类从来不直接使用JavaBeans Introspector.所以他们一般不会导致内部查看资源泄露.但是一些类库和框架往往会产生这个问题.例如:Struts 和Quartz.<br /> <br />单个的内部查看泄漏会导致整个的web应用的类加载器不能进行垃圾回收.在web应用关闭之后,你会看到此应用的所有静态类资源(例如单例).这个错误当然不是由这个类自身引起的.</p><p><br />这个listener的源代码 : </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" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> org.springframework.web.util;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.beans.Introspector;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.ServletContextEvent;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.ServletContextListener;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_234_393_Open_Image" onclick="this.style.display='none'; Codehighlighter1_234_393_Open_Text.style.display='none'; Codehighlighter1_234_393_Closed_Image.style.display='inline'; Codehighlighter1_234_393_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_234_393_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_234_393_Closed_Text.style.display='none'; Codehighlighter1_234_393_Open_Image.style.display='inline'; Codehighlighter1_234_393_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> IntrospectorCleanupListener </span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000"> ServletContextListener </span><span id="Codehighlighter1_234_393_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" /></span><span id="Codehighlighter1_234_393_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_295_298_Open_Image" onclick="this.style.display='none'; Codehighlighter1_295_298_Open_Text.style.display='none'; Codehighlighter1_295_298_Closed_Image.style.display='inline'; Codehighlighter1_295_298_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_295_298_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_295_298_Closed_Text.style.display='none'; Codehighlighter1_295_298_Open_Image.style.display='inline'; Codehighlighter1_295_298_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> contextInitialized(ServletContextEvent event) </span><span id="Codehighlighter1_295_298_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" /></span><span id="Codehighlighter1_295_298_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_358_391_Open_Image" onclick="this.style.display='none'; Codehighlighter1_358_391_Open_Text.style.display='none'; Codehighlighter1_358_391_Closed_Image.style.display='inline'; Codehighlighter1_358_391_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_358_391_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_358_391_Closed_Text.style.display='none'; Codehighlighter1_358_391_Open_Image.style.display='inline'; Codehighlighter1_358_391_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> contextDestroyed(ServletContextEvent event) </span><span id="Codehighlighter1_358_391_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" /></span><span id="Codehighlighter1_358_391_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Introspector.flushCaches();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><img src ="http://www.blogjava.net/renyangok/aggbug/88557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-18 15:22 <a href="http://www.blogjava.net/renyangok/archive/2006/12/18/88557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java世界的ruby on rails — rife </title><link>http://www.blogjava.net/renyangok/archive/2006/12/14/87615.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Thu, 14 Dec 2006 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/14/87615.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/87615.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/14/87615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/87615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/87615.html</trackback:ping><description><![CDATA[
		<font face="Verdana">（转自：<a href="http://www.itpub.net/605260.html">http://www.itpub.net/605260.html</a>）</font>
		<p>
				<font face="verdana, arial, helvetica" size="2">
						<span class="javascript" id="text5028253" style="FONT-SIZE: 12px">大家可以看看他的flash演示<a href="http://rifers.org/，下载example试用一下。给我的感觉是那么的似曾相识，就像我第一次看到ruby" target="_blank">http://rifers.org/，下载example试用...业谝淮慰吹絩uby</a> on rails网站上面的演示一样。<br /><br />rife简单来说就像rails一样，是一个包含了各层结构的、简化的开发框架，他包含了web层，IoC容器和持久层开发，等同于 Webwork/Spring/Hibernate的组合。不过rife的好处就是一个完整的框架，以统一的概念和操作方式来整合，并且对于domain model的运用和rails颇有异曲同工之妙。而rife的CRUD也类似于rails，异常简化了持久层开发。<br /><br />此外，rife自身还包含了很多实用功能，例如异步发送Email，定时执行任务，web services功能，甚至还包含了一个cms框架！<br /><br />rife从作者描述来看是2001年底开始开发的，此前用perl和PHP开发web项目，曾经自己有过一些框架，这些PHP的框架是rife的原型。rife到现在已经发展很多年了，最近我也是因为webwork2.2集成了rife的continuations子项目才知道rife的，目前 rife还不太知名，不论国内外，google出来的评论都寥寥无几。<br /><br />rife给我初感觉很惊艳，因为我自己也认为Webwork/Spring/Hibernate组合功能强大确实很强大，但是这么多框架内容太多，整个学习成本颇高，而且每个框架都有自己的哲学，概念并不完全一致，考虑到再整合sitemesh，freemarker等等小框架，这门槛也够高的了。<br /><br />rails能够这么引人关注，无非就是简化开发，这些特点我从rife身上也看到了。当然，限于Java语言特性，没有办法做到rails那么简化和灵活，但是已经比Webwork/Spring/Hibernate简化得太多了，和rails有得一比了，而且基于Java这种最成熟的语言，也是一大优势。<br /><br />先说说rife的优点：<br /><br />1、是一个full-stack的Java框架，所谓full-stack大概指的是集成所需要的所有功能的框架，例如rails也是一个full-stack的框架。因而其学习成本自然比Webwork/Spring/Hibernate要小得多。<br /><br />2、rife集成了常用的大部分功能，包括了一个组件方式的web框架，IoC支持和持久化框架，此外还有RSS支持，CMF支持，Web Service支持，异步邮件支持，Job schedule等等等等。<br /><br />3、他有一些扩展的子项目很有意思，例如continuations，CRUD，openlaszlo等等。CRUD框架类似于rails，不需要配置映射，运行期动态生成所有需要的CRUD，continuations就不用多说了，openlaszlo支持输出为laszlo。<br /><br />总体而言，rife是一个和rails相似度很高的框架。有意思的是，rife作者和rails作者还爆发过争吵，这个可以去search他们各自的blog。大意是这样的：<br /><br />rails作者David Heinemeier Hansson搞了一个在线todolist网站：<br /><a href="http://www.tatalist.com/" target="_blank">www.tatalist.com</a><br />号称只用了600行ruby代码，而rife作者Geert Bevin看了这个网站之后，发现一些很严重的bug，在指出之余，狠狠贬低了一把rails，于是遭到了Hansson的嘲讽和rails爱好者的攻击。<br /><br />Geert Bevin说写这么个简单的网站竟然用了600行代码，可以想像rails并不像它吹的那么好，于是rails爱好者说，你有本事也自己写一个啊，站着说话不腰疼。Geert Bevin就真的自己写了一个出来，这就是：<br /><a href="http://blablalist.com/" target="_blank">http://blablalist.com/</a><br />功能和tatlist完全一样。并且把所有代码开源出来，号称用了752行Java代码和100多行XML配置文件。<br /><br />Hansson看了代码之后，又在自己的blog上面狠狠贬低了一把Geert Bevin的代码和rife框架，最后说Java社区太不诚实了，骗子太多。<br /><br />针对rails网站的那个15分钟做出来一个simpleblog的视频，Geert Bevin也搞了一个40分钟做出来一个simpleblog的视频，录制的内容更加丰富，所以也比较长，总体来说，两者的开发过程很相似，也都很快捷，但限于语言特性，rife要略微繁复一些。<br /><br />再说说rife的缺点：<br /><br />实际上我只是简单的看了几个rife做出来的开源程序和quickstart，可能叙述未必客观。<br /><br />1、rife的持久层映射不是O/R Mapping，这是我认为最致命的缺陷。rife的映射方式是完全忠实映射table column的方式，没有对象层次图。这种方式在某些情况来说也许很好，降低难度，但是在O/R Mapping如此普及的今天，这样用法多少有点落伍，也让用惯了O/R Mapping的开发人员无法接受。<br /><br />2、rife的view模板用这样的HTML注释标记来嵌入服务器端逻辑，大量运用这种的HTML注释标记显得非常烦琐，既没有freemarker这样的${}方便，也没有JSP Tag方便。<br /><br />3、rife虽然有IoC功能，也可以连接Spring，但是显然不那么重视DI这种编程习惯。在作者自己写的bamboo forum里面处处看得到类似程序自己去创建依赖对象的代码，让用惯了IoC的开发人员感觉很不好。<br /><br />总之，rife确确实实提供了一条快速开发的方式，学习成本也显然比Webwork/Spring/Hibernate要低。不过对于Webwork/Spring/Hibernate掌握非常熟练的开发人员例如我来说，似乎改用rife也不会提供更高的开发效率。<br /><br />顺便提一句ruby on rails，我觉得大家有些过于被表象吸引。实际上对于逻辑关系比较复杂的项目来说，如果自己对Webwork/Spring/Hibernate掌握熟练，又积累了些加速开发的工具类和模板，其开发速度并不会比rails低。</span>
				</font>
		</p>
<img src ="http://www.blogjava.net/renyangok/aggbug/87615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-14 09:22 <a href="http://www.blogjava.net/renyangok/archive/2006/12/14/87615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用sitemesh建立复合视图</title><link>http://www.blogjava.net/renyangok/archive/2006/12/13/87402.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Wed, 13 Dec 2006 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/13/87402.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/87402.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/13/87402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/87402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/87402.html</trackback:ping><description><![CDATA[
		<a href="http://www.huihoo.com/java/sitemesh/index.html">http://www.huihoo.com/java/sitemesh/index.html</a>
<img src ="http://www.blogjava.net/renyangok/aggbug/87402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-13 10:28 <a href="http://www.blogjava.net/renyangok/archive/2006/12/13/87402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>appfuse中的UrlRewrite </title><link>http://www.blogjava.net/renyangok/archive/2006/12/13/87386.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Wed, 13 Dec 2006 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/13/87386.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/87386.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/13/87386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/87386.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/87386.html</trackback:ping><description><![CDATA[（转自：<a href="/liuwentao253/archive/2006/08/31/66855.html">http://www.blogjava.net/liuwentao253/archive/2006/08/31/66855.html</a>）<br />appfuse中使用了UrlRewrite.实现了url的重写，这样有什么用处呢？上网搜了一把，大体上有以下好处：<br /><br />1、满足搜索引擎的要求 <br />某些搜索引擎不能支持动态页面的抓取，大量的信息就不能被潜在用户搜索到。用UrlRewrite技术你可以把 <a href="http://server/news.asp?id=111">http://server/news.asp?id=111</a> 变成 <a href="http://server/news/111.htm">http://server/news/111.htm</a> 这样他们就会被搜索引擎收录了。google虽然可以抓取动态页面，但是google对动态页面的评分一般低于静态页面。所以，对大量信息发布的网站，把网站地址改变成静态的绝对是值得的。<br /> <br />2、隐藏技术实现，提高网站的移植性 <br />每个页面都挂着鲜明的.asp/.jsp这种开发语言的标记，可以一眼让人看出你的网站使用什么语言做的。而且在改变网站的语言的时候，你需要改动大量的链接。而且，一个页面修改了扩展名，他的pagerank也会随之消失，从头开始。我们可以用UrlRewrite技术隐藏我们的实现细节，这样修改移植都很方便，而且完全不损失pagerank。 <br /><br />3、满足美感的要求 <br />对于追求完美主义的网站设计师，即使是网页的地址也要看起来简洁明快。形如 <a href="http://server/news.asp?channel=3&amp;id=111">http://server/news.asp?channel=3&amp;id=111</a> 的网页地址，肯定是上不了完美主义者的法眼的，用UrlRewrite技术，你可以把他变成 <a href="http://server/news/3/111.htm">http://server/news/3/111.htm</a> 。 <br />在应用中怎样集成它呢？看看appfuse中的实现方式。<br /><p>在appfuse的web.xml声明文件中有下面的类似声明：</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" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">rewriteFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">logLevel</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">commons</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">init</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">param</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span></div><br /><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" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">rewriteFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_87_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_87_121_Open_Text.style.display='none'; Codehighlighter1_87_121_Closed_Image.style.display='inline'; Codehighlighter1_87_121_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_87_121_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_87_121_Closed_Text.style.display='none'; Codehighlighter1_87_121_Open_Image.style.display='inline'; Codehighlighter1_87_121_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">&gt;</span><span id="Codehighlighter1_87_121_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">/**/</span><span id="Codehighlighter1_87_121_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&lt;/url-pattern&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&lt;/filter-mapping&gt;</span></span></div><p><br />它所应用到的包存放在lib下的</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" /><span style="COLOR: #000000">urlrewrite</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">3.0</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">beta.jar</span></div><p>它和以上的两部分，以及</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" /><span style="COLOR: #000000">/</span><span style="COLOR: #000000">web</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">inf</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">urlrewrite.xml</span></div><p>构成了对url地址的美化</p><p>打开这个文件，我们可以看到以下的声明：</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" /><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">xml version</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> encoding</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">utf-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;!</span><span style="COLOR: #000000">DOCTYPE urlrewrite PUBLIC </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-//tuckey.org//DTD UrlRewrite 3.0//EN</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://tuckey.org/res/dtds/urlrewrite3.0.dtd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> https:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">urlrewrite.dev.java.net/manual/3.0 --&gt;</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">urlrewrite</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">rule</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">from</span><span style="COLOR: #000000">&gt;^/</span><span style="COLOR: #000000">user</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">).html$</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">from</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">to type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">forward</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;/</span><span style="COLOR: #000000">editUser.html\</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">username</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">$</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">to</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">rule</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">urlrewrite</span><span style="COLOR: #000000">&gt;</span></div><p><br />这样系统就完成了url地址的editUser.html?username=****的美化</p><p>如将 <br /><a href="http://localhost/aaa/bbb.jsp?id=99&amp;name=abc"><font color="#000080">http://localhost/aaa/bbb.jsp?id=99&amp;name=abc</font></a><br />表现为： <br /><a href="http://localhost/aaa/bbb/99_abc.html"><font color="#000080">http://localhost/aaa/bbb/99_abc.html</font></a><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" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">rule</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">from</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">aaa</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">bbb</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">([</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">)_([a</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">z]</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">).html<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">from</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">to</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">..</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">aaa</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">bbb.jsp</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">$</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">$</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">to</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">rule</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> </span></div><p> </p><img src ="http://www.blogjava.net/renyangok/aggbug/87386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-13 09:48 <a href="http://www.blogjava.net/renyangok/archive/2006/12/13/87386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>appfuse1.6使用手册（1-6）</title><link>http://www.blogjava.net/renyangok/archive/2006/12/07/86119.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Thu, 07 Dec 2006 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/07/86119.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/86119.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/07/86119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/86119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/86119.html</trackback:ping><description><![CDATA[转载<a href="http://www.cnblogs.com/maxpain/archive/2004/11/11/62623.html">http://www.cnblogs.com/maxpain/archive/2004/11/11/62623.html</a><img src ="http://www.blogjava.net/renyangok/aggbug/86119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-07 16:33 <a href="http://www.blogjava.net/renyangok/archive/2006/12/07/86119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AppFuse: Start Your J2EE Web Apps （中英文对照）</title><link>http://www.blogjava.net/renyangok/archive/2006/12/06/85740.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Wed, 06 Dec 2006 00:50:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/06/85740.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/85740.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/06/85740.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/85740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/85740.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1  AppFuse: 														开始你的														J2EE web														应用																																																by Matt Raible07/15/2004														...&nbsp;&nbsp;<a href='http://www.blogjava.net/renyangok/archive/2006/12/06/85740.html'>阅读全文</a><img src ="http://www.blogjava.net/renyangok/aggbug/85740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-06 08:50 <a href="http://www.blogjava.net/renyangok/archive/2006/12/06/85740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一步步配置ant</title><link>http://www.blogjava.net/renyangok/archive/2006/12/01/84847.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 01 Dec 2006 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/01/84847.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/84847.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/01/84847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/84847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/84847.html</trackback:ping><description><![CDATA[
		<p> Appfuse应用的核心在于ant build任务的灵活应用和xdoclet模板的修改与使用。重要的工具是其提供的appgen，通过对ant build任务和appgen xdocet模板的修改将appfuse与自己的项目进行融合、与IDE进行融合。所以要用appfuse，学习ant工具和xdoclet是必不可少的第一步。<br />前提所需的软件<br />jdk1.4.2.6<br />tomcat5.0.28<br />ant1.6.2<br />appfuse1.82<br />mysql4.x</p>
		<p>以上软件请访问<br /><a href="http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseQuickStart_zh"><font color="#355ea0">http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseQuickStart_zh</font></a><br />根据相关提示下载<br />同时对以上变量，都设置相关的HOME变量及路径。</p>
		<p>下面开始一步步操作完成appfuse的布署工作</p>
		<p>1，解压appfuse1.8.2（或更高版本），会产生一个appfuse的目录。<br />2，打开eclipse3.0或eclipse3.1，选择菜单，“新建工程”--&gt;"Java Project"----&gt;工程名"appfuse"后，指定一个工程目录后，完成。<br />3，先复制第一步中appfuse目录下所有文件，然后右键点击"appfuse"工程名，选择“粘贴”，把appfuse的所有的文件导入到appfuse工程中。<br />4，在eclipse下选择"windows"菜单---&gt;"Preference"菜单---&gt;"ant"---&gt;"Runtime"----&gt;点“ant      home”按钮,设备ant-home目录，同时复制junit.jar到ant安装目录下的lib目录里<br />5,在安装mysql服务器后，如果设置了密码的话，要点，windows菜单---&gt;show views---&gt; ant 。出现ant工具界面，在界面上，点add buildfiles图标，把appfuse工程根目录下的build.xml文件中附加进来，然后再打开properties.xml文件，修改里面的root用户的密码为你的mysql数据库访问时的密码。然后在ant菜单界面中展开target列表，选择，setup目录安装所有装备工作，<br />详细ant任务可以参照<a href="http://www.kingbit.com/appfuse/index.php"><font color="#355ea0">http://www.kingbit.com/appfuse/index.php</font></a>上所描述的ant任务详解。<br />运行ant setup-tomcat 然后再运行，ant start-tomcat<br />然后在浏览器中打<a href="http://localhost:8080/appfuse"><font color="#355ea0">http://localhost:8080/appfuse</font></a><br />看看有没有出现界面<br />操作用户名及密码是tomcat tomcat<br />6,当上面都配置正确后，我们就来开始写一个新的操作了，先写个dao类下的model类<br />在eclipse下，展开src/dao文档结构，在org.appfuse.model下面，建个Person.java文件，<br />内容如下图：</p>
		<p>/*<br /> * Created on 2006-5-22<br /> *<br /> * TODO To change the template for this generated file go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> */<br />package org.appfuse.model;</p>
		<p>/**<br /> * @author Administrator<br /> *<br /> * TODO To change the template for this generated type comment go to<br /> * Window - Preferences - Java - Code Style - Code Templates<br /> * @hibernate.class table="person"<br /> */<br />public class Person  extends BaseObject{<br /> private Long id;<br /> private String first_name;<br /> <br /> /**<br />  * @return Returns the id.<br />  * @hibernate.id column="id"  generator-class="increment"<br />     *               <br />  */<br /> public Long getId() {<br />  return id;<br /> }<br /> /**<br />  * @param id The id to set.<br />  */<br /> public void setId(Long id) {<br />  this.id = id;<br /> }<br /> /* (non-Javadoc)<br />  * @see org.appfuse.model.BaseObject#toString()<br />  */<br /> <br /> public String toString() {<br />  // TODO Auto-generated method stub<br />  return null;<br /> }<br /> /* (non-Javadoc)<br />  * @see org.appfuse.model.BaseObject#equals(java.lang.Object)<br />  */<br /> public boolean equals(Object o) {<br />  // TODO Auto-generated method stub<br />  return false;<br /> }<br /> /* (non-Javadoc)<br />  * @see org.appfuse.model.BaseObject#hashCode()<br />  */<br /> public int hashCode() {<br />  // TODO Auto-generated method stub<br />  return 0;<br /> }<br /> <br /> /**<br />  * @return Returns the first_name.<br />  * @hibernate.property column="first_name" not-null="true"<br />  */<br /> public String getFirst_name() {<br />  return first_name;<br /> }<br /> /**<br />  * @param first_name The first_name to set.<br />  * @spring.validator type="required" //该字段需要验证，用Spring的校验机制<br />  */<br /> public void setFirst_name(String first_name) {<br />  this.first_name = first_name;<br /> }<br />}</p>
		<p>
				<br />在以上代码中注释javadoc区域中添加上xdoclet在生成hibernate所用到的XML文件的一些O/R映射信息。</p>
		<p>建好上以Person.java后，我们就开始利用xdoclet工具，配合ant任务，生成我们所需用到了数据库表结构了，<br />点ant db-create 后，可以在控制台下看到一系列建表的语句，同时可以到mysql控制台查看到相关信息.<br />表建好后，我们就开始利用appgen自动生成appfuse所需要的其它dao操作类，manage业务类，controller控制器类及Person.hbm.xml等相关文件<br />。操作过程如下，到dos命令行模式下，找到工程所在的根目录下\extras\appgen目录，点运行ant install-detailed<br />会根据提示，建Person及person相关文件。Build成功后，再回到eclipse下，右键点工程文件名appfuse,选择Refresh ,再运行ant deploy命令，再重新启TOMCAT,这样一个Person的添加，删除操作功能模块就完成了，开发就是这么easy and fast!!^_^<br />@spring.validator type="required" 是另外附</p>
		<p>appgen生成的类文件如下：</p>
		<p>PersonDAO接口类<br />PersonDAOHibernate接口实现类<br />PersonManager业务接口类<br />PersonManagerImpl.java业务接口实现类<br />PersonController.java控制器类(根据客户端提交的请求，显示的是信息列表)<br />PersonFormController页面控制器类（根据客户端提交的请求，修改，添加，删除操作控制类）</p>
		<p>
				<br />注意在生成dao接口类的时候，appgen会根据Person类中的hibernate的注释标记，生成对应的Person.hbm.xml文件<br />修改org.appfuse.dao.hibernate.applicationContext-hibernate.xml文件，<br />追加<br /> &lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />        &lt;property name="dataSource" ref="dataSource"/&gt;<br />        &lt;property name="mappingResources"&gt;<br />            &lt;list&gt;<br />                &lt;value&gt;org/appfuse/model/Role.hbm.xml&lt;/value&gt;<br />                &lt;value&gt;org/appfuse/model/User.hbm.xml&lt;/value&gt;<br />                &lt;value&gt;org/appfuse/model/UserCookie.hbm.xml&lt;/value&gt;<br />                &lt;value&gt;org/appfuse/model/Person.hbm.xml&lt;/value&gt;<br />  &lt;value&gt;org/appfuse/model/Book.hbm.xml&lt;/value&gt;    <br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />        &lt;!-- The property below is commented out b/c it doesn't work when run via<br />             Ant in Eclipse.  It works fine for individual JUnit tests and in IDEA ??<br />        &lt;property name="mappingJarLocations"&gt;<br />            &lt;list&gt;&lt;value&gt;file:dist/appfuse-dao.jar&lt;/value&gt;&lt;/list&gt;<br />        &lt;/property&gt;<br />        --&gt;<br />        &lt;property name="hibernateProperties"&gt;<br />        &lt;props&gt;<br />            &lt;prop key="hibernate.dialect"&gt;@HIBERNATE-DIALECT@&lt;/prop&gt;<br />            &lt;!-- Create/update the database tables automatically when the JVM starts up<br />            &lt;prop key="hibernate.hbm2ddl.auto"&gt;update&lt;/prop&gt; --&gt;<br />            &lt;!-- Turn batching off for better error messages under PostgreSQL <br />            &lt;prop key="hibernate.jdbc.batch_size"&gt;0&lt;/prop&gt; --&gt;<br />        &lt;/props&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    同时指定动态指定接口的实现类<br />&lt;!--Person-START--&gt;<br />    &lt;bean id="personDAO" class="org.appfuse.dao.hibernate.PersonDAOHibernate" autowire="byName"/&gt;<br />    &lt;!--Person-END--&gt;<br />注意在业务接口类操作时，要运用SPRING的IOC进行对业务逻辑的处理，<br />修改org.appfuse.service目录下的，applicationContext-service.xml文件</p>
		<p>追加以下配置</p>
		<p>&lt;!--Person-START--&gt;<br />    &lt;bean id="personManager" parent="txProxyTemplate"&gt;<br />        &lt;property name="target"&gt;<br />            &lt;bean class="org.appfuse.service.impl.PersonManagerImpl" autowire="byName"/&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;<br />    &lt;!--Person-END--&gt;<br />在personManagerImpl.java文件中装PersonDao接口的Instance注入到personManager容器中。</p>
		<p> </p>
		<p>PersonDAO接口类</p>
		<p>
				<br />package org.appfuse.dao;</p>
		<p>import java.util.List;</p>
		<p>import org.appfuse.model.Person;</p>
		<p>public interface PersonDAO extends DAO {</p>
		<p>    /**<br />     * Retrieves all of the persons<br />     */<br />    public List getPersons(Person person);</p>
		<p>    /**<br />     * Gets person's information based on primary key. An<br />     * ObjectRetrievalFailureException Runtime Exception is thrown if <br />     * nothing is found.<br />     * <br />     * @param id the person's id<br />     * @return person populated person object<br />     */<br />    public Person getPerson(final Long id);</p>
		<p>    /**<br />     * Saves a person's information<br />     * @param person the object to be saved<br />     */ <br />    public void savePerson(Person person);</p>
		<p> /**<br />     * Removes a person from the database by id<br />     * @param id the person's id<br />     */<br />    public void removePerson(final Long id);<br />}</p>
		<p>PersonDAOHibernate接口实现类</p>
		<p>
				<br />package org.appfuse.dao.hibernate;</p>
		<p>import java.util.List;</p>
		<p>import org.appfuse.model.Person;<br />import org.appfuse.dao.PersonDAO;</p>
		<p>import org.springframework.orm.ObjectRetrievalFailureException;</p>
		<p>public class PersonDAOHibernate extends BaseDAOHibernate implements PersonDAO {</p>
		<p>    /**<br />     * @see org.appfuse.dao.PersonDAO#getPersons(org.appfuse.model.Person)<br />     */<br />    public List getPersons(final Person person) {<br />        return getHibernateTemplate().find("from Person");</p>
		<p>        /* Remove the line above and uncomment this code block if you want <br />           to use Hibernate's Query by Example API.<br />        if (person == null) {<br />            return getHibernateTemplate().find("from Person");<br />        } else {<br />            // filter on properties set in the person<br />            HibernateCallback callback = new HibernateCallback() {<br />                public Object doInHibernate(Session session) throws HibernateException {<br />                    Example ex = Example.create(person).ignoreCase().enableLike(MatchMode.ANYWHERE);<br />                    return session.createCriteria(Person.class).add(ex).list();<br />                }<br />            };<br />            return (List) getHibernateTemplate().execute(callback);<br />        }*/<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.dao.PersonDAO#getPerson(Long id)<br />     */<br />    public Person getPerson(final Long id) {<br />        Person person = (Person) getHibernateTemplate().get(Person.class, id);<br />        if (person == null) {<br />            log.warn("uh oh, person with id '" + id + "' not found...");<br />            throw new ObjectRetrievalFailureException(Person.class, id);<br />        }</p>
		<p>        return person;<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.dao.PersonDAO#savePerson(Person person)<br />     */    <br />    public void savePerson(final Person person) {<br />        getHibernateTemplate().saveOrUpdate(person);<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.dao.PersonDAO#removePerson(Long id)<br />     */<br />    public void removePerson(final Long id) {<br />        getHibernateTemplate().delete(getPerson(id));<br />    }<br />}</p>
		<p> </p>
		<p>
				<br />PersonManager业务接口类</p>
		<p>package org.appfuse.service;</p>
		<p>import java.util.List;</p>
		<p>import org.appfuse.model.Person;<br />import org.appfuse.dao.PersonDAO;</p>
		<p>public interface PersonManager extends Manager {</p>
		<p>    /**<br />     * Setter for DAO, convenient for unit testing<br />     */<br />    public void setPersonDAO(PersonDAO personDAO);</p>
		<p>    /**<br />     * Retrieves all of the persons<br />     */<br />    public List getPersons(Person person);</p>
		<p>    /**<br />     * Gets person's information based on id.<br />     * @param id the person's id<br />     * @return person populated person object<br />     */<br />    public Person getPerson(final String id);</p>
		<p>    /**<br />     * Saves a person's information<br />     * @param person the object to be saved<br />     */<br />    public void savePerson(Person person);</p>
		<p>    /**<br />     * Removes a person from the database by id<br />     * @param id the person's id<br />     */<br />    public void removePerson(final String id);<br />}</p>
		<p>
				<br />PersonManagerImpl业务接口实现类</p>
		<p>package org.appfuse.service.impl;</p>
		<p>import java.util.List;</p>
		<p>import org.appfuse.model.Person;<br />import org.appfuse.dao.PersonDAO;<br />import org.appfuse.service.PersonManager;</p>
		<p>public class PersonManagerImpl extends BaseManager implements PersonManager {<br />    private PersonDAO dao;</p>
		<p>    /**<br />     * Set the DAO for communication with the data layer.<br />     * @param dao<br />     */<br />    public void setPersonDAO(PersonDAO dao) {<br />        this.dao = dao;<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.service.PersonManager#getPersons(org.appfuse.model.Person)<br />     */<br />    public List getPersons(final Person person) {<br />        return dao.getPersons(person);<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.service.PersonManager#getPerson(String id)<br />     */<br />    public Person getPerson(final String id) {<br />        return dao.getPerson(new Long(id));<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.service.PersonManager#savePerson(Person person)<br />     */<br />    public void savePerson(Person person) {<br />        dao.savePerson(person);<br />    }</p>
		<p>    /**<br />     * @see org.appfuse.service.PersonManager#removePerson(String id)<br />     */<br />    public void removePerson(final String id) {<br />        dao.removePerson(new Long(id));<br />    }<br />}</p>
		<p>
				<br />PersonController控制器类<br />注意在产生这个控制器类的作用是为了将PersonManager接口通过IOC注入并Instance<br />能够调用dao类取得的数据结果集返回给客户浏览器的请求。请求的mappingUrl地址又是在WEB/WEB-INF目录下action-servlet.xml<br />文件下进行配置的<br />&lt;!--Person-BEAN-START--&gt;<br />  &lt;bean id="personController" class="org.appfuse.webapp.action.PersonController" autowire="byName"/&gt;</p>
		<p>    &lt;bean id="personFormController" class="org.appfuse.webapp.action.PersonFormController" autowire="byName"&gt;<br />        &lt;property name="commandName" value="person"/&gt;<br />        &lt;property name="commandClass" value="org.appfuse.model.Person"/&gt;<br />        &lt;property name="validator" ref="beanValidator"/&gt;<br />        &lt;property name="formView" value="personForm"/&gt;<br />        &lt;property name="successView" value="redirect:persons.html"/&gt;<br />    &lt;/bean&gt;<br />    &lt;!--Person-BEAN-END--&gt;</p>
		<p>    &lt;!--Person-URL-START--&gt;<br />                &lt;prop key="/persons.html"&gt;personController&lt;/prop&gt;<br />                &lt;prop key="/editPerson.html"&gt;personFormController&lt;/prop&gt;<br />                &lt;!--Person-URL-END--&gt;<br />package org.appfuse.webapp.action;</p>
		<p>import java.util.List;</p>
		<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
		<p>import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br />import org.apache.commons.beanutils.BeanUtils;</p>
		<p>import org.appfuse.Constants;<br />import org.appfuse.model.Person;<br />import org.appfuse.service.PersonManager;</p>
		<p>import org.springframework.web.servlet.ModelAndView;<br />import org.springframework.web.servlet.mvc.Controller;</p>
		<p>public class PersonController implements Controller {<br />    private final Log log = LogFactory.getLog(PersonController.class);<br />    private PersonManager personManager = null;</p>
		<p>    public void setPersonManager(PersonManager personManager) {<br />        this.personManager = personManager;<br />    }</p>
		<p>    public ModelAndView handleRequest(HttpServletRequest request,<br />                                      HttpServletResponse response)<br />    throws Exception {<br />        if (log.isDebugEnabled()) {<br />            log.debug("entering 'handleRequest' method...");<br />        }</p>
		<p>        Person person = new Person();<br />        // populate object with request parameters<br />        BeanUtils.populate(person, request.getParameterMap());</p>
		<p>        List persons = personManager.getPersons(person);</p>
		<p>        return new ModelAndView("personList", Constants.PERSON_LIST, persons);<br />    }<br />}</p>
		<p>
				<br />PersonFormController添加修改删除操作控制器类。</p>
		<p>package org.appfuse.webapp.action;</p>
		<p>import java.util.Locale;</p>
		<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;</p>
		<p>import org.apache.commons.lang.StringUtils;<br />import org.appfuse.model.Person;<br />import org.appfuse.service.PersonManager;<br />import org.springframework.validation.BindException;<br />import org.springframework.web.servlet.ModelAndView;</p>
		<p>public class PersonFormController extends BaseFormController {<br />    private PersonManager personManager = null;</p>
		<p>    public void setPersonManager(PersonManager personManager) {<br />        this.personManager = personManager;<br />    }</p>
		<p>    protected Object formBackingObject(HttpServletRequest request)<br />    throws Exception {<br />        String id = request.getParameter("id");<br />        Person person = null;</p>
		<p>        if (!StringUtils.isEmpty(id)) {<br />            person = personManager.getPerson(id);<br />        } else {<br />            person = new Person();<br />        }</p>
		<p>        return person;<br />    }</p>
		<p>    public ModelAndView onSubmit(HttpServletRequest request,<br />                                 HttpServletResponse response, Object command,<br />                                 BindException errors)<br />    throws Exception {<br />        if (log.isDebugEnabled()) {<br />            log.debug("entering 'onSubmit' method...");<br />        }</p>
		<p>        Person person = (Person) command;<br />        boolean isNew = (person.getId() == null);<br />        Locale locale = request.getLocale();</p>
		<p>        if (request.getParameter("delete") != null) {<br />            personManager.removePerson(person.getId().toString());</p>
		<p>            saveMessage(request, getText("person.deleted", locale));<br />        } else {<br />            personManager.savePerson(person);</p>
		<p>            String key = (isNew) ? "person.added" : "person.updated";<br />            saveMessage(request, getText(key, locale));</p>
		<p>            if (!isNew) {<br />             return new ModelAndView("redirect:editPerson.html", "id", person.getId());<br />            }<br />        }</p>
		<p>        return new ModelAndView(getSuccessView());<br />    }<br />}</p>
		<p>
				<br />在布署公司的产品过程中，mine的WAR应用，在执行ant compile-dao过程中，会报一个，找不到org.eclipse.jta的错误，<br />这是由于ant找不到eclipse的关于jta的插件的原因！解决办法是，在ant架包中，把eclipse 安装目录下的plugns目录下的org.eclipse.jdt.core_3.0.<br />（E:\eclipse\plugins\org.eclipse.jdt.core_3.0.0\）目录中两个jar文件加入到ant的lib目录下！</p>
		<p>xdoclet在执行ant的deploy的任务时，有时候生成的XML文件格式会出现小小的问题，解决的办法是修改相关的JAVA文件，然后运行deploy脚本重新利用<br />xdoclet来生成相关的xml文件！直至成功！</p>
		<p>首页登录在调用loginServlet时候，login.jsp页面能正确显示出来，但是提交到服务器的/authorize的action映射找不到，也就是找不到服务，<br />这是由于tomcat是启动在8080端口的服务，而程序中，用户登录的校验是根据properties.xml文件中，配置的<br />&lt;property name="http.port" value="8080"/&gt;这个端口号，默认的是80端口，可以通过把TOMCAT启动时监听80端口或，修改properties.xml文件中<br />http.port的value="8080",就可以找到服务器响应。注意，这里/authorize的映射,不是通过spring的IOC操作的，而是通过在web.xml文件中加入一个<br /> &lt;filter&gt;<br />  &lt;filter-name&gt;securityFilter&lt;/filter-name&gt; <br />  &lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />- &lt;init-param&gt;<br />  &lt;param-name&gt;targetClass&lt;/param-name&gt; <br />  &lt;param-value&gt;net.sf.acegisecurity.util.FilterChainProxy&lt;/param-value&gt; <br />  &lt;/init-param&gt;<br />  &lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />  &lt;filter-name&gt;securityFilter&lt;/filter-name&gt; <br />  &lt;url-pattern&gt;/j_security_check&lt;/url-pattern&gt; <br />  &lt;/filter-mapping&gt;</p>
		<p>来实现的</p>
		<p>但是一定要记得，文件net.sf.acegisecurity.util.FilterChainProxy是在acegi-security-x.x.x.jar包里面的，调用前一定要记得放在应用的WEB-INF/lib/目录下才能正常使用。</p>
		<p>当系统启动时会自动加载spring配置文件中所声明的类，在appfuse中这一声明是放在action-servlet.xml中的，因此必须将这个文件同其他的applicationContext.xml一起在web.xml中声明为contextConfigLocation的内容，如下：</p>
		<p>   &lt;context-param&gt;<br />  &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; <br />  &lt;param-value&gt;classpath*:META-INF/applicationContext-*.xml /WEB-INF/applicationContext-*.xml /WEB-INF/schedulingContext-timer.xml&lt;/param-value&gt; <br />  &lt;/context-param&gt;</p>
		<p> </p>
		<p>在action-servlet.xml中定义如下（这个文件必须符合spring-beans.dtd的规范）：</p>
		<p>&lt;beans&gt;    <br />    <br />    &lt;bean id="userAction" class="com.mywap.webwork.action.UserAction" singleton="false"&gt;<br />        &lt;property name="userManager"&gt;&lt;ref bean="userManager"/&gt;&lt;/property&gt;<br />    &lt;/bean&gt;<br />    <br />    &lt;!-- Add additional actions here --&gt;<br />&lt;/beans&gt;</p>
		<p> </p>
		<p>
				<br />acegi出了0.8,改动还真不少，原先0.7的应用，改了一个多小时才完全升级成功。备忘一下：</p>
		<p>1 最贴心的改变莫过于 filter chains可以放在spring 容器中加载了，再也不用在Web.XML中声明长长的一串filter了。例如：</p>
		<p> &lt;bean id="filterChainProxy" class="net.sf.aceGISecurity.util.FilterChainProxy"&gt;<br />      &lt;property name="filterInvocationDefinitionSource"&gt;<br />         &lt;value&gt;<br />         CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />          PATTERN_TYPE_APACHE_ANT<br />            /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,......<br />         &lt;/value&gt;<br />      &lt;/property&gt;<br />    &lt;/bean&gt;</p>
		<p>2 HttpSessionIntegrationFilter 已经消失，使用net.sf.acegisecurity.context.HttpSessionContextIntegrationFilter取而代之，如：<br />    &lt;bean id="httpSessionContextIntegrationFilter" class="net.sf.acegisecurity.context.HttpSessionContextIntegrationFilter"&gt;<br />      &lt;property name="context"&gt;&lt;value&gt;net.sf.acegisecurity.context.security.SecureContextImpl&lt;/value&gt;&lt;/property&gt;<br />    &lt;/bean&gt;</p>
		<p>这个"context"属性不可不设哟。</p>
		<p>3 新增了一个功能，可以在web.xml中声明一个HttpSessionEventPublisher context listener,想想Spring的现在还不很成熟的消息发布机制(AOP),主要是用来记日志。我暂时还没用到这个功能。</p>
		<p> </p>
		<p>mine在通过ant deploy任务到TOMCAT下,会把hibernate的表映射文件,连同持久化的类文件,打包成一个,mine-dao.jar架包,放到web-inf/lib私有目录下<br /></p>
<img src ="http://www.blogjava.net/renyangok/aggbug/84847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-01 15:03 <a href="http://www.blogjava.net/renyangok/archive/2006/12/01/84847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从appfuse新建项目过程</title><link>http://www.blogjava.net/renyangok/archive/2006/12/01/84842.html</link><dc:creator>保尔任</dc:creator><author>保尔任</author><pubDate>Fri, 01 Dec 2006 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/renyangok/archive/2006/12/01/84842.html</guid><wfw:comment>http://www.blogjava.net/renyangok/comments/84842.html</wfw:comment><comments>http://www.blogjava.net/renyangok/archive/2006/12/01/84842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/renyangok/comments/commentRss/84842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/renyangok/services/trackbacks/84842.html</trackback:ping><description><![CDATA[
		<div>
				<a href="http://album.sina.com.cn/pic/496638e0020006cj" target="_blank">
				</a>准备:</div>
		<div>1.下载并安装AppFuse 1.91, Ant 1.6.2, Tomcat 5.0.28 和 MySQL 4.1.11</div>
		<div>2.设置以下环境变量:ANT_HOME,CATALINA_HOME,JAVA_HOME,</div>
		<div>3.把文件 lib/junit3.8.1/junit.jar 拷贝到 $ANT_HOME/lib目录下</div>
		<div> </div>
		<div>把下载的Appfuse的ZIP包解压缩到磁盘上(如:H:\appfuse)</div>
		<div> </div>
		<div>到控制台按次序执行以下命令:</div>
		<div> </div>
		<div>h:\appfuse&gt;ant</div>
		<div> </div>
		<div>
				<div>h:\appfuse&gt;ant new</div>
				<div>
						<a href="http://album.sina.com.cn/pic/496638e0020006cj" target="_blank">
								<img src="http://album.sina.com.cn/pic/496638e0020006cj" border="0" />
						</a>
				</div>
				<div> </div>
				<div>注意自己可以输入要生成项目的名称,数据库名称,包名称,选择要用的VIEW框架</div>
				<div> </div>
				<div>h:\testApp&gt;ant setup-db</div>
				<div> </div>
				<div>h:\testApp&gt;ant</div>
				<div> </div>
				<div>testApp下会生成一个dist目录,把里边的WAR文件复制到TOMCAT中就可以RUN了.</div>
		</div>
<img src ="http://www.blogjava.net/renyangok/aggbug/84842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/renyangok/" target="_blank">保尔任</a> 2006-12-01 14:56 <a href="http://www.blogjava.net/renyangok/archive/2006/12/01/84842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>