<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/xsl/rss.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:ppp="http://blog.sohu.com/rss/module/ppp/"
	>

	<channel>
		<title>堕落天堂</title>
		<link>http://pigheadss.blog.sohu.com/</link>
		<description><![CDATA[天堂是多少人的向往,可惜那儿会让人堕落!]]></description>
		<pubDate>Thu, 20 Mar 2008 16:07:22 +0800</pubDate>
		<generator>搜狐博客</generator>
		<ppp:ebi>0e5b65a792</ppp:ebi>
		<image>
			<title>http://blog.sohu.com</title>
			<url>http://js.pp.sohu.com/ppp/blog/images/common/logo_150_60.gif</url>
			<link>http://blog.sohu.com/</link>
			<width>100</width>
			<height>43</height>
			<description>搜狐博客</description>
		</image>
		<item>
			<title>龙洞的任务</title>
			<link>http://pigheadss.blog.sohu.com/82318802.html</link>
			<comments>http://pigheadss.blog.sohu.com/82318802.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Thu, 20 Mar 2008 16:07:22 +0800</pubDate>
			<category>我的游戏</category>
			<guid>http://pigheadss.blog.sohu.com/82318802.html</guid>
			<description><![CDATA[龙洞的任务 <br /><br />　　龙洞的任务（东431 南743）首先在一楼拿到龙笛之后（龙笛要lv40才能装备）到四、五、六楼便可能遇上以下三种龙： <br /><br /><br />　　4F疾速之龙－lv47（敏捷度高，且很会反击）<br /><br />　　5F刚气之龙－lv45（为全水属性，且攻击力超强）<br /><br />　　6F刚格之龙－lv47（沙包肉龙一只）<br /><br />　　打倒它们后分别会得到疾速之玉，刚气之玉及刚格之玉。当三个玉都拿到后，到7F会遇到你打败的那三只龙，和牠们说话就能换到超强的龙系装备。记住，你只能向其中一只换武器，而且只能换一样，它就会把你的东西全收走啰&hellip;&hellip;<br /><br />　　而且这个任务只能完成一次，至于想要什么东西就看个人啰！ <br /><br />　　这三样武器分别为： <br /><br />　　龙之枪 攻+36 防-14 敏-14 魅+2 治愈的精灵LV2 <br /><br />　　龙之铠 防+23 敏-10 魅+2 猛毒的精灵LV2 <br /><br />　　龙之衣 防+13 敏+4 魅+2 复活的精灵LV1 <br /><br />建议： <br /><br />　　疾速龙：闪躲强，反击率高，攻击力尚佳，但不易出现。 <br /><br />　　刚气龙：此龙千千万万得多找人作为肉垫（GUARD），其攻击力高得可怕，最好能有多几个高等级的同伴帮助，把它迅速干掉。此外火系属性的玩家更需小心。 <br /><br /><br />　　刚格龙：这只肉到不能再肉，只有血多皮硬外，攻击力并不强，玩家可尽情发泄。]]></description>
		</item>
		    
		
		<item>
			<title>jdk6新特性1</title>
			<link>http://pigheadss.blog.sohu.com/77779510.html</link>
			<comments>http://pigheadss.blog.sohu.com/77779510.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Mon, 28 Jan 2008 09:46:37 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/77779510.html</guid>
			<description><![CDATA[Mustang（也称作Java SE 6），如今刚进入其第二个测试阶段。本文作者将同你进一步探讨这个新的发行版本中所提供的许多新的特征(从控制台I/O和存取权限控制方法到系统托盘API和表格排序和过滤等)。<br /><p>
<br />
　　一、 引言<br />
<br />
　　Mustang（也称作Java SE 6），如今刚进入其第二个测试阶段。本文中让我们一起进一步探讨这个新的发行版本中所提供的许多新的特征(从控制台I/O和存取权限控制方法到系统托盘API和表格排序和过滤等)。<br />
<br />
　　在分析控制文件和目录存取许可的若干新的文件方法后，本文将向你展示新的桌面集成API。然后，本文还要分析Mustang的新的编程存取网络参数的能力。最后，本文将讨论表格组件的新的排序与过滤能力。<br />
<br />
　　【注意】我使用Java SE 6的第二个测试版本(build 86)开发并测试了本文的Java示例应用程序，OS平台是Windows 98 SE。<br />
<br />
　　二、 存取权限控制方法<br />
<br />
　　从某种角度看，File类的一个实例其实是一个标识文件系统中文件或目录对象的抽象路径名。文件系统可以限制在这个对象上实现的读、写以及执行等操作。<br />
<br />
　　读、写和执行限制统称为&ldquo;存取权限&rdquo;。文件系统可以把多个存取权限集合关联到单个对象。例如，一个集合可以用于对象的所有者而另一个集合可以用于所有的其他用户。 </p>

<br />
<br />
　　前一个版本中提供的存取权限在直接用于存取对象时，有可能会导致File类的一些方法失败。由于这个原因，Mustang为File类引入了六种新的方法以便让你修改路径名的存取权限：<br />
<br />
　　①&ldquo;public boolean setExecutable(boolean executable， boolean
ownerOnly)&rdquo;：设置所有者或每个人对于指定抽象路径名的执行许可权。当executable为true时，允许执行操作；而传递给它的值为
false时，则不允许执行。把true传递给参数ownerOnly仅允许该抽象路径名的所有者拥有该许可权；当ownerOnly为false，则把
该许可权授予每个人。如果底层文件系统无法区分所有者的执行许可与每个人的执行许可，那么，该许可应用于每个人，而不管ownerOnly取值如何。<br />
<br />
　　该方法在成功时返回true；否则，返回false。如果用户无权改变抽象路径名的存取权限或如果底层文件系统没有实现一种执行许可并且executable为false，则方法调用失败。<br />
<br />
　　②&ldquo;public boolean setExecutable(boolean executable)&rdquo;：这个方法便于设置所有者对于给定抽象路径名的执行权限。<br />
<br />
　　③public oolean setReadable( oolean readable， oolean
ownerOnly)&rdquo;：设置所有者或每个人对于这个抽象路径名的读取许可权。参数readable为true时允许读取操作；否则，不允许读取。参数
ownerOnly为true时仅允许该抽象路径名的所有者拥有该许可权；当ownerOnly为false，则把该许可权授予每个人。如果底层文件系统
无法区分所有者的读取许可与每个人的读取许可，那么，该许可应用于每个人，而不管ownerOnly取值如何。 <p> </p>
<br />
<br />
　　该方法在成功时返回true；否则，返回false。如果用户无权改变抽象路径名的存取权限或如果底层文件系统没有实现一种读取许可并且readable为false，则方法调用会失败。<br />
<br />
　　④&ldquo;public boolean setReadable(boolean readable)&rdquo;：这个方法便于设置所有者对于给定抽象路径名的读取权限。<br />
<br />
　　⑤&ldquo;public boolean setWritable(boolean writable，boolean
ownerOnly)&rdquo;：设置所有者或每个人对于这个抽象路径名的写许可权。参数writable为true时允许写操作；否则，不允许写操作。参数
ownerOnly为true时仅允许该抽象路径名的所有者拥有该许可权；当ownerOnly为false，则把该许可权授予每个人。如果底层文件系统
无法区分所有者的写许可与每个人的写许可，那么，该许可应用于每个人，而不管ownerOnly取值如何。<br />
<br />
　　该方法在成功时这个方法返回true；否则，返回false。如果用户无权改变抽象路径名的存取权限，则方法调用会失败。<br />
<br />
　　⑥&ldquo;public boolean setWritable(boolean writable)&rdquo;：这个方法便于设置所有者对于给定抽象路径名的写权限。<br />
<br />
　　【注意】如果存在一个安全管理器并且它的&ldquo;public void checkWrite(String file)&rdquo;方法不允许对文件进行写操作的话，则上面列出的每一个方法都会抛出一个SecurityException异常。 <span></span><br />
<br />
　　File类还提供了如下对应的方法以帮助你获得一个对象当前设置的读、写和执行权限：<br />
<br />
　　①public boolean canRead()；<br />
<br />
　　②public boolean canWrite()；<br />
<br />
　　③public boolean canExecute()(在Mustang中新引入的)。]]></description>
		</item>
		    
		
		<item>
			<title>JDK6的新特性之三:理解StAX </title>
			<link>http://pigheadss.blog.sohu.com/77778590.html</link>
			<comments>http://pigheadss.blog.sohu.com/77778590.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Mon, 28 Jan 2008 09:32:11 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/77778590.html</guid>
			<description><![CDATA[<font>JDK6的新特性之三:理解StAX </font><br /><font>
StAX(JSR&nbsp;173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API<br />

<br />
StAX的来历&nbsp;<br />
<br />
在JAXP1.3(JSR&nbsp;206)有两种处理XML文档的方法:DOM(Document&nbsp;Object&nbsp;Model)和SAX
(Simple&nbsp;API&nbsp;for&nbsp;XML).由于JDK6.0中的JAXB2(JSR&nbsp;222)和JAX-WS&nbsp;2.0(JSR&nbsp;224)都会用到
StAX所以Sun决定把StAX加入到JAXP家族当中来，并将JAXP的版本升级到1.4(JAXP1.4是JAXP1.3的维护版本).&nbsp;JDK6
里面JAXP的版本就是1.4.<br />

<br />
StAX简介<br />
<br />
StAX是The&nbsp;Streaming&nbsp;API&nbsp;for&nbsp;XML的缩写，一种利用拉模式解析(pull-parsing)XML文档的API.StAX通
过提供一种基于事件迭代器(Iterator)的API让程序员去控制xml文档解析过程,程序遍历这个事件迭代器去处理每一个解析事件，解析事件可以看
做是程序拉出来的，也就是程序促使解析器产生一个解析事件然后处理该事件，之后又促使解析器产生下一个解析事件，如此循环直到碰到文档结束符；SAX也是
基于事件处理xml文档，但却是用推模式解析，解析器解析完整个xml文档后，才产生解析事件，然后推给程序去处理这些事件；DOM采用的方式是将整个
xml文档映射到一颗内存树，这样就可以很容易地得到父节点和子结点以及兄弟节点的数据，但如果文档很大，将会严重影响性能。下面是这几种API的比较
(转载自<a href="http://www.blogjava.net/hsith/archive/2006/06/29/55817.html">http://www.blogjava.net/hsith/archive/2006/06/29/55817.html</a>)<br />

<br />
XML&nbsp;Parser&nbsp;API&nbsp;Feature&nbsp;Summary&nbsp;&nbsp;Feature&nbsp;&nbsp;StAX&nbsp;&nbsp;SAX&nbsp;&nbsp;DOM&nbsp;&nbsp;TrAX&nbsp;&nbsp;<br />

API&nbsp;Type&nbsp;&nbsp;Pull,&nbsp;streaming&nbsp;&nbsp;Push,&nbsp;streaming&nbsp;&nbsp;In&nbsp;memory&nbsp;tree&nbsp;&nbsp;XSLT&nbsp;Rule&nbsp;&nbsp;<br />

Ease&nbsp;of&nbsp;Use&nbsp;&nbsp;High&nbsp;&nbsp;Medium&nbsp;&nbsp;High&nbsp;&nbsp;Medium&nbsp;&nbsp;<br />

XPath&nbsp;Capability&nbsp;&nbsp;No&nbsp;&nbsp;No&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;<br />

CPU&nbsp;and&nbsp;Memory&nbsp;Efficiency&nbsp;&nbsp;Good&nbsp;&nbsp;Good&nbsp;&nbsp;Varies&nbsp;&nbsp;Varies&nbsp;&nbsp;<br />

Forward&nbsp;Only&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;No&nbsp;&nbsp;<br />

Read&nbsp;XML&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;<br />

Write&nbsp;XML&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;<br />

Create,&nbsp;Read,&nbsp;Update,&nbsp;Delete&nbsp;&nbsp;No&nbsp;&nbsp;No&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;<br />

<br />
<br />
StAX代码演示<br />
<br />
下面代码演示了如何通过StAX读取xml文档和生成xml文档<br />
<br />
public&nbsp;class&nbsp;StaxTester&nbsp;{<br />

&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;XMLStreamException,&nbsp;FileNotFoundException&nbsp;{<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readXMLByStAX();//用XMLEventReader解析xml文档<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeXMLByStAX();//用XMLStreamWriter写xml文档<br />

&nbsp;&nbsp;&nbsp;&nbsp;}<br />

<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;readXMLByStAX()&nbsp;throws&nbsp;XMLStreamException,&nbsp;FileNotFoundException&nbsp;{<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLInputFactory&nbsp;xmlif&nbsp;=&nbsp;XMLInputFactory.newInstance();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLEventReader&nbsp;xmler&nbsp;=&nbsp;xmlif.createXMLEventReader(StaxTester.class.getResourceAsStream(&quot;test.xml&quot;));<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLEvent&nbsp;event;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;parsingResult&nbsp;=&nbsp;new&nbsp;StringBuffer();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(xmler.hasNext())&nbsp;{<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event&nbsp;=&nbsp;xmler.nextEvent();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(event.isStartElement())&nbsp;{&nbsp;//如果解析的是起始标记<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StartElement&nbsp;se&nbsp;=&nbsp;event.asStartElement();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(&quot;&lt;&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(se.getName());<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(se.getName().getLocalPart().equals(&quot;catalog&quot;))&nbsp;{<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(&quot;&nbsp;id=\&quot;&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(se.getAttributeByName(new&nbsp;QName(&quot;id&quot;)).getValue());<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(&quot;\&quot;&quot;);&nbsp;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(&quot;&gt;&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(event.isCharacters())&nbsp;{&nbsp;//如果解析的是文本内容<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(event.asCharacters().getData());<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if(event.isEndElement()){&nbsp;//如果解析的是结束标记<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(&quot;&lt;/&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(event.asEndElement().getName());<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parsingResult.append(&quot;&gt;&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(parsingResult);<br />

&nbsp;&nbsp;&nbsp;&nbsp;}<br />

<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;writeXMLByStAX()&nbsp;throws&nbsp;XMLStreamException,&nbsp;FileNotFoundException&nbsp;{<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLOutputFactory&nbsp;xmlof&nbsp;=&nbsp;XMLOutputFactory.newInstance();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XMLStreamWriter&nbsp;xmlw&nbsp;=&nbsp;xmlof.createXMLStreamWriter(new&nbsp;FileOutputStream(&quot;output.xml&quot;));<br />

<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写入默认的&nbsp;XML&nbsp;声明到xml文档<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeStartDocument();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeCharacters(&quot;\n&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写入注释到xml文档<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeComment(&quot;testing&nbsp;comment&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeCharacters(&quot;\n&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写入一个catalogs根元素<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeStartElement(&quot;catalogs&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeNamespace(&quot;myNS&quot;,&nbsp;&quot;http://blog.csdn.net/Chinajash&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeAttribute(&quot;owner&quot;,&quot;Chinajash&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeCharacters(&quot;\n&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写入子元素catalog<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeStartElement(&quot;http://blog.csdn.net/Chinajash&quot;,&nbsp;&quot;catalog&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeAttribute(&quot;id&quot;,&quot;007&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeCharacters(&quot;Apparel&quot;);<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写入catalog元素的结束标签<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeEndElement();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;写入catalogs元素的结束标签<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeEndElement();<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;结束&nbsp;XML&nbsp;文档<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.writeEndDocument();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlw.close();<br />

&nbsp;&nbsp;&nbsp;&nbsp;}<br />

}<br />
<br />
test.xml文件内容如下:<br />
<br />
&lt;?xml&nbsp;version=&quot;1.0&quot;&nbsp;encoding=&quot;UTF-8&quot;?&gt;<br />

&lt;catalogs&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;catalog&nbsp;id=&quot;001&quot;&gt;Book&lt;/catalog&gt;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&lt;catalog&nbsp;id=&quot;002&quot;&gt;Video&lt;/catalog&gt;<br />

&lt;/catalogs&gt;<br />
<br />
运行上面程序后，控制台输出如下:<br />
<br />
&lt;catalogs&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;catalog&nbsp;id=&quot;001&quot;&gt;Book&lt;/catalog&gt;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&lt;catalog&nbsp;id=&quot;002&quot;&gt;Video&lt;/catalog&gt;<br />

&lt;/catalogs&gt;<br />
<br />
运行上面程序后，产生的output.xml文件如下:<br />
<br />
&lt;?xml&nbsp;version=&quot;1.0&quot;&nbsp;?&gt;<br />

&lt;!--&nbsp;testing&nbsp;comment--&gt;<br />

&lt;catalogs&nbsp;xmlns:myNS=&quot;http://blog.csdn.net/Chinajash&quot;&nbsp;owner=&quot;Chinajash&quot;&gt;<br />

&nbsp;&nbsp;&nbsp;&nbsp;&lt;myNS:catalog&nbsp;id=&quot;007&quot;&gt;Apparel&lt;/myNS:catalog&gt;<br />

&lt;/catalogs&gt;<br /><br /></font><span>文章来源：http://blog.sina.com.cn/s/blog_4df5e42c01000b43.html</span><br />]]></description>
		</item>
		    
		
		<item>
			<title>放风筝的一个晴天</title>
			<link>http://pigheadss.blog.sohu.com/77538578.html</link>
			<comments>http://pigheadss.blog.sohu.com/77538578.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Fri, 25 Jan 2008 12:48:58 +0800</pubDate>
			<category>转载文章</category>
			<guid>http://pigheadss.blog.sohu.com/77538578.html</guid>
			<description><![CDATA[<p>看来多么高不可及的风筝，都有根细细的线，偷偷的牵在一个女人手里，没了那柔弱手，风筝就飞不起来，断了那根线，风筝就将坠毁。<br />　　<br />风筝和晴天在&ldquo;情舍&rdquo;里从夏天腻到秋天，仅仅三个月，整整一百天，然后就突然走不下去了。也许所有爱情的高潮都这样吧，来得快去得也快。云淡风清的日子里晴天拖着简单的行李黯然离开，当初收拾了一下午却还是没有带走什么，只因为生怕带走太多的回忆。<br />　　<br /><br />　　<br />（一）<br />　　　　<br />曾经不期而遇的邂逅，同一个出生成长的城市，两个不相识的人，因彼此欣赏而匆忙相识。风筝的文笔透露着幽幽情怀，晴天全身上下洋溢着智慧和灵气，你言我的语，交换了彼此的心，慢慢感受着，爱与情的甜蜜。心灵交会的那一刻，他们相爱了。<br />　　<br />从他们认识开始，风筝就扮演最佳听众，听晴天说从小到大，发生的每一件事。高兴时，晴天会唱歌给风筝听，娇媚的充盈着生动气息的唇线，腿很修长，身体的流畅轮廓显得温情脉脉。风筝默默的把手指放在嘴唇上，无限的柔情无限的欣赏着。晴天喜欢散步，喜欢和他牵手的感觉，喜欢自己的小手放在他温暖的大手里；风筝也喜欢散步，喜欢相拥的感觉。他们工作不忙碌，在一起的时间很多，时而过着平平淡淡的日子，常一起漫步，踏着渐去的夕阳轻轻的走过一条又一条古老的小街；迎着徐徐微风听海的笑声，躺在沙滩上，任凭浪花轻柔地冲刷自己。时而添一抹浪漫的色彩，酒吧小酌，脸上显出了浅红色的光泽；影院总有他们相依偎的影子。<br />　　<br />夜深人静中，时不时收到晴天的信息，那种熨贴心灵的问候，一点点驱赶风筝旧爱的阴霾，终有一天，风筝的手穿过晴天如墨的黑发。<br />　　<br />夏天的夜晚仿佛还带着春天的气息。<br />　　<br />风筝从后面亲热地抱着晴天，嗅她脖子的清香，吻她的后颈，晴天心跳加速，脉博加快，脸颊发烫。风筝那带着点点烟草味道的手指轻轻顺着额头到鼻尖，绯红的双颊，樱桃的红唇，温柔的一吻。室内氛围在瞬间变得相当安静，风筝规律平稳的鼻息声缓缓响起，晴天伴随着一阵激动，简直就地融化了。试去了上衣，丰满的乳房从只剩一丁点的布头上露出来，风筝抚摩着晴天的身体，她的皮肤非常细嫩光滑。眼神无限柔情，坚挺的乳，韧细的腰，丰盈的臀，有种奇怪的感觉在体内四处流窜，传递一个信息：爱，爱，爱。<br />　　<br />事后，风筝点了根烟，烟雾一丝丝飘散在空气中。<br />　　<br />风筝睡着了，像婴儿般蜷缩着身体，晴天的温柔轻轻覆盖在他额头上，风筝的头发卷起晴天对他感情执着的想象，也许我这里才是他唯一的归宿。晴天想起风筝曾经受的伤，更是对他怜爱，晴天付出了毕生的爱。她仿佛迎来了第二个春天。风筝却在不经意中对晴天进行了致命的伤害。<br />　　<br />晴天不知道自己什么时候睡着了，等她醒来，正躺在风筝的怀里，他呼吸深沉，均匀，紧贴着晴天的耳朵，晴天把头枕在风筝的锁骨和肩膀之间的小凹坑里，他的胳膊紧拥着自己。<br />　　　　<br />清晨了，外面还很静。<br />　　<br />风筝睁开略显迷蒙的眼眸轻轻地把晴天搂在怀里，含着笑，眼里的深情，晴天好喜欢风筝的深情，好喜欢风筝望着自己的眼神，这双眼睛，这种目光。晴天朝风筝理所当然嫣然一笑，钻进了被窝。<br />　　<br /><br />　　<br />（二）<br />　　<br />黄昏之际，一阵阵薄纱般的清风，带着淡淡的甜意，轻轻飘来，一丝丝，一缕缕，似纱似雾，如烟如尘。风筝和晴天再一次鱼水交欢。<br />　　<br />风筝躺下了：&ldquo;你快乐吗？&rdquo;<br />　　<br />晴天喘气着用心试去风筝脸上的汗珠，口乾舌燥地说：&ldquo;宝贝，你很棒！&rdquo;<br />　　<br />风筝点燃了一根烟。猛地吸了一口，颓然无力的躺在晴天身上：&ldquo;以前没有吗？&rdquo;<br />　　<br />晴天不语。<br />　　<br />风筝端详晴天的面容，不可思议的可爱和纯朴，因欲望而酡红的双颊，迷乱的双眼，微启的小嘴儿，有些兴奋地把晴天搂得更紧，一个画面一闪，她曾经躺在别的男人身下血液激荡，晴天似乎感觉到风筝的变化，便问：&ldquo;宝贝，怎么了？&rdquo;风筝又吸了一口烟：&ldquo;你告诉我，你以前那个事后抽烟么？&rdquo;晴天心头一紧，有些不高兴：&ldquo;你问这个干嘛？&rdquo;&ldquo;没什么，我就是想知道，我跟以前那个相比，谁能让你更开心......&rdquo;晴天觉得脑袋开始发胀了，胸口像是堵了一团乱麻，怎么扯也扯不开。<br />　　<br />这已经不是风筝第一次这么问了，和风筝在一起，晴天很开心，可偏偏风筝总是隔三岔五的旧事重提。一次又一次的撕开她的伤疤，逼她去看过去的鲜血淋漓。晴天知道风筝不是故意，风筝只是好奇，可这好奇却让晴天疼得受不了。风筝也常把那份没有完全遗忘的感情重温。风筝只是想听到身边的女人提起他以前的男人，自己会不会心痛。风筝很自私，没有想到晴天的感受，因为，时常，风筝不知是爱晴天还是.....欣赏.....<br />　　<br />&ldquo;你真的想知道吗？这都是过去的事了，不要再提了好吗？&rdquo;晴天的声音很虚弱。<br />　　<br />&ldquo;其实也没什么啊！我只想多些知道你的事，想了解你全部，然后让你更快东。&rdquo;<br />　　<br />晴天背对着风筝不说话，肩膀抖动着，风筝板过晴天的肩膀，看到的是一张让人疼惜的泪脸，风筝慌张的问：&ldquo;怎么哭了...是不是...你还爱他...放不下他....那我以后不碰你了....&rdquo;&ldquo;我爱你，我现在爱的只有你！&rdquo;晴天紧紧抱住风筝，眼泪滑落风筝的脸颊，&ldquo;只求你不要再让我讲过去的事好吗？我装不下许多事，不愿意去想不开心的事，我现在只有你，从此以后我心中也只有一个你。你要我回忆，回忆起与他的快乐你就会痛苦，回忆与他的痛苦我又怎么能忍受？&rdquo;<br />　　<br />次日醒来，枕边潮湿的泪痕提醒着昨天的一切。<br />　　<br />晴天站在窗台，风筝想起昨夜泪如决堤的晴天，心疼的环抱着晴天：&ldquo;晴儿，对不起，我再也不会问你了。&rdquo;风筝连连发誓，风筝害怕晴天冷漠的眼光，怕晴天离开他，他的手颤抖着，而晴天的心抽动着，多希望这样的事不要再发生，不要跟过去纠缠不清。其实跟他的事，晴天一早就告诉了风筝，晴天提起他只是耳边掠过的一阵风，不往心里去。而现在要对着自己深爱的人谈曾经爱过的人，字字句句如刺在心。和深爱的风筝紧紧拥抱在一起，鼻息相近，心跳相贴的感觉，多么令人难忘，多么渴望这一刻化为永恒啊！<br />　　<br />风筝一次又一次伤了晴天，又一次又一次的挽回晴天，然而风筝却不知，幸福和快乐每天都在损耗，就像春雪一样难以储存。风筝不是个细致的人，常常伤害了晴天却全然不知。晴天和他的爱情早已过期，可风筝不断追问那些回忆让它像病毒一样蔓延到他们新的爱情里去，幸福也跟着变了味 ，过了期.....<br />　　<br />立足点不一样，闪光点也不一样。认识一个人越久，风筝就越让晴天迷惑。<br />　　　　<br />　　<br /><br />（三）<br />　　<br />在朋友聚会上，晴天特意将自己打扮一番。<br />　　<br />一双明亮的大眼一如儿时般灵活有神，小巧的嘴唇擦着淡淡的口红，健康色泽的脸颊显示出晴天长期曝晒在阳光下，紧身的皮衣和低腰的短皮裤露出小肚脐和几乎可以看到臀部的修长大腿。胸部显得丰满和性感，腰身特别苗条，身材美得几乎让人窒息。<br />　　<br />风筝不禁皱起眉头，这一身火辣辣的打扮非常养眼又性感，尤其凹凸有致的身材相当惹火够味，很容易想男人想入非非又心痒难耐。风筝一整晚都不高兴，处处为难晴天，他真想说：有亲蜜朋友了还穿得这么暴露，勾引谁啊你，你骨子里到底是什么东西。可他不敢说，毕竟，日久生情。他也怕这种话会把晴天伤得很重。晴天也不知道自己哪错了，两个人就这样僵着。<br />　　<br />直到深夜，酒意欲醉时，风筝把心中的话全泼了出去。特别是针对晴天的初恋。风筝还自以为是的认为晴天现在还照顾着他。一股气话闷话脱口而出，风筝很后悔自己的失态，表情和手势都表示道歉和退让。可晴天看着他就像看外星人一样。晴天闭上眼睛，真想知道自己能这样坚持多久。风筝和晴天都有各自的心结，晴天努力的解开这个结，当解开一点，进了一步，风筝又让晴天不敢迈进，甚至不能退。晴天交叉着双臂保护着自己冷漠的说：&ldquo;我没办法听你那句&lsquo;你开心吗&rsquo;？我不开心，早就不开心了，我说的开心是谎话，一切都是谎话，抱着你我想着他，看着你我仿佛看到他！我根本不爱你，连喜欢都说不上，我怕孤单寂莫，我需要的只是欲望。&rdquo;自从认识风筝以来，第一次见他一筹莫展。可晴天心在滴血，已顾及不了。<br />　　<br />所有人都把矛头指向风筝，风筝百口莫辨，无论怎么解释，大家都不相信他。冷冰的目光像锥子一般刺入风筝的身体。晴天仿佛酝酿许久，才从抖动的嘴角吐出微弱的却不容拒绝烫火的死亡请函：&ldquo;你走你的阳关道，我过我的独木桥。后会无期。&ldquo;她的面容一瞬间那么遥远模糊。她的消失和出现一样突然。<br />　　<br />风筝一失足千古恨，痛失爱人。任凭泪水的哀求，任凭口舌的说服，依旧唤不回晴天毅然离去的决心。睛天百般照护，迁就，而时急欲离去，如同丧失玩具般不舍和痛苦。<br />　　<br />往事不可追，往事不可求，很多激励人心的往事只能留在记忆的档案里。<br /><br /><br />　　<br />（四）<br />　　<br />云淡风清的日子里晴天拖着简单的行李黯然离开，收拾了一下午却还是没有带走什么，只因为生怕带走太多的回忆。<br />　　<br />风筝曾是晴天爱的最深的人。每次回忆晴天都很难过，毕竟那个人给过她最快乐的时光。可让晴天痛心的是无论她现在如何回忆，呈现她面前的总是后来那些争执、心碎、哭泣的破碎画面，而曾经那么快乐的日子却变成大片大片的空白，仿佛从来没有拥有过。她不能接受，曾经为之付出那么多的人，到头来竟然成了最深切的痛苦的代名词。为什么每次让晴天想起那些不愉快过去的人，却总是风筝？爱的反义词是害怕、恐惧、担心、而不是恨。晴天面对风筝给自己的伤痛，亲自断了这份她爱的最深最真的情。风筝是晴天唯一称为宝贝的人，唯一疼惜的人，以为他会是自己的终点，唯一幸福的终点。和他相遇是个悲剧，和他相恋更是一个永远的痛。<br />　　<br />&ldquo;事情就这么结束了？&rdquo;晴天在电梯里想，好像才昨天才搬进来，好像昨天才一起去买的床买的生活用品，把钥匙丢进垃圾桶就彻底说再见了，又一次爱情的终结。虽然是大热天，天气晴朗，可感觉冷风呼啸，天色灰暗。房屋冷漠的耸在晴天眼前，街上很热闹，唯独晴天一人孤零零的，她叹了一口气，一个不知往何处去的无家可归者。<br />　　 <br />冰冻三尺非一日之寒。浪漫、理想的爱情因现实的无奈默默离去，留下的只是无尽的追思和痛楚。<br />　　<br /><br />（五）<br />　　<br />风筝回来时，晴天已经人去楼空了。金红的阳光爆裂成无数碎片。美好的爱情最终定格成一道模糊的旧影。<br />　　<br />他不相信，就这样失去了深爱的人，所有，所有一起拥有过的东西全不见了，仿佛从来没存在过。风筝还不明白，不明白这是为什么，曾经以为会长相厮守，永不分离。风筝暴跳如雷，失去理智的四处打听，似乎整个世界都快翻过来了，都不知道晴天的真正下落。晴天像一只被猎人擒获的猎物，毫无反抗之力，只剩下在恐惧中瑟瑟发抖。一日日焦灼的等待，无望，寻找中，风筝的心渐渐沉潜下来，也许缘分已尽，但每天晚上躺在小木屋里，总无法入睡，即使把自己灌得天花乱醉，睡到半夜，在撕心裂肺的离别噩梦中惊醒。<br />　　<br />从相识、相熟到相爱，在恋爱中飘飘然，全然不知朝夕的相处却摩擦了彼此的心，慢慢产生了爱与情的危机。没有机会做决定，包括分手也不在自己的权力范围内。曾经错失了幸福的时刻；亲密爱人就此杳无行踪。<br />　　<br />情感得不到满足，望眼欲穿的思念，深深相思淡淡愁，不离弃缠绕身心。<br />　　<br />感情是一个高利息的存单，刚存进去的时候平淡无奇，但一天一天积累的爱恋的利息却很高，想要完全舍去，不留痕迹，不容易啊。仅仅100天，可晴天在风筝的位置不是轻易就能被替代的。夜色昏昏，思绪沉沉.<br />　　<br />一个很寂静的夜里，风筝拨通的晴天的电话，那一头静得让人窒息，风筝很想晴天再回来，却无力开口，晴天也很想对风筝说想，说念，说放不下，说爱。可是谁都无力开口。只听一声不知是谁说的话，&ldquo;晚安，宝贝......&rdquo;那一刻，一切成定局，去留已成定局。<br />　　<br />疯狂的哭过，疯狂的笑过，疯狂的日子已远走。这一生还剩什么？你的点点滴滴还深深印在我心。短短的100天，却形成了脐带的纠结，剪不断，理还乱。想放，放不下手；不想放，却又抓不住。风筝无助，脆弱，慌张，长期的思念，长期的悔恨，终将玉石俱焚.....<br />　　<br />懊悔就像一剂慢性毒药，在无休无止中磨灭着风筝的意志，在不知不觉中消耗快乐。总有一天，风筝会被自己引来的巨浪，吞噬。<br />　　<br />晴垮了，日夜思念，让自己心动又让自己心痛的人，人生的失败爬满了全身神经的每一个枝丫，虽然硬撑着，但心灰意冷一点一点的抽空了晴天的身体，只剩下一个空壳。永远也忘不了他当时的目光，交织着极度的痛楚和悔恨，洋溢着无比的深情和眷恋....大颗大颗的泪水顺着他脸庞淌下。可晴不敢往心里想，只怕把记忆中的痛释放出来，那是关在心灵深处的猛兽。<br />　　<br />晴天立在沙滩上，望着大海，感觉自己很渺小，伤痛却如此的庞大，仿佛要吞了自己，头发凌乱不堪的扭结着。海水缓缓顺着肌肤滑下来，她感到全身的冰凉更是身心的冰凉。记得两人看海，风筝总温柔的抱着自己，在自己耳际轻轻细语。她转过身，一步步挪动双脚，她知道，自己的身体一定已经碎成千百块，只因皮肤裹着才没掉下来。她很感谢皮肤。她摸出钥匙，想起风筝说的最后一句话：&ldquo;你给我一把锁，打开了我的心锁，现在你却要锁上并离开，那我怎么办？&rdquo;手在发抖，全身都在发抖，如果这么一直抖下去，皮肤一定会撑不住的，她顺着车身摊了下去，似乎要化成一滩水，&ldquo;为什么？为什么？我到底做错了什么？&rdquo;<br />　　<br />分手后的两个不约而同的病了，晴天发高烧时风筝那呵护照顾的影子找不到了，风筝咳嗽时晴天拍风筝胸口的手消失了。回想着风筝真切的爱抚，太多太深的柔情，太长太久的牵念，泪水像小溪一样在脸上肆意流淌着。第二天，身体好些了，晴天茫然的走在街上，不知走了多久，也不知走了多远，等她突然停下脚步的时候才发觉自己鬼使神差般来到了那幢曾经无比熟悉的楼前，晴天去风筝单位找风筝，就像晴天一退热就去风筝单位找他一起下班一样。可她却不敢见他，只能在远远处，望着他。晴天心里异样的恍惚，想哭，又泪珠泄露心中的隐秘。<br />　　<br />晴天放飞了风筝，再见了最爱的人啊，不是我不爱你，不是我想离开你，世上说不清道不明的事太多，我想你，夜夜都梦见你；可是我怕，我想回到你身边，可是我怕。她想爱吗？想恨吗？想断吗？不知道，谁也不知道。风筝失去了晴天，除了喝酒还是喝酒，除了想她还是想她，每夜都借着酒精，抱着晴天的衣服，才能入睡。可他睡着安稳吗？ 不知道，谁也不知道。<br />　　<br /><br /><br />（六）<br />　　<br />想念，突然想念起一个人，可能是某一首歌曲音符的触动，可能是某一个身影擦身而过的惊觉，也可能单纯的脑海中的某个角落一直保留着他的位置。<br />　　<br />再回来，&ldquo;情舍&rdquo;，往事竟如此清晰，心被回忆胀满的感觉，很疼。屋子里，安静清爽，风筝蹲在曾经床的位置上，仿佛看到枕边泪痕留下的痕迹，无力想象那夜的晴天是怎样的痛彻心扉，落泪到天明......<br />　　<br />风筝走到浴室，一面镜子前，不由自主的停下来，往日一幕幕又浮现在眼前：她常常站在镜子前，顾盼生辉，久久沉醉于自己的与众不同，而自己就站在她身边，用比她更陶醉的目光欣赏着，用无比诚挚的话赞美着。这镜子里肯定还藏着她的倩影，她的气息。于是，风筝伸手去摸，但镜子冷冰冰的。失去心中至爱，上帝！刹那间感觉撕心裂肺，悲伤苦痛牢牢地将风筝攫住，他不得不离开。<br />　　<br />美，经不过长久的凝视，因为美在凝视中凋零。<br />　　<br /><br />　<br />（七）<br />　　<br />风筝收拾了行李，变卖了家产，变换了职业。和唯一的亲人――母亲，搬到另一个城市。母亲照顾着他的生活起居，风筝不至于一日三餐没有着落。那段日子过得很清贫，甚至一碗面也是分着吃。风筝的话越来越少了，常常为了写稿赶稿累趴在桌子上，直至蚊子的提醒才抽根烟提神，继续晴天指的路线一笔一划的写下去。随身携带着纸，笔，敏感的心，兜里一盒火柴，一包白茶花，他满脑子都是她的影子，一个单纯，自然的女子，和她一起的快乐的种子是他生存的意志。整天故作坚强还是和同事和睦相处，但深夜却是他们互相思念的时间，这段时间没有人去打扰他们，那是他们无形的约会。每夜，风筝和晴天都做同样的梦，梦里都有心中最爱的彼此。可是，现实，再怎么也回不去过去快乐的时光，再也回不去曾经的深情，曾经的爱恋。<br />　　<br />风筝沉浸在酒吧里和酒精对话，沉浸在迪厅里和疯狂对话，沉浸在网吧里和虚幻对话。一切都是虚幻的，犹如太阳底下的肥皂泡在色彩斑斓的映衬下转眼就消失了。<br />　　<br />朋友不忍，说起自己的故事：我从18岁失恋到现在40多岁了，现在还是单身一个人，曾经有个家，有个孩子，和老婆离婚，痛！老婆又把孩子带走了，痛上撒盐！生命的伴侣不是最亲的，唯有血缘的孩子才是最亲的啊！调整好心态，走向开心路！<br />　　<br />&ldquo;开心路？&rdquo;风筝喃喃自语，&ldquo;那么遥远，要走很多公里，很多年！我能否走到那儿？要花上几年，甚至一生！&rdquo;<br />　　<br />&ldquo;我爱她，我竟然不知道！！每一天，每一刻，都深深的陶醉在她的温柔，她的爱情之中，她的一切就像一缕缕蚕丝紧紧的将我裹住，我就是那幸福的小虫子，我竟然不知道！！失去以后才知道原来是爱不是欣赏不是代替品！&rdquo;<br />　　<br />&ldquo;美好的东西是不需要被证实的，只要用心体会。&rdquo;<br />　　<br />&ldquo;我以前就想证实，证实，不停的证实&hellip;&hellip;好想&hellip;..找一个能适合自己的容器，装进去&hellip;&hellip;我像一只离群无助的大雁&hellip;&hellip;孤独而凄凉&hellip;&hellip;遇见她&hellip;&hellip;才知道爱一个人是什么滋味&hellip;&hellip;为一个人心跳是什么滋味&hellip;&hellip;对她的思念已凝固成一个如玉之润，如石之坚，如水之静，如海之深的永恒印象&hellip;&hellip;&rdquo;风筝在说这些话时，手脚冰凉，语音颤抖，目光如炬，气若游丝，心力衰弱。<br />　　<br />风筝和晴天分手在深秋，刻骨铭心的冷啊。从此，漫长的岁月里，每个秋天比冬天还冷。<br />　　<br />朋友无奈，把风筝带到文学评论会中。<br />　　<br />风筝坐在文学同行中间，聆听种种发自肺腑的声音，那一刻，心从未有过那样的踏实，温暖。风筝想到《和普希金一起散步》的苏联作家西尼亚夫斯基他是在劳改服刑期间完成的，而他的坐牢也是因为写作。思绪走得更远，北极熊和中国的大熊猫，本是同一祖先，但是因为后者退出竞争圈，所以只能以竹子来延续这一濒临灭绝的种群生命；而北极熊不仅食肉，在陆地上能生存，在海水中能捕食水生物，实在没有吃的就在冰天雪地里冬眠三四个月，醒来又是一条&ldquo;好汉&rdquo;。在生命的四周，有战争的硝烟，有人性的沦丧，有美丽的花果，有苍凉的歌唱，但是文学的足迹能够抵达四面八方，帮助人类帮助地球帮助心灵守住安宁静谧，让最深的渴望在瞬间永恒。<br />　　<br />让我来铸造心灵的瞬间永恒吧。<br />　　<br />&hellip;&hellip; &hellip;&hellip;<br />　　<br />联系越来越少，风筝有一次忍不住打个电话给她，是个男的接的，男的声音很虚弱，听是病了，他说：&ldquo;她去买药了.....&rdquo;<br />　　<br />挂了之后，风筝愣了半响，她有她的生活和追求，更有她的难处，人始终向往更好的生活。<br />　　<br />&hellip;&hellip;<br />　　<br />&hellip;&hellip;<br />　　<br />风筝这个月完成了几个月才能写出的稿子，在当年的好新闻评奖中获省一等奖。随即而来的是不菲的名气。<br />　　<br /><br /><br />（八）<br />　　<br />母亲劳累过度，世上只剩风筝一人。<br />　　<br />风筝目光滞呆，一言不发，母亲的葬礼上，几乎都没有哭。<br />　　<br />风筝是1976年唐山大地震前出生的。几十万活泼的生命随着房子的轰然倒塌刹那时归为寂莫，而母亲以自己血肉之驱紧紧把风筝护在怀中，抵挡死神的打击。世间万物，一代代生命消失，一代代生命生长，在生命的流程中，母亲的位置最重要，母爱的光辉是永恒的。想劳累一生的母亲，想到孤苦伶仃的自己。更加深沉了。<br />　　<br />大年三十，一个人躺在床上，心，又酸又苦，百感交集，漫漫的孤独，长长的等待。城市的夜晚特别凉，明天又是一天，不知道我什么时候能回到你身边。<br />　　<br />风筝经常为自己的诗稿举行小型的火葬仪式，在无人的角落或透风的阳台上。和茨维塔耶娃有共同的嗜好－－焚毁自己的诗稿:我所有的诗歌即使没有献给上帝至少也献给天使们了。<br /><br />　　<br />（九）<br />　　<br />车子近了，越来越近了，风筝的心剧烈的跳动起来，五年或许只是沧海一粟，可对风筝来说，却仿佛经历了一个生命的轮回。<br />　　<br />分手时他们约定五年后再见面。<br />　　<br />脚步声若有若无的传来，近了，近了，驻足了。坐下了。<br />　　<br />熟悉的声音，熟悉的问候，震得晴天的心一阵天翻地覆的慌乱，一张消瘦的面孔随及撞入视线，气色晦暗，眼睛深陷，近在咫尺的思念陌生得完全没有记忆中的丰采俊逸。在以前他们常去的酒吧。<br />　　<br />一样的人，一样的酒，不一样的心情，拖着恍如隔世的往事。他们对视着，那生命的真实与柔情都深深地侵蚀到心里，恍然又有了当时的深情。<br />　　<br />风筝抬头看着晴天，晴天精神还不错，只是明显的瘦了，一身浅灰色的套裙略有松驰的裹在身上，脸上已经有了很深的皱纹，每一道皱纹都印着她牺牲的足迹，刻下她奋斗的历程，他的目光在她脸上游离着，那颗负疚的心泪雨纷飞。<br />　　<br />&ldquo;你过得好吗？&rdquo;晴天眉间簇着久违的怜爱。<br />　　<br />&ldquo;还好。&rdquo;两个字浓缩着五年的光阴，其实好不好只有自己知道。&ldquo;你呢？&rdquo;<br /><br />晴天不语，眼睛望着窗外，生活的影子在她脸上阴云般铺开......<br />　　<br />风筝的心像被什么蜇了一下，一丝疼痛缓缓的弥漫开来。<br /><br />&ldquo;你结婚了？&rdquo;风筝不敢看她的眼睛。<br />　　<br />&ldquo; ......&rdquo;<br />　　<br />&ldquo;想，日日夜夜。&rdquo;<br />　　<br />&ldquo;......&rdquo;<br />　　<br />熟悉的服务生递来一杯开水，晴天接过来，怕风筝烫着，轻轻放在唇边试了试，这一细节让他早已忍满眶的泪水刹那间喷涌而出，哽咽的说：&ldquo;你让我一辈子无法心安，我爱的是你，伤害的也是你&hellip;&hellip;&rdquo; <br />　　<br />一片树叶被风吹落，不知是好事还是多情，将坠地时又反卷上来，砸在窗玻璃上，发出一声巨响，打破了这片寂静。<br />　　<br />晴天淡淡的忧伤十分自持，让风筝重新感到晴天在自己心中的美。<br />　　<br />风筝摸索着握住晴天的手，一片温暖立刻顺着掌心传遍全身，心似琴弦般颤动起来。晴天是一个不会掩藏感情的人，终于含不住的眼泪骨碌骨碌滚下来，风筝紧紧把晴天搂在怀里，晴天听见自己的心轰隆一声塌软了。一股很热的气流冲击双唇。<br />　　<br />原来谅解一个人可以如此简单。<br />　　<br />人的一生中，也许有人曾给过你激情，给过你柔情，却给不了你深情；也许有人让你心旌摇荡，朝思暮想，却不能相濡以沫，厮守一生；有的人注定只能陪你走过生命里的一段路，而真正的人生伴侣却是那个永远把你放在心上给你一生一世最彻底的体恤。<br />　　<br />　<br />（十）<br />　　<br />次日醒来，床上只有晴天的余温。风筝脸色青了，恐惧和恨意一起涌上心头，如笼中困兽，简直想破窗而出。风筝已经忘了自己是怎样颓然倒在沙发上，心中渴望她的出现，不敢合上眼睛，生怕自己会入睡，错过了她的信息，他死死的撑着，分分秒秒的企盼着......他的心被撕成碎片，昏昏沉沉挨到了天亮，情绪在崩溃的临界上，跌跌撞撞出了门。<br />　　<br />大雨如注，大地间好像都被水帘笼罩了，雨点打在路面上，形成了一片白茫茫的水雾，思念把欲望燃得很旺很旺，怎么做也不会解渴，欲望堆积成火山，要涨出胸脯，风筝越来越焦虑，急急的跑在街上，四处寻着晴天的影子。一辆迎面汽车飞驰而来，说时迟，来时快，汽车已经开到了风筝的面前，风筝想躲已经来不及了。&ldquo;嘭&rdquo;的一声巨响，身体被汽车撞飞到了半空中，风筝想用手去抓什么，可是，已经没有力气了，他的眼前一片漆黑.....<br />　　<br />天上怎么飘起那么多风筝！！！<br />　　<br />莫非是风神的指令？？还是心灵的相约？？？<br />　　<br />飘飞的风筝向南连绵不绝没有尽头，隐隐约约风筝又向西蜿蜒，怎么没有向东飞的？我想看到希望，我想看到光明啊！你可否揭开迷惘的面纱，让我看清楚如何走出人生的迷宫，如何勇于面对生命的真相......风筝凝视着天上的红蜻蜒、黑蝴蝶，还有各种叫不出名字的风筝。它们或高或低，或静若处子，或轻轻飘摇。风筝想：它们一定在那里欢唱吧，欢唱健康与自由，欢唱清洁与纯美。<br />　　<br />风筝觉得自己也是一只风筝，融入了天上的风筝河......<br />　　<br /><br /><br /><br />旧爱犹如一场无法谢幕的噩梦，总会在无助孤独的深夜令人泪湿忱巾。<br />　　<br />梦醒时，手还举在半空中，依然是常一起放风筝的开心状态。动人的爱情为何成了风雨飘摇的风筝，只有那残轴断线留在受伤的掌心。</p>]]></description>
		</item>
		    
		
		<item>
			<title>Eclipse快捷键</title>
			<link>http://pigheadss.blog.sohu.com/76686478.html</link>
			<comments>http://pigheadss.blog.sohu.com/76686478.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Wed, 16 Jan 2008 09:10:26 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/76686478.html</guid>
			<description><![CDATA[<strong>编辑相关快捷键</strong> <br /><br />&nbsp;&nbsp; Eclipse的编辑功能非常强大，掌握了Eclipse快捷键功能，能够大大提高开发效率。Eclipse中有如下一些和编辑相关的快捷键。 <br />&nbsp;&nbsp; 1. 【ALT+/】 <br />&nbsp;&nbsp; 此快捷键为用户编辑的好帮手，能为用户提供内容的辅助，不要为记不全方法和属性名称犯愁，当记不全类、方法和属性的名字时，多体验一下【ALT+/】快捷键带来的好处吧。<br /> <br />&nbsp;&nbsp; 2. 【Ctrl+O】 <br />&nbsp;&nbsp; 显示类中方法和属性的大纲，能快速定位类的方法和属性，在查找Bug时非常有用。<br /> <br />&nbsp;&nbsp; 3. 【Ctrl+/】 <br />&nbsp;&nbsp; 快速添加注释，能为光标所在行或所选定行快速添加注释或取消注释，在调试的时候可能总会需要注释一些东西或取消注释，现在好了，不需要每行进行重复的注释。<br /> <br />&nbsp;&nbsp; 4. 【Ctrl+D】 <br />&nbsp;&nbsp; 删除当前行，这也是笔者的最爱之一，不用为删除一行而按那么多次的删除键。 <br /><br />&nbsp;&nbsp; 5. 【Ctrl+M】 <br />&nbsp;&nbsp; 窗口最大化和还原，用户在窗口中进行操作时，总会觉得当前窗口小（尤其在编写代码时），现在好了，试试【Ctrl+M】快捷键。 <br /><br /><strong>&nbsp;&nbsp; 查看和定位快捷键</strong> <br /><br />&nbsp;&nbsp; 在程序中，迅速定位代码的位置，快速找到Bug的所在，是非常不容易的事，Eclipse提供了强大的查找功能，可以利用如下的快捷键帮助完成查找定位的工作。 <br /><br />&nbsp;&nbsp; 1. 【Ctrl+K】、【Ctrl++Shift+K】 <br />&nbsp;&nbsp; 快速向下和向上查找选定的内容，从此不再需要用鼠标单击查找对话框了。 <br /><br />&nbsp;&nbsp; 2. 【Ctrl+Shift+T】 <br />&nbsp;&nbsp; 查找工作空间（Workspace）构建路径中的可找到Java类文件，不要为找不到类而痛苦，而且可以使用&ldquo;*&rdquo;、&ldquo;？&rdquo;等通配符。 <br /><br />&nbsp;&nbsp; 3. 【Ctrl+Shift+R】 <br />&nbsp;&nbsp; 和【Ctrl+Shift+T】对应，查找工作空间（Workspace）中的所有文件（包括Java文件），也可以使用通配符。 <br /><br />&nbsp;&nbsp; 4. 【Ctrl+Shift+G】 <br />&nbsp;&nbsp; 查找类、方法和属性的引用。这是一个非常实用的快捷键，例如要修改引用某个方法的代码，可以通过【Ctrl+Shift+G】快捷键迅速定位所有引用此方法的位置。 <br /><br />&nbsp;&nbsp; 5. 【Ctrl+Shift+O】 <br />快速生成import，当从网上拷贝一段程序后，不知道如何import进所调用的类，试试【Ctrl+Shift+O】快捷键，一定会有惊喜。 <br /><br />&nbsp;&nbsp; 6. 【Ctrl+Shift+F】 <br />&nbsp;&nbsp; 格式化代码，书写格式规范的代码是每一个程序员的必修之课，当看见某段代码极不顺眼时，选定后按【Ctrl+Shift+F】快捷键可以格式化这段代码，如果不选定代码则默认格式化当前文件（Java文件）。 <br /><br />&nbsp;&nbsp; 7. 【ALT+Shift+W】 <br />&nbsp;&nbsp; 查找当前文件所在项目中的路径，可以快速定位浏览器视图的位置，如果想查找某个文件所在的包时，此快捷键非常有用（特别在比较大的项目中）。 <br /><br />&nbsp;&nbsp; 8. 【Ctrl+L】 <br />&nbsp;&nbsp; 定位到当前编辑器的某一行，对非Java文件也有效。<br /> <br />&nbsp;&nbsp; 9. 【Alt+&larr;】、【Alt+&rarr;】 <br />&nbsp;&nbsp; 后退历史记录和前进历史记录，在跟踪代码时非常有用，用户可能查找了几个有关联的地方，但可能记不清楚了，可以通过这两个快捷键定位查找的顺序。 <br /><br />&nbsp;&nbsp; 10. 【F3】 <br />快速定位光标位置的某个类、方法和属性。<br /> <br />&nbsp;&nbsp; 11. 【F4】 <br />&nbsp;&nbsp; 显示类的继承关系，并打开类继承视图。<br /> <br /><strong>&nbsp;&nbsp; 调试快捷键</strong> <br /><br />&nbsp;&nbsp; Eclipse中有如下一些和运行调试相关的快捷键。<br /> <br />&nbsp;&nbsp; 1. 【Ctrl+Shift+B】：在当前行设置断点或取消设置的断点。 <br />&nbsp;&nbsp; 2. 【F11】：调试最后一次执行的程序。 <br />&nbsp;&nbsp; 3. 【Ctrl+F11】：运行最后一次执行的程序。 <br />&nbsp;&nbsp; 4. 【F5】：跟踪到方法中，当程序执行到某方法时，可以按【F5】键跟踪到方法中。 <br />&nbsp;&nbsp; 5. 【F6】：单步执行程序。 <br />&nbsp;&nbsp; 6. 【F7】：执行完方法，返回到调用此方法的后一条语句。 <br />&nbsp;&nbsp; 7. 【F8】：继续执行，到下一个断点或程序结束。 <br /><br /><strong>&nbsp;&nbsp; 常用编辑器快捷键</strong> <br /><br />&nbsp;&nbsp; 通常文本编辑器都提供了一些和编辑相关的快捷键，在Eclipse中也可以通过这些快捷键进行文本编辑。 <br />&nbsp;&nbsp; 1. 【Ctrl+C】：复制。 <br />&nbsp;&nbsp; 2. 【Ctrl+X】：剪切。 <br />&nbsp;&nbsp; 3. 【Ctrl+V】：粘贴。 <br />&nbsp;&nbsp; 4. 【Ctrl+S】：保存文件。 <br />&nbsp;&nbsp; 5. 【Ctrl+Z】：撤销。 <br />&nbsp;&nbsp; 6. 【Ctrl+Y】：重复。 <br />&nbsp;&nbsp; 7. 【Ctrl+F】：查找。 <br /><br /><strong>&nbsp;&nbsp; 其他快捷键</strong> <br /><br />&nbsp;&nbsp; Eclipse中还有很多快捷键，无法一一列举，用户可以通过帮助文档找到它们的使用方式，另外还有几个常用的快捷键如下。 <br />&nbsp;&nbsp; 1. 【Ctrl+F6】：切换到下一个编辑器。 <br />&nbsp;&nbsp; 2. 【Ctrl+Shift+F6】：切换到上一个编辑器。 <br />&nbsp;&nbsp; 3. 【Ctrl+F7】：切换到下一个视图。 <br />&nbsp;&nbsp; 4. 【Ctrl+Shift+F7】：切换到上一个视图。 <br />&nbsp;&nbsp; 5. 【Ctrl+F8】：切换到下一个透视图。 <br />&nbsp;&nbsp; 6. 【Ctrl+Shift+F8】：切换到上一个透视图。 ]]></description>
		</item>
		    
		
		<item>
			<title>真实与谎言</title>
			<link>http://pigheadss.blog.sohu.com/76535095.html</link>
			<comments>http://pigheadss.blog.sohu.com/76535095.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Mon, 14 Jan 2008 15:11:31 +0800</pubDate>
			<category>转载文学</category>
			<guid>http://pigheadss.blog.sohu.com/76535095.html</guid>
			<description><![CDATA[很久很久以前，谎言和真实在河边洗澡，谎言先洗好，穿了真实的衣服离开，真实却不肯穿谎言的衣服。后来，在人们的眼里，只有穿着真实衣服的谎言，却很难接受赤裸裸的真实... ]]></description>
		</item>
		    
		
		<item>
			<title>两分钟让你明白什么是ERP！</title>
			<link>http://pigheadss.blog.sohu.com/76512115.html</link>
			<comments>http://pigheadss.blog.sohu.com/76512115.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Mon, 14 Jan 2008 10:56:58 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/76512115.html</guid>
			<description><![CDATA[<p>&nbsp;&nbsp;ERP(Enterprise&nbsp;Resource&nbsp;Planning)企业资源计划系统，是指建立在信息技术基础上，以系统化的管理思想，为企业决策层及员工提供决策运行手段的管理平台。&nbsp;<br /><br />　　一天中午，丈夫在外给家里打电话：&ldquo;亲爱的老婆，晚上我想带几个同事回家吃饭可以吗？&rdquo;&nbsp;(订货意向)&nbsp;<br /><br />　　妻子：&ldquo;当然可以，来几个人，几点来，想吃什么菜？&rdquo;&nbsp;<br /><br />　　丈夫：&ldquo;6个人，我们7点左右回来，准备些酒、烤鸭、番茄炒蛋、凉菜、蛋花汤&hellip;&hellip;。你看可吗？&rdquo;&nbsp;(商务沟通)&nbsp;<br /><br />　　妻子：&ldquo;没问题，我会准备好的。&rdquo;&nbsp;(订单确认)&nbsp;<br /><br />　　妻子记录下需要做的菜单&nbsp;(MPS计划)&nbsp;，具体要准备的东西：鸭、酒、番茄、鸡蛋、调料&hellip;&hellip;&nbsp;(BOM物料清单)&nbsp;，发现需要：1只鸭蛋，5瓶酒，4个鸡蛋&hellip;&hellip;&nbsp;(BOM展开)&nbsp;，炒蛋需要6个鸡蛋，蛋花汤需要4个鸡蛋&nbsp;(共用物料)&nbsp;。&nbsp;<br /><br />　　打开冰箱一看&nbsp;(库房)&nbsp;，只剩下2个鸡蛋&nbsp;(缺料)&nbsp;。&nbsp;<br /><br />　　来到自由市场，妻子：&ldquo;请问鸡蛋怎么卖？&rdquo;&nbsp;(采购询价)&nbsp;<br /><br />　　小贩：&ldquo;1个1元，半打5元，1打9.5元。&rdquo;&nbsp;<br /><br />　　妻子：&ldquo;我只需要8个，但这次买1打。&rdquo;&nbsp;(经济批量采购)&nbsp;<br /><br />　　妻子：&ldquo;这有一个坏的，换一个。&rdquo;&nbsp;(验收、退料、换料)&nbsp;<br /><br />　　回到家中，准备洗采、切菜、炒菜&hellip;&hellip;&nbsp;(工艺线路)&nbsp;，厨房中有燃气灶、微波炉、电饭煲&hellip;&hellip;&nbsp;(工作中心)&nbsp;。&nbsp;<br /><br />　　妻子发现拨鸭毛最费时间&nbsp;(瓶颈工序，关键工艺路线)&nbsp;，用微波炉自己做烤鸭可能来不及&nbsp;(产能不足)&nbsp;，于是阅览室在楼下的餐厅里买现成的&nbsp;(产品委外)&nbsp;。&nbsp;<br /><br />　　下午4点，接到儿子的电话：&ldquo;妈妈，晚上几个同学想来家里吃饭，你帮忙准备一下。&rdquo;&nbsp;(紧急订单)&nbsp;<br /><br />　　&ldquo;好的，你们想吃什么，爸爸晚上也有客人，你愿意和他们一起吃吗？&rdquo;&nbsp;<br /><br />　　&ldquo;菜你看着办吧，但一定要有番茄炒鸡蛋，我们不和大人一起吃，6：30左右回来。&rdquo;&nbsp;(不能并单处理)&nbsp;<br /><br />　　&ldquo;好的，肯定让你们满意。&rdquo;&nbsp;(订单确定)&nbsp;<br /><br />　　&ldquo;鸡蛋又不购了，打电话叫小店送来。&rdquo;&nbsp;(紧急采购)&nbsp;<br /><br />　　6：30，一切准备就绪，可烤鸭还没送来，急忙打电话询问：&ldquo;我是李太，怎么订的烤鸭还不送来？&rdquo;&nbsp;(采购委外单跟催)&nbsp;<br /><br />　　&ldquo;不好意思，送货的人已经走了，可能是堵车吧，马上就会到的。&rdquo;&nbsp;<br /><br />　　门铃响了。&nbsp;<br /><br />　　&ldquo;李太太，这是您要的烤鸭。请在单上签一个字。&rdquo;&nbsp;(验收、入库、转应付账款)&nbsp;<br /><br />　　6：45，女儿的电话：&ldquo;妈妈，我想现在带几个朋友回家吃饭可以吗？&rdquo;&nbsp;(呵呵，又是紧急订购意向，要求现货)&nbsp;<br /><br />　　&ldquo;不行呀，女儿，今天妈已经需要准备两桌饭了，时间实在是来不及，真的非常抱歉，下次早点说，一定给你们准备好。&rdquo;&nbsp;(哈哈，这就是ERP的使用局限，要有稳定的外部环境，要有一个起码的提前期)&nbsp;。&nbsp;<br /><br />　　&hellip;&hellip;&nbsp;&hellip;&hellip;&nbsp;<br /><br />　　送走了所有客人，疲惫的妻子坐在沙发上对丈夫说：&ldquo;亲爱的，现在咱们家请客的频率非常高，应该要买些厨房用品了&nbsp;(设备采购)&nbsp;，最好能再雇个小保姆&nbsp;(连人力资源系统也有缺口了)&nbsp;。&nbsp;<br /><br />　　丈夫：&ldquo;家里你做主，需要什么你就去办吧。&rdquo;&nbsp;(通过审核)&nbsp;<br /><br />　　妻子：&ldquo;还有，最近家里花销太大，用你的私房钱来补贴一下，好吗？&rdquo;&nbsp;(最后就是应收货款的催要)&nbsp;<br /><br />　　现在还有人不理解ERP吗？记住，每一个合格的家庭主妇都是生产厂长的有力竞争者。</p>]]></description>
		</item>
		    
		
		<item>
			<title>Log4J使用完全手册</title>
			<link>http://pigheadss.blog.sohu.com/74743713.html</link>
			<comments>http://pigheadss.blog.sohu.com/74743713.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Thu, 27 Dec 2007 10:23:13 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/74743713.html</guid>
			<description><![CDATA[<div>
<h2>一、LOG4J组成</h2></div>
<div>
<p>&nbsp;&nbsp;&nbsp; LOG4J主要由三大组件组成：<br />&nbsp;&nbsp;&nbsp; . Logger: 决定什么日志信息应该被输出、什么日志信息应该被忽略；<br />&nbsp;&nbsp;&nbsp; . Appender: 指定日志信息应该输出到什么地方, 这些地方可以是控制台、文件、网络设备；<br />&nbsp;&nbsp;&nbsp; . Layout: 指定日志信息的输出格式；</p>
<p>&nbsp;&nbsp;&nbsp; 一个Logger可以有多个Appender，也就是说日志信息可以同时输出到多个设备上，每个Appender对应<br />&nbsp;&nbsp;&nbsp; 一种Layout(示例见下图)。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ↗&nbsp; Appender1&nbsp; &rarr;&nbsp; Layout<br />&nbsp;&nbsp;&nbsp;&nbsp; ／&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Logger<br />&nbsp;&nbsp;&nbsp;&nbsp; ﹨ &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ↘&nbsp; Appender2&nbsp; &rarr;&nbsp; Layout</p>
<p><br />二、Logger组件</p>
<p>&nbsp;&nbsp;&nbsp; 1. Logger组件提供的方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger组件是LOG4J的核心组件，它代表了Log4J的日志记录器，它能够对日志信息进行分类筛选。它由org.apache.log4j.Logger类实现，提供了如下方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; package org.apache.log4j;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Logger {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Creation &amp; retrieval methods:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Logger getRootLogger();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Logger getLogger(String name);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // printing methods:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void debug(Object message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void info(Object message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void warn(Object message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void error(Object message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void fatal(Object message);<br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // generic printing method:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(Priority p, Object message);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; 2. 在配置文件中配置Logger组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可在Log4J配置文件中配置自己的Logger组件，示例：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.myLogger=WARN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上代码定义了一个Logger组件，名称为myLogger，日志级别为WARN。<br />&nbsp; <br />&nbsp;&nbsp;&nbsp; 3. 日志级别种类：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一共有五种，级别由高到低依次是：fatal、error、warn、info、debug。获得Logger实例后，我们可调用以下方法之一输出日志信息：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void debug(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出debug级别的日志信息；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void info(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出info级别的日志信息；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void warn(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出warn级别的日志信息；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void error(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出error级别的日志信息；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void fatal(Object message);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //输出fatal级别的日志信息；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void log(Priority p, Object message);//输出参数Priority指定级别的日志信息；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上方法只有当它的级别大于或等于Logger组件配置的日志级别时才调用。以前面我们配置的myLogger为例，它的日志级别为WARN, 那么在程序中，它的warn()、error()、fatal()方法会被执行。对于log()方法，只有当它的参数Priority指定的日志级别大于或等于WARN时，它才会被执行。</p>
<p>&nbsp;&nbsp;&nbsp; 4. 为什么需要对日志进行分级？<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在写程序的时候，为了调试程序，我们会在很多出错的地方输出大量的日志信息。当程序调试完，不需要这些信息时，将程序中这些输出日志信息代码删除吗？这样费时费力，对于大型程序几乎不可行。通过对日志分级，假如不想输出WARN级别的日志信息，则Logger组件的级别调高即可，省时省心。</p>
<p>&nbsp;&nbsp;&nbsp; 5. Logger组件的继承性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J提供了一个root Logger，它是所有Logger组件的&ldquo;祖先&rdquo;,它永远存在，且不能通过名字检索或引用，通过Logger.getRootLogger()方法取得它。配置root Logger代码：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.rootLogger=INFO,console</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可在配置文件中方便地配置存在继承关系的Logger组件，凡是在符号&ldquo;.&rdquo;后面的组件都会成为在符号&ldquo;.&rdquo;前面的Logger组件的子类。例如：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.apache.myLogger=WARN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.apache.myLogger.mySonLogger=,file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上代码中, mySonLogger是myLogger的子类Logger组件。Logger组件的继承关系：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 如果子类Logger组件没有定义日志级别，则将继承父类的日志级别;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 如果子类Logger组件定义了日志级别，就不会继承父类的日志级别;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 黙认情况下，子类Logger组件会继承父类所有的Appender，把它们加入到自己的Appener;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 如果把子类Logger组件的additivity标志设为false，那么它就不会继承父类Appender。additivity标志&nbsp;默认值为false；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上配置的三个Logger继承关系示例如图：<br />&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root Logger: 日志级别=INFO&nbsp; appender清单=console<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &uarr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger: 日志级别=WARN appender清单=null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &uarr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger: 日志级别=null appender清单=file </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这三个Logger组件实际日志级别和Appender如下表：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger组件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日志级别&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Appender清单<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root Logger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INFO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console(继承)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN(继承)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file，console(继承)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />三、Appender组件</p>
<p>&nbsp;&nbsp;&nbsp; Appender组件决定将日志信息输出到什么地方。支持以下目的地：<br />&nbsp;&nbsp;&nbsp; . 控制台(Console);<br />&nbsp;&nbsp;&nbsp; . 文件(File);<br />&nbsp;&nbsp;&nbsp; . GUI组件(GUI component);<br />&nbsp;&nbsp;&nbsp; . 套接口服务器(Remote socket server);<br />&nbsp;&nbsp;&nbsp; . NT的事件记录器(NT Event Logger);<br />&nbsp;&nbsp;&nbsp; . UNIX Syslog守护进程(Remote UNIX Syslog daemon);</p>
<p>&nbsp;&nbsp;&nbsp; 一个Logger可同时对应多个Appender，示例：myLogger配置二个Appender: 一个file, 一个是console：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.logger.myAppender=WARN,file,console</p>
<p>&nbsp;&nbsp;&nbsp; log4j.appender.file=org.apache.log4j.RollingFileAppender<br />&nbsp;&nbsp;&nbsp; log4j.appender.file.File=log.txt</p>
<p>&nbsp;&nbsp;&nbsp; log4j.apender.console=org.apache.log4j.ConsoleAppender</p>
<p>四、Layout组件</p>
<p>&nbsp;&nbsp;&nbsp; Layout组件决定日志输出格式，有以下几种类型：<br />&nbsp;&nbsp;&nbsp; . org.apache.log4j.HTMLLayout(以HTML表格形式布局);<br />&nbsp;&nbsp;&nbsp; . org.apache.log4j.PatternLayout(可以灵活地指定布局模式);<br />&nbsp;&nbsp;&nbsp; . org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串);<br />&nbsp;&nbsp;&nbsp; . org.apache.log4j.TTCCLayout(包含日志产生的时间、线程和类别等信息);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 为名称为console的Appender配置SimpleLayout，代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.appender.console.layout=org.apache.log4j.SimpleLayout</p>
<p>&nbsp;&nbsp;&nbsp; 输出日志格式如下：</p>
<p>&nbsp;&nbsp;&nbsp; WARN - This is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 为名称为file的Appender配置PatternLayout，代码如下：</p>
<p>&nbsp;&nbsp;&nbsp; log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />&nbsp;&nbsp;&nbsp; log4j.appender.file.layout.ConversionPattern=%t %p - %m%n</p>
<p>&nbsp;&nbsp;&nbsp; 输出日志格式如下：</p>
<p>&nbsp;&nbsp;&nbsp; THREAD-1 WARN - This is a log message from the myLogger</p>
<p>&nbsp;&nbsp;&nbsp; PatternLayout让开发者依照ConversionPattern定义输出格式。ConversionPattern中一些指定日志内容和格式的预定义符号说明如下：</p>
<p>&nbsp;&nbsp;&nbsp; 符号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述<br />&nbsp;&nbsp;&nbsp; %r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 自程序开始后消耗的毫秒数<br />&nbsp;&nbsp;&nbsp; %t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示日志记录请求生成的线程<br />&nbsp;&nbsp;&nbsp; %p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示日专语句的优先级<br />&nbsp;&nbsp;&nbsp; %r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与日志请求相关的类别名称<br />&nbsp;&nbsp;&nbsp; %c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日志信息所在的类名<br />&nbsp;&nbsp;&nbsp; %m%n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示日志信息的内容</p>
<p>五、Log4J的基本用法</p>
<p>&nbsp;&nbsp;&nbsp; 1. 定义配置文件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J支持二种配置文件格式：XML和Java属性文件(采用&ldquo;键=值&rdquo;形式)。以下为Java属性文件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式配置文件：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 配置Logger组件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置root Logger语法为：log4j.rootLogger=[priority],appenderName,appenderName,...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置自定义Logger组件语法为：log4j.logger.loggerName=[priority],appenderName,appenderName,...</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中：priority为日志级别，可选值包括FATAL、ERROR、WARN、INFO、DEBUG、ALL；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; appenderName指定Appender组件，可指定多个;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 配置Appender组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置日志信息输出目的地Appender, 语法为：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName=fully.ualified.name.of.appender.class<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.option1=value1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.optionN=valueN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log4J提供的Appender有以下几种：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. org.apache.log4j.ConsoleAppender(控制台);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. org.apache.log4j.FileAppender(文件);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d. org.apache.log4j.RollingFileAppender(文件大小到指定尺寸产生一个新的文件);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e. org.apache.log4j.WriteAppender(将日志信息以流格式发送到任意指定地方);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 配置Layout组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 配置Layout组件语法为：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout=fully.ualified.name.of.appender.class<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout.option1=value1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.layout.optionN=valueN</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面为一配置文件示例，文件名为log4j.properties：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## LOGGERS ##</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #configure root logger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.rootLogger=INFO,console<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define a logger named myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.myLogger=WARN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define a second logger that is a child to myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.logger.myLogger.mySonLogger=,file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## APPENDERS ##</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define an appender named console, which is set to be a ConsoleAppender<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.console=org.apache.log4j.ConsoleAppender</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # define an appender named file, which is set to be a RollingFileAppender<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file=org.apache.log4j.FileAppender<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file.File=log.txt</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ## LAYOUTS ##<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # assian a SimpleLayout to console appender<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.console.layout=org.apache.log4j.SimpleLayout</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # assian a PatternLayout to file appender<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file.layout=org.apache.log4j.PatternLayout<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j.appender.file.layout.ConversionPattern=%t%p-%m%n<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 2. 程序中使用Log4j</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 获得日志记录器：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获得rootLogger：Logger rootLogger=Logger.getRootLogger();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获得自定义Logger：Logger myLogger = Logger.getLogger(&quot;log4j.logger.myLogger&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 读取日志记录器，配置Log4J环境;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. BasicConfigurator.configure(): 自动快速地使用默认Log4J环境;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. Property.configurator.configure(String configFilename): 读取使用Java属性格式的配置文件并配置Log4J环境；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. DOMConfigurator.configure(String filename): 读取XML形式的配置文件并配置LOG4J环境;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 输出日志信息;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在程序代码中需要生成日志的地方，调用Logger的各种输出日志方法输出不同级别的日志，例如：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.debug(&quot;Thie is a log message from the &quot; + myLogger.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面为一使用Log4J的程序，程序名为Test.java：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.log4j.Logger;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.log4j.PropertyConfigurator;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Test {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Get an instance of the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger myLogger = Logger.getLogger(&quot;myLogger&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Get an instance of the childLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger mySonLogger = Logger.getLogger(&quot;myLogger.mySonLogger&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Load the proerties using the PropertyConfigurator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(&quot;log4j.properties&quot;);<br />&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Log Messages using the Parent Logger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.debug(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.info(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.warn(&quot;Thie is a log message from the &quot; +&nbsp; myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.error(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.fatal(&quot;Thie is a log message from the &quot; + myLogger.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.debug(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.info(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.warn(&quot;Thie is a log message from the &quot; +&nbsp; mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.error(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.fatal(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 程序运行结果为:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另在Test.class所在的目录下看到一个log.txt文件，内容如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如将配置文件log4j.properties中语句</p>
<p>&nbsp;log4j.logger.myLogger.mySonLogger=,file</p>
<p>&nbsp;改为</p>
<p>&nbsp;log4j.logger.myLogger.mySonLogger=,file,console</p>
<p>&nbsp;再次运行程序，结果如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger的日志在控制台上输出了二次，这是因为mySonLogger继承了父类console Appender，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本身又定义了一个console Appender, 因而有二个console Appender。</p>
<p>六、在web应用中使用Log4J</p>
<p>&nbsp;&nbsp;&nbsp; 创建一个Servlet，在它初始化方法中读取Log4J配置文件并配置Log4J环境，这个Servlet在Web应用启<br />&nbsp;&nbsp;&nbsp; 动时候被加载和初始化，然后就可在其它Web组件中获取Logger对象并输出日志。</p>
<p>&nbsp;&nbsp;&nbsp; 1. 创建用于配置Log4J环境的Servlet</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import javax.servlet.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import javax.servlet.http.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import java.io.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import java.util.*;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import org.apache.log4j.PropertyConfigurator;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class Log4JServlet extends HttpServlet {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void init() throws ServletException {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = getServletContext().getRealPath(&quot;/&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //getInitParameter(&quot;propfile&quot;)方法从web.xml文件中读取Log4J配置文件的名字&quot;profile&quot;。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String propfile = path + getInitParameter(&quot;propfile&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure(propfile);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该Servlet在web.xml中的配置如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;log4jServlet&lt;/servlet-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;Log4JServlet&lt;/servlet-class&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;propfile&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</p>
<p>&nbsp;&nbsp;&nbsp; 2. 在login.jsp中输出日志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;<a href="mailto:%@page"><font color="#73af1d">%@page</font></a> import=&quot;org.apache.log4j.Logger&quot;%&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;login&lt;/title&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger myLogger = Logger.getLogger(&quot;myLogger&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Logger mySonLogger = Logger.getLogger(&quot;myLogger.mySonLogger&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.debug(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.info(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.warn(&quot;Thie is a log message from the &quot; +&nbsp; myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.error(&quot;Thie is a log message from the &quot; + myLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myLogger.fatal(&quot;Thie is a log message from the &quot; + myLogger.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.debug(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.info(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.warn(&quot;Thie is a log message from the &quot; +&nbsp; mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.error(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mySonLogger.fatal(&quot;Thie is a log message from the &quot; + mySonLogger.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form name=&quot;loginForm&quot; method=&quot;post&quot; action=&quot;dispatcher&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username: &lt;input type=&quot;text&quot; name=&quot;username&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password: &lt;input type=&quot;text&quot; name=&quot;password&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot;&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 3. 发布运行使用Log4J的web应用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1) 将Log4J的JAR文件拷贝至目录：&lt;WEB应用所在目录&gt;/WEB-INF/lib<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) 创建Log4J的配置文件log4j.properties, 存放目录为：&lt;WEB应用所在目录&gt;/WEB-INF。内容同前面配置文件示例。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) 编译Log4JServlet, 存放至目录： &lt;WEB应用所在目录&gt;/WEB-INF/classes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4) 修改web.xml文件，加入以下内容：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;log4jServlet&lt;/servlet-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;Log4JServlet&lt;/servlet-class&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;profile&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/log4j.properties&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5) 启动服务器，访问login.jsp页面，在服务器控制台上看到如下日志：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另在&lt;WEB应用所在目录&gt;/WEB-INF目录下看到一个log.txt文件，内容如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WARN - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ERROR - Thie is a log message from the myLogger.mySonLogger<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FATAL - Thie is a log message from the myLogger.mySonLogger </p></div>]]></description>
		</item>
		    
		
		<item>
			<title>log4j配置详解</title>
			<link>http://pigheadss.blog.sohu.com/74426889.html</link>
			<comments>http://pigheadss.blog.sohu.com/74426889.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Mon, 24 Dec 2007 08:42:57 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/74426889.html</guid>
			<description><![CDATA[log4j配置文件有三个主要的组件：Logger，Appender和Layout，分别为日志类型，日志输出目的地，日志输出格式。 <br />log4j.rootLogger = [level], appenderName, appenderName, ... (level是错误级别，appenderName是输出目的地，本例设为mylog，可以定义多个) <br />level优先级分别为FATAL、ERROR、WARN、INFO、DEBUG 5个级别.通过定义的级别,你可以控制程序中的日志输出.比如在这里定义了ERROR级别,程序中只有FARAL、ERROR 级别的LOG会被输出. <br />log4j.appender.mylog= 输出目的地 (这里的appenderName是在前面定义的,可任意起名) <br />Log4j提供的输出目的地有以下几种: <br />org.apache.log4j.ConsoleAppender(控制台) <br />org.apache.log4j.FileAppender(文件) <br />org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) <br />org.apache.log4j.RollingFileAppender(文件到达指定大小时产生一个新文件) <br />org.apache.log4j.WriterAppender(将日志信息以流格式发送到任何地方) <br /><br />log4j.appender.filelog.File=your file dir <br />log4j.appender.filelog.MaxFileSize=your filesize <br />log4j.appender.mylog.MaxBackupIndex=num设置保存备份文件数量 <br /><br />log4j.appender.appenderName.layout = 布局类型(设置布局类型) <br />Log4j提供的layout有以下4种： <br />org.apache.log4j.HTMLLayout(以HTML表格形式布局) <br />org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) <br />org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) <br />org.apache.log4j.PatternLayout(可以灵活地指定布局模式) <br />如果使用PatternLayout布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下： <br />%m 输出代码中指定的消息 <br />%p 输出优先级,即DEBUG，INFO，WARN，ERROR，FATAL <br />%r 输出自应用启动到输出该log信息耗费的毫秒数 <br />%c 输出所属的类目,通常就是所在类的全名 <br />%t 输出产生该日志事件的线程名 <br />%n 输出一个回车换行符,Windows为&quot;rn&quot;，Unix为&quot;n&quot; <br />%d 输出日志时间,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出:2007年5月17日 19:30:00,000 <br />%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 <br />[QC]是log信息的开头，可以为任意字符，一般为项目简称 <br /><br />程序中并没有直接用到log4j的类，而是使用了commons-logging提供的日志类。commons-logging是为&quot;所有的Java日志实现&quot;提供一个统一的接口，它的功能据说&ldquo;平常弱&rdquo;。 <br />Log(基本记录器)和LogFactory(负责创建Log实例)。当commons-logging.jar被加入到CLASSPATH之后，它会合理地猜测你喜欢的日志工具，然后进行自我设置，用户根本不需要做任何设置。默认的LogFactory是按照下列的步骤去发现并决定那个日志工具将被使用的（按照顺序，寻找过程会在找到第一个工具时中止）: <br />1.寻找当前factory中名叫org.apache.commons.logging.Log配置属性的值 <br />2.寻找系统中属性中名叫org.apache.commons.logging.Log的值 <br />3.如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger) <br />4.如果应用程序运行在jdk1.4的系统中，使用相关的包装类(Jdk14Logger) <br />5.使用简易日志包装类(SimpleLog) ]]></description>
		</item>
		    
		
		<item>
			<title>专业名词解释</title>
			<link>http://pigheadss.blog.sohu.com/71348865.html</link>
			<comments>http://pigheadss.blog.sohu.com/71348865.html#comment</comments>
			<dc:creator>堕落天堂</dc:creator>
			<pubDate>Fri, 23 Nov 2007 17:06:49 +0800</pubDate>
			<category>我的专业</category>
			<guid>http://pigheadss.blog.sohu.com/71348865.html</guid>
			<description><![CDATA[<p>PO(persistant&nbsp;object)&nbsp;持久对象 <br />在o/r映射的时候出现的概念，如果没有o/r映射，没有这个概念存在了。通常对应数据模型(数据库),本身还有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最简单的PO就是对应数据库中某个表中的一条记录，多个记录可以用PO的集合。PO中应该不包含任何对数据库的操作。 <br /><br />VO(value&nbsp;object)&nbsp;值对象 <br />通常用于业务层之间的数据传递，和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要.个人觉得同DTO(数据传输对象),在web上传递。&nbsp;</p>
<p>TO(Transfer&nbsp;Object)，数据传输对象<br />在应用程序不同tie(关系)之间传输的对象&nbsp;<br /><br />BO(business&nbsp;object)&nbsp;业务对象 <br />从业务模型的角度看,见UML元件领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作。&nbsp; <br /><br />POJO(plain&nbsp;ordinary&nbsp;java&nbsp;object)&nbsp;简单无规则java对象<br />纯的传统意义的java对象。就是说在一些Object/Relation&nbsp;Mapping工具中，能够做到维护数据库表记录的persisent&nbsp;object完全是一个符合Java&nbsp;Bean规范的纯Java对象，没有增加别的属性和方法。我的理解就是最基本的Java&nbsp;Bean，只有属性字段及setter和getter方法！。 <br /><br />DAO(data&nbsp;access&nbsp;object)&nbsp;数据访问对象 <br />是一个sun的一个标准j2ee设计模式，这个模式中有个接口就是DAO，它负持久层的操作。为业务层提供接口。此对象用于访问数据库。通常和PO结合使用，DAO中包含了各种数据库的操作方法。通过它的方法,结合PO对数据库进行相关的操作。夹在业务逻辑与数据库资源中间。配合VO, 提供数据库的CRUD操作...&nbsp; <br /><br />O/R&nbsp;Mapper&nbsp;对象/关系&nbsp;映射&nbsp;&nbsp; <br />定义好所有的mapping之后，这个O/R&nbsp;Mapper可以帮我们做很多的工作。通过这些mappings,这个O/R&nbsp;Mapper可以生成所有的关于对象保存，删除，读取的SQL语句，我们不再需要写那么多行的DAL代码了。&nbsp; <br /><br />实体Model(实体模式) <br />DAL(数据访问层) <br />IDAL(接口层) <br />DALFactory(类工厂) <br />BLL(业务逻辑层)&nbsp; <br />BOF&nbsp;&nbsp;&nbsp;&nbsp;Business&nbsp;Object&nbsp;Framework&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业务对象框架 <br />SOA&nbsp;&nbsp;&nbsp;&nbsp;Service&nbsp;Orient&nbsp;Architecture&nbsp;&nbsp;&nbsp;&nbsp;面向服务的设计 <br />EMF&nbsp;&nbsp;&nbsp;&nbsp;Eclipse&nbsp;Model&nbsp;Framework&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eclipse建模框架</p>]]></description>
		</item>
		    
		
	</channel>
</rss>
