﻿<?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--随笔分类-java</title><link>http://www2.blogjava.net/jackstudio/category/9250.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 19:49:01 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 19:49:01 GMT</pubDate><ttl>60</ttl><item><title>各种排序算法java实现 </title><link>http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 15 Dec 2006 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/87971.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/87971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/87971.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 各种排序算法java实现 插入排序:				package				 org.rut.util.algorithm.support;				import				 org.rut.util.algorithm.SortUtil;				/** */										/**																						 * 						@author			...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/87971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-15 16:06 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/15/87971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts,ajax乱码解决方案 </title><link>http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Dec 2006 18:38:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/86629.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/86629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/86629.html</trackback:ping><description><![CDATA[
		<p>
				<font size="2">转载：<a href="/errorfun/archive/2006/12/09/86584.html">http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html</a><br />作者：errorfun<br /><br /><br />乱码问题好像跟我们中国程序员特别有缘，一直困扰着我们，从开始的<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">JSP</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">乱码问题，</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">STRUTS</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">乱码问题，到现在的</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">AJAX</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">乱码问题，无一不是搞得许多程序员焦头烂额的，整天骂</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">XXX</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">产品对中文支持不了，UTF-8无法使用中文啊什么的，其实这里面被骂的产品中其实</font></span><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">99</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体">％以上是对中文支持非常好的，而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行，怎么可能对中文支持不了呢，下面就开始一一帮大家解决这些问题。</font></span></font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />
						<br />1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">、编码</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />      －－</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">想要解决好中文问题，对编码肯定是不能一概不懂了，编码是解决中文乱码问题的根本。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />      </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">编码比较常用的有：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GBK</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">，除了</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">iso-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">之外的其它三个编码都能很好的支持中文，但它们都兼容</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的编码（就是说无论编码怎么改变，只要是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">中的字符，永远不会出现乱码）。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<br />      </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">这四种编码中，</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">是中国规定的汉字编码，也可以说是简体中文的字符集编码</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">;</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GBK </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">的扩展</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">,</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">除了兼容</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB2312</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">外，它还能显示繁体中文，还有日文的假名</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">;</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">而</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UTF-8</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">虽然也支持中文，但却</span>
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">与</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">码不兼容（编码值不同）</span>
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">。</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">使用的是可变长的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">UNICODE</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">编码，编码可能是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">位</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">16</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">进制（即</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">ISO-8859-1</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">中的字符，其编码也是相同的）也有可能是</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">2</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">位或</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">3</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">位的</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">16</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">
						<font face="宋体">进制。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">的优点是：</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">1</span>
				<font face="宋体">
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">、</span>
						<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">与</span>
				</font>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">CPU</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">字节顺序无关</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">可以在不同平台之间交流。</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">2</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">、容错能力高</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">任何一个字节损坏后</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">最多只会导致一个编码码位损失</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">, </span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">不会链锁错误</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">(</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">如</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">GB</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">码错一个字节就会整行乱码</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">)</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">，所以在国际化处理中基本都是建议使用</font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">UTF-8</span>
				<span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'">
						<font face="宋体">作为编码。<br /></font>
				</span>
				<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p>
								<br />2、文件的编码<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br />      －－虽然说只要设置了正确的编码就可以使字符正确显示了，但如果忽略了文件保存时的编码的话，那可是会让你走进迷雾中的。<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br />      文件编码最常使用的有两种：ANSI和UTF-8，光看名字估计你都可以猜到了，ANSI就是我们保存文件时使用的默认编码，而UTF-8则需自己设置。对于编码的改变，我使用的工具是NOTEPAD和ECLIPSE，NOTEPAD使用最简单，只要打开文件后在另存为中选择相应的编码就行了，而且它对编码的支持非常好;而在ECLIPSE中，只要稍微设置一下就行了，打开首选项，然后选择：常规-&gt;内容类型(ContentType)，在右边选中你想改变保存编码的文件类型，然后在下方的缺省编码中改变其值，最后点击更新（UPDATE）按钮即可。<br /></span></span></o:p>
				</span>
		</p>
		<p align="center">
				<img src="http://errorfun.bokee.com/inc/eclipse.png" />
		</p>
		<p align="left">
				<br />
				<br />而在其它的编辑器中，默认保存的内容都是GB2312或者GBK（NOTEPAD中对应ANSI）.而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点，可以知道，如果文件使用了UTF-8，那么字符编码就必须使用UTF-8，否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。（JS和JSP都是这个道理）<br /><br />3、JSP,STRUTS等的中文乱码解决方案<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><br />     其实解决的方法只有一个：</span><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体"></font></span></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000"> request.setCharacterEncoding(encoding);</span>
		</div>
		<p align="left">   方法只有一种，但处理方式就多种多样了，初学者会在JSP页面上直接使用，而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了，网上有很多教程。偷懒一点的，到TOMCAT中复制就行了。在TOMCAT的目录下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 这个类，放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'</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: #0000ff">&lt;</span>
				<span style="COLOR: #800000">filter-mapping</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">filter-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">Set Character Encoding</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">filter-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">servlet-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">servlet-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />  </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">filter-mapping</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p align="left">像上面这样配置的话(可能也是网上大多教程的做法，想当年也是害苦了我)，可能你只有JSP的乱码解决了，要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。</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">&lt;</span>
				<span style="COLOR: #800000">init-param</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">param-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">encoding</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">param-name</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">param-value</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">UTF-8</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">param-value</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">init-param</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p align="left">当然，最重要的是要记得根据前面所说的方法，改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。<br />而在JSP内容中，还是使用如网上教程所说的那种技俩，在所有页面的页首加入：</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: #808080">&lt;%</span>
				<span style="COLOR: #000000">@ page language</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">"java" contentType</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="FONT-WEIGHT: bold; COLOR: #000000">text</span>
				<span style="COLOR: #808080">/</span>
				<span style="COLOR: #000000">html; charset</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">UTF</span>
				<span style="COLOR: #808080">-</span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">8</span>
				<span style="COLOR: #000000">"<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    pageEncoding</span>
				<span style="COLOR: #808080">=</span>
				<span style="COLOR: #000000">"UTF</span>
				<span style="COLOR: #808080">-</span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">8</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #808080">%&gt;</span>
		</div>
		<br />至此，相信JSP,ACTION都不太可能出现乱码了。<br /><br />4、资源文件的乱码解决方案<br />      资源文件谁都知道是国际化支持不可或缺的一部分，如果资源文件都出现乱码了那还了得？其实资源文件的乱码是很好解决的，其原因也是因为使用了UTF-8做为JSP编码后，没有相应地改变资源文件的文件编码造成的，所以只要对资源文件保存的编码进行更正后，乱码问题也就解决了。当然，你的中文要使用 native2ascii 命令进行正确的转换。<br /><br />5、调用JS时，JS内容乱码的解决方案。<br />     其实JS的乱码还是跟文件的编码有关系的，如果JS中有中文的话，那JS文件保存的编码就必须跟调用此JS的页面编码相同，否则，你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的（也是建立在前面的辛苦之下的）。<br /><br />6、AJAX提交数据乱码，返回数据乱码的解决方案<br />     随着AJAX的流行，乱码问题也开始困扰着许多刚开始使用它的程序员，幸好我之前对JSP乱码有过一点研究，在遇到AJAX后，并没有给我带来多大的困扰，在此将我的一些心得共享给大家。<br />     万变不离其宗，AJAX的乱码问题自然跟编码有关了，其实很多人跟我一样想到了对文件编码进行设置，并且在接数据时设置了requet的编码，在返回的数据时设置了response的编码一切都以为会很顺利，可是这一切都是徒劳无功的，讨厌的乱码再一次出现在你眼前。在你试了N多种方法，包括JS自身的escape,unescape方法后，你发现乱码仍然猖狂地出现在屏幕上。<br />    其实在试过这N多方法后，很多人都没发现，解决的方法其实很简单，而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码<br /><span style="FONT-SIZE: 10pt; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana"><font face="宋体"><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"><font size="2"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">xmlhttp.open( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">post</span><span style="COLOR: #000000">"</span></font><font size="2"><span style="COLOR: #000000">, url, async );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />xmlhttp.setRequestHeader( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Type</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html</span><span style="COLOR: #000000">"</span></font><span style="COLOR: #000000"><font size="2"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />xmlhttp.send( params );</font></span></div><br />通过前面的说明，不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响，setRequestHeader并是万年不变的，也没人想过去改它，而问题就正好出在这个地方。回想一个JSP页面内容的编码设置，其中有这么一节： 
<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"><font size="2"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">contentType</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html; charset=UTF-8</span><span style="COLOR: #000000">"</span></font></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"><font size="2"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">xmlhttp.setRequestHeader( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Content-Type</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html;charset=UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></font></div></font></span><font size="2"><br /><font face="宋体">最后别忘了在返回数据时也设置上： </font><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"><font face="宋体"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></font><span style="COLOR: #000000">response.setContentType( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />response.setCharacterEncoding( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );</span></div><br />是不是很简单，一点都不麻烦呢？<br />如果要问为什么的话，其实我们可以把xmlhttp看成是一个临时页面，它由浏览器动态生成，主要作用是在后台获得请求的数据（可以看成是一个高级的iframe）。所以对于普通页面设置的编码，对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知，jsp的最后形态就是servlet，而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话：<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">response.setContentType( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/html</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />response.setCharacterEncoding( </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UTF-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> );</span></div><br />而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存（这跟之后生成的CLASS有关系）。所以在servlet设置response的编码也是理所当然的了。<br /><br />一口气把自己一年以来遇到的乱码问题和解决的方案写出来了，希望对你有所帮助。</font><img src ="http://www.blogjava.net/jackstudio/aggbug/86629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-12-10 02:38 <a href="http://www.blogjava.net/jackstudio/archive/2006/12/10/86629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.</title><link>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 09 Nov 2006 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/80060.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/80060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/80060.html</trackback:ping><description><![CDATA[
		<p>spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn.<br />看一下ContextLoaderListener的源码,这是一个ServletContextListener<br />/**<br />  * Initialize the root web application context.<br />  */<br /> public void contextInitialized(ServletContextEvent event) {<br />  this.contextLoader = createContextLoader();<br />  this.contextLoader.initWebApplicationContext(event.getServletContext());<br /> }<br /> <br />  /**<br />  * Create the ContextLoader to use. Can be overridden in subclasses.<br />  * @return the new ContextLoader<br />  */<br /> protected ContextLoader createContextLoader() {<br />  return new ContextLoader();<br /> }</p>
		<p> contextLoader的源码<br /> public WebApplicationContext initWebApplicationContext(ServletContext servletContext)<br />   throws BeansException {</p>
		<p>  long startTime = System.currentTimeMillis();<br />  if (logger.isInfoEnabled()) {<br />   logger.info("Root WebApplicationContext: initialization started");<br />  }<br />  servletContext.log("Loading Spring root WebApplicationContext");</p>
		<p>  try {<br />   // Determine parent for root web application context, if any.<br />   ApplicationContext parent = loadParentContext(servletContext);</p>
		<p>   WebApplicationContext wac = createWebApplicationContext(servletContext, parent);<br />   servletContext.setAttribute(<br />     WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);</p>
		<p>   if (logger.isInfoEnabled()) {<br />    logger.info("Using context class [" + wac.getClass().getName() +<br />      "] for root WebApplicationContext");<br />   }<br />   if (logger.isDebugEnabled()) {<br />    logger.debug("Published root WebApplicationContext [" + wac +<br />      "] as ServletContext attribute with name [" +<br />      WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE + "]");<br />   }</p>
		<p>   if (logger.isInfoEnabled()) {<br />    long elapsedTime = System.currentTimeMillis() - startTime;<br />    logger.info("Root WebApplicationContext: initialization completed in " + elapsedTime + " ms");<br />   }</p>
		<p>   return wac;<br />  }<br />  catch (RuntimeException ex) {<br />   logger.error("Context initialization failed", ex);<br />   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ex);<br />   throw ex;<br />  }<br />  catch (Error err) {<br />   logger.error("Context initialization failed", err);<br />   servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, err);<br />   throw err;<br />  }<br /> }<br /> 注意WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,这里面放了WebApplicationContext,需要使用时从ServletContext取出<br /> 可以使用WebApplicationContextUtils得到WebApplicationContext<br /> public static WebApplicationContext getWebApplicationContext(ServletContext sc) {<br />  Object attr = sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);<br />  if (attr == null) {<br />   return null;<br />  }<br />  if (attr instanceof RuntimeException) {<br />   throw (RuntimeException) attr;<br />  }<br />  if (attr instanceof Error) {<br />   throw (Error) attr;<br />  }<br />  if (!(attr instanceof WebApplicationContext)) {<br />   throw new IllegalStateException("Root context attribute is not of type WebApplicationContext: " + attr);<br />  }<br />  return (WebApplicationContext) attr;<br /> }<br /> 关键的问题在于struts如何启动的spring的,ContextLoaderPlugIn的源码<br /> <br /> // Publish the context as a servlet context attribute.<br />  String attrName = getServletContextAttributeName();<br />  getServletContext().setAttribute(attrName, wac);<br /> <br /> public String getServletContextAttributeName() {<br />  return SERVLET_CONTEXT_PREFIX + getModulePrefix();<br /> }<br /> 不同加载的Key竟然不同,原因就是WebApplicationContext放在那里的问题,可spring调用的时候会根据WebApplicationContext里面定义的那个名字去找的,问题出在这里</p>
		<p>
				<br /> 在struts-config.xml中配置<br />    &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;<br />      &lt;set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /&gt;<br />    &lt;/plug-in&gt;</p>
		<p>    &lt;controller&gt;<br />        &lt;set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" /&gt;<br />    &lt;/controller&gt;</p>
		<p>
				<br /> 原理是这样的,Struts虽然只能有一个ActionServlet实例,但是对于不同的子应用分别能有自己的RequestProcessor实例每个RequestProcessor实例分别对应不同的struts配置文件。<br />   子应用的ProcessorClass类必须重写一般就是继承RequestProcessor类，然后再其配置文件的controller元素中的&lt;processorClass&gt;属性中作出修改。那么当<br />  getRequestProcessor(getModuleConfig(request)).process(request,response);就能根据request选择相应的moduleconfig,再根据其&lt;processorClass&gt;属性选择相应的RequestProcessor子类来处理相应的请求了。</p>
		<p> </p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/80060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-11-09 10:40 <a href="http://www.blogjava.net/jackstudio/archive/2006/11/09/80060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用ServletContextListener在服务器启动和关闭时创建和关闭缓存</title><link>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 09 Nov 2006 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/80058.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/80058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/80058.html</trackback:ping><description><![CDATA[
		<div class="con_sample">
				<p>ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志，转发请求。每一个 Web 应用程序含有一个Context，被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享，所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存，所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。</p>
		</div>
		<div class="con_all">
				<p>
				</p>
				<p>ServletContext 被 Servlet 程序用来与 Web 容器通信。例如写日志，转发请求。每一个 Web 应用程序含有一个Context，被Web应用内的各个程序共享。因为Context可以用来保存资源并且共享，所以我所知道的 ServletContext 的最大应用是Web缓存----把不经常更改的内容读入内存，所以服务器响应请求的时候就不需要进行慢速的磁盘I/O了。 </p>
				<p>ServletContextListener 是 ServletContext 的监听者，如果 ServletContext 发生变化，如服务器启动时 ServletContext 被创建，服务器关闭时 ServletContext 将要被销毁。 </p>
				<p>在JSP文件中，application 是 ServletContext 的实例，由JSP容器默认创建。Servlet 中调用 getServletContext()方法得到 ServletContext 的实例。 </p>
				<p>我们使用缓存的思路大概是： </p>
				<ol>
						<li>
								<p>服务器启动时，ServletContextListener 的 contextInitialized()方法被调用，所以在里面创建好缓存。可以从文件中或者从数据库中读取取缓存内容生成类，用 ervletContext.setAttribute()方法将缓存类保存在 ServletContext 的实例中。 </p>
						</li>
						<li>
								<p>程序使用 ServletContext.getAttribute()读取缓存。如果是 JSP，使用a pplication.getAttribute()。如果是 Servlet，使用 getServletContext().getAttribute()。如果缓存发生变化(如访问计数)，你可以同时更改缓存和文件/数据库。或者你等 变化积累到一定程序再保存，也可以在下一步保存。 </p>
						</li>
						<li>
								<p>服务器将要关闭时，ServletContextListener 的 contextDestroyed()方法被调用，所以在里面保存缓存的更改。将更改后的缓存保存回文件或者数据库，更新原来的内容。 </p>
						</li>
				</ol>
				<pre>import User; //my own class<br />import DatabaseManager; // my own class<br />import javax.servlet.ServletContext;<br />import javax.servlet.ServletContextListener;<br /><br />public class MyContextListener<br /><br />	implements ServletContextListener {<br />	private ServletContext context = null;<br /><br />	public void contextInitialized(ServletContextEvent event) {<br />		context = event.getServletContext();<br />		User user = DatabaseManager.getUserById(1);<br />		context.setAttribute("user1", user);<br />	}<br /><br />	public void contextDestroyed(ServletContextEvent event) {<br />		User user = (User)context.getAttribute("user1");<br />		DatabaseManager.updateUserData(user);<br />		this.context = null;<br />	}<br />}<br /></pre>
				<h3 class="para">布署 ServletContextListener</h3>
				<p>你实现(implements)了 ServletContextListener 编译后，把它放在正确的WEB-INF/classes目录下，更改WEB-INF目录下的 web.xml文件，在web-app节点里添加 </p>
				<pre>&lt;listener&gt;<br />	&lt;listener-class&gt;MyServletContextListener&lt;/listener-class&gt;<br />&lt;/listener&gt;<br /></pre> 来自：<a href="http://www.ideawu.net/ideablog/">idea's blog</a></div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/80058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-11-09 10:39 <a href="http://www.blogjava.net/jackstudio/archive/2006/11/09/80058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB轻松进阶</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 23 Oct 2006 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76764.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76764.html</trackback:ping><description><![CDATA[转载：<a href="http://dev.21tx.com/java/ejb/">http://dev.21tx.com/java/ejb/</a><br /><br /><strong>编写第一个EJB应用程序 <br /><br /></strong>　　 搞清了基本的分布式对象应用程序机理，下面我们就来实地做一个简单的EJB应用程序，一步一步找着做，你会发现——它真的不难！ <br /><br />　　 EJB中的Beans有两种，一种是会话Bean（SessionBean），一种是实体Bean（EntityBean）。其中，SessionBean又分为有状态（Stateful）和无状态（Stateless）两种，EntityBean又分为容器管理（Container Managed）和自管理（Bean Managed）两种。我们要做的第一个EJB应用程序是：写一个无状态会话Bean（Stateless SessionBean）。 <br /><br /><strong>这个程序的功能是： </strong>实现一个远程加密、解密演示系统，用户把一段明文发到<a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a>端，服务器端执行一定的加密算法（按先后顺序倒排）得到密文，然后把加密完成后的密文发到客户端显示给用户；用户还可发一段加密后的密文到服务器端，服务器端执行一定的解密算法（倒排）得到明文，然后回传显示给用户。 <br /><br /><strong>注： </strong>这里使用的是<a href="http://dev.21tx.com/os/windows/" target="_blank"><font color="#3366cc">Windows</font></a>平台，并且假定<a href="http://dev.21tx.com/java/base/jdk/" target="_blank"><font color="#3366cc">JDK</font></a>已经装好，并且认为你至少是编过一个<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>程序的程序员。 <br /><br /><strong>第一步 <a href="http://dl.21tx.com/" target="_blank"><font color="#3366cc">下载</font></a>、安装<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a>开发工具箱 </strong><br /><br />　　 编写EJB应用程序必须下载相关的工具箱才行，作为学习试验之用，不须采用很高档的<a href="http://dev.21tx.com/java/as/" target="_blank"><font color="#3366cc">应用服务器</font></a>（比如：<a href="http://dev.21tx.com/web/" target="_blank"><font color="#3366cc">Web</font></a>Logic、WebSphere等），只需采用SUN公司提供的免费开发包就可以了，下载地址为：ftp://202.116.77.69/development/Java/j2sdkee1.2/j2sdkee-img_java ejb/2_1-win.exe。 <br /><br />　　 下载后执行这个应用程序，即可完成J2EESDK的本地安装（假定安装在C:\j2sdkee1.3目录）。安装之后还不能立刻用，需要把C:\j2sdkee1.3\lib\j2ee.jar加到系统的ClassPath变量中去，装过JDK的朋友对此肯定不会陌生。做完这些后，最终系统的ClassPath应该至少有.;C:\j2sdk1.4.0-beta3\lib\tools.jar; C:\j2sdk1.4.0-beta3\lib\dt.jar;C:\j2sdkee1.3\lib\j2ee.jar这几项。 <br /><br />　　 然后，把C:\j2sdkee1.3\bin目录加到系统的Path变量中，也就是说，系统的Path变量至少应该有%PATH%;C:\j2sdkee1.3\bin;C:\j2sdk1.4.0-beta3\bin这几项。 <br /><br />以上两步其实和配置<a href="http://dev.21tx.com/java/j2se/" target="_blank"><font color="#3366cc">J2SE</font></a>的方法类似，配过JDK的朋友一定不陌生。<br /><br /><strong>第二步 建立应用程序目录结构 </strong><br /><br />　　 如你所知的，Java程序中目录结构是很重要的，因为Java中的包（package）是与目录相关的，同时，目录结构不同，程序打包生成（jar）的结构也不同，所以必须引起重视。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16262.gif" border="1" /></p>　　 我们编写的第一个EJB应用程序的目录结构如图二所示，由上可见，所有的java程序都放在securitybeans目录下（它们都属于一个名为securitybeans的package）。客户代码主要由<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>和html文件组成：musecurityjsp.html文件为静态网页，主要用于显示系统的首页，提供用户输入明文/密文的界面，并负责把用户输入的内容提交给下一个页面（SecuriryProcessPage.jsp）；SecurityProcessPage.jsp文件为用JSP（Java Server Pages）编写的动态网页，主要用于生成EJB对象实例，并向EJB对象发送加密/解密请求，并在页面上显示加密/解密结果供用户浏览。<br /><br /><br /><strong> 编写EJB代码 <br /><br /></strong>　　 由前述的目录结构可知，EJB代码包括三个<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>文件。 <br /><br />　　 1、Security.java是一个接口，它定义了基本的加密、解密调用接口。注意，由于Security接口可生成EJB对象，所以它必须继承自EJBObject接口。其源代码如下： <br /><br />文件“Security.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.EJBObject; <br /><br />public interface Security extends EJBObject <br /><br />{ <br /><br />public String encrypt( String strSource ) throws RemoteException; <br /><br />public String decrypt( String strTarget ) throws RemoteException; <br /><br />}/* Security */ <br /><br />　　 2、SecurityHome接口可生成EJBHome对象，它负责直接与客户打交道，接收客户的请求，返回处理结果。在EJB规范中，SecurityHome必须继承自EJBHome接口。其源代码如下： <br /><br />文件“SecurityHome.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.EJBHome; <br /><br />import javax.ejb.CreateException; <br /><br />public interface SecurityHome extends EJBHome <br /><br />{ <br /><br />Security create() throws CreateException, RemoteException; <br /><br />}/* EJBHome */ <br /><br />　　 3、SecurityBean类才是真正做“正事”的类，它负责对SecurityHome对象传来的字符串执行加密、解密算法，将得到的结果返回给SecurityHome对象。它是一个Stateless SessionBean，按照EJB规范，必须实现SessionBean接口。其源代码如下： <br /><br />文件“ScurityBean.java” <br /><br />package securitybeans; <br /><br />import java.rmi.RemoteException; <br /><br />import javax.ejb.SessionBean; <br /><br />import javax.ejb.SessionContext; <br /><br />public class SecurityBean implements SessionBean <br /><br />{ <br /><br />public String encrypt( String strSource ) <br /><br />{ <br /><br />String strTarget = ""; <br /><br />for ( int i = strSource.length() - 1; i &gt;= 0; i -- ) <br /><br />{ <br /><br />strTarget += strSource.charAt( i ); <br /><br />}//for <br /><br /><br />return strTarget; <br /><br />}//encrypt() <br /><br /><br />public String decrypt( String strTarget ) <br /><br />{ <br /><br />String strSource = ""; <br /><br /><br />for ( int i = strTarget.length() - 1; i &gt;= 0; i -- ) <br /><br />{ <br /><br />strSource += strTarget.charAt( i ); <br /><br />}//for <br /><br /><br />return strSource; <br /><br />}//decrypt() <br /><br /><br />public void ejbActivate() {}//ejbActivate() <br /><br />public void ejbRemove() {}//ejbRemove() <br /><br />public void ejbPassivate() {}//ejbPassivate() <br /><br />public void setSessionContext( SessionContext sc ) {}//setSessionContext() <br /><br />public void ejbCreate() {}//ejbCreate() <br /><br />public void ejbLoad() {}//ejbLoad() <br /><br />public void ejbStore() {}//ejbStore() <br /><br />}/* SecurityBean */ <br /><br />　　 SecurityBean中的ejbActivate()、ejbPassivate()等方法都是SessionBean接口中的方法，由于本程序中这里不需要有实际内容，因此直接实现它就可以了。<br /><br /><br /><strong>编写客户代码 <br /><br /></strong>　　 便完了EJB代码，下面我们来写客户代码。 <br /><br />　　 1、mysecurity<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>.html文件用于显示一个静态的网页，它提供了用户录入明文/密文的界面，使用户能够录入自己的内容然后提交给<a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a>端。其源代码如下： <br /><br />文件mysecurityjsp.html <br /><br />&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; TITLE &gt;EJB示例：数据加密、解密演示系统&lt; /TITLE &gt; <br />&lt; /HEAD &gt; <br />&lt; BODY BACKGROUND="bg.gif" &gt; <br /><br />&lt; CENTER &gt; <br /><br />&lt; H1 &gt;数据加密解密演示系统&lt; IMG SRC="duke.gif" &gt;&lt; /H1 &gt; <br />&lt; BR &gt;&lt; BR &gt;&lt; BR &gt; <br />&lt; FORM METHOD="GET" ACTION="SecurityJSPAlias" &gt; <br />&lt; TABLE WIDTH="700" HEIGHT="300" BORDER="1" &gt; <br />&lt; TR &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; H2 &gt;——加密请求窗——&lt; /H2 &gt; <br />&lt; P &gt; <br />请输入明文： <br />&lt; P &gt; <br />&lt; INPUT TYPE="TEXT" NAME="SOURCECONTENT" &gt;&lt; /INPUT &gt; <br />&lt; P &gt; <br />&lt; INPUT TYPE="SUBMIT" VALUE=" 提 交 " &gt; <br />&lt; INPUT TYPE="RESET" VALUE=" 重 置 " &gt; <br />&lt; /TD &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; H2 &gt;——解密请求窗——&lt; /H2 &gt; <br />&lt; P &gt; <br />请输入密文： <br />&lt; P &gt; <br />&lt; INPUT TYPE="TEXT" NAME="TARGETCONTENT" &gt;&lt; /INPUT &gt; <br />&lt; P &gt; <br />&lt; INPUT TYPE="SUBMIT" VALUE=" 提 交 " &gt; <br />&lt; INPUT TYPE="RESET" VALUE=" 重 置 " &gt; <br />&lt; /TD &gt; <br />&lt; /TR &gt; <br />&lt; /TABLE &gt; <br />&lt; /FORM &gt; <br /><br />&lt; /CENTER &gt; <br /><br />&lt; /BODY &gt; <br />&lt; /HTML &gt; <br /><br />　　 2、SecurityProcessPage.jsp文件是用JSP编写的动态网页，它用于处理mysecurityjsp.html提交过来的内容，并查找、生成EJBHome对象，发送加密/解密请求，并将结果传回客户端。其源代码如下： <br /><br />文件“SecurityProcessPage.jsp” <br /><br />&lt; %@ page language="<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>" info="数据加密解密信息处理系统" % &gt; <br />&lt; %@ page import="java.rmi.*" % &gt; <br />&lt; %@ page import="javax.naming.*" % &gt; <br />&lt; %@ page import="javax.rmi.PortableRemoteObject" % &gt; <br />&lt; %@ page import="securitybeans.*" % &gt; <br /><br />&lt; HTML &gt; <br />&lt; HEAD &gt; <br />&lt; TITLE &gt;EJB示例：数据加密、解密演示系统&lt; /TITLE &gt; <br />&lt; /HEAD &gt; <br />&lt; % <br />SecurityHome shMain = null; <br />Try <br />{ <br />shMain = ( SecurityHome )PortableRemoteObject.narrow( new InitialContext().lookup( "mysecurity" ), SecurityHome.class ); <br />}//try <br />catch( NamingException ne ) <br />{ <br />ne.printStackTrace(); <br />}//catch <br />Security security = shMain.create(); <br />% &gt; <br />&lt; BODY BACKGROUND="bg.gif" &gt; <br />&lt; CENTER &gt; <br />&lt; H1 &gt;数据加密解密演示系统&lt; IMG SRC="duke.gif" &gt;&lt; /H1 &gt;&lt; BR &gt;&lt; BR &gt;&lt; BR &gt; <br />&lt; TABLE WIDTH="700" HEIGHT="300" BORDER="1" &gt; <br />&lt; TR &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; % <br />if ( request.getParameter( "SOURCECONTENT" ) != null ) <br />{ <br />% &gt; <br />加密生成的密文为：&lt; BR &gt; <br />&lt; %= security.encrypt( request.getParameter( "SOURCECONTENT" ) ) % &gt; <br />&lt; % <br />}//if <br />% &gt; <br />&lt; /TD &gt; <br />&lt; TD ALIGN="CENTER" &gt; <br />&lt; % <br />if ( request.getParameter( "TARGETCONTENT" ) != null ) <br />{ <br />% &gt; <br />解密生成的明文为：&lt; BR &gt; <br />&lt; %= security.encrypt( request.getParameter( "TARGETCONTENT" ) ) % &gt; <br />&lt; % <br />}//if <br />% &gt; <br />&lt; /TD &gt; <br />&lt; /TR &gt; <br />&lt; /TABLE &gt; <br />&lt; /CENTER &gt; <br />&lt; /BODY &gt; <br />&lt; /HTML &gt; <br /><br /><br /><strong>运行第一个EJB应用程序 <br /><br /></strong>　　 一个完整的EJB应用程序已经写完了，但是事情还远没有完结。要使一个EJB应用程序能够运行，还有很多事情要做。并且，可能这些事情的工作量并不比编程序本身小多少。 <br /><br /><strong>第一步 编译EJB代码 </strong><br /><br />　　 html和<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>代码是不需编译的，但securitybeans目录下的三个.<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>文件必须编译成.class文件才可运行。由于三个Java文件属于一个包，所以要进行联编。 <br /><br /><strong>第二步 启动<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a><a href="http://www.21tx.com/server/" target="_blank"><font color="#3366cc">服务器</font></a></strong><br /><br />　　 打开一个DOS Shell窗口，键入j2ee –verbose，稍候片刻，当屏幕出现提示“J2EE server startup complete”时，表示j2eesdk自带的J2EE服务器启动成功了。 <br /><br /><strong>第三步 打开配置工具 </strong><br /><br />　　 打开一个DOS Shell窗口（如果你现每次打开一个新的DOS Shell窗口麻烦，可以在前一步中键入start j2ee –verbose，即可自动弹出一个新的窗口，而原窗口不变），键入deploytool，稍候片刻，即可启动j2eesdk自带的配置工具。Deploytool的启动画面如图三所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16253.jpg" width="500" /><br />图三 deploytool的启动画面</p><strong>新建一个Application </strong><p align="center"><strong><img src="http://image.21tx.com/image/20050421/16239.jpg" width="500" /><br /></strong>图四 新建一个Application </p><br />　　 点击deploytool的File菜单－&gt;New－&gt;Application，在弹出的对话框中选中SecurityApp所在的目录，并在Display Name中输入任意一个你想在界面上看到的这个应用程序的名称（比如：SecurityApp）。 <br /><br /><strong>第五步 新建一个Ent<a href="http://dev.21tx.com/corp/solution/erp/" target="_blank"><font color="#3366cc">ERP</font></a>rise Bean </strong><br /><br />　　 下面就将进入比较关键的部分！ <br /><br />　　 点击deploytool的File菜单－&gt;New－&gt;Enterprise Bean，将弹出一个New Enterprise Bean Wizard。点击Next按钮略过第一个界面，在第二个界面中输入JAR Display Name为“SecurityJar”，并点击Edit按钮，在弹出的对话框中将securitybeans目录下的三个.<a href="http://dev.21tx.com/java/" target="_blank"><font color="#3366cc">Java</font></a>编译后生成的.class文件加入到SecurityJar的内容中去，如图五所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16248.jpg" /><br />图五 将.class文件添加到SecurityJar中</p><br />　　 点击Next到第三个界面，注意： <br /><br />1. 选中Session为Stateless（缺省为Stateful）； <br /><br />2. 输入Enterprise Bean Name为SecurityBean； <br /><br />3. 选择Enterprise Bean Class为securitybeans.SecurityBean； <br /><br />4. 选择Remote Home Interface为securitybeans.SecurityHome； <br /><br />5. 选择Remote Interface为securitybeans.Security。 <br /><br />　　 至此关键的步骤就完成了，以下几个界面你大可以放心的“Next”了。至最后一个界面点击Finish按钮，即完成了一个Enterprise Bean的添加工作。 <br /><br /><br /><strong>新建一个</strong><a href="http://dev.21tx.com/web/" target="_blank"><font color="#3366cc"><strong>Web</strong></font></a><strong> Component <br /><br />这个步骤与上一步骤类似 </strong><br /><br />　　 点击deploytool的File菜单－&gt;New－&gt;Web Component，将弹出一个New Web Component Wizard。点击Next按钮略过第一个界面，在第二个界面中输入WAR Display Name为“SecurityWar”，并点击Edit按钮，在弹出的对话框中将ClientCode目录下的几个客户代码文件加入到SecurityWar的内容中去，如图六所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16219.jpg" /><br />图六 将ClientCode目录下的文件添加到SecurityJar中 </p><br />　　 点击Next进入第三个界面，选择the type of web component you are creating为<a href="http://dev.21tx.com/java/jsp/" target="_blank"><font color="#3366cc">JSP</font></a>。点击Next进入第四个界面，注意： <br /><br />1、 选中JSP FileName为SecurityProcessPage.jsp； <br /><br />2、 输入Web Component Name为SecurityProcessPage。 <br /><br />　　 两次点击Next按钮进入第五个界面，点击Add按钮，给该Web Component添加一个别名为SecurityAlias。 <br /><br />　　 至此主要的步骤就完成了，以下几个界面只需放心点击Next按钮即可，至最后一个界面，点击Finish按钮，即完成了一个Web Component的添加工作。 <br /><br /><strong>第七步 修改JNDI和RootContext </strong><br /><br />　　 添加完了两个主要的组件之后，还要修改两个配置，才能最后完成EJB的配置。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16227.jpg" /><br />图七 SecurityApp的JNDI Names标签页的设置 </p><br />　　 在deploytool主界面左边的树形结构中点击SecurityApp节点，主界面的右边就会显示出四个标签页。在这四个标签页中，JNDI Names标签页需加上mysecurity为JNDI Name，如图七所示；WebContext标签页中需加上SecurityRoot为SecurityWar的ContextRoot，如图八所示。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16230.jpg" /><br />图八 SecurityApp的Web Context标签页的设置 </p><br /><strong>第八步 校验<a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc">J2EE</font></a>应用程序 </strong><br /><br />　　 完成以上七个步骤后，整个EJB的配置工作就基本完成了，下面只需简单两个步骤就大功告成，不过也要做好功亏一篑的准备！ <br /><br />　　 在deploytool主界面左边的树形结构中点击SecurityApp节点，再点击deploytool的Tools菜单－&gt;Verifier…菜单项，在弹出窗口中点击OK按钮，deploytool将自动对EJB应用程序进行测试校验，检查有没有配置错误。稍候片刻，如果提示“There were no failed tests.”，则恭喜你大功告成。如果提示有错，则需要返回去仔细重新检查一步步配置，看看有没有地方疏漏了。配置错误可是很容易出的哟，你要有思想准备。<br /><br /><br /><br /><strong>发布</strong><a href="http://dev.21tx.com/java/j2ee/" target="_blank"><font color="#3366cc"><strong>J2EE</strong></font></a><strong>应用程序 <br /><br /></strong>　　 如果通过了第八步，则第九步就完全是例行公事了。 <br /><br />　　 点击deploytool的Tools菜单－&gt;Deploy…菜单项，会弹出一个发布向导对话框窗口，只管放心点击Next到最后一个界面，至最后一个界面点击“Finish”按钮，等待Deployment Progress至最后完成，如图九所示，就彻底搞定了！ <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16207.jpg" /><br />图九 发布完成后的Deployment Progress </p><br /><strong>第十步 欣赏程序运行效果 </strong><br /><br />　　 接下来打开一个浏览器窗口，输入http://localhost:8000/SecurityRoot，就可以欣赏到你第一个EJB应用程序的运行效果了。 <br /><br />　　 第一个页面如图十所示，显示的是一个数据录入页面，用户可录入一些想要加密/解密的内容，点击提交按钮就可到下一个页面。 <br /><br />　　 第二个页面如图十一所示，显示的是对用户请求内容的加密/解密处理结果。 <br /><p align="center"><img src="http://image.21tx.com/image/20050421/16211.jpg" width="500" /><br />图十 运行效果第一个页面（加密/解密请求窗） <br /><br /><img src="http://image.21tx.com/image/20050421/16215.jpg" width="500" /><br />图十一 运行效果第二个页面（加密/解密结果显示页） </p><br />　　 万事开头难，有了第一个EJB应用程序运行通过的体验，以后就好办了。希望本文能为你开个好头！ <br /><br /><img src ="http://www.blogjava.net/jackstudio/aggbug/76764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-23 15:24 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/23/76764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaMail 深入浅出</title><link>http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Mon, 23 Oct 2006 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/76762.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/76762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/76762.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JavaMail 深入浅出																																    我干软件开发也有一点的年头了,回头想想,也经历了不少的酸甜苦辣,为解决了复杂的问题快乐过.也为不分昼夜的加班赶工程郁闷过.不过这些都没能减少我对计算机的热情,我对程序的喜好.以前对JavaMail也有一些学习性的认识,不过一直没在实际的项目中应用过.直到最近的一个项目,需要Java...&nbsp;&nbsp;<a href='http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html'>阅读全文</a><img src ="http://www.blogjava.net/jackstudio/aggbug/76762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-10-23 15:10 <a href="http://www.blogjava.net/jackstudio/archive/2006/10/23/76762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅论taglib设计 </title><link>http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Sep 2006 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68675.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68675.html</trackback:ping><description><![CDATA[
		<h2>
				<a id="viewpost1_TitleUrl" href="http://www.cnblogs.com/xchunyu/archive/2004/09/28/47472.html">浅论taglib设计</a>
		</h2>
		<p>
				<strong>[概述]<br /></strong>
				<br />Taglib是JSP比较高级的技术。做为JSP开发人员来讲，不了解taglib是可以接受的。因为JSP的风格或者JAVA的风格就是一种简洁的美。如果技术太过复杂或者繁琐，就会在技术的汪洋中失去自我。<br /><br />但是，当我们的项目变得越来越大，或者团队有了一些技术积累之后，很自然就会有将我们的开发工作提高一个层次的需要。当我们面对一些非常类似的界面或者程序单元的时候，我们会想到把这样的工作成果直接用于下一个项目。这样的问题可以由taglib来解决。<br /><br />到此还没有真正说明一下taglib是什么。只要你从事过JSP的开发工作，你就已经使用过taglib了。只不过是在不知不觉中使用的。你一定不会忘记 &lt;jsp:include /&gt;标记。实际上这就是一个taglib。Taglib直译做标记库，是JSP定义给开发人员可以使用自行定义的标记体系。也就是说，开发人员可以在JSP中使用自己定义的特殊标记。而该标记可以用作特定的用途。比如显示一个每个页都需要的公司版权信息。就可以不用复制粘贴相同的代码到每个页去了。<br /><br />但是taglib可以完成的工作远远不止这些。由于每个自定义标记一定是一个完全的JAVA类，我们可以定义非常丰富的一组行为，并且可以通过自定义的attribute来控制它。<br /><br /><strong>[实例]</strong><br /><br />我习惯用实例来说明问题。大家也许都对用户会话状态的检查不陌生。当用户登录到系统后，我们希望自动保持用户的登录状态。而这个过程在每个需要认证用户才能访问的程序单元都需要实现。通常我们需要访问预定义的session服务器变量，当这个变量不满足某值时即判定改用户为非法访问或者会话状态丢失。<br /><br />我们来看一下使用taglib如何实现。我们需要编写一个仅处理该逻辑的标记。实现的最简单的逻辑：检查用户状态session值，不满足某值时即将用户转向一个预先设置的报错页。<br /><br />以下是源码(CheckSessionTag.java)：<br />(省略了细节)</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia" size="2">
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">public class CheckSessionTag extends TagSupport<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    public </span>
										<span style="COLOR: #0000ff">int</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000"> doEndTag()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">try</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            String member_id </font>
						</span>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> (String) pageContext.getSession().getAttribute(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">member_id</span>
										<span style="COLOR: #000000">"</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">if</span>
										<span style="COLOR: #000000">(member_id </span>
										<span style="COLOR: #000000">==</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">null</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">||</span>
										<span style="COLOR: #000000"> member_id.equals(</span>
										<span style="COLOR: #000000">""</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">))<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />                pageContext.forward(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">/home/check_session_fail.jsp</span>
										<span style="COLOR: #000000">"</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">);<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">catch</span>
								</font>
						</font>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">(Exception e)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />            </span>
										<span style="COLOR: #008000">//</span>
										<span style="COLOR: #008000"> 报告异常过程省略.</span>
								</font>
						</font>
						<span style="COLOR: #008000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								</font>
						</span>
						<font size="2">
								<font face="Georgia">
										<span style="COLOR: #000000">        }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">return</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<font face="Georgia" size="2"> EVAL_PAGE;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />}</font>
						</span>
				</div>
		</div>
		<p>
				<br />
				<br />
				<strong>[分析]</strong>
				<br />
				<br />在以上源码中，我们在使tag自动检查用户session变量中的"member_id"值，如果该值为空，则立即判定用户没有访问权限，则立即将流程导向一个预先设定的报错页：/home/check_session_fail.jsp.<br /><br />类CheckSessionTag派生自：TagSupport(javax.servlet.jsp.tagext.TagSupport). 是一个从JAVA 1.3就开始支持的类库，位于servlet.jar包。java文档给出的描述是：<br /><br />A base class for defining new tag handlers implementing Tag. The TagSupport class is a utility class intended to be used as the base class for new tag handlers. The TagSupport class implements the Tag and IterationTag interfaces and adds additional convenience methods including getter methods for the properties in Tag. TagSupport has one static method that is included to facilitate coordination among cooperating tags. Many tag handlers will extend TagSupport and only redefine a few methods.<br />(该类为所有taglib的基类。该类定义了实现标记的一系列接口。)<br /><br />在实例CheckSessionTag类中，我们仅仅重写了doEndTag方法。没有向其容器：jsp页输出任何东西。但是该类在实际应用中是切实可行的。<br /><br />以下是在一个成品项目中的某jsp中截取的片断：<br />&lt;logic:checkSession /&gt;<br /><br />当我们直接使用输入url的方式访问本页时，我们被立即带到了报告：用户会话状态丢失或者未经登录的页。<br />这就省却了我们习以为常的一项工作：以前我们必须复制相同的scriplet到每个jsp页。（实际上，也可以使用类似intercept filter的模式来处理此需求）。这使我们的开发工作变得reusable, flexiable, 和extendable。可以想象，如果我们想改变检查session的逻辑，则可以仅仅通过改变CheckSessionTag内部的逻辑就可以通盘改变。并且我们可以通过给logic:checkSession标记加上类似target=admin的attribute来限定只有管理员才可以访问的区域。这就是形成组件化开发的基本过程。<br /><br />如何实施呢? <br /><br /><br /><strong>[实施过程]</strong><br /><br />我们需要做一系列工作来将taglib引入我们的工程。<br /><br />web.xml<br />为了使jsp解析器可以识别我们的taglib必须将其配置在web.xml内。web.xml位于/WEB-INF目录内。<br />使用特定语法来配置我们的taglib:<br />web.xml(片断)</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">web-app</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<img src="http://www.cnblogs.com/Images/dot.gif" />
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">taglib</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">taglib-uri</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">/WEB-INF/logic.tld</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">taglib-uri</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">taglib-location</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">/WEB-INF/logic.tld</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">taglib-location</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">taglib</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								<img src="http://www.cnblogs.com/Images/dot.gif" />
								<br />
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">web-app</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</div>
		</div>
		<p>该语法告诉容器到什么地方去寻找所有logic:开头的tag.<br /><br />tld是taglib defination的缩写。即taglib定义。该文件定义了我们使用的标记，Java类如何加载，并且该标记如何工作。让我们来看一段实际的tld:<br />logic.tld(片断)</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia">
								<font size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
										<span style="COLOR: #0000ff">&lt;?</span>
										<span style="COLOR: #ff00ff">xml version="1.0" encoding="ISO-8859-1"</span>
										<span style="COLOR: #0000ff">?&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								</font>
						</span>
						<span style="COLOR: #0000ff">
								<font face="Georgia" size="2">&lt;!</font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #ff00ff">DOCTYPE taglib<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2/EN"<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
										<br />
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
								</font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">taglib</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tlib-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">1.0</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tlib-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">jsp-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">1.2</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">jsp-version</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">short-name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">logic</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">short-name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">uri</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">/taglibs/logic</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">uri</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
										<br />
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">checkSession</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">mbajob.common.tags.logic.CheckSessionTag</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">empty</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
				</div>
		</div>
		<p>
				<br />我们注意到taglib标记内.<br />1． short-name: 标记的prefix名。<br />2． uri: 识别该taglib的名称。<br /><br />tag标记：<br />1． name: 标记名（prefix:之后）<br />2． tag-class：类名（包含包名）<br />3． body-content: 标记内容模式，如果该标记没有内容则为empty.<br /><br />将logic.tld放置在/WEB-INF下，此时确保编译好的CheckSessionTag类可以被容器访问到。即可完成配置。必须注意的是，不同的jsp容器的配置可能有差别。本文的配置是基于Resin 2.1.11<br /><br /><strong>[应用]</strong><br /><br />建立一个jsp页。在源码的开头加入如下的预编译指令：(page)<br />&lt;%@ taglib prefix="logic" uri="/WEB-INF/logic.tld" %&gt;<br /><br />此指令告诉编译器到哪里去寻找所有以logic:开头的标记的定义。<br /><br />接下来在任意位置加入标记：&lt;logic:checkSession /&gt;即可以工作了。当标记被实例化后，即自动执行doEndTag过程，检查session服务器变量值，之后将页过程跳转。<br /><br /><br /><strong>[深入一些：attribute]</strong><br /><br />有时候我们希望可以对标记进行一些定制。依旧拿checkSession做例：现在我们要限制两类用户访问系统：某<br />些部分仅允许具有管理员权限的用户访问。这样我们设想可以在&lt;logic:checkSession target=admin /&gt;进行进一步定义。这需要在CheckSessionTag类中增加一些额外的逻辑。检查的过程很简单，取决于你的安全系统的分析，但是，我们写了target attribute如何是类可以得到该数据，这是一个关键的问题。<br /><br />为了实现对tag增加可用的attribute, 需要做如下工作：<br />1． 为类增加相应的成员及相应读写器：<br />CheckSessionTag.java(片断): </p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia" size="2">
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000">public class CheckSessionTag extends TagSupport<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />{<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     private String target;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     public </span>
										<span style="COLOR: #0000ff">void</span>
								</font>
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000"> setTarget(String t)<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">this</span>
										<span style="COLOR: #000000">.target </span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000"> t;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     public String getTarget()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">this</span>
								</font>
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000">.target;<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />     }<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    public </span>
										<span style="COLOR: #0000ff">int</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<font face="Georgia" size="2"> doEndTag()<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    {<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />        <img src="http://www.cnblogs.com/Images/dot.gif" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    }</font>
						</span>
				</div>
		</div>
		<p>
				<br />2． 更改logic.tld:</p>
		<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
				<div>
						<font face="Georgia" size="2">
								<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />
						</font>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #000000">
												<img src="http://www.cnblogs.com/Images/dot.gif" />.<br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </span>
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">checkSession</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">mbajob.common.tags.logic.CheckSessionTag</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag-class</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">empty</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">body-content</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">attribute</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />          </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">title</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">name</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />          </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;</span>
										<span style="COLOR: #800000">required</span>
										<span style="COLOR: #0000ff">&gt;</span>
										<span style="COLOR: #000000">true</span>
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">required</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />       </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">attribute</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
						<span style="COLOR: #000000">
								<br />
								<font face="Georgia" size="2">
										<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" />    </font>
						</span>
						<font face="Georgia">
								<font size="2">
										<span style="COLOR: #0000ff">&lt;/</span>
										<span style="COLOR: #800000">tag</span>
										<span style="COLOR: #0000ff">&gt;</span>
								</font>
						</font>
				</div>
		</div>
		<p>为tag标记增加arrtibute节点，语法如下：<br /><br />name: attribute名<br />required: 是否为必须的attribute<br /><br />幸运的是，jsp内置地将attribute解释为java类的成员，我们无需显式地获取该值，即可直接使用。也就是说，我们只要在tag内指定了target=admin, 那么，CheckSessionTag在活着的时候就自动获取该值，可以在逻辑中直接使用。<br /><br />这样，我们就可以给tag增加任意的attribute.<br /><br /><br /><strong>[入门以后]</strong><br /><br />到此为止，我么就可以写一些类似的简单的tag了。根据不同的需求，完成不同的逻辑。当我们开发一个新的tag的时候，我们在logic.tld里增加一个tag子标记。设置好相应的类型。如果需要，我们可以把我们已经写好的tag们完全的移植到第二个项目中使用，仅仅做很少的更改。而更改也仅仅限于对java源代码。<br /><br />在我和我的团队的实际经验中，taglib最多的应用还是在设计一系列特殊的UI. 例如类似于选择省市多级行政区域的选择器。为了放置在HTML中嵌入过多scriplet和脚本，我们的做法通常是将其写在组装好的tag里；为了形成整个应用一致的外观，我们设计了一套用于组装页构图的框架；为了向jsp输出集合数据，我们设计了可以绑定数据的呈现器。经过很长一个时期的工作，我们发现我们的项目中jsp页内仅有很少的html, 而完全是有taglib组成的。最终，我们的taglib按照layout, logic, element, form分类，已经形成了比较大的规模。我们甚至完成了apache的struts框架完成的一部分工作。甚至做得更灵活。所有这些工作中积累的思想甚至影响到我在.NET平台下的技术思路。<br /><br />为了不使篇幅太长，我不准备在本文再做深入的探索。仅仅介绍taglib入门级的一些东西。有时间的话，可能会再次写一些高级一些的taglib的设计方法。<br /><br /><br /><strong>[与ASP.NET Web Custom Control]</strong><br /><br />不能说taglib与ASP.NET Web Custom Control有什么可比性。但是我习惯将二者放到一起看。因为因为在某些实际项目中，我确实从二者之间找到一些共性。甚至有时候创作一些组件的时候实现是完全相同的。<br />1． 二者都定义了当标记输出开始标记和结束标记时的过程。<br />2． 二者都可以跨应用使用。<br />3． 可以使用相同的HTML和脚本。<br /><br />但比较起来，ASP.NET Web Custom Control更高级一些。可以在容器中直接以对象的形式访问。并且可以定义方法，事件。意即可以完全控制一个控件。<br /><br />而taglib同样有优点，例如可以嵌套使用，开发成本低等。最关键的是，taglib具有做为java产品的精细，小巧和活泼。他们分别是有着不同风格的优秀技术。<br /><br />参考文档<br />taglib最佳实践(IBM <em>developerWorks中文站</em>)<br /><a href="http://www-900.ibm.com/developerWorks/cn/java/j-jsp07233/">http://www-900.ibm.com/developerWorks/cn/java/j-jsp07233/</a><br /></p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/68675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-09 10:47 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/09/68675.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用OSCache提升J2EE系统运行性能 </title><link>http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 09 Sep 2006 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68664.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68664.html</trackback:ping><description><![CDATA[
		<h4>作者简介</h4>
		<br />
		<p>肖菁，软件工程师，IBM developerWorks/Bea dev2dev/sun 技术开发者撰稿人，主要研究J2EE、web services以及他们在websphere、weblogic平台上的实现，拥有IBM的 Developing With Websphere Studio证书。您可以通过<a href="mailto:guilaida@163.com"><u><font color="#0000ff">guilaida@163.com</font></u></a>和作者取得联系，或者查看作者的<a href="http://guilaida.go.nease.net/"><u><font color="#0000ff">主页</font></u></a>获取更多信息。</p>
		<h4>文章摘要</h4>
		<br />
		<p>Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。通过应用OSCache，我们不但可以实现通常的Cache功能，还能够改善系统的稳定性。</p>
		<h4>1 面临的问题</h4>
		<br />
		<h4>1.1 需要处理的特殊动态内容</h4>
		<br />
		<p>在信息系统建设过程中我们通常会遇到这样的问题：</p>
		<p>
				<b>
						<font color="#000000">1. 基础数据的变更问题</font>
				</b>
		</p>
		<p>信息系统中需要处理的基础数据的内容短时间内是不会发生变化的，但是在一个相对长一些的时间里，它却可能是动态增加或者减少的。</p>
		<p>举个例子：电子商务中关于送货区域的定义，可能短时间内不会发生变化，但是随着电子商务企业业务的扩大，系统中需要处理的送货区域就可能增加。所以我们的系统中不得不在每次向客户展示送货区域信息的时候都和数据库（假设送货区域信息保存在数据库中，这也是通常采用的处理方法）进行交互。</p>
		<p>
				<b>
						<font color="#000000">2. 统计报表（不仅限于统计报表）的问题</font>
				</b>
		</p>
		<p>一般来说，统计报表是一个周期性的工作，可能是半个月、一个月或者更长的时间才会需要更新一次，然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件，这些图形内容、文件的生成通常需要消耗很多的系统资源，给系统运行造成很大的负担。</p>
		<h4>1.2 问题的共同点</h4>
		<br />
		<p>通过比较分析，不难发现这两类问题有一些共同点：</p>
		<p>1、被处理的内容短时间不变，所以短时间内可以作为静态内容进行处理</p>
		<p>2、在一个不太长的时间内，被处理的内容可能或者必定产生变化，所以必须将他们作为动态内容进行处理</p>
		<p>3、在合理的时间区段内可以忽略被处理内容变化后带来的影响</p>
		<p>4、对这些内容的处理动作比较消耗系统性能，影响系统响应时间</p>
		<h4>1.3 解决方法</h4>
		<br />
		<p>缓存技术可以帮助我们很好的解决这个问题：</p>
		<p>1、缓存信息</p>
		<p>当上述的基础数据或者统计报表第一次被访问时，被处理的内容被当作动态信息，基础数库从数据库中获得，统计报表也会被生成符合要求的图形、文件，然后这些信息都会被放入缓存信息中。</p>
		<p>2、响应信息由缓存提供</p>
		<p>当上述的基础数据或者统计报表继续被访问时，系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则，如果符合缓存信息存在而且符合缓存规则，给出的响应将来自于缓存信息，如果没有或者缓存信息已经不符合设定的要求，系统将重复上一步的动作。</p>
		<p>很显然，上面的步骤2中，多数情况下，当用户请求到达时，被处理的内容将来自于缓存，所以大大的减少了与数据库的交互，或者不再需要为每个请求都生成一次报表图形或者文件，这部分工作的减少对于降低系统性能消耗、提高系统稳定性和并发处理能力是非常有益的。</p>
		<h4>2 OSCache简介</h4>
		<br />
		<p>OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件，它的出现解决了我们面临的问题。 OSCache目前最新的稳定版本是2.0，本文中的例子都是基于这个版本的，如果大家运行例子的过程中发生问题，请首先确认是否采用了正确的软件版本。</p>
		<h4>2.1 主要特征</h4>
		<br />
		<p>1. 兼容多种支持JSP的web服务器</p>
		<p>已经通过兼容测试的web服务器包括OrionServer (1.4.0或者以上版本) 、Macromedia JRun (3.0或者以上版本) 、BEA Weblogic (7.x或者以上版本) 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho Resin (1.2.3或者以上版本)、Tomcat (4.0或者以上版本) ，其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的。</p>
		<p>2. 可选的缓存区</p>
		<p>你可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源（需要自己提供适配器）作为缓存区。</p>
		<ul>
				<li>使用内存作为缓存区将可以提供更好的性能 
</li>
				<li>使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容 
</li>
				<li>同时使用内存和硬盘作为缓存区则可以减少对内存的占用 </li>
		</ul>
		<p>3. 灵活的缓存系统</p>
		<p>OSCache支持对部分页面内容或者对页面级的响应内容进行缓存，编程者可以根据不同的需求、不同的环境选择不同的缓存级别。</p>
		<p>4. 容错</p>
		<p>在一般的web应用中，如果某个页面需要和数据库打交道，而当客户请求到达时，web应用和数据库之间无法进行交互，那么将返回给用户"系统出错"或者类似的提示信息，如果使用了OSCache的话，你可以使用缓存提供给用户，给自己赢得维护系统或者采取其他补救的时间。</p>
		<p>其它特性还包括对集群的支持、缓存主动刷新等特性，大家可以参考OpenSymphony网站上的其他资源获取更多的信息。</p>
		<h4>3 OSCache组件的安装</h4>
		<br />
		<p>OSCache是一个基于web应用的组件，他的安装工作主要是对web应用进行配置，大概的步骤如下：</p>
		<p>1. 下载、解压缩OSCache</p>
		<p>请到OSCache的主页http://www.opensymphony.com/oscache/download.html下载Oscache的最新版本，作者下载的是OSCache的最新稳定版本2.0。</p>
		<p>将下载后的。Zip文件解压缩到c:\oscache（后面的章节中将使用%OSCache_Home%来表示这个目录）目录下</p>
		<p>2. 新建立一个web应用</p>
		<p>3. 将主要组件%OSCache_Home%\oscache.jar放入WEB-INF\lib目录</p>
		<p>4. commons-logging.jar、commons-collections.jar的处理</p>
		<ul>
				<li>OSCache组件用Jakarta Commons Logging来处理日志信息，所以需要commons-logging.jar的支持，请将%OSCache_Home%\lib\core\commons-logging.jar放入classpath（通常意味着将这个文件放入WEB-INF\lib目录） 
</li>
				<li>如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar放入classpath，如果使用JDK1.4或者以上版本，则不需要了 </li>
		</ul>
		<p>5. 将oscache.properties、oscache.tld放入WEB-INF\class目录</p>
		<ul>
				<li>%OSCache_Home%\oscache.properties包含了对OSCache运行特征值的设置信息 
</li>
				<li>%OSCache_Home%\oscache.tld包含了OSCache提供的标签库的定义内容 </li>
		</ul>
		<p>6. 修改web.xml文件</p>
		<p>在web.xml文件中增加下面的内容，增加对OSCache提供的taglib的支持：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;taglib&gt;
&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;
&lt;taglib-location&gt;/WEB-INF/classes/ oscache.tld&lt;/taglib-location&gt;
&lt;/taglib&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<h4>4 开始使用OSCache中的缓存组件</h4>
		<br />
		<p>OSCache中按照缓存范围的不同分为两种不同的方式：一种是缓存JSP页面中部分或者全部内容，一种是基于整个页面文件的缓存。</p>
		<h4>4.1 JSP部分内容缓存</h4>
		<br />
		<h4>4.1.1 Cache-OSCache提供的缓存标签</h4>
		<br />
		<p>这是OSCache提供的标签库中最重要的一个标签，包括在标签中的内容将应用缓存机制进行处理，处理的方式将取决于编程者对cache标签属性的设置。</p>
		<p>第一次请求到达时，标签中的内容被处理并且缓存起来，当下一个请求到达时，缓存系统会检查这部分内容的缓存是否已经失效，主要是以下几项：</p>
		<ul>
				<li>1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 
</li>
				<li>2. cron属性规定的时间比缓存信息的开始时间更晚 
</li>
				<li>3. 标签中缓存的内容在缓存后又被重新刷新过 
</li>
				<li>4. 其他缓存超期设定 </li>
		</ul>
		<p>如果符合上面四项中的任何一项，被缓存的内容视为已经失效，这时被缓存的内容将被重新处理并且返回处理过后的信息，如果被缓存的内容没有失效，那么返回给用户的将是缓存中的信息。</p>
		<p>cache标签的属性说明:</p>
		<p>
				<font color="#000000">
						<b>key</b> - 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。</font>
		</p>
		<p>你可以在同一个页面中使用很多cache标签而不指定他的key属性，这种情况下系统使用该页面的URI和后面的请求字符串，另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。</p>
		<p>
				<font color="#000000">
						<b>scope</b> - 缓存发生作用的范围，可以是application或者session</font>
		</p>
		<p>
				<font color="#000000">
						<b>time</b> - 缓存内容的时间段，单位是秒，默认是3600秒，也就是一个小时，如果设定一个负值，那么这部分被缓存的内容将永远不过期。 </font>
		</p>
		<p>
				<font color="#000000">
						<b>duration</b> - 指定缓存内容失效的时间，是相对time的另一个选择，可以使用简单日期格式或者符合USO-8601的日期格式。如：duration='PT5M' duration='5s'等</font>
		</p>
		<p>
				<font color="#000000">
						<b>refresh</b> - false 或者true。</font>
		</p>
		<p>如果refresh属性设置为true，不管其他的属性是否符合条件，这部分被缓存的内容都将被更新，这给编程者一种选择，决定什么时候必须刷新。 </p>
		<p>
				<font color="#000000">
						<b>mode</b> - 如果编程者不希望被缓存的内容增加到给用户的响应中，可以设置mode属性为"silent"</font>
		</p>
		<p>其它可用的属性还包括：cron 、groups、language、refreshpolicyclass、refreshpolicyparam。</p>
		<p>上面的这些属性可以单独使用，也可以根据需要组合使用，下面的例子将讲解这些常用属性的使用方式。</p>
		<h4>4.1.2 Cache标签实例分析:</h4>
		<br />
		<p>1. 最简单的cache标签用法</p>
		<p>使用默认的关键字来标识cache内容，超时时间是默认的3600秒</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache&gt;
&lt;%
//自己的JSP代码内容
%&gt;
&lt;/cache:cache&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2. 用自己指定的字符串标识缓存内容，并且设定作用范围为session。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache key="foobar" scope="session"&gt;
&lt;%
//自己的JSP代码内容
%&gt;
&lt;/cache:cache&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>3.动态设定key值，使用自己指定的time属性设定缓存内容的超时时间，使用动态refresh值决定是否强制内容刷新。</p>
		<p>因为OSCache使用key值来标识缓存内容，使用相同的key值将会被认为使用相同的的缓存内容，所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache key="&lt;%= product.getId() %&gt;" time="1800" refresh="&lt;%= needRefresh %&gt;"&gt;
&lt;%
//自己的JSP代码内容
%&gt;
&lt;/cache:cache&gt; 
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>4. 设置time属性为负数使缓存内容永不过期</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache time="-1"&gt;
&lt;%
//自己的JSP代码内容
%&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>5. 使用duration属性设置超期时间</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache  duration='PT5M'&gt;
&lt;%
//自己的JSP代码内容
%&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>6. 使用mode属性使被缓存的内容不加入给客户的响应中</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;cache:cache  mode='silent'&gt;
&lt;%
//自己的JSP代码内容
%&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<h4>4.2 用CashFilter实现页面级缓存</h4>
		<br />
		<p>在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存，主要用于对web应用中的某些动态页面进行缓存，尤其是那些需要生成pdf格式文件/报表、图片文件等的页面，不仅减少了数据库的交互、减少数据库服务器的压力，而且对于减少web服务器的性能消耗有很显著的效果。</p>
		<p>这种功能的实现是通过在web.xml中进行配置来决定缓存哪一个或者一组页面，而且还可以设置缓存的相关属性，这种基于配置文件的实现方式对于J2EE来说应该是一种标准的实现方式了。</p>
		<p>[注] 只有客户访问时返回http头信息中代码为200（也就是访问已经成功）的页面信息才能够被缓存</p>
		<p>1. 缓存单个文件</p>
		<p>修改web.xml，增加如下内容，确定对/testContent.jsp页面进行缓存。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;filter&gt;
      &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;!-对/testContent.jsp页面内容进行缓存--&gt;
      &lt;url-pattern&gt;/testContent.jsp&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>2. 缓存URL pattern</p>
		<p>修改web.xml，增加如下内容，确定对*.jsp页面进行缓存。</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;filter&gt;
      &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;!-对所有jsp页面内容进行缓存--&gt;
      &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>3. 自己设定缓存属性</p>
		<p>在页面级缓存的情况下，可以通过设置CacheFilter的初始属性来决定缓存的一些特性：time属性设置缓存的时间段，默认为3600秒，可以根据自己的需要只有的设置，而scope属性设置，默认为application，可选项包括application、session</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>&lt;filter&gt;
      &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;
	&lt;init-param&gt;
         &lt;param-name&gt;time&lt;/param-name&gt;
         &lt;param-value&gt;600&lt;/param-value&gt;
      &lt;/init-param&gt;
      &lt;init-param&gt;
         &lt;param-name&gt;scope&lt;/param-name&gt;
         &lt;param-value&gt;session&lt;/param-value&gt;
      &lt;/init-param&gt;
&lt;/filter&gt;
&lt;filter-mapping&gt;
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;
&lt;!-对所有jsp页面内容进行缓存--&gt;
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;
&lt;/filter-mapping&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<h4>5 性能测试结果</h4>
		<br />
		<h4>5.1 测试环境</h4>
		<br />
		<p>系统平台：windows 2000 高级服务器/ P3 800 /512M内存</p>
		<p>web服务器：websphere 5.0</p>
		<p>数据库服务器：mysql 4.0.18-nt</p>
		<p>性能测试用工具：apache Jmeter</p>
		<h4>5.2 测试计划</h4>
		<br />
		<p>这次性能测试对比方为使用缓存和不使用缓存两种，他们的访问代码都是一样的：通过数据源从本地mysql数据库中获取person表的所有记录，然后显示在页面上。</p>
		<p>测试中将模仿10个用户，每个用户发起5次请求，然后统计所有访问花费的时间。</p>
		<h4>5.3 测试结果</h4>
		<br />
		<p>使用缓存后的测试结果 不使用缓存时的测试结果 
</p>
		<p>所有请求花费的总时间(毫秒) 20569 22870 
</p>
		<p>性能测试的详细结果请大家查看下载内容中的《不使用cache时的系统性能测试结果.txt》和《使用cache后系统性能测试结果.txt》</p>
		<h4>6 总结</h4>
		<br />
		<p>在J2EE系统中，我们经常需要处理一些特殊的动态内容，这些内容在一个时间段内的变更非常有限，但是又不得不将他们确定为动态内容进行输出，而且非常消耗数据库系统资源或者web服务器的资源，这时我们就可以采用Cache----一种用于提高系统响应速度、改善系统运行性能的技术----来优化我们的系统。尤其是在Web应用中，这种处理可以很显著的改善系统运行性能。</p>
		<p>本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。它提供了在J2EE系统中实现缓存需要的丰富的功能。通过应用OSCache，我们不但可以实现通常的Cache功能、自由的设定cache的相关特性比如缓存时间段/缓存内容等，提升系统性能，而且还能有效的改善系统的稳定性。除此之外，OSCache组件还提供了更多的特性比如集群、容错、灵活的缓存区选择等。</p>
		<p>作者根据自己的使用经验给大家提供了一些简单的例子，他们部分演示了如何使用OSCache组件提供的丰富特性，OSCache提供的特性远不止这些，需要大家在今后的时间里深入的研究，同时也希望大家通过E-mail和作者贡献研究成果。</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/68664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-09 10:06 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/09/68664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oscache 使用1</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 08 Sep 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68568.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68568.html</trackback:ping><description><![CDATA[https://oscache.dev.java.net/files/documents/629/13962/oscache-2.1.1-full.zip<br />OSCache各版本下载页面：http://www.opensymphony.com/oscache/download.action<br /><p><strong>○用二分钟配置：</strong><br /><br />将下载的<u>oscache-2.1.1-full.zip</u>解压，你会看到oscache-2.1.1.jar 及一些目录 docs、etc、lib、src。<br />现在将 etc目录下oscache.properties 、oscache.tld 及 oscache-2.1.1.jar 文件复制到你的应用服务器目录下<br /><br />使用tomcat，jdk1.4 配置例：<br />         D:\Tomcat 5.0\webapps\ROOT\WEB-INF\lib\oscache-2.1.1.jar <br />         D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\oscache.properties<br />         D:\Tomcat 5.0\webapps\ROOT\WEB-INF\classes\oscache.tld<br /><br />oscache.properties 文件配置参数说明：<br />cache.memory<br />值为true 或 false ，默认为在内存中作缓存，<br />如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）<br />cache.capacity<br />缓存元素个数<br />cache.persistence.class<br />持久化缓存类，如此类打开，则必须设置cache.path信息<br />cache.cluster 相关<br />为集群设置信息。如<br />cache.cluster.multicast.ip为广播IP地址<br />cache.cluster.properties为集群属性<br /><br />再将 D:\Tomcat 5.0\webapps\ROOT\WEB-INF\web.xml 文件中添加如下代码<br />&lt;taglib&gt;<br />&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br />&lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt; </p><p>就是这么简单，OSCache就配置好了。</p><p><strong>○再用二分钟测试一下</strong>：</p><p>编写jsp文件<br />======================cache1.jsp 内容如下=================<br />&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />&lt;%@ page import="java.util.*" %&gt;<br />&lt;%@ taglib uri="oscache" prefix="cache" %&gt;<br />&lt;html&gt;<br />&lt;body&gt;<br />没有缓存的日期: &lt;%= new Date() %&gt;&lt;p&gt;<br />&lt;!--自动刷新--&gt;<br />&lt;cache:cache time="30"&gt;<br />每30秒刷新缓存一次的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br />&lt;/cache:cache&gt;<br /><br />&lt;!--手动刷新--&gt;<br />&lt;cache:cache key="testcache"&gt;<br />手动刷新缓存的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br />&lt;/cache:cache&gt;<br />&lt;a href="http://dev.csdn.net/article/"cache2.jsp"&gt;手动刷新&lt;/a&gt;<br" />&lt;/body&gt;<br />&lt;/html&gt;<br />=========================================================<br /><br />====================cache2.jsp 执行手动刷新页面如下===========<br />&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />&lt;%@ taglib uri="oscache" prefix="cache" %&gt;<br />&lt;html&gt;<br />&lt;body&gt;缓存已刷新...&lt;p&gt;<br /><br />&lt;cache:flush key="testcache" scope="application"/&gt;<br /><br />&lt;a href="http://dev.csdn.net/article/"cache1.jsp"&gt;返回&lt;/a&gt;<br" />&lt;/body&gt;<br />&lt;/html&gt;<br />==========================================================        </p><p><strong>其他： 缓存过滤器 CacheFilter</strong><br />可以让你所有.jsp页面自动缓存。<br /><br />你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br />&lt;filter&gt;<br />&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;time&lt;/param-name&gt;<br />&lt;param-value&gt;60&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;scope&lt;/param-name&gt;<br />&lt;param-value&gt;session&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session<br /><br />注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br />而不对其他请求（如500,404,400）作缓存处理 </p><p>此文完。。谢谢观看。</p><img src ="http://www.blogjava.net/jackstudio/aggbug/68568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-08 17:57 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/08/68568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSCache使用经验总结</title><link>http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 08 Sep 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/68569.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/68569.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/68569.html</trackback:ping><description><![CDATA[
		<p>OSCache使用经验总结<br />                              OSCache使用经验总结<br />OSCache的使用主要有4种：<br />POJO 缓存<br />HTTP Response 缓存<br />JSP Tag Library 缓存<br />O/R Data Access 缓存</p>
		<p>1、POJO 缓存<br />这种方式的缓存直接调用OSCache的API进行，主要用于处理页面内容会根据参数动态改变，可以将参数设置为key值来保存数据：<br />首先，声明成员变量：<br /> // OSCache Adminitrator instance<br /> private static GeneralCacheAdministrator cacheAdmin = null;<br />其次，进行初始化：<br /> public RingArtistAction() {<br />  cacheAdmin = new GeneralCacheAdministrator();<br /> }<br />将POJO进行缓存：<br />  // Cache data key and refresh period<br />  String key = sex + ":" + place;<br />  int refreshPeriod = Constants.getIntegerValue(Constants.OSCACHE_REFRESH_PERIOD).intValue();<br />  try {<br />      // Get from the cache<br />   artists = (Map) cacheAdmin.getFromCache(key, refreshPeriod);<br />  } catch (NeedsRefreshException nre) {<br />      try {<br />          // Get the value (probably from the database)<br />    int count = getArtistCount(sex, place, errors);<br />    artists = getArtistData(sex, place, count, errors);<br />          // Store in the cache<br />    cacheAdmin.putInCache(key, artists);<br />      } catch (Exception ex) {<br />          // We have the current content if we want fail-over.<br />    artists = (Map) nre.getCacheContent();<br />          // It is essential that cancelUpdate is called if the<br />          // cached content is not rebuilt<br />    cacheAdmin.cancelUpdate(key);<br />    ex.printStackTrace();<br />      }<br />  }<br />  <br />2、HTTP Response 缓存<br />这种方式的缓存用来处理整个页面的内容固定，不会根据参数动态改变：<br />首先在web.xml中配置CacheFilter：<br /> &lt;filter&gt;<br />  &lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />  &lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />  &lt;init-param&gt;<br />   &lt;param-name&gt;time&lt;/param-name&gt;<br />   &lt;param-value&gt;86400&lt;/param-value&gt;<br />  &lt;/init-param&gt;<br />  &lt;init-param&gt;<br />   &lt;param-name&gt;scope&lt;/param-name&gt;<br />   &lt;param-value&gt;application&lt;/param-value&gt;<br />  &lt;/init-param&gt;<br /> &lt;/filter&gt;<br />将所有需要缓存的页面加入filter-mapping：<br /> &lt;filter-mapping&gt;<br />  &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />  &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br /> &lt;/filter-mapping&gt;<br />注意，只有返回状态为200（HttpServletResponse.SC_OK）的内容才会被缓存</p>
		<p>3、JSP Tag 缓存<br />JSP Tag缓存主要用于缓存JSP页面的局部内容：<br />  &lt;cache:cache key="especialcategory" cron="* 5 * * *"&gt;<br />  &lt;jsp:include page="/ringcategory.do" flush="true" &gt;<br />    &lt;jsp:param name="ringType" value="1"/&gt;<br />  &lt;/jsp:include&gt;<br />  &lt;/cache:cache&gt;</p>
		<p>4、O/R Data Access 缓存<br />请阅读参考资料的内容获取详情。</p>
		<p>参考资料：<br />Taking the load off: OSCache helps databases cope：<a href="http://www.theserverside.com/articles/article.tss?l=OSCacheHelpsDatabases">http://www.theserverside.com/articles/article.tss?l=OSCacheHelpsDatabases</a></p>
		<p> </p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/68569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-09-08 17:57 <a href="http://www.blogjava.net/jackstudio/archive/2006/09/08/68569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正规表达式java.util.regex包 </title><link>http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 17 Jun 2006 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/53484.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/53484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/53484.html</trackback:ping><description><![CDATA[
		<table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="96%" border="0">
				<tbody>
						<tr>
								<td bgcolor="#e8f0f1">
										<strong>  [转]正规表达式java.util.regex包</strong>
								</td>
						</tr>
						<tr>
								<td>
										<table cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td>
																		<div align="right">
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
										<span class="oblog_text">  来源：<a href="http://www.52blog.net/user1/53795/archives/2006/653150.shtml">http://www.52blog.net/user1/53795/archives/2006/653150.shtml</a><p>现在JDK1.4里有了自己的正则表达式API包，JAVA程序员可以免去找第三方提供的正则表达式库的周折了，我们现在就马上来了解一下这个SUN提供的迟来恩物- -对我来说确实如此。<br /><br /><strong>1.简介：</strong><br />java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。<br />它包括两个类：Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。<br />Matcher 一个Matcher对象是一个状态机器，它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式，然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。<br />以下我们就分别来看看这两个类： </p><p><strong>2.Pattern类：</strong><br />Pattern的方法如下： static Pattern compile(String regex) <br />将给定的正则表达式编译并赋予给Pattern类 <br />static Pattern compile(String regex, int flags) <br />同上，但增加flag参数的指定，可选的flag参数包括：CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE， CANON EQ <br />int flags() <br />返回当前Pattern的匹配flag参数. <br />Matcher matcher(CharSequence input) <br />生成一个给定命名的Matcher对象 <br />static boolean matches(String regex, CharSequence input) <br />编译给定的正则表达式并且对输入的字串以该正则表达式为模开展匹配,该方法适合于该正则表达式只会使用一次的情况，也就是只进行一次匹配工作，因为这种情况下并不需要生成一个Matcher实例。 <br />String pattern() <br />返回该Patter对象所编译的正则表达式。 <br />String[] split(CharSequence input) <br />将目标字符串按照Pattern里所包含的正则表达式为模进行分割。 <br />String[] split(CharSequence input, int limit) <br />作用同上，增加参数limit目的在于要指定分割的段数，如将limi设为2，那么目标字符串将根据正则表达式分为割为两段。 </p><p>一个正则表达式，也就是一串有特定意义的字符，必须首先要编译成为一个Pattern类的实例，这个Pattern对象将会使用matcher()方法来生成一个Matcher实例，接着便可以使用该 Matcher实例以编译的正则表达式为基础对目标字符串进行匹配工作，多个Matcher是可以共用一个Pattern对象的。 </p><p>现在我们先来看一个简单的例子，再通过分析它来了解怎样生成一个Pattern对象并且编译一个正则表达式，最后根据这个正则表达式将目标字符串进行分割： <br />import java.util.regex.*; <br />public class Replacement{ <br />public static void main(String[] args) throws Exception { <br />// 生成一个Pattern,同时编译一个正则表达式 <br />Pattern p = Pattern.compile("[/]+"); <br />//用Pattern的split()方法把字符串按"/"分割 <br />String[] result = p.split( <br />"Kevin has seen《LEON》seveal times,because it is a good film." <br />+"/ 凯文已经看过《这个杀手不太冷》几次了，因为它是一部" <br />+"好电影。/名词:凯文。"); <br />for (int i=0; i&lt;result.length; i++) <br />System.out.println(result[i]); <br />} <br />} </p><p>输出结果为： </p><p>Kevin has seen《LEON》seveal times,because it is a good film. <br />凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。 <br />名词:凯文。 </p><p>很明显，该程序将字符串按"/"进行了分段，我们以下再使用 split(CharSequence input, int limit)方法来指定分段的段数，程序改动为： <br />tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。/名词:凯文。"，2); </p><p>这里面的参数"2"表明将目标语句分为两段。 </p><p>输出结果则为： </p><p>Kevin has seen《LEON》seveal times,because it is a good film. <br />凯文已经看过《这个杀手不太冷》几次了，因为它是一部好电影。/名词:凯文。 </p><p>由上面的例子，我们可以比较出java.util.regex包在构造Pattern对象以及编译指定的正则表达式的实现手法与我们在上一篇中所介绍的Jakarta-ORO 包在完成同样工作时的差别，Jakarta-ORO 包要先构造一个PatternCompiler类对象接着生成一个Pattern对象，再将正则表达式用该PatternCompiler类的compile()方法来将所需的正则表达式编译赋予Pattern类： </p><p>PatternCompiler orocom=new Perl5Compiler(); </p><p>Pattern pattern=orocom.compile("REGULAR EXPRESSIONS"); </p><p>PatternMatcher matcher=new Perl5Matcher(); </p><p>但是在java.util.regex包里，我们仅需生成一个Pattern类，直接使用它的compile()方法就可以达到同样的效果: <br />Pattern p = Pattern.compile("[/]+"); </p><p>因此似乎java.util.regex的构造法比Jakarta-ORO更为简洁并容易理解。 </p><p><strong>3.Matcher类： <br /></strong>Matcher方法如下： Matcher appendReplacement(StringBuffer sb, String replacement) <br />将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。 <br />StringBuffer appendTail(StringBuffer sb) <br />将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 <br />int end() <br />返回当前匹配的子串的最后一个字符在原目标字符串中的索引位置 。 <br />int end(int group) <br />返回与匹配模式里指定的组相匹配的子串最后一个字符的位置。 <br />boolean find() <br />尝试在目标字符串里查找下一个匹配子串。 <br />boolean find(int start) <br />重设Matcher对象，并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。 <br />String group() <br />返回当前查找而获得的与组匹配的所有子串内容 <br />String group(int group) <br />返回当前查找而获得的与指定的组匹配的子串内容 <br />int groupCount() <br />返回当前查找所获得的匹配组的数量。 <br />boolean lookingAt() <br />检测目标字符串是否以匹配的子串起始。 <br />boolean matches() <br />尝试对整个目标字符展开匹配检测，也就是只有整个目标字符串完全匹配时才返回真值。 <br />Pattern pattern() <br />返回该Matcher对象的现有匹配模式，也就是对应的Pattern 对象。 <br />String replaceAll(String replacement) <br />将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。 <br />String replaceFirst(String replacement) <br />将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。 <br />Matcher reset() <br />重设该Matcher对象。 <br />Matcher reset(CharSequence input) <br />重设该Matcher对象并且指定一个新的目标字符串。 <br />int start() <br />返回当前查找所获子串的开始字符在原目标字符串中的位置。 <br />int start(int group) <br />返回当前查找所获得的和指定组匹配的子串的第一个字符在原目标字符串中的位置。 </p><p><br />（光看方法的解释是不是很不好理解？不要急，待会结合例子就比较容易明白了） </p><p>一个Matcher实例是被用来对目标字符串进行基于既有模式（也就是一个给定的Pattern所编译的正则表达式）进行匹配查找的，所有往Matcher的输入都是通过CharSequence接口提供的，这样做的目的在于可以支持对从多元化的数据源所提供的数据进行匹配工作。 </p><p>我们分别来看看各方法的使用： </p><p>★matches()/lookingAt ()/find()： <br />一个Matcher对象是由一个Pattern对象调用其matcher()方法而生成的，一旦该Matcher对象生成,它就可以进行三种不同的匹配查找操作： </p><p>matches()方法尝试对整个目标字符展开匹配检测，也就是只有整个目标字符串完全匹配时才返回真值。 <br />lookingAt ()方法将检测目标字符串是否以匹配的子串起始。 <br />find()方法尝试在目标字符串里查找下一个匹配子串。 </p><p>以上三个方法都将返回一个布尔值来表明成功与否。 </p><p>★replaceAll ()/appendReplacement()/appendTail()： <br />Matcher类同时提供了四个将匹配子串替换成指定字符串的方法： </p><p>replaceAll() <br />replaceFirst() <br />appendReplacement() <br />appendTail() </p><p>replaceAll()与replaceFirst()的用法都比较简单，请看上面方法的解释。我们主要重点了解一下appendReplacement()和appendTail()方法。 </p><p>appendReplacement(StringBuffer sb, String replacement) 将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里，而appendTail(StringBuffer sb) 方法则将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里。 </p><p>例如，有字符串fatcatfatcatfat,假设既有正则表达式模式为"cat"，第一次匹配后调用appendReplacement(sb,"dog"),那么这时StringBuffer sb的内容为fatdog，也就是fatcat中的cat被替换为dog并且与匹配子串前的内容加到sb里，而第二次匹配后调用appendReplacement(sb,"dog")，那么sb的内容就变为fatdogfatdog，如果最后再调用一次appendTail（sb）,那么sb最终的内容将是fatdogfatdogfat。 </p><p>还是有点模糊？那么我们来看个简单的程序： <br />//该例将把句子里的"Kelvin"改为"Kevin" <br />import java.util.regex.*; <br />public class MatcherTest{ <br />public static void main(String[] args) <br />throws Exception { <br />//生成Pattern对象并且编译一个简单的正则表达式"Kelvin" <br />Pattern p = Pattern.compile("Kevin"); <br />//用Pattern类的matcher()方法生成一个Matcher对象 <br />Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company"); <br />StringBuffer sb = new StringBuffer(); <br />int i=0; <br />//使用find()方法查找第一个匹配的对象 <br />boolean result = m.find(); <br />//使用循环将句子里所有的kelvin找出并替换再将内容加到sb里 <br />while(result) { <br />i++; <br />m.appendReplacement(sb, "Kevin"); <br />System.out.println("第"+i+"次匹配后sb的内容是："+sb); <br />//继续查找下一个匹配对象 <br />result = m.find(); <br />} <br />//最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里； <br />m.appendTail(sb); <br />System.out.println("调用m.appendTail(sb)后sb的最终内容是:"+ sb.toString()); <br />} <br />} </p><p>最终输出结果为： <br />第1次匹配后sb的内容是：Kevin <br />第2次匹配后sb的内容是：Kevin Li and Kevin <br />第3次匹配后sb的内容是：Kevin Li and Kevin Chan are both working in Kevin <br />第4次匹配后sb的内容是：Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin <br />调用m.appendTail(sb)后sb的最终内容是：Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company. </p><p>看了上面这个例程是否对appendReplacement()，appendTail()两个方法的使用更清楚呢，如果还是不太肯定最好自己动手写几行代码测试一下。 </p><p>★group()/group(int group)/groupCount()： <br />该系列方法与我们在上篇介绍的Jakarta-ORO中的MatchResult .group()方法类似(有关Jakarta-ORO请参考上篇的内容)，都是要返回与组匹配的子串内容，下面代码将很好解释其用法： <br />import java.util.regex.*; </p><p>public class GroupTest{ <br />public static void main(String[] args) <br />throws Exception { <br />Pattern p = Pattern.compile("(ca)(t)"); <br />Matcher m = p.matcher("one cat,two cats in the yard"); <br />StringBuffer sb = new StringBuffer(); <br />boolean result = m.find(); <br />System.out.println("该次查找获得匹配组的数量为："+m.groupCount()); <br />for(int i=1;i&lt;=m.groupCount();i++){ <br />System.out.println("第"+i+"组的子串内容为： "+m.group(i)); <br />} <br />} <br />} </p><p>输出为： <br />该次查找获得匹配组的数量为：2 <br />第1组的子串内容为：ca <br />第2组的子串内容为：t </p><p>Matcher对象的其他方法因比较好理解且由于篇幅有限，请读者自己编程验证。 </p><p><strong>4．一个检验Email地址的小程序： <br /></strong>最后我们来看一个检验Email地址的例程，该程序是用来检验一个输入的EMAIL地址里所包含的字符是否合法，虽然这不是一个完整的EMAIL地址检验程序，它不能检验所有可能出现的情况，但在必要时您可以在其基础上增加所需功能。 <br />import java.util.regex.*; <br />public class Email { <br />public static void main(String[] args) throws Exception { <br />String input = args[0]; <br />//检测输入的EMAIL地址是否以 非法符号"."或"@"作为起始字符 <br />Pattern p = Pattern.compile("^\\.|^\\@"); <br />Matcher m = p.matcher(input); <br />if (m.find()){ <br />System.err.println("EMAIL地址不能以'.'或'@'作为起始字符"); <br />} <br />//检测是否以"www."为起始 <br />p = Pattern.compile("^www\\."); <br />m = p.matcher(input); <br />if (m.find()) { <br />System.out.println("EMAIL地址不能以'www.'起始"); <br />} <br />//检测是否包含非法字符 <br />p = Pattern.compile("[^A-Za-z0-9\\.\\@_\\-~#]+"); <br />m = p.matcher(input); <br />StringBuffer sb = new StringBuffer(); <br />boolean result = m.find(); <br />boolean deletedIllegalChars = false; <br />while(result) { <br />//如果找到了非法字符那么就设下标记 <br />deletedIllegalChars = true; <br />//如果里面包含非法字符如冒号双引号等，那么就把他们消去，加到SB里面 <br />m.appendReplacement(sb, ""); <br />result = m.find(); <br />} <br />m.appendTail(sb); <br />input = sb.toString(); <br />if (deletedIllegalChars) { <br />System.out.println("输入的EMAIL地址里包含有冒号、逗号等非法字符，请修改"); <br />System.out.println("您现在的输入为: "+args[0]); <br />System.out.println("修改后合法的地址应类似: "+input); <br />} <br />} <br />} </p><p>例如，我们在命令行输入：java Email www.kevin@163.net </p><p>那么输出结果将会是：EMAIL地址不能以'www.'起始 </p><p>如果输入的EMAIL为@kevin@163.net </p><p>则输出为：EMAIL地址不能以'.'或'@'作为起始字符 </p><p>当输入为：cgjmail#$%@163.net </p><p>那么输出就是： </p><p>输入的EMAIL地址里包含有冒号、逗号等非法字符，请修改 <br />您现在的输入为: cgjmail#$%@163.net <br />修改后合法的地址应类似: cgjmail@163.net </p><p><strong>5．总结：<br /></strong>本文介绍了jdk1.4.0-beta3里正则表达式库--java.util.regex中的类以及其方法，如果结合与上一篇中所介绍的Jakarta-ORO API作比较，读者会更容易掌握该API的使用，当然该库的性能将在未来的日子里不断扩展，希望获得最新信息的读者最好到及时到SUN的网站去了解。 </p><p><strong>6．结束语：<br /></strong>本来计划再多写一篇介绍一下需付费的正则表达式库中较具代表性的作品，但觉得既然有了免费且优秀的正则表达式库可以使用，何必还要去找需付费的呢，相信很多读者也是这么想的:，所以有兴趣了解更多其他的第三方正则表达式库的朋友可以自己到网上查找或者到我在参考资料里提供的网址去看看。</p></span>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jackstudio/aggbug/53484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-17 16:21 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/17/53484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在myeclipse中配置weblogic[转]</title><link>http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 02 Jun 2006 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49893.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49893.html</trackback:ping><description><![CDATA[
		<font color="#555555">安装WebLogic8.1 <br />安装WebLogic比较容易，在这里就不再累述了，大家可以参阅相关文档。现在着重讲一下WebLogic的配置，因为后面在配置MyEclipse时将用到这里的有关信息。 <br />(1)运行开始\程序\BEA WebLogic PlatFORM 8.1\Configuration Wizard。 <br />(2)选择Create a new WebLogic configuration，下一步。 <br />(3)选择Basic WebLogic Server Domain，下一步。 <br />(4)选择Custom，下一步。 <br />(5)在Name处输入admin，Listen Address处选择localhost，以下两个Port均采用默认值，下一步。 <br />(6)选择Skip跳过Multiple Servers，Clusters，and Machines Options，下一步。 <br />(7)选择Skip跳过JDBC连接池的配置（注：JDBC连接池的配置可以在启动WebLogic后到控制台上进行，大家可以参阅相关文档），下一步。 <br />(选择Skip跳过JMS的配置（同样留到控制台上做），下一步。 <br />(9)继续跳过，下一步。 <br />(10)选择Yes，下一步。 <br />(11)在User页点击Add，随意添加一个用户user，密码12345678，下一步。 <br />(12)将用户user分配到Administrators组（还可以同时分配到其它组，方法是选中待加入的组，然后勾中user前的复选框即可），下一步。 <br />(13)直接点击下一步跳过。 <br />(14)设置用户user的权限，选中Admin，勾中user前的复选框（要指定其它权限依次类推），下一步。 <br />(15)采用默认设置，直接点击下一步跳过。 <br />(16)同样采用默认设置，直接点击下一步跳过。 <br />(17)配置JDK，采用WebLogic的默认值，直接点击下一步跳过。 <br />(1最后在Configuration Name处输入dev，然后点击Create生成配置，完毕点击Done关闭Configuration Wizard对话框。 <br />5.配置MyEclipse的WebLogic服务器 <br />MyEclipse默认的应用服务器为JBoss3，这里我们使用WebLogic8.1。启动Eclipse，选择“窗口\首选项”菜单，打开首选项对话框。展开MyEclipse下的Application Servers结点，点击JBoss 3，选中右面的Disable单选按钮，停用JBoss 3。然后点击WebLogic 8，选中右边的Enable单选按钮，启用WebLogic服务器。同时下面的配置如下： <br />(1)BEA home directory：D:\BEA。假定WebLogic安装在D:\BEA文件夹中。 <br />(2)WebLogic installation directory：D:\BEA\weblogic81。 <br />(3)Admin username：user。 <br />(4)Admin password：12345678。 <br />(5)Execution domain root：D:\BEA\user_projects\dev。 <br />(6)Execution domain name：dev。 <br />(7)Execution server name：admin。 <br />(8)Hostname:PortNumber：localhost:7001。 <br />(9)Security policy file：D:\BEA\weblogic81\server\lib\weblogic.policy。 <br />(10)JAAS login configuration file：省略。 <br />接着展开WebLogic 8结点，点击JDK，在右边的WLS JDK name处选择WebLogic 8的默认JDK。这里组合框中缺省为j2re1.4.2_03，即之前单独安装的jre。单击Add按钮，弹出WebLogic &gt; Add JVM对话框，在JRE名称处随便输入一个名字，如jre1.4.1_02。然后在JRE主目录处选择WebLogic安装文件夹中的JDK文件夹，如D:\BEA\jdk141_02，程序会自动填充Javadoc URL文本框和JRE系统库列表框。单击确定按钮关闭对话框。这时候就可以在WLS JDK name组合框中选择jre1.4.1_02了。之后还要在下面的Optional Java VM arguments，如-ms64m -mx64m -Djava.library.path="D:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false <br />最后点击Paths，在右边的Prepend to classpath列表框中，通过Add JAR/ZIP按钮，加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\server\lib\webservices.jar。如果用到数据库，还需把数据库的驱动类库加进来，这里我们用WebLogic自带的SQL Server数据库驱动库D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar。 <br />至此，MyEclipse中WebLogic8的配置工作就算完成了。下面可以看看在Eclipse中能否启动WebLogic了？自从安装了MyEclipse之后，Eclipse工具栏中就会有一个Run/Stop Servers下拉按钮。点击该按钮的下拉部分，选择“WebLogic 8\Start”菜单，即开始启动WebLogic了。通过查看下面的控制台消息，就可以知道启动是否成功，或有什么异常发生。停止WebLogic可选择“WebLogic\Stop”菜单。 </font>
		<br />
		<br />
<img src ="http://www.blogjava.net/jackstudio/aggbug/49893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-06-02 11:31 <a href="http://www.blogjava.net/jackstudio/archive/2006/06/02/49893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts1.1基于dbcp下的mysql数据库的数据源配置</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49324.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49324.html</trackback:ping><description><![CDATA[首先要有四个文件在lib\目录下。<br />分别是<br />1.commons-dbcp-1.2.1.jar<br />2.commons-pool-1.2.jar<br />3.struts-legacy.jar<br />4.mysqldriver.jar<br /><br /><br /><a class="" title="" href="/Files/jackstudio/lib.rar" target="_blank">点这里全部下载</a><br /><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">    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">sources</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">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">source type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.commons.dbcp.BasicDataSource</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">driverClassName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.gjt.mm.mysql.Driver</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jdbc:mysql://localhost/userinfo?useUnicode=true&amp;amp;characterEncoding=GB2312</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">username</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">root</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">password</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">""</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maxActive</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maxWait</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">5000</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">defaultAutoCommit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">defaultReadOnly</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</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">set</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">property property</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">validationQuery</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SELECT COUNT(*) FROM myuserinfo</span><span style="COLOR: #000000">"</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">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">source</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">data</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">sources</span><span style="COLOR: #000000">&gt;</span></div><img src ="http://www.blogjava.net/jackstudio/aggbug/49324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 20:09 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java/JSP中文乱码问题解决心得</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49296.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49296.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49296.html</trackback:ping><description><![CDATA[
		<div class="postcontent">
				<h3 class="title">Java/JSP中文乱码问题解决心得</h3>
				<p>作者信息：liqian  liqianbnu@126.com   http://202.112.88.39/liqian/<br />文章原始出处：http://202.112.88.39/liqian/000271.html</p>
				<p>自从接触Java和JSP以来，就不断与Java的中文乱码问题打交道，现在终于得到了彻底的解决，现将我们的解决心得与大家共享。</p>
				<p>
						<b>一、Java中文问题的由来</b>
				</p>
				<p>Java的内核和class文件是基于unicode的，这使Java程序具有良好的跨平台性，但也带来了一些中文乱码问题的麻烦。原因主要有两方面，Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。</p>
				<p>首先Java（包括JSP）源文件中很可能包含有中文，而Java和JSP源文件的保存方式是基于字节流的，如果Java和JSP编译成class文件过程中，使用的编码方式与源文件的编码不一致，就会出现乱码。基于这种乱码，建议在Java文件中尽量不要写中文（注释部分不参与编译，写中文没关系），如果必须写的话，尽量手动带参数－ecoding GBK或－ecoding gb2312编译；对于JSP，在文件头加上&lt;%@ page contentType="text/html;charset=GBK"%&gt;或&lt;%@ page contentType="text/html;charset=gb2312"%&gt;基本上就能解决这类乱码问题。</p>
				<p>本文要重点讨论的是第二类乱码，即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介，如数据库，文件，流等的存储方式都是基于字节流的，Java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换，具体情况如下：</p>
				<p>从页面form提交数据到java程序 byte－&gt;char<br />从java程序到页面显示 char—&gt;byte</p>
				<p>从数据库到java程序 byte—&gt;char<br />从java程序到数据库 char—&gt;byte</p>
				<p>从文件到java程序 byte－&gt;char<br />从java程序到文件 char－&gt;byte</p>
				<p>从流到java程序 byte－&gt;char<br />从java程序到流 char－&gt;byte</p>
				<p>如果在以上转换过程中使用的编码方式与字节原有的编码不一致，很可能就会出现乱码。</p>
				<p>
						<b>二、解决方法</b>
						<br />
						<br />前面已经提到了Java程序与其他媒介交互时字符和字节的转换过程，如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致，下面分别论述（Java或JSP自身产生的乱码请参看第一部分）。</p>
				<p>
						<b>1、JSP与页面参数之间的乱码</b>
						<br />JSP获取页面参数时一般采用系统默认的编码方式，如果页面参数的编码类型和系统默认的编码类型不一致，很可能就会出现乱码。解决这类乱码问题的基本方法是在页面获取参数之前，强制指定request获取参数的编码方式：request.setCharacterEncoding("GBK")或request.setCharacterEncoding("gb2312")。<br />如果在JSP将变量输出到页面时出现了乱码，可以通过设置response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解决。<br />如果不想在每个文件里都写这样两句话，更简洁的办法是使用Servlet规范中的过虑器指定编码，过滤器的在web.xml中的典型配置和主要代码如下：<br />web.xml:</p>
				<p>&lt;filter&gt;<br />&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br />&lt;filter-class&gt;net.vschool.web.CharacterEncodingFilter&lt;/filter-class&gt;<br />&lt;init-param&gt;<br />&lt;param-name&gt;encoding&lt;/param-name&gt;<br />&lt;param-value&gt;GBK&lt;/param-value&gt;<br />&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;<br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;</p>
				<p>CharacterEncodingFilter.java:</p>
				<p>public class CharacterEncodingFilter implements Filter <br />{</p>
				<p>protected String encoding = null; </p>
				<p>public void init(FilterConfig filterConfig) throws ServletException <br />{<br />this.encoding = filterConfig.getInitParameter("encoding");<br />}</p>
				<p>public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException <br />{<br />request.setCharacterEncoding(encoding);<br />response.setContentType("text/html;charset="+encoding);<br />chain.doFilter(request, response);<br />}</p>
				<p>}</p>
				<p>
						<br />
						<b>2、Java与数据库之间的乱码</b>
						<br />大部分数据库都支持以unicode编码方式，所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode，如Microsoft的SQLServer驱动。其他大部分数据库驱动，可以在驱动的url参数中指定，如如mm的mysql驱动：jdbc:mysql://localhost/WEBCLDB?useUnicode=true&amp;characterEncoding=GBK。</p>
				<p>
						<b>3、Java与文件/流之间的乱码</b>
						<br />Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。其中FileInputStream和FileOutputStream是基于字节流的，常用于读写二进制文件。读写字符文件建议使用基于字符的FileReader和FileWriter，省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编码方式，如果文件内容与系统编码方式不一致，可能会出现乱码。在这种情况下，建议使用FileReader和FileWriter的父类：InputStreamReader/OutputStreamWriter，它们也是基于字符的，但在构造函数中可以指定编码类型：InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。 </p>
				<p>
						<b>4、其他</b>
						<br />上面提到的方法应该能解决大部分乱码问题，如果在其他地方还出现乱码，可能需要手动修改代码。解决Java乱码问题的关键在于在字节与字符的转换过程中，你必须知道原来字节或转换后的字节的编码方式，转换时采用的编码必须与这个编码方式保持一致。我们以前使用Resin服务器，使用smartUpload组件上传文件，上传文件同时传递的中文参数获取没有乱码问题。当在Linux中把Resin设置成服务后，上传文件同时的中文参数获取出现了乱码。这个问题困扰了我们很久，后来我们分析smartUpload组件的源文件，因为文件上传采用的是字节流的方式，里面包含的参数名称和值也是字节流的方式传递的。smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来，问题就出现在smartUpload将字节流转换成字符串时采用了系统默认的编码，而将Resin设置成服务后，系统默认的编码可能发生了改变，因此出现了乱码。后来，我们更改了smartUpload的源文件，增加了一个属性charset和setCharset(String)方法，将upload()方法中提取参数语句：<br />String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1 );<br />改成了<br />String value = new String(m_binArray, m_startData, (m_endData - m_startData) + 1, charset );<br />终于解决了这个乱码问题。</p>
				<p>
						<b>三、后记</b>
						<br />接触Java和JSP已经有一年多了，这一年来最大的收获是越来越喜欢上了Java，开始把问题当作乐事去研究，没有了以前的恐惧心理，我相信我会继续坚持下去。这一年来，从网上学习了很多同行的宝贵经验，在此表示感谢。这是我第一篇自己总结的Java学习心得，由于水平有限，本文中偏颇和错误之处，欢迎指正。如果对你有些价值，在保留作者信息和文章原始出处的前提下可以随处转载。<br />撰写该文之前已参考了很多关于Java中文问题的文章，其中影响比较大的有owen1944在“Java研究组织”中发表的《这是我们公司总结的一些关于中文乱码问题的一些解决方案和经验和大家分享！》等。本文谈到的解决方法已应用到<a href="http://www.webcl.net.cn/" target="_blank"><font color="#8d8c8c">“基于网络的协作学习系统－WebCL”</font></a>等项目中，并通过资源绑定的方式实现了该平台中文文两个版本的即时切换。Google根据浏览器自动选择语言，一个页面同时显示多种语言的国际化应用和车东的<a href="http://www.chedong.com/tech/hello_unicode.html" target="_blank"><font color="#8d8c8c">《Java中文处理学习笔记——Hello Unicode》</font></a>一文引起了我极大的兴趣，日后想将继续探讨Java的国际化问题，欢迎大家一起讨论。<br /></p>
		</div>
<img src ="http://www.blogjava.net/jackstudio/aggbug/49296.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 16:54 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49296.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Myeclipse的困扰。。。。</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Wed, 31 May 2006 08:18:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/49283.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/49283.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/49283.html</trackback:ping><description><![CDATA[前几天用下了Myeclipse4.1.1来小试了一下。发现了一个不知道是不是bug的问题。<br /><br />Myeclipse4.1.1内置的struts1.1中&lt;html:errors /&gt;不能正常工作。<br /><br />我的resourses如下：<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"># Resources </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> parameter </span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">com.jackstudio.struts.ApplicationResources</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /># Project P</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">MyEclipseTest<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />userNameIsNull</span><span style="COLOR: #000000">=&lt;</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">userName is require</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />whyNot</span><span style="COLOR: #000000">=&lt;</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">whyNot</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">li</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />okgood</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">the userName is right<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />errors.footer</span><span style="COLOR: #000000">=&lt;/</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">tr</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">table</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">fieldset</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />errors.header</span><span style="COLOR: #000000">=&lt;</span><span style="COLOR: #000000">fieldset</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">table</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">tr</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">img src</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://localhost:8080/MyEclipseTest/ico_tj_24.gif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">td</span><span style="COLOR: #000000">&gt;</span></div><br />首先我用Myeclipse4.1.1内置的struts1.1。代码如下；<br /><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">        </span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">ActionErrors errors </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActionErrors();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            errors.add(ActionMessages.GLOBAL_MESSAGE, </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ActionMessage(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userNameIsNull</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            request.setAttribute(Globals.ERROR_KEY, errors);<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">%&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">html:errors </span><span style="COLOR: #000000">/&gt;</span></div><br />这样的情况运行的结果是：<br /><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">org.apache.jasper.JasperException: org.apache.struts.action.ActionMessage<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:</span><span style="COLOR: #000000">372</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:</span><span style="COLOR: #000000">292</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:</span><span style="COLOR: #000000">236</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    javax.servlet.http.HttpServlet.service(HttpServlet.java:</span><span style="COLOR: #000000">802</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />当我用孙mm提供的（随书提供）struts，相同的代码却可以运行。<br />经过仔细查找，发现问题是出在了struts.jar这个文件里面。两者的大小根本都一样了（呵呵），于是用孙mm提供的struts.jar覆盖了MyEclipse里面的struts.jar,呵呵，问题解决了。<br />MyEclipse每建立一个struts项目都是从<br />{MyEclipse}\eclipse\plugins\com.genuitec.eclipse.cross.easystruts.eclipse_4.1.1\data\1.1\lib下读取struts.jar包的。所以替换了它就可以一劳永逸了。<br /><img src ="http://www.blogjava.net/jackstudio/aggbug/49283.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-31 16:18 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/31/49283.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse4.1.1注册码</title><link>http://www.blogjava.net/jackstudio/archive/2006/05/25/48072.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Thu, 25 May 2006 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/25/48072.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/48072.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/25/48072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/48072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/48072.html</trackback:ping><description><![CDATA[
		<font size="2">MyEclipse 开发组近日宣布，MyEclipse 4.1 正式发布。<br /><br />报道中指出，该新版本中出现的新特性正如之前所期待的，主要包括：<br /><br />AJAX/Web 2.0 支持<br />JavaScript Editor 提升<br />新的JavaScript Debbugger 和Web 2.0 平台和浏览器<br />UML序列图标支持<br />Spring/Hibernate 集成<br />新的Hibernate 映射编辑工具<br />提高了拖放性能<br />Visual Web Designer Zoom<br />JSP 本地察看<br />提高的服务器管理性能<br />New Image Editor for Eclipse 3.1<br /><br />下载地址：</font>
		<a href="http://www.myeclipseide.com/" target="_blank">
				<font color="#000000" size="2">http://www.myeclipseide.com/</font>
		</a>
		<br />
		<br />不好用你找我<br /><br />下载地址：<a href="http://www.myeclipseide.com/ContentExpress-display-ceid-10.html" target="_blank"><font color="#000000">http://www.myeclipseide.com/ContentExpress-display-ceid-10.html</font></a><br />4.1及4.1.1注册码：<br />junsan<br />wLR8ZC-956-55-5467865000966531<br />或者<br />inpsiresky.com<br />vLR8ZC-956-55-54678656095533727<img src ="http://www.blogjava.net/jackstudio/aggbug/48072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-25 17:07 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/25/48072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的常用方法 </title><link>http://www.blogjava.net/jackstudio/archive/2006/05/21/47321.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sun, 21 May 2006 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/05/21/47321.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/47321.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/05/21/47321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/47321.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/47321.html</trackback:ping><description><![CDATA[
		<p style="COLOR: rgb(0,0,0); BACKGROUND-COLOR: rgb(255,255,255); TEXT-ALIGN: center">
				<font size="2">第一章 字符串</font>
		</p>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>
				</font>
				<font size="2">
						<span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(127,255,212)">
								<span style="COLOR: rgb(0,0,255)">
								</span>
						</span>获取字符串的长度：length()<br /><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(255,255,255)">2、</span>判断字符串的前缀或后缀与已知字符串是否相同<br />前缀 startsWith(String s)、后缀 endsWith(String s)<br /><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(255,255,255)">3、</span>比较两个字符串：equals(String s)<br /><span style="COLOR: rgb(0,0,255); BACKGROUND-COLOR: rgb(255,255,255)">4、</span>把字符串转化为相应的数值<br />int型 Integer.parseInt(字符串)、long型 Long.parseLong(字符串)<br />float型 Folat.valueOf(字符串).floatValue()<br />double型 Double.valueOf(字符串).doubleValue()<br /><span style="COLOR: rgb(0,0,255)">5、</span><span style="BACKGROUND-COLOR: rgb(127,255,212)"></span></font>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">
						</span>
				</font>
				<font size="2">
						<span style="BACKGROUND-COLOR: rgb(127,255,212)">
						</span>将数值转化为字符串：valueOf(数值)<br /><span style="BACKGROUND-COLOR: rgb(127,255,212)"></span></font>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">6、</span>
				</font>
				<font size="2">
						<span style="BACKGROUND-COLOR: rgb(127,255,212)">
						</span>字符串检索<br />indexOf(Srting s) 从头开始检索<br />indexOf(String s ,int startpoint) 从startpoint处开始检索<br />如果没有检索到，将返回-1<br /><span style="BACKGROUND-COLOR: rgb(127,255,212)"></span></font>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">7、</span>
				</font>
				<font size="2">
						<span style="BACKGROUND-COLOR: rgb(127,255,212)">
						</span>得到字符串的子字符串<br />substring(int startpoint) 从startpoint处开始获取<br />substring(int start,int end) 从start到end中间的字符<br /><span style="BACKGROUND-COLOR: rgb(127,255,212)"></span></font>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">8、</span>
				</font>
				<font size="2">
						<span style="BACKGROUND-COLOR: rgb(127,255,212)">
						</span>替换字符串中的字符,去掉字符串前后空格<br />replace(char old,char new) 用new替换old<br /><span style="BACKGROUND-COLOR: rgb(127,255,212)"></span></font>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">9、</span>
				</font>
				<font size="2">
						<span style="BACKGROUND-COLOR: rgb(127,255,212)">
						</span>分析字符串<br />StringTokenizer(String s) 构造一个分析器，使用默认分隔字符（空格，换行，回车，Tab，进纸符）<br />StringTokenizer(String s,String delim) delim是自己定义的分隔符<br />nextToken() 逐个获取字符串中的语言符号<br />boolean hasMoreTokens() 只要字符串还有语言符号将返回true，否则返回false<br />countTokens() 得到一共有多少个语言符号</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第二章 文本框和文本区<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>文本框<br />TextField() 构造文本框，一个字符长、TextField(int x) 构造文本框，x个字符长<br />TextField(String s) 构造文本框，显示s、setText(String s) 设置文本为s<br />getText() 获取文本、setEchoChar(char c) 设置显示字符为c<br />setEditable(boolean) 设置文本框是否可以被修改、addActionListener() 添加监视器<br />removeActionListener() 移去监视器<br /><span style="COLOR: rgb(0,0,255)">2、</span>文本区<br />TextArea() 构造文本区；TextArea(String s) 构造文本区，显示s<br />TextArea(String s,int x,int y) 构造文本区，x行，y列，显示s<br />TextArea(int x,int y) 构造文本区，x行，y列<br />TextArea(String s,int x,ing y,int scrollbar)<br />scrollbar的值是：<br />TextArea.SCROLLBARS_BOTH<span style="COLOR: rgb(0,0,0)">；</span>TextArea.SCROLLBARS_VERTICAL_ONLY<br />TextArea.SCROLLBARS_HORIZONTAL_ONLY；TextArea.SCROLLBARS_NONE<br />setText(String s) 设置文本为s；getText() 获取文本<br />addTextListener() 添加监视器；removeTextListener() 移去监视器<br />insert(String s,int x) 在x处插入文本s<br />replaceRange(String s,int x,int y) 用s替换从x到y处的文本<br />append(String s) 在文本的最后追加文本s<br />Int getCaretPosition(int n) 获取文本区中光标的位置<br /></font>
		</p>
		<p style="TEXT-ALIGN: center">
				<font size="2">第三章 按钮</font>
		</p>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>按钮<br />Button() 构造按钮；Button(String s) 构造按钮，标签是s<br />setLabel(String s) 设置按钮标签是s；getLabel() 获取按钮标签<br />addActionListener() 添加监视器；removeActionListener() 移去监视器<br /></font>
		</p>
		<p style="TEXT-ALIGN: center">
				<font size="2">第四章 标签</font>
		</p>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>标签<br />Label() 构造标签；Label(String s) 构造标签，显示s<br />Label(String s,int x)x是对齐方式，取值：Label.LEFT；Label.RIGHT；Label.CENTER<br />setText(String s) 设置文本s；getText() 获取文本<br />setBackground(Color c) 设置标签背景颜色；setForeground(Color c) 设置字体颜色</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第五章 选择框</font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>选择框<br />Checkbox() 构造选择框；Checkbox(String s) 构造选择框，给定标题s<br />Checkbox(String s,boolean b) b设定初始状态<br />Checkbox(String s,boolean b,CheckboxGroup g) g设定了所属的组（有了组就成为单选框）<br />addItemListener() 添加监视器；removeItemListener() 移去监视器<br />getState() 返回选择框的是否选中状态；setState(boolean b) 设置选择框的状态<br />getLabel() 获取选择框的标题；setLabel(String s) 设置选择框的标题为s<br /></font>
		</p>
		<p style="TEXT-ALIGN: center">
				<font size="2">第六章 选择控件和滚动列表</font>
		</p>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>选择控件<br />Choice() 构造选择控件；add(String s) 向选择控件增加一个选项<br />addItemListener() 添加监视器；removeItemListener() 移去监视器<br />getSelectedIndex() 返回当前选项的索引；getSelectedItem() 返回当前选项的字符串代表<br />insert(String s,int n) 在n处插入选项s<br />remove(int n)；removeAll()<br /><span style="COLOR: rgb(0,0,255)">2、</span>滚动列表<br />List() 构造滚动列表；List(int n) 参数n是可见行数<br />List(int n,boolean b) 参数b是设置是否可以多项选择<br />add(String s) 向列表的结尾增加一个选项；add(String s,int n) 在n处增加一个选项<br />AddActionListener() 滚动列表添加监视器<br />addItemListener() 滚动列表上的选项添加监视器<br />remove(int n) 删除n初的选项；remnoveAll() 删除全部选项<br />getSelectedIndex() 返回当前选项的索引；getSelectedItem() 返回当前选项的字符串代表<br /><span style="COLOR: rgb(0,0,255)">3、</span>组件类的一些常用方法<br />void setBackground(Color c) 设置组件背景颜色<br />void setForeground(Color c) 设置组件前景颜色<br />void setFonts(Font f) 设置组件字体<br />void setBounds(int x,int y,int w,int h) 设置坐标，x，y表示在容器中坐标，w,h表示宽和高<br />void setLocation(int x,int y) 移动到x，y 处；void setSize(int w,int h) 设置宽和高<br />void setVisible(boolean b) 设置组建是否可见<br />int getBounds().wigth 获取宽；int getBounds().height 获取高<br />int getBounds().x 获取x 坐标；int getBounds().y 获取y 坐标<br />Toolkit getToolkit() 获取工具包对<br />void setEnabled(boolean b) 设置是否可以使用（默认可以）<br /></font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第七章 窗口和菜单<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>窗口<br />Frame() 构造窗口；Frame(String s) 窗口标题是s<br />setBounds(int x,int y,int w,int h) 窗口位置x，y，宽w,高y<br />setSize(int w,int h) 设置窗口位置（单位是像素）<br />setBackground(Color c) 设置背景颜色；setVisible(boolean b) 设置窗口是否可见<br />pack() 窗口出现时紧凑；setTitle(String s) 设置标题为s<br />getTitle() 获取标题；setResizable(boolean b) 设置窗口大小是否可以调整<br /><span style="COLOR: rgb(0,0,255)">2、</span>菜单条<br />Menubar() 构造菜单条；setMenubar() 窗口添加菜单条<br /><span style="COLOR: rgb(0,0,255)">3、</span>菜单<br />Menu() 构造菜单；Menu(String s) 构造菜单，标题s<br />add(MenuItem item) 菜单增加菜单选项item；add(String s) 向菜单增加选项s<br />getItem(int n) 获取n处的选项；getItemCount() 获取选项数目<br />insert(MenuItem item,int n) 在n处插入菜单选项item<br />insert(String s,int n) 在n处插入菜单选项<br />remove(int n) 删除菜单的n处的菜单选项；removeAll() 删除全部<br /><span style="COLOR: rgb(0,0,255)">4、</span>菜单项<br />MenuItem() 构造菜单项；MenuItem(String s) 构造标题是s的菜单项<br />setEnabled(boolean b) 设置是否可以被选择；getLabel() 得到菜单选项名<br />addActionListener() 添加监视器<br /><span style="COLOR: rgb(0,0,255)">5、</span>有关菜单的技巧<br />addSeparator() 增加菜单分割线；CheckboxMenuItem() 复选框菜单项<br />setShortcut(MenuShortcut k) 设置快捷键(k取值KeyEvent.VK_A----KeyEvent.VK_Z)</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第八章 建立对话框<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>Dialog类<br />Dialog(Frame f,String s) 构造对话框，初始不可见，s是标题，f是对话框所依赖的窗口<br />Dialog(Frame f,String s,boolean b) b设置初始是否可见<br />getTitle() 获取对话框标题；setTitle(String s) 设置对话框标题<br />setModal(boolean b) 设置对话框模式；setSize(int w,int h) 设置对话框大小<br />setVisible(boolean b) 显示或隐藏对话框<br /><span style="COLOR: rgb(0,0,255)">2、</span>FileDialog类<br />Filedialog(Frame f,String s,int mode) mode的值是fileDialog.LOAD或者fileDialog.SAVE<br />public String getDirectory() 获取当前文件对话框中显示的文件所属目录<br />public String getFile() 获取当前文件对话框中文件的字符串表示，不存在返回null<br /></font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第九章 Java中的鼠标和键盘事件<br /><br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>使用MouseListener借口处理鼠标事件<br />鼠标事件有5种：按下鼠标键，释放鼠标键，点击鼠标键，鼠标进入和鼠标退出<br />鼠标事件类型是MouseEvent，主要方法有：<br />getX(),getY() 获取鼠标位置；getModifiers() 获取鼠标左键或者右键<br />getClickCount() 获取鼠标被点击的次数；getSource() 获取鼠标发生的事件源<br />事件源获得监视器的方法addMouseListener()，移去监视器的方法removeMouseListener()<br />处理事件源发生的时间的事件的接口是MouseListener 接口中有如下的方法<br />mousePressed(MouseEvent) 负责处理鼠标按下事件<br />mouseReleased(MouseEvent) 负责处理鼠标释放事件<br />mouseEntered(MouseEvent) 负责处理鼠标进入容器事件<br />mouseExited(MouseEvent) 负责处理鼠标离开事件<br />mouseClicked(MouseEvent) 负责处理点击事件<br /><span style="COLOR: rgb(0,0,255)">2、</span>使用MouseMotionListener接口处理鼠标事件<br />事件源发生的鼠标事件有2种：拖动鼠标和鼠标移动；鼠标事件的类型是MouseEvent<br />事件源获得监视器的方法是addMouseMotionListener()<br />处理事件源发生的事件的接口是MouseMotionListener 接口中有如下的方法<br />mouseDragged() 负责处理鼠标拖动事件；mouseMoved() 负责处理鼠标移动事件<br /><span style="COLOR: rgb(0,0,255)">3、</span>控制鼠标的指针形状<br />setCursor(Cursor.getPreddfinedCursor(Cursor.鼠标形状定义)) 鼠标形状定义见（书 P 210）<br /><span style="COLOR: rgb(0,0,255)">4、</span>键盘事件<br />键盘事件源使用addKeyListener 方法获得监视器<br />键盘事件的接口是KeyListener 接口中有3个方法<br />public void keyPressed(KeyEvent e) 按下键盘按键<br />public void keyReleased(KeyEvent e) 释放键盘按键<br />public void keyTypde(KeyEvent e) 按下又释放键盘按键</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十章 Java多线程机制<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>Java的线程类与Runnable接口<br />Thread类<br />public Thread() 创建线程对象；  public Thread(Runnable target) <br />target称为被创建线程的目标对象，负责实现Runnable<br />线程优先级<br />Thread类有三个有关线程优先级的静态常量：MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY<br />新建线程将继承创建它的副线程的优先级。<br />用户可以调用Thread类的setPriority(int a)来修改a的取值:<br />Thread.MIN_PRIORITY,Thread.MAX_PRIORITY,Thread.NORM_PRIORITY<br />主要方法<br />启动线程 start()；定义线程操作 run()<br />使线程休眠 sleep()：sleep(int millsecond) 以毫秒为单位的休眠时间<br />sleep(int millsecond,int nanosecond) 以纳秒为单位的休眠时间<br />currentThread() 判断谁在占用CPU的线程 <br /></font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十一章 输入输出流<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>FileInputStream类<br />FileInputStream(String name) 使用给定的文件名name创建一个FileInputStream对象<br />FileInputStream(File file) 使用File对象创建FileInpuStream对象<br />File类有两个常用方法：<br />File(String s) s确定文件名字；File(String directory,String s) directory是文件目录<br />处理I/O异常<br />当出现I/O错误的时候，Java生成一个IOException(I/O异常)对象来表示这个错误的信号。<br />程序必须使用一个catch检测这个异常<br /><br />从输入流中读取字节<br />int read() 返回0~255之间一个整数，如果到输入流末尾，则返回-1<br />int read(byte b[]) 读取字节数组<br />int read(byte b[],int off,int len)：<br />off指定把数据存放在b中什么地方，len指定读取的最大字节数<br />关闭流<br />close()<br /><span style="COLOR: rgb(0,0,255)">2、</span>FileOutputStream类<br />FileOutputStream(String name) 使用指定的文件名name创建FileOutputStream对象<br />FileOutputStream（File file） 使用file对象创建FileOutputStream对象<br />FileOutputStream（FileDescriptor fdobj） 使用FileDescriptor对象创建FileOutputStream对象<br /><span style="COLOR: rgb(0,0,255)">3、</span>FileReader类和FileWriter类<br />FileReader(String filename)；FileWriter(String filename)<br />处理时需要FileNotFoundException异常<br /><span style="COLOR: rgb(0,0,255)">4、</span>RandomAccessFile类<br />RandomAccessFile不同于FileInputStream和FileOutputStream,不是他们的子类<br />当我们想对一个文件进行读写操作的时候，创建一个指向该文件的RandomAccessFile流就行了<br />RandomAccessFile类有两个构造方法：<br />RandomAccessFile（String name, String mode） name是文件名，mode取r(只读)或rw(读写)<br />RandomAccessFile（File file,String mode） file给出创建流的源<br />seek(long a) 移动RandomAccessFile流指向文件的指针,a确定指针距文件开头的位置<br />getFilePointer() 获取当前文件的指针位置；close() 关闭文件<br />getFD() 获取文件的FileDescriptor；length() 获取文件长度<br />read() 读取一个字节数据；readBoolean() 读取一个布尔值；readByte() 读取一个字节<br />readChar()；readFloat()；readFully(byte b[])；readInt()；readLine()；readLong()<br />readUnsignedShort()；readUTF() 读取一个UTF字符串<br />setLength(long newLength) 设置文件长度；skipByte(int n) 在文件中跳过给定数量的字节<br />write(byte b[]) 写b.length个字节到文件；writeBoolean(bolean b)<br />writeByte(int v)；writeChar(char c)；writeChars(String s)；writeDouble(double d)<br />writeFloat(float v)；writeInt(int i)；writeLong(long l)；writeShort(int i)<br />writeUTF(String s)<br /><span style="COLOR: rgb(0,0,255)">5、</span>管道流<br />PipedInputStream类；PipedInputStream() 创建一个管道输入流<br />PipedInputStream（PipedOutputStream a） 连接到输出流a的输入流<br />read() 从输入流中读取一个字节<br />read(byte b[],int off,int len) off是在b中的开始位置，len是字节长度<br />PipedOutputStream类；PipedOutputStream() 创建一个输出流<br />PipedOutputStream(PipedInputStream a) 连接到输入流a的输出流<br />write(int b)；write(byte b[],int off,int len)<br />counnect() 连接输入输出流；close() 关闭流；在使用的时候要捕获IOException异常。<br /><span style="COLOR: rgb(0,0,255)">6、</span>数据流<br />DataInputStream类(数据输入流)<br />DataInputStream(InputStream in) 将数据输入流指向一个由in指定的输入流<br />DataOutputStream类(数据输出流)<br />DataOutputStream(OutputStream out) 将数据输出流指向一个由out指定的输出流<br />主要方法：<br />close()；read() 读取一个字节数据；readBoolean() 读取一个布尔值<br />readByte() 读取一个字节；readChar()；readFloat()；readFully(byte b[])<br />readInt()；readLine()；readLong()；readUnsignedShort()<br />readUTF() 读取一个UTF字符串；skipByte(int n) 在文件中跳过给定数量的字节<br />write(byte b[]) 写b.length个字节到文件；writeBoolean(bolean b)<br />writeByte(int v)；writeChar(char c)；writeChars(String s)；<br />writeDouble(double d)；writeFloat(float v)；writeInt(int i)<br />writeLong(long l)；writeShort(int i)；writeUTF(String s)<br /><span style="COLOR: rgb(0,0,255)">7、</span>对象流<br />ObjectInputStream类和ObjectOutputStream类分别是DataInputStream类和DataOutputStream类的子类<br /><span style="COLOR: rgb(0,0,255)">8、</span>回压输入流<br />PushbackInputStream类；PushbackInputStream(InputStream in)<br />PushbackReader类；PushbackReader(Reader in)<br />unread(char c) 回压一个字符；unread(char c[]) 回压数组c中全部字符<br />unread(char c[],offset,int n) 回压c中从offset开始的n个字符</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十二章 java网络的基本知识<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>使用URL（统一资源定位）<br />例如：<br />try<br />{<br />url=new URL("<a href="http://www.sina.com.cn/">http://www.sina.com.cn</a>";<br />}<br />catch(MalformedURLException e)<br />{<br />System.out.println("Bad <a href="http://www.54bk.com/%22+url">URL:"+url</a>);<br />}<br />在Applet 中链接向另外的Web页面，使用代码：<br />getAppletContext().showDocument(url);<br /><span style="COLOR: rgb(0,0,255)">2、</span>套接字<br />客户建立到服务器的套接字（Socket）<br />Socket(String host,int port) host是服务器的IP地址，port是端口号<br />建立了套接字后可以使用getInputStream()获得输入流<br />还可以使用getOutputStream()获得一个输出流<br />服务器建立接受客户套接字的服务器套接字（ServerSocket）<br />ServerSocket(int port) port是端口号<br />建立了套接字连接后可以使用accept()接收客户的套接字<br />可以使用getOutputStream()获得一个输出流<br />还可以使用getInputStream()获得一个输入流<br /><span style="COLOR: rgb(0,0,255)">3、</span>InetAddress类<br />getByName(String s) 获取Internet上主机的地址<br />getHostName() 获取InetAddress对象所包含的域名<br />getHostAddress() 获取InetAddress对象所包含的IP地址<br />getLocalHost() 获取本地地址<br /><span style="COLOR: rgb(0,0,255)">4、</span>UDP数据报<br />发送数据包，即使用DatagramPacket类将数据打包,有两种构造方法<br />DatagramPacket(byte data[],int length,InetAddress address,int port)<br />?含有data数组的数据<br />?该数据包将发送到地质是address，端口是port的主机上<br />DatagramPacket(byte data[],int offset,int length,InetAddress address,int port)<br />?含有data数组的从offset开始，length长度的数据<br />?该数据包将发送到地质是address，端口是port的主机上<br />接收数据包，即使用DatagramSocket（int port）创建一个对象，port必须和待接收的数据包的端口相同<br />例如：<br />如果发送方的数据包端口是5566<br />DatagramSocket mail=new DatagramSocket(5566);<br />然后对象mail可以使用方法receive（Datagrampacket pack）接收数据包<br />在使用参数pack 接收数据包前，必须创建pack<br />byte data[]=new byte[100];<br />int length=90;<br />DatagramPacket pack=new DatagramPataet(data,length);<br />mail.receive(pack);<br />该数据包pack将接收长度是length的数据放入data,注意数据长度不要超过8192KB<br />pack还可以调用方法getPort()获取所接受数据包是从什么端口发出的<br />调用方法InetAddress getAddress()可以获知数据包来自哪个主机</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十三章 Java与图像 <br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>java支持的图像类型：GIF，JPEG，BMP<br /><span style="COLOR: rgb(0,0,255)">2、</span>Image类<br />首先申请一个Image对象<br />Image img =getImage(URL url,String name) url是图像地址，name是图片名称<br />通常使用：<br />Image img =getImage(getCodBase(),String name) getCodBase()获取当前小应用程序的URL，也就是在同一目录下<br />图像被加载后，就可以在paint()中绘制了<br />drawImage(Image img,int x,int y,ImageObserver observer)<br />img是上面获取的图像， x,y是指定图像左上角的位置，observer是加载图像时的图像观察器<br />Applet类已经实现了ImageObserver接口，所以可以直接使用this作为最后一个参数<br />drawImage(Image img,int x,int y,int width,int height,ImageObserver observer)<br />width和height是要绘制的图像的宽和高<br />可以使用img.getHeight(this)和img.getWidth(this)来获取被加载的图像的宽和高<br /><span style="COLOR: rgb(0,0,255)">3、</span>设置Java窗口图标<br />Frame对象可以使用setIconImage(Image img)方法设置左上角图标，默认图标是咖啡杯</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十四章 Java数据库连接(JDBC)<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>JDBC-ODBC桥接器<br />建立JDBC-ODBC桥接器<br />try<br />{<br />Class.forName("sun.jdbc.odbc.JdbcOdbcDriver";<br />}<br />catch(ClassNotFoundException e){}<br />连接到数据库<br />try<br />{<br />Connection con=DriverManager.getConnection("jdbc:jdbc:数据源名称","数据源的login name"，<br />"数据源的password"<br />}<br />catch(SQLException e){}<br />向数据库发送SQL语句<br />try<br />{<br />Statement sql=con.createStatement();<br />}<br />catch(SQLException e){}<br />处理查询结果<br />ResultSet rs=sql.executeQuery("SQL语句";<br /></font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十五章 Java与多媒体<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>在小程序中播放声音<br />java可以播放au,aiff,wav,midi,rfm格式的音频<br />可以调用Applet的一个静态方法：<br />newAudioClip(URL url,String name) url是地址，name是音频名称<br />也可以用Applet类的实例方法：<br />getAudioClip(URL url,String name)<br />根据url地址和声音文件name，获得一个用于播放的音频对象，这对象可以使用下面的方法来处理声音：<br />play() 播放声音文件name；loop() 循环播放name；stop() 停止播放name<br /><span style="COLOR: rgb(0,0,255)">2、</span>Java媒体框架(JMF)<br />创建播放器<br />try<br />{<br />URL url=new URL(getDocumenBase(),视频文件名称);<br />player player=Manager.createPlayer(url);<br />}<br />catch(IOException e){}<br />向播放器注册控制监视器<br />player.addControllerListener(监视器);<br />创建监视器必须使用接口ControllerListener ，该接口中的方法是<br />public void controllerUpdate(ControllerEvent e)<br />让播放器对媒体进行预提取：player.prefetch()<br />启动播放器：player.start();<br />停止播放器：player.stop();<br />停止播放器后必须释放内存中的资源：player.deallocate();</font>
		</p>
		<div style="TEXT-ALIGN: center">
				<font size="2">第十六章 Java Swing基础<br /></font>
		</div>
		<p>
				<font size="2">
						<span style="COLOR: rgb(0,0,255)">1、</span>Jcomponent类<br />Jcomponent类 是所有轻量组件的父类，主要的子类有：<br />JButton 创建按钮对象，而且可以创建在图标的按钮；</font>
				<font size="2">JTree 创建树对象<br /></font>
				<font size="2">JComboBox 创建组合框对象，和Choice相似；JCheckBox 创建复选框对象<br />JFileChooser 创建文件选择器；JInternalFrame 创建内部窗体<br />JLabel 创建标签；JMenu 创建菜单对象；JMenuBar 创建菜单条对象<br />JMenuItem 创建菜单项对象；JPanel 创建面板对象；JPasswordField 创建口令文本对象<br />JPopupMenu 创建弹出式菜单；JProgressBar 创建进程条；JRadioButton 创建单选按钮<br />JScrollBar 创建滚动条；JScrollPane 创建滚动窗格；JSlider 创建滚动条<br />JSplitPane 创建拆分窗格；JTable 创建表格；JTextArea 创建文本区<br />JTexPane 创建文本窗格；JToolBar 创建工具条；JToolTip 创建工具提示对象<br /><span style="COLOR: rgb(0,0,255)">2、</span>JFrame类<br />JFrame类及其子类创建的对象是窗体<br />（1）JFrame类及其子类创建的窗体是swing窗体<br />（2）不可以把组件直接加到swing窗体中，应该把组件加到内容面板中<br />（3）不能为swing窗体设置布局，而应当为内容面板设置布局<br />（4）swing窗体通过调用getContentPane()方法得到它的内容面板<br /><span style="COLOR: rgb(0,0,255)">3、</span>JApplet类<br />（1）不可以把组件直接添加到小程序容器中，也应该添加到内容面板中<br />（2）不能为小程序设置布局<br />（3）小程序容器通过调用getContenPane()方法得到内容面板<br /><span style="COLOR: rgb(0,0,255)">4、</span>JDialog类<br />（1）不可以把组件直接添加到对话框容器中，也应该添加到内容面板中<br />（2）不能为对话框设置布局<br />（3）对话框容器通过调用getContenPane()方法得到内容面板<br /><span style="COLOR: rgb(0,0,255)">5、</span>JPanel面板：JPanel()；JPanel(布局对象)<br /><span style="COLOR: rgb(0,0,255)">6、</span>滚动窗口JScrollPane：JScrollPane()；JScrollPane(component c)<br /><span style="COLOR: rgb(0,0,255)">7、</span>拆分窗口JSplitPane<br />JSplitPane(int a,Component b,Component c)<br />a的取值是HORIZONTAL_SPLIT或者VERTICAL_SPLIT决定水平拆分还是垂直拆分<br />JSplitPane(int a,boolean b ,Component b,Component c) b的取值决定拆分线移动的时候组件是否连续变化<br /><span style="COLOR: rgb(0,0,255)">8、</span>内部窗体JInternalFrame<br />JInternalFrame(String title,boolean resizable,booleam closable,boolean max,boolean min)<br />参数的意义分别是窗口名称，是否能调整大小，是否有关闭按钮，最大化按钮，最小化按钮<br />（1）不能把组件直接加到窗体中，而是加到内容面板中<br />（2）必须先把内部窗体加到一个容器中（JDesktopPane），该容器是专门为内部窗体服务的<br /><span style="COLOR: rgb(0,0,255)">9、</span>按钮（JButton）<br />JButton() 创建按钮；JButton(String s) s是按钮的名字<br />JButton(Icon icon) icon是按钮上的图标；JButton(String s,Icon icon)<br />getText() 获取按钮名字；getIcon() 获取按钮图标<br />setIcon(Icon icon) 设置按钮图标<br />setHorizontalTextposition(int a) a确定按钮上图标的位置，取值：<br />AbstractButton_CENTR,AbstractButton_LEFT,AbstractButton_RIGHT<br />setVerticalTextposition(int a) a确定按钮上名字相对图标的位置，取值：<br />AbstractButton.TOP，AbstractButton.BOTTOM，AbstractButton.CENTR<br />setMnemonic(char c) 设置按钮的键盘操作方式是字符c（Alt+c）<br />setEnabled(boolean b) b决定按钮是否可以被单击</font>
		</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/47321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-05-21 19:20 <a href="http://www.blogjava.net/jackstudio/archive/2006/05/21/47321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Log4J使用方法</title><link>http://www.blogjava.net/jackstudio/archive/2006/04/22/42447.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Sat, 22 Apr 2006 01:38:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/04/22/42447.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/42447.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/04/22/42447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/42447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/42447.html</trackback:ping><description><![CDATA[
		<p align="left">看了别人写了那么多的教程,自己也受益不少,现在也把自己学Log4J的体会写下来.<br /><br />1.在WEB-INF\classes文件下放入一个java属性文件,名字为commons-logging.properties,这是一个通用日志文件的配置文件,当然你也可以用xml文件来弄.其内容如下:<br /><br />#--------------------------------------------------------<br />#使用Log4J实现<br />org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog</p>
		<p>## 使用SimpleLog实现<br />#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog<br /><br />后面的值是你想要的实现日志接口的类.apache的commons-logging.jar本身带了两个实现,SimpleLog<br />是其中的一个,如果 你的要使用Log4J,还必须把Log4J大相关jar放到相应的lib下.<br /><br /><br />2.如果使用SimpleLog,那么在WEB-INF\classes下要有一个simplelog.properties文件,内容:<br />//---------------------------------------------<br />org.apache.commons.logging.simplelog.defaultlog = info<br /><br />主要是定义SimpleLog日志输出级别.<br /><br /><br />3.使用Log4J进行日志输出不仅可以定义输出的级别,还可以定义输出的地方和输出的格式.而simplelog只有System.err.         Log4J主要是定义三个Logger,appender 和layout,appender 是输出的地方,layout就是布局,也就是输出的格式.<br />//-----------------------------------------------<br /><br />## LOGGERS ##<br />#定义一个logger<br />log4j.rootLogger=INFO,<strong><font color="#ff0000">console</font></strong>,<strong><font color="#ff0000">file</font></strong></p>
		<p>## APPENDERS ##<br />#定义一个appender,后面的红色字体就是他的名字,可以任意定义.其值是相关的输出的类.可取值如<br />#ConsoleAppender<br />#RollingFileAppender<br />#DailyRollingFileAppender<br />..............................................<br /><br /># log4j.appender.<strong><font color="#ff0000">console</font></strong>=org.apache.log4j.ConsoleAppender<br /><br />log4j.appender.<font color="#ff0000"><strong>file</strong></font>=org.apache.log4j.RollingFileAppender<br />log4j.appender.<strong><font color="#ff0000">file</font></strong>.File=log.txt</p>
		<p>#如果使用FileAppender那么后面还跟很有多属性如MaxFileSize,MaxBackupIndex等.<br /><br />## LAYOUTS ##<br /><br /># 定义格式<br />#格式主要有好几中常用的就是SimpleLayout,HTMLLayout,PatternLayout,使用PatternLayout时后面还要有一个定义格式的ConversionPattern.<br />log4j.appender.<strong><font color="#ff0000">console</font></strong>.layout=org.apache.log4j.SimpleLayout</p>
		<p># PatternLayout <br />log4j.appender.<font color="#ff0000"><strong>file</strong></font>.layout=org.apache.log4j.PatternLayout<br />log4j.appender.<strong><font color="#ff0000">file</font></strong>.layout.ConversionPattern=%t %p - %m%n<br /><br />#以下是使用的方法:<br />1.在action,servlet中<br /><br />import org.apache.commons.logging.Log;<br />import org.apache.commons.logging.LogFactory;<br /><br />         Log log=LogFactory.getLog("helloapplog");<br />         log.trace("This is a trace message");<br />         log.debug("This is a debug message");<br />         log.info("This is an info message");<br />         log.warn("This is a warn message");<br />         log.error("This is an error message");<br />         log.fatal("This is a fatal message");<br /><br />2.在jsp中.<br /><br /> &lt;%@ page import="org.apache.commons.logging.Log" %&gt;<br />&lt;%@ page import="org.apache.commons.logging.LogFactory" %&gt;<br />&lt;% Log logger = LogFactory.getLog( this.getClass(  ) ); %&gt;<br />  &lt;% logger.warn( "This is a warn message from a jsp" ); %&gt;<br />  &lt;% logger.error( "This is an error message from a jsp" ); %&gt;</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/42447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-04-22 09:38 <a href="http://www.blogjava.net/jackstudio/archive/2006/04/22/42447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小弟整理的关于lucene笔记...........</title><link>http://www.blogjava.net/jackstudio/archive/2006/03/31/38471.html</link><dc:creator>jackstudio</dc:creator><author>jackstudio</author><pubDate>Fri, 31 Mar 2006 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/jackstudio/archive/2006/03/31/38471.html</guid><wfw:comment>http://www.blogjava.net/jackstudio/comments/38471.html</wfw:comment><comments>http://www.blogjava.net/jackstudio/archive/2006/03/31/38471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jackstudio/comments/commentRss/38471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jackstudio/services/trackbacks/38471.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<font color="#ff3333">记得是看了某位大虾的blog整理的,可是现在也忘记了这位好人,在次表示感谢这为无名英雄.</font>
				</strong>
				<br />
				<br />
				<br />lucene学习笔记:</p>
		<p>(一)Query<br /> 1.TermQuey//查询特定的某个Field<br /> //过程:<br /> Term t = new Term("subject", "ant");<br /> //Term构造函数的参数:param1是Field名,param2是用户查询的关键字<br /> Query query = new TermQuery(t);<br /> Hits hits = searcher.Search(query);<br /> 2.QueryParse//简化查询语句<br /> //过程:<br /> Query query = QueryParser.Parse("+JUNIT +ANT -MOCK","contents",new SimpleAnalyzer());<br /> Hits hits = searcher.Search(query);<br /> //注意:TermQuery和QueryParse只要在QueryParse的Parse方法中只有一个word,就会自动转换成TermQuery.<br /> 3.RangeQuery//范围查询,用于查询范围,通常用于时间<br /> //过程:<br /> RangeQuery query = new RangeQuery(begin, end, true);<br /> Hits hits = searcher.Search(query);<br /> //RangeQuery的第三个参数用于表示是否包含该起止日期.Lucene用[] 和{}分别表示包含和不包含.RangeQuery到QueryParse的转化<br /> //Query query = QueryParser.Parse("pubmonth:[200004 TO 200206]", "subject", new SimpleAnalyzer());<br /> //IndexSearcher searcher = new IndexSearcher(directory);<br /> //Hits hits = searcher.Search(query);<br /> 4.PrefixQuery//搜索是否包含某个特定前缀<br /> PrefixQuery query = new PrefixQuery(new Term("category", "/Computers"));<br /> Hits hits = searcher.Search(query);<br /> 5.BooleanQuery//用于测试满足多个条件<br /> TermQuery searchingBooks =new TermQuery(new Term("subject", "junit"));<br /> RangeQuery currentBooks =new RangeQuery(new Term("pubmonth", "200301"),new Term("pubmonth", "200312"),true);<br /> BooleanQuery currentSearchingBooks = new BooleanQuery();<br /> currentSearchingBooks.Add(searchingBooks, true, false);<br /> currentSearchingBooks.Add(currentBooks, true, false);<br /> IndexSearcher searcher = new IndexSearcher(directory);<br /> Hits hits = searcher.Search(currentSearchingBooks);<br /> //什么时候是与什么时候又是或? 关键在于BooleanQuery对象的Add方法的参数.<br /> //参数一是待添加的查询条件.<br /> //参数二Required表示这个条件必须满足吗? True表示必须满足, False表示可以不满足该条件.<br /> //参数三Prohibited表示这个条件必须拒绝吗? True表示这么满足这个条件的结果要排除, False表示可以满足该条件.<br /> //BooleanQuery和QueryParse<br /> [Test]<br />         public void TestQueryParser()<br />         {<br />              Query query = QueryParser.Parse("pubmonth:[200301 TO 200312] AND junit", "subject", new SimpleAnalyzer());<br />              IndexSearcher searcher = new IndexSearcher(directory);<br />              Hits hits = searcher.Search(query);<br />              Assert.AreEqual(1, hits.Length());<br />              query = QueryParser.Parse("/Computers/JUnit OR /Computers/Ant", "category", new WhitespaceAnalyzer());<br />              hits = searcher.Search(query);<br />              Assert.AreEqual(2, hits.Length());<br />         }</p>
		<p>  //注意AND和OR的大小 如果想要Ａ与非B 就用 A AND –B 表示, +A –B也可以.</p>
		<p>  //默认的情况下QueryParser会把空格认为是或关系,就象google一样.但是你可以通过QueryParser对象修改这一属性.</p>
		<p>[Test]<br />         public void TestQueryParserDefaultAND()<br />         {<br />              QueryParser qp = new QueryParser("subject", new SimpleAnalyzer());<br />              qp.SetOperator(QueryParser.DEFAULT_OPERATOR_AND );<br />              Query query = qp.Parse("pubmonth:[200301 TO 200312] junit");<br />              IndexSearcher searcher = new IndexSearcher(directory);<br />              Hits hits = searcher.Search(query);<br />              Assert.AreEqual(1, hits.Length());</p>
		<p>         }</p>
		<p> 6.PhraseQuery//短语查询<br /> 7.WildcardQuery//通配符搜索<br /> 8.FuzzyQuery//模糊查询</p>
		<p>(二)Analyzer</p>
		<p> WhitespaceAnalyzer:仅仅是去除空格，对字符没有lowcase化,不支持中文<br /> SimpleAnalyzer:功能强于WhitespaceAnalyzer,将除去letter之外的符号全部过滤掉,并且将所有的字符lowcase化,<br /> 不支持中文<br /> StopAnalyzer:StopAnalyzer的功能超越了SimpleAnalyzer，在SimpleAnalyzer的基础上<br />    增加了去除StopWords的功能,不支持中文<br /> StandardAnalyzer:英文的处理能力同于StopAnalyzer.支持中文采用的方法为单字切分.<br /> ChineseAnalyzer:来自于Lucene的sand box.性能类似于StandardAnalyzer,缺点是不支持中英文混和分词.<br /> CJKAnalyzer:chedong写的CJKAnalyzer的功能在英文处理上的功能和StandardAnalyzer相同<br />    但是在汉语的分词上，不能过滤掉标点符号，即使用二元切分<br /> 最强大的分析程序——StandardAnalyzer类。<br /> StandardAnalyzer类会将文本的所有内容变成小写的，并去掉一些常用的停顿词（stop word）。<br /> 停顿词是像“a”、“the”和“in”这样的词，它们都是内容里非常常见的词，但是对搜索却一点用处都没有。<br /> 分析程序也会分析搜索查询，这就意味着查询会找到匹配的部分。例如，<br /> 这段文本“The dog is a golden retriever（这条狗是一只金毛猎犬）”，<br /> 就会被处理为“dog golden retriever”作为索引。当用户搜索“a Golden Dog”的时候，<br /> 分析程序会处理这个查询，并将其转变为“golden dog”，这就符合我们的内容了。</p>
		<p>
				<br />(三)性能问题<br /> 1.切词,索引,存属<br /> 域存储字段规则<br /> 方法 切词 索引 存储 用途 <br /> Field.Text(String name, String value) 切分词索引并存储，比如：标题，内容字段 <br /> Field.Text(String name, Reader value)  切分词索引不存储，比如：META信息，<br /> 不用于返回显示，但需要进行检索内容 <br /> Field.Keyword(String name, String value)  不切分索引并存储，比如：日期字段 <br /> Field.UnIndexed(String name, String value)  不索引，只存储，比如：文件路径 <br /> Field.UnStored(String name, String value)  只全文索引，不存储 <br />-----------------------------------------------------------------------------------------------<br /> Keywork<br /> 该类型的数据将不被分析,而会被索引并保存保存在索引中. <br /> UnIndexed<br /> 该类型的数据不会被分析也不会被索引,但是会保存在索引. <br /> UnStored<br /> 和UnIndexed刚好相反,被分析被索引,但是不被保存.<br /> Text<br /> 和UnStrored类似.如果值的类型为string还会被保存.如果值的类型Reader就不会被保存和UnStored一样.<br /> <br /> 2.优化索引生成文件<br />  1.索引的权重SetBoost<br />   if (GetSenderDomain().EndsWith(COMPANY_DOMAIN)) <br />   //如果是公司邮件,提高权重,默认权重是1.0<br />           doc.SetBoost(1.5);                       <br />   else<br />   //如果是私人邮件,降低权重.<br />           doc.SetBoost(0.1);<br />  不仅如此你还可以对Field也设置权重.比如你对邮件的主题更感兴趣.就可以提高它的权重.  <br />  Field senderNameField = Field.Text("senderName", senderName);<br />  Field subjectField = Field.Text("subject", subject);<br />  subjectField.SetBoost(1.2);</p>
		<p>  2.利用IndexWriter 属性对建立索引进行高级管理<br />   在建立索引的时候对性能影响最大的地方就是在将索引写入文件的时候所以在具体应用的时候就需要对此加以控制 <br />   IndexWriter属性   <br />   描述   默认值   备注<br />   MergeFactory 10    控制segment合并的频率和大小<br />   MaxMergeDocs Int32.MaxValue 限制每个segment中包含的文档数<br />   MinMergeDocs 10    当内存中的文档达到多少的时候再写入segment</p>
		<p>   Lucene默认情况是每加入10份文档就从内存往index文件写入并生成一个segement,然后每10个segment就合并成一个segment.通过MergeFactory这个变量就可以对此进行控制. <br />   MaxMergeDocs用于控制一个segment文件中最多包含的Document数.比如限制为100的话,即使当前有10个segment也不会合并,因为合并后的segmnet将包含1000个文档,超过了限制.<br />   MinMergeDocs用于确定一个当内存中文档达到多少的时候才写入文件,该项对segment的数量和大小不会有什么影响,它仅仅影响内存的使用,进一步影响写索引的效率.</p>
		<p>  3.利用RAMDirectory充分发挥内存的优势<br />   在实际应用中RAMDirectory和FSDirectory协作可以更好的利用内存来优化建立索引的时间.<br />   具体方法如下:<br />   1.建立一个使用FSDirectory的IndexWriter<br />   2.建立一个使用RAMDirectory的IndexWriter <br />   3. 把Document添加到RAMDirectory中<br />   4. 当达到某种条件将RAMDirectory 中的Document写入FSDirectory.<br />   5. 重复第三步 </p>
		<p>   示意代码:<br />      private FSDirectory fsDir = FSDirectory.GetDirectory("index",true);  </p>
		<p>       private RAMDirectory ramDir = new RAMDirectory();</p>
		<p>       private IndexWriter fsWriter = IndexWriter(fsDir,new SimpleAnalyzer(), true);<br />       private IndexWriter ramWriter = new IndexWriter(ramDir,new SimpleAnalyzer(), true);<br />       while (there are documents to index) <br />      {<br />         ramWriter.addDocument(doc);<br />         if (condition for flushing memory to disk has been met) <br />         {<br />           fsWriter.AddIndexes(Directory[]{ramDir}) ;<br />           ramWriter.Close();          //why not support flush?<br />           ramWriter =new IndexWriter(ramDir,new SimpleAnalyzer(),true);<br />         }<br />     } <br />   这里的条件完全由用户控制,而不是FSDirectory采用对Document计数的方式控制何时写入文件.<br />   相比之下有更大的自由性,更能提升性能.<br />  4.控制索引内容的长度<br />   Lucene对一份文本建立索引时默认的索引长度是10,000. 你可以通过IndexWriter 的MaxFieldLength属性对此加以修改.还是用一个例子说明问题. <br />  5.Optimize 优化<br /><br />=------------------------jackstudio-----------------</p>
<img src ="http://www.blogjava.net/jackstudio/aggbug/38471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jackstudio/" target="_blank">jackstudio</a> 2006-03-31 14:01 <a href="http://www.blogjava.net/jackstudio/archive/2006/03/31/38471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>