﻿<?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-</title><link>http://www.blogjava.net/jiabao/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 06:23:23 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 06:23:23 GMT</pubDate><ttl>60</ttl><item><title>java 数据库缓冲池 使用c3p0</title><link>http://www.blogjava.net/jiabao/archive/2008/10/23/236102.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 23 Oct 2008 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/23/236102.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/236102.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/23/236102.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/236102.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/236102.html</trackback:ping><description><![CDATA[
		<div class="blog_content">
				<p>
						<em>c3p0很容易使用的开源专业级jdbc数据库缓冲池。<br />它是sourceforge上的一个开源项目，<br />项目在 </em>
						<a href="http://sourceforge.net/projects/c3p0">
								<font color="#108ac6">
										<em>http://sourceforge.net/projects/c3p0</em>
								</font>
						</a>
						<br />
						<em>他的众多特性这里就不一一介绍了。<br />比较爽的一点就是<br />当Connection归还缓冲池时，c3p0会很小心的关闭<br />这条连接打开的Statement和ResultSet,免去了使用时<br />自己动手小心翼翼的关闭。</em>
				</p>
				<p>
						<em>c3p0使用非常简单，这里给一个例子</em>
				</p>
				<p>
						<em>package common.db;</em>
				</p>
				<p>
						<em>import java.sql.Connection;<br />import java.sql.SQLException;<br />import java.util.Properties;</em>
				</p>
				<p>
						<br />
						<em>import com.mchange.v2.c3p0.ComboPooledDataSource;<br />import com.mchange.v2.c3p0.DataSources;</em>
				</p>
				<p>
						<em>public final class ConnectionManager {<br /> private static ConnectionManager instance;<br /> <br /> public ComboPooledDataSource ds;<br /> private static String c3p0Properties="c3p0.properties";<br />  <br /> private ConnectionManager() throws Exception {<br />  Properties p = new Properties();<br />  p.load(this.getClass().getResourceAsStream(c3p0Properties));<br />  ds = new ComboPooledDataSource();<br /> }<br /> <br /> public static final ConnectionManager getInstance() {<br />  if (instance == null) {<br />   try {<br />    instance = new ConnectionManager();<br />   } catch (Exception e) {<br />    e.printStackTrace();<br />   }<br />  }<br />  return instance;<br /> }<br /> <br /> public synchronized final Connection getConnection() {<br />  try {<br />   return ds.getConnection();<br />  } catch (SQLException e) {<br />   e.printStackTrace();<br />  }<br />  return null;<br /> }</em>
				</p>
				<p>
						<em> protected void finalize() throws Throwable {<br />  DataSources.destroy(ds); //关闭datasource<br />  super.finalize();<br /> }<br /> <br />}</em>
				</p>
				<p>
						<em>然后在ConnectionManager类的目录下再创建一个配置文件c3p0.properties<br />内容如下：<br />#db login parameters<br />driverClass=com.mysql.jdbc.Driver<br />jdbcUrl=jdbc:mysql://localhost/test?useUnicode=no&amp;characterEncoding=GBK<br />user=test<br />password=test</em>
				</p>
				<p>
						<em>#pool parameters<br />initialPoolSize=2<br />maxPoolSize=5<br />#maxIdleTime=10<br />#idleConnectionTestPeriod=5<br />autoCommitOnClose=true</em>
				</p>
				<p>
						<em>完整的配置文件参数参看c3p0的文档</em>
				</p>
				<p>
						<em>使用connection时很简单<br />Connection conn = ConnectionManager.getInstance().getConnection();<br />... <br />最后 conn.close() 即可，</em>
				</p>
		</div>
<img src ="http://www.blogjava.net/jiabao/aggbug/236102.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-23 10:24 <a href="http://www.blogjava.net/jiabao/archive/2008/10/23/236102.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC也分2.0和3.0？</title><link>http://www.blogjava.net/jiabao/archive/2008/10/23/236098.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 23 Oct 2008 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/23/236098.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/236098.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/23/236098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/236098.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/236098.html</trackback:ping><description><![CDATA[如题。研究中...以前没有注意过。<img height="19" src="http://www.blogjava.net/Emoticons/red_smile.gif" width="19" border="0" /><img src ="http://www.blogjava.net/jiabao/aggbug/236098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-23 10:10 <a href="http://www.blogjava.net/jiabao/archive/2008/10/23/236098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>鲤鱼论坛 研究笔记（未）</title><link>http://www.blogjava.net/jiabao/archive/2008/10/21/235627.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Tue, 21 Oct 2008 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/21/235627.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/235627.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/21/235627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/235627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/235627.html</trackback:ping><description><![CDATA[2008.10.21第一天<br />网站地址： <a href="http://www.liyunet.com/">http://www.liyunet.com/</a><br />源码下载： <a href="http://www.liyunet.com/bbs/download.jsp">http://www.liyunet.com/bbs/download.jsp</a><br /><br />我主要是利用该论坛的简易性来研究JSP技术，以及缓存技术。虽然说目前大部分论坛应用的都是主流框架技术，但说回来，这些框架也只是对JSP等相关技术的一个封装，而了解底部应用及其原理更容易让我理解主流框架的内部原理机制。不至于让框架把我们变成“傻子”。<br /><br /><br />那就开始吧<br />首先，和某些大虾一样的习惯，我们从WEB-INF下的web.xml开始，从以下代码中可以发现随着tomcat启动时，自动加载了InitServlet类。这是一个Servlet类。<br />WEB-INF\web.xml部分代码:<br /><div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/dot.gif" /><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">InitServlet</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 /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">com.bcxy.servlet.InitServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />      </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><img src="http://www.blogjava.net/images/dot.gif" /></span></div><p>查看<span style="COLOR: #000000">com.bcxy.servlet.InitServlet类，代码很简单:<br />开始做了一个对此类日志（log4j)的绑定。接着通过SystemConfig取得了系统配置中的连接类型conntype（查看classes目录下的SystemConfig.xml可知此变量是判断使用连接池的类型0:3P0； 1:Proxool）。接着是初始化操作，记录一些必要的启动信息(log4j)（其中做了本地地址和网络访问地址的转换）。<br />用DBUtil.close测试连接池是否加载成功。<br />最后是释放类所做的必要操作。判断使用的是哪一种连接池，然后关闭。这样我们的第一个类就分析完毕。<br />接着需要了解到<br /><font style="BACKGROUND-COLOR: #ff9933">SystemConfig类是加载SystemConfig.xml配置文件，并设定方法去读取。其中有一定的类型转换。<br /></font><br />此时似乎已经找不到头绪了。那这样吧。我们就开始访问我们自己搭建的论坛，从首页开始，也就是index.jsp页面。<br />浏览index.jsp代码，由上向下理解每一个语句的含义（整体分体）。<br /><br />设定页面编码；导入IPLocalizer类（应该是做IP显示的工具类）；插入INC/const.jsp页（过后会有分析）；设定stats变量数值（通过阅读其他jsp页面发现，此变量的作用主要是在于在首页显示用户状态时，兼并显示当前用户做浏览的页面：也就是stats的值，这样我们可以在客户可访问的范围内对stats变量进行设置，就可以查看在线用户的当前行为）；继续插入INC/theme.jsp（估计是定制论坛模板的文件）；&lt;table&gt;标签内部就是连接到相关显示数据信息的jsp页面并附加了参数。其中的一些格式是通过上面引用文件中的变量设置，相对不难理解；论坛消息广播部分，通过一个可执行jsp页面vector显示在首页顶部，当中访问数据库的细节需要进一步研究代码）；接着是帖子的遍历，也就是首页最关键的部分，这里看起来不是由jsp页面来负责获取数据，而是通过Forum类来获取一些过滤之后的数据：这里所说的过滤是例如置顶帖子，最新帖子等有一些特殊标记的数据：;<br />index.jsp的其他部分就都是大同小异了。都是通过一个遍历来展现具有相同特性的数据。；大家需要注意一些关于页面表现的而非java技术的部分，例如信息层的提示，和一些图片连接。<br /><em>通过index.jsp的学习，我们大概已经了解了大部分jsp页面代码的表现形式和含义。当然，一定要注意在这个过程中，参数传递、参数获取的代码部分，不要遗漏。除了一些我们可以看到的页面之外，上面部分也讲到了一些并不用于显示给用户的页面，这里我们认为它是可执行页面，也就是说它对我们的数据和请求做了一些处理，或者说把我们的请求转交给了服务器（比如servlet）。<br /><br /><strong>预计晚上要研究一下有关数据库方面的存取类JdbcWrapper以及连接获取和释放、数据查询插入。<br />2008.10.22<br /></strong></em>大概昨天写的已经忘的差不多了，那么我们还是从index.jsp文件开始，前几行没有什么问题，都是一些导入文件的标签，那么我们从SkinUtil.这个类入手。在查看SkinUtil类代码的时候我们发现里面应用了一些com\bcxy\bbs\util 包中类，其中含有三个工具类。（偷笑，看了文件大小，应该代码不多，我们看看里面都是什么）在开始之前我们应了解一下GCookie.java类的大概内容和作用。看导入包我们可以大概了解一下此类的作用：对URL的编码与解码，产生和读取Cookie，还有就是做一些日志记录(log4j)。<br />我们仔细阅读后，了解到，其中有一个重载方法，也就是setCookie方法，根据不同的参数，可以让我们选择直接赋予变量名和值的方法，或者是赋予变量名和值另外加上最大保存时间的方法。  类中的另一个方法是获取Cookie方法值。<br />ParamUtil类也很简单，是取得字符串和 取得整数的重载方法，其中的参数决定是否有默认值，是否需要转码。<br />SysUtil类中根据SystemConfig类中的读取方法读取配置文件systemconfig.properties，按照里面的设置，来判断是否对参数和数据库读取操作中的参数进行编码。其中还有一个方法是取得真实地址，当然这些都是根据systemconfig.properties文件中配置而定的。<br />BBSCconst.java类简单的设置了一些常量。作用是设置数据库表名的时候加上systemconfig.properties中设置的前缀。<br />回到SkinUtil.java类似乎看起来一些刚刚还陌生的类方法，显得明朗。前面设置了一个Cookie的变量名并赋了值。<br /></span></p><div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">ret </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> JdbcWrapper().doIntSearch(sql, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);</span></div><p>这里用到了新类，也就是我们昨天说过的要了解的关于数据库连接的类。也是今天要解决的重点。打开JdbcWrapper类，查看代码.(插一句，看代码的时候，我觉得先看包名，了解大概要用到的类和方法，去设想这个类要实现的功能），yi一眼看来，大概都熟悉，无非是连接数据库 读取，结果保存，异常，还有一些类似数组的HashMap还有遍历用得Iterator。想想，大概就是数据层的一些基础CRUD操作。但是其中有个类不是很熟悉，DatabaseMetaData类，查看sun公司的在线文档，发现这是个接口而且方法奇多，文档的第一句这么写，</p><div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">Comprehensive information about the database as a whole. </span></div><p>我也不能理解这句话包含了什么内容。不管他，在程序中慢慢体会吧。JdbcWrapper这个类有点长，不过，大部分方法都有类似的作用，也就是说真正不同功能的代码也只有几分之一而已。我看的都想睡觉了。<br /><br /><em><strong>在网吧，因为不便，先离开咯<br /></strong></em>今天还好，自己有一台电脑，可以不限制时间。继续工作....<br />之前研究JdbcWrapper类的时候有一个小小的疑问。如下<br /></p><p> </p><div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080"> 1</span><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">######这里有一点不明白，为什么要判断getAutoClose（）</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #008000"><img id="Codehighlighter1_41_101_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_101_Open_Text.style.display='none'; Codehighlighter1_41_101_Closed_Image.style.display='inline'; Codehighlighter1_41_101_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="DISPLAY: none" id="Codehighlighter1_41_101_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_41_101_Closed_Text.style.display='none'; Codehighlighter1_41_101_Open_Image.style.display='inline'; Codehighlighter1_41_101_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /></span><span style="COLOR: #000000">    </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_41_101_Closed_Text">/**/</span><span id="Codehighlighter1_41_101_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />     * 当需要事务支持时，需要设置autoClose=false，那就等到事务提交时再关闭数据库连接。<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />     * </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img id="Codehighlighter1_134_194_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_194_Open_Text.style.display='none'; Codehighlighter1_134_194_Closed_Image.style.display='inline'; Codehighlighter1_134_194_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="DISPLAY: none" id="Codehighlighter1_134_194_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_134_194_Closed_Text.style.display='none'; Codehighlighter1_134_194_Open_Image.style.display='inline'; Codehighlighter1_134_194_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> closeConnection() </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_134_194_Closed_Text"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_134_194_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img id="Codehighlighter1_158_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_158_191_Open_Text.style.display='none'; Codehighlighter1_158_191_Closed_Image.style.display='inline'; Codehighlighter1_158_191_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" /><img style="DISPLAY: none" id="Codehighlighter1_158_191_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_158_191_Closed_Text.style.display='none'; Codehighlighter1_158_191_Open_Image.style.display='inline'; Codehighlighter1_158_191_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (getAutoClose()) </span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id="Codehighlighter1_158_191_Closed_Text"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_158_191_Open_Text"><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" />            DBUtil.close(pstmt, con);<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />        }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" />    }</span></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div><p>今天看群里鲤鱼回答内容如下：</p><div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">当需要事务支持时，需要设置autoClose=false，那就等到事务提交时再关闭数据库连接。</span></div><p><br />一时还没有理解开来。<br />看过来看过去，JdbcWrapper类对我来讲还是有一部分难以理解。索性不去管它，等在下面的代码中出现时，反复查阅应该会有更多的收获。<br /></p><img src ="http://www.blogjava.net/jiabao/aggbug/235627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-21 11:47 <a href="http://www.blogjava.net/jiabao/archive/2008/10/21/235627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于正则表达式</title><link>http://www.blogjava.net/jiabao/archive/2008/10/17/234851.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Fri, 17 Oct 2008 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/17/234851.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/234851.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/17/234851.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/234851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/234851.html</trackback:ping><description><![CDATA[*匹配除了换行之外的所有字符<br /><br />合法IP的正则表达式 ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)<br /><br />\s匹配任意的空白符、（空格、制表符、换行符、中文全角空格）<br />\w匹配字母或数字或下划线或汉字<br /><br /><table cellspacing="0"><caption>表1.常用的元字符</caption><thead><tr><th scope="col">代码</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span class="code" bakclassname="code"><font color="#0000ff">.</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配除换行符以外的任意字符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\w</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配字母或数字或下划线或汉字</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\s</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配任意的空白符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\d</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配数字</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\b</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配单词的开始或结束</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">^</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配字符串的开始</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">$</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配字符串的结束</u></span></td></tr></tbody></table><br /><br /><table cellspacing="0"><caption>表2.常用的限定符</caption><thead><tr><th scope="col">代码/语法</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span class="code" bakclassname="code"><font color="#0000ff">*</font></span></td><td><span class="desc" bakclassname="desc"><u>重复零次或更多次</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">+</font></span></td><td><span class="desc" bakclassname="desc"><u>重复一次或更多次</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">?</font></span></td><td><span class="desc" bakclassname="desc"><u>重复零次或一次</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">{n}</font></span></td><td><span class="desc" bakclassname="desc"><u>重复n次</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">{n,}</font></span></td><td><span class="desc" bakclassname="desc"><u>重复n次或更多次</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">{n,m}</font></span></td><td><span class="desc" bakclassname="desc"><u>重复n到m次</u></span></td></tr></tbody></table><br /><br /><h2 id="backreference">后向引用</h2><p>使用小括号指定一个子表达式后，<strong>匹配这个子表达式的文本</strong>(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个<span class="name" bakclassname="name"><strong>组号</strong></span>，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。</p><p><span class="name" bakclassname="name"><strong>后向引用</strong></span>用于重复搜索前面某个分组匹配的文本。例如，<span class="part" bakclassname="part"><font color="#008000">\1</font></span>代表<span class="desc" bakclassname="desc"><u>分组1匹配的文本</u></span>。难以理解？请看示例：</p><p><span class="regex" bakclassname="regex"><font color="#ff0000">\b(\w+)\b\s+\1\b</font></span>可以用来匹配<span class="desc" bakclassname="desc"><u>重复的单词</u></span>，像<span class="string" bakclassname="string"><em>go go</em></span>, 或者<span class="string" bakclassname="string"><em>kitty kitty</em></span>。这个表达式首先是<span class="desc" bakclassname="desc"><u>一个单词</u></span>，也就是<span class="desc" bakclassname="desc"><u>单词开始处和结束处之间的多于一个的字母或数字</u></span>(<span class="part" bakclassname="part"><font color="#008000">\b(\w+)\b</font></span>)，这个单词会被捕获到编号为1的分组中，然后是<span class="desc" bakclassname="desc"><u>1个或几个空白符</u></span>(<span class="part" bakclassname="part"><font color="#008000">\s+</font></span>)，最后是<span class="desc" bakclassname="desc"><u>分组1中捕获的内容（也就是前面匹配的那个单词）</u></span>(<span class="part" bakclassname="part"><font color="#008000">\1</font></span>)。</p><p>你也可以自己指定子表达式的<span class="name" bakclassname="name"><strong>组名</strong></span>。要指定一个子表达式的组名，请使用这样的语法：<span class="code" bakclassname="code"><font color="#0000ff">(?&lt;Word&gt;\w+)</font></span>(或者把尖括号换成<span class="code" bakclassname="code"><font color="#0000ff">'</font></span>也行：<span class="code" bakclassname="code"><font color="#0000ff">(?'Word'\w+)</font></span>),这样就把<span class="part" bakclassname="part"><font color="#008000">\w+</font></span>的组名指定为<span class="part" bakclassname="part"><font color="#008000">Word</font></span>了。要反向引用这个分组<span class="name" bakclassname="name"><strong>捕获</strong></span>的内容，你可以使用<span class="code" bakclassname="code"><font color="#0000ff">\k&lt;Word&gt;</font></span>,所以上一个例子也可以写成这样：<span class="regex" bakclassname="regex"><font color="#ff0000">\b(?&lt;Word&gt;\w+)\b\s+\k&lt;Word&gt;\b</font></span>。</p><p>使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：</p><table cellspacing="0"><caption>表4.常用分组语法</caption><tbody><tr><th scope="col">分类</th><th scope="col">代码/语法</th><th scope="col">说明</th></tr><tr><th rowspan="3">捕获</th><td><span class="code" bakclassname="code"><font color="#0000ff">(exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配exp,并捕获文本到自动命名的组里</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?&lt;name&gt;exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?:exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配exp,不捕获匹配的文本，也不给此分组分配组号</u></span></td></tr><tr><th rowspan="4">零宽断言</th><td><span class="code" bakclassname="code"><font color="#0000ff">(?=exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配exp前面的位置</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?&lt;=exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配exp后面的位置</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?!exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配后面跟的不是exp的位置</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?&lt;!exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>匹配前面不是exp的位置</u></span></td></tr><tr><th>注释</th><td><span class="code" bakclassname="code"><font color="#0000ff">(?#comment)</font></span></td><td><span class="desc" bakclassname="desc"><u>这种类型的分组不对正则表达式的处理产生任何影响，用于提供注释让人阅读</u></span></td></tr></tbody></table><br /><br /><table cellspacing="0"><caption>表5.懒惰限定符</caption><thead><tr><th scope="col">代码/语法</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span class="code" bakclassname="code"><font color="#0000ff">*?</font></span></td><td><span class="desc" bakclassname="desc"><u>重复任意次，但尽可能少重复</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">+?</font></span></td><td><span class="desc" bakclassname="desc"><u>重复1次或更多次，但尽可能少重复</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">??</font></span></td><td><span class="desc" bakclassname="desc"><u>重复0次或1次，但尽可能少重复</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">{n,m}?</font></span></td><td><span class="desc" bakclassname="desc"><u>重复n到m次，但尽可能少重复</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">{n,}?</font></span></td><td><span class="desc" bakclassname="desc"><u>重复n次以上，但尽可能少重复</u></span></td></tr></tbody></table><br /><br /><table cellspacing="0"><caption>表6.常用的处理选项</caption><thead><tr><th scope="col">名称</th><th scope="col">说明</th></tr></thead><tbody><tr><td>IgnoreCase(忽略大小写)</td><td>匹配时不区分大小写。</td></tr><tr><td>Multiline(多行模式)</td><td>更改<span class="code" bakclassname="code"><font color="#0000ff">^</font></span>和<span class="code" bakclassname="code"><font color="#0000ff">$</font></span>的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,<span class="code" bakclassname="code"><font color="#0000ff">$</font></span>的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) </td></tr><tr><td>Singleline(单行模式)</td><td>更改<span class="code" bakclassname="code"><font color="#0000ff">.</font></span>的含义，使它与每一个字符匹配（包括换行符\n）。 </td></tr><tr><td>IgnorePatternWhitespace(忽略空白)</td><td>忽略表达式中的非转义空白并启用由<span class="code" bakclassname="code"><font color="#0000ff">#</font></span>标记的注释。</td></tr><tr><td>RightToLeft(从右向左查找)</td><td>匹配从右向左而不是从左向右进行。</td></tr><tr><td>ExplicitCapture(显式捕获)</td><td>仅捕获已被显式命名的组。</td></tr><tr><td>ECMAScript(JavaScript兼容模式)</td><td>使表达式的行为与它在JavaScript里的行为一致。</td></tr></tbody></table><table cellspacing="0"><caption>表7.尚未详细讨论的语法</caption><thead><tr><th scope="col">代码/语法</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\a</font></span></td><td><span class="desc" bakclassname="desc"><u>报警字符(打印它的效果是电脑嘀一声)</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\b</font></span></td><td><span class="desc" bakclassname="desc"><u>通常是单词分界位置，但如果在字符类里使用代表退格</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\t</font></span></td><td><span class="desc" bakclassname="desc"><u>制表符，Tab</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\r</font></span></td><td><span class="desc" bakclassname="desc"><u>回车</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\v</font></span></td><td><span class="desc" bakclassname="desc"><u>竖向制表符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\f</font></span></td><td><span class="desc" bakclassname="desc"><u>换页符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\n</font></span></td><td><span class="desc" bakclassname="desc"><u>换行符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\e</font></span></td><td><span class="desc" bakclassname="desc"><u>Escape</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\0nn</font></span></td><td><span class="desc" bakclassname="desc"><u>ASCII代码中八进制代码为nn的字符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\xnn</font></span></td><td><span class="desc" bakclassname="desc"><u>ASCII代码中十六进制代码为nn的字符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\unnnn</font></span></td><td><span class="desc" bakclassname="desc"><u>Unicode代码中十六进制代码为nnnn的字符</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\cN</font></span></td><td><span class="desc" bakclassname="desc"><u>ASCII控制字符。比如\cC代表Ctrl+C</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\A</font></span></td><td><span class="desc" bakclassname="desc"><u>字符串开头(类似^，但不受处理多行选项的影响)</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\Z</font></span></td><td><span class="desc" bakclassname="desc"><u>字符串结尾或行尾(不受处理多行选项的影响)</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\z</font></span></td><td><span class="desc" bakclassname="desc"><u>字符串结尾(类似$，但不受处理多行选项的影响)</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\G</font></span></td><td><span class="desc" bakclassname="desc"><u>当前搜索的开头</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">\p{name}</font></span></td><td><span class="desc" bakclassname="desc"><u>Unicode中命名为name的字符类，例如\p{IsGreek}</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?&gt;exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>贪婪子表达式</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?&lt;x&gt;-&lt;y&gt;exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>平衡组</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?im-nsx:exp)</font></span></td><td><span class="desc" bakclassname="desc"><u>在子表达式exp中改变处理选项</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?im-nsx)</font></span></td><td><span class="desc" bakclassname="desc"><u>为表达式后面的部分改变处理选项</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?(exp)yes|no)</font></span></td><td><span class="desc" bakclassname="desc"><u>把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?(exp)yes)</font></span></td><td><span class="desc" bakclassname="desc"><u>同上，只是使用空表达式作为no</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?(name)yes|no)</font></span></td><td><span class="desc" bakclassname="desc"><u>如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no</u></span></td></tr><tr><td><span class="code" bakclassname="code"><font color="#0000ff">(?(name)yes)</font></span></td><td><span class="desc" bakclassname="desc"><u>同上，只是使用空表达式作为no</u></span></td></tr></tbody></table><img src ="http://www.blogjava.net/jiabao/aggbug/234851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-17 11:10 <a href="http://www.blogjava.net/jiabao/archive/2008/10/17/234851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene倒排索引原理(转) </title><link>http://www.blogjava.net/jiabao/archive/2008/10/17/234822.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Fri, 17 Oct 2008 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/17/234822.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/234822.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/17/234822.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/234822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/234822.html</trackback:ping><description><![CDATA[Lucene是一个高性能的java全文检索工具包，它使用的是倒排文件索引结构。该结构及相应的生成算法如下：<br /><br />0）设有两篇文章1和2<br />文章1的内容为：Tom lives in Guangzhou,I live in Guangzhou too.<br />文章2的内容为：He once lived in Shanghai.<br /><br />1)由于lucene是基于关键词索引和查询的，首先我们要取得这两篇文章的关键词，通常我们需要如下处理措施<br />a.我们现在有的是文章内容，即一个字符串，我们先要找出字符串中的所有单词，即分词。英文单词由于用空格分隔，比较好处理。中文单词间是连在一起的需要特殊的分词处理。<br />b.文章中的”in”, “once” “too”等词没有什么实际意义，中文中的“的”“是”等字通常也无具体含义，这些不代表概念的词可以过滤掉<br />c.用户通常希望查“He”时能把含“he”，“HE”的文章也找出来，所以所有单词需要统一大小写。<br />d.用户通常希望查“live”时能把含“lives”，“lived”的文章也找出来，所以需要把“lives”，“lived”还原成“live”<br />e.文章中的标点符号通常不表示某种概念，也可以过滤掉<br />在lucene中以上措施由Analyzer类完成<br /><br />经过上面处理后<br />    文章1的所有关键词为：[tom] [live] [guangzhou] [i] [live] [guangzhou]<br />    文章2的所有关键词为：[he] [live] [shanghai]<br /><br />2) 有了关键词后，我们就可以建立倒排索引了。上面的对应关系是：“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来，变成：“关键词”对“拥有该关键词的所有文章号”。文章1，2经过倒排后变成<br />关键词   文章号<br />guangzhou  1<br />he         2<br />i           1<br />live       1,2<br />shanghai   2<br />tom         1<br /><br />通常仅知道关键词在哪些文章中出现还不够，我们还需要知道关键词在文章中出现次数和出现的位置，通常有两种位置：a)字符位置，即记录该词是文章中第几个字符（优点是关键词亮显时定位快）；b)关键词位置，即记录该词是文章中第几个关键词（优点是节约索引空间、词组（phase）查询快），lucene中记录的就是这种位置。<br /><br />加上“出现频率”和“出现位置”信息后，我们的索引结构变为：<br />关键词   文章号[出现频率]   出现位置<br />guangzhou 1[2]               3，6<br />he       2[1]               1<br />i         1[1]               4<br />live      1[2],2[1]           2，5，2<br />shanghai  2[1]               3<br />tom      1[1]               1<br /><br />以live 这行为例我们说明一下该结构：live在文章1中出现了2次，文章2中出现了一次，它的出现位置为“2,5,2”这表示什么呢？我们需要结合文章号和出现频率来分析，文章1中出现了2次，那么“2,5”就表示live在文章1中出现的两个位置，文章2中出现了一次，剩下的“2”就表示live是文章2中第 2个关键字。<br />    <br />以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的（lucene没有使用B树结构），因此lucene可以用二元搜索算法快速定位关键词。<br />    <br />实现时 lucene将上面三列分别作为词典文件（Term Dictionary）、频率文件(frequencies)、位置文件 (positions)保存。其中词典文件不仅保存有每个关键词，还保留了指向频率文件和位置文件的指针，通过指针可以找到该关键字的频率信息和位置信息。<br /><br />    Lucene中使用了field的概念，用于表达信息所在位置（如标题中，文章中，url中），在建索引中，该field信息也记录在词典文件中，每个关键词都有一个field信息(因为每个关键字一定属于一个或多个field)。<br /><br />     为了减小索引文件的大小，Lucene对索引还使用了压缩技术。首先，对词典文件中的关键词进行了压缩，关键词压缩为&lt;前缀长度，后缀&gt;，例如：当前词为“阿拉伯语”，上一个词为“阿拉伯”，那么“阿拉伯语”压缩为&lt;3，语&gt;。其次大量用到的是对数字的压缩，数字只保存与上一个值的差值（这样可以减小数字的长度，进而减少保存该数字需要的字节数）。例如当前文章号是16389（不压缩要用3个字节保存），上一文章号是16382，压缩后保存7（只用一个字节）。<br />    <br />    下面我们可以通过对该索引的查询来解释一下为什么要建立索引。<br />假设要查询单词 “live”，lucene先对词典二元查找、找到该词，通过指向频率文件的指针读出所有文章号，然后返回结果。词典通常非常小，因而，整个过程的时间是毫秒级的。<br />而用普通的顺序匹配算法，不建索引，而是对所有文章的内容进行字符串匹配，这个过程将会相当缓慢，当文章数目很大时，时间往往是无法忍受的。 <br /><img src ="http://www.blogjava.net/jiabao/aggbug/234822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-17 09:43 <a href="http://www.blogjava.net/jiabao/archive/2008/10/17/234822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2标签</title><link>http://www.blogjava.net/jiabao/archive/2008/10/13/234029.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Mon, 13 Oct 2008 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/13/234029.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/234029.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/13/234029.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/234029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/234029.html</trackback:ping><description><![CDATA[
		<div class="tit"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt" id="blog_text">
												<p>一、 <br />写jsp页面的时候，在struts2中，用的是s标记，先引入标记： <br />&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt; <br />二、 <br />struts2的标签和1是完全不同的。 <br />struts2的标签分为两大类：非UI标志和UI标志 struts1 将标志库按功能分成HTML、Tiles、Logic和Bean等几部分 <br />下面就介绍strut2的具体标签： <br />1、UI <br />UI标志又可以分为表单UI和非表单UI两部分。表单UI部分基本与Struts 1.x相同，都是对HTML表单元素的包装。不过，Struts 2.0加了几个我们经常在项目中用到的控件如：datepicker、doubleselect、timepicker、optiontransferselect等。因为这些标志很多都经常用到，而且参数也很多，要在一篇文章详细说明并非易事。 <br />下面主要是ui标签的一些用法 <br />form: <br />&lt;s:form action="exampleSubmit" method="post" enctype="multipart/form-data"&gt; <br />&lt;s:submit /&gt; <br />    &lt;s:reset /&gt;</p>
												<p>&lt;/s:form&gt;可以上传文件的form。 <br />textfield： <br />&lt;s:textfield <br />            label="姓名：" <br />            name="name" <br />            tooltip="Enter your Name here" /&gt; <br />datepicker： <br />&lt;s:datepicker <br />            tooltip="Select Your Birthday" <br />            label="生日" <br />            name="birthday" /&gt; <br />textarea： <br />&lt;s:textarea <br />            tooltip="Enter your remart" <br />            label="备注" <br />            name="remart" <br />            cols="20" <br />            rows="3"/&gt; <br />select: <br />&lt;s:select <br />            tooltip="Choose user_type" <br />            label="" <br />            list="#{'free':'免费','vip':'收费'}" value="#{'free':'免费'}"   <br />           name="bean.user_type" <br />            emptyOption="true" <br />            headerKey="None" <br />            headerValue="None"/&gt; <br />&lt;s:select <br />            tooltip="Choose user_type" <br />            label="" <br />            list="#{'free':'免费','vip':'收费'}" value="#{'free':'免费'}"   <br />           name="bean.user_type" <br />            emptyOption="true" <br />            headerKey="None" <br />            headerValue="None"/&gt; <br />&lt;s:select <br />list="venderList" <br />listKey="id" <br />listValue="name" <br />value="%{profile.companyName}" <br />name="companyName" cssClass="sel_style_w_180"/&gt;   <br />挺好用的 <br />checkboxlist： <br />&lt;s:checkboxlist <br />            tooltip="Choose your Friends" <br />            label="朋友" <br />            list="{'Patrick', 'Jason', 'Jay', 'Toby', 'Rene'}" <br />            name="friends"/&gt; <br />checkbox： <br />   &lt;s:checkbox <br />            tooltip="Confirmed that your are Over 18" <br />            label="年龄" <br />            name="legalAge" <br />            value="18"/&gt; <br />file: <br />   &lt;s:file <br />            tooltip="Upload Your Picture" <br />            label="Picture" <br />            name="picture" /&gt; <br />a: <br />&lt;s:a href="getP.jsp"&gt;超链接提交&lt;/s:a&gt; <br />date : <br />&lt;s:date name="ad_end_time" format="yyyy-MM-dd"/&gt;</p>
												<p>
														<br />2、非UI <br />if、elseif和else 描述： <br />执行基本的条件流转。 <br />参数： <br />名称必需默认类型描述备注test是Boolean决定标志里内容是否显示的表达式else标志没有这个参数id否Object/String用来标识元素的id。在UI和表单中为HTML的id属性 例子： <br />&lt;%@ page c %&gt; <br />&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt; <br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; <br />&lt;html&gt; <br />    &lt;head&gt; <br />        &lt;title&gt;Condition Flow&lt;/title&gt; <br />    &lt;/head&gt; <br />    &lt;body&gt; <br />        &lt;h3&gt;Condition Flow&lt;/h3&gt;             <br />        &lt;!-- <br />            这里有点小技巧： <br />            本来可以用#parameters.name[0]来获得，请求中name的值。但是，在我实现include例子时， <br />            无论我用param标志给name赋任何值，#parameters里面不会含有任何值，所以#parameters.name也为空值。 <br />             <br />            其原因为： <br />            当使用include标志时，被包含的页面（included）里#parameters拿到的是包含页面里的请求参数。 <br />             <br />            因此，这里必须手工调用request.getParameter("name")。 <br />        --&gt; <br />    &lt;s:iterator value="linkList" status="bean"&gt;<br />   &lt;tr&gt;<br />    &lt;td class="data_tab_tdcl"&gt;<br />     &lt;s:property value="#bean.Index+1" /&gt;    &lt;/td&gt;<br />    &lt;td class="data_tab_tdcl"&gt;&lt;s:property value="link_title" /&gt;&lt;/td&gt;<br />    &lt;td class="data_tab_tdcl"&gt;&lt;s:property value="link_url" /&gt;&lt;/td&gt;<br />    &lt;td class="data_tab_tdcl"&gt;<br />    &lt;s:if test="link_type == 1"&gt; <br />                   文字<br />                &lt;/s:if&gt; <br />                &lt;s:elseif test="link_type == 2"&gt; <br />                   图片<br />                &lt;/s:elseif&gt; <br />                 &lt;s:else&gt; <br />                 -----<br />               &lt;/s:else&gt;    <br />    &lt;/td&gt;</p>
												<p>    <br />    &lt;/body&gt; <br />&lt;/html&gt; <br />例1 condition.jsp <br />iterator 描述： <br />用于遍历集合（java.util.Collection）或枚举值（java.util.Iterator）。 <br />参数： <br />名称必需默认类型描述status否String如果设置此参数，一个IteratorStatus的实例将会压入每个遍历的堆栈value否Object/String要遍历的可枚举的（iteratable）数据源，或者将放入新列表（List）的对象id否Object/String用来标识元素的id。在UI和表单中为HTML的id属性 例子： <br />&lt;%@ page c %&gt; <br />&lt;%@ page import="java.util.List" %&gt; <br />&lt;%@ page import="java.util.ArrayList" %&gt; <br />&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
												<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt; <br />&lt;% <br />    List list = new ArrayList(); <br />    list.add("Max"); <br />    list.add("Scott"); <br />    list.add("Jeffry"); <br />    list.add("Joe"); <br />    list.add("Kelvin"); <br />    request.setAttribute("names", list); <br />%&gt; <br />&lt;html&gt; <br />    &lt;head&gt; <br />        &lt;title&gt;Iterator&lt;/title&gt; <br />    &lt;/head&gt; <br />    &lt;body&gt; <br />        &lt;h3&gt;Names: &lt;/h3&gt; <br />        &lt;!-- <br />            1、此处的空property元素用于获得当前iterator的值 <br />            2、status被设成stuts，在iterator的里面就可以通过#stuts取得IteratorStatus的对象。IteratorStatus类包含当前序号信息，如是否第一个或最后一个，是否为奇数序号。这些信息在我们做格式化的时候，显得非常有用。 <br />        --&gt; <br />        &lt;ol&gt; <br />            &lt;s:iterator value="#request.names" status="stuts"&gt;                 <br />                &lt;s:if test="#stuts.odd == true"&gt; <br />                    &lt;li&gt;White &lt;s:property /&gt;&lt;/li&gt; <br />                &lt;/s:if&gt; <br />                &lt;s:else&gt; <br />                    &lt;li style="background-color:gray"&gt;&lt;s:property /&gt;&lt;/li&gt; <br />                &lt;/s:else&gt; <br />            &lt;/s:iterator&gt; <br />        &lt;/ol&gt; <br />    &lt;/body&gt; <br />&lt;/html&gt;</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jiabao/aggbug/234029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-13 15:46 <a href="http://www.blogjava.net/jiabao/archive/2008/10/13/234029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java笔试题（部分）</title><link>http://www.blogjava.net/jiabao/archive/2008/10/09/233317.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 09 Oct 2008 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/10/09/233317.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/233317.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/10/09/233317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/233317.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/233317.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: EJB										方面																														 																																				94																																、																																EJB2.0					...&nbsp;&nbsp;<a href='http://www.blogjava.net/jiabao/archive/2008/10/09/233317.html'>阅读全文</a><img src ="http://www.blogjava.net/jiabao/aggbug/233317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-10-09 11:56 <a href="http://www.blogjava.net/jiabao/archive/2008/10/09/233317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装WinCVS时Python不可用的问题</title><link>http://www.blogjava.net/jiabao/archive/2008/09/21/230219.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sun, 21 Sep 2008 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/09/21/230219.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/230219.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/09/21/230219.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/230219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/230219.html</trackback:ping><description><![CDATA[在我装完Wincvs之后,提示我没有安装python,但后来我又装了python2.4,可Wincvs还是说配置不对.到底要怎么配置python呢?期待着您的回复,谢谢你了!<br />    <br /><table style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" align="center"><tbody><tr><td>TCL or Python are not available, shell is disabled。</td></tr></tbody></table>有的网友说是版本的问题，我今天安装时也是一样，装了好三四个版本，都一样，最后在CSDN上找到了答案。<br /><font size="4"><br style="FONT-WEIGHT: bold" /><span style="FONT-WEIGHT: bold">解决办法：<br /><br /></span></font>在admin-〉Preferences-&gt;wincvs中有关于python的设置，   <br />  其中python是指你的python虚拟机的位置，一般是python2X.dll的位置。在你来说就是python24.dll的位置，一般这个文件会在你的系统文件中找到。   <br />  Tcl则一般会在python文件架的dlls子文件架中找到，一般名称为tclxx.dll，在你大概就是tcl84.dll。如果是安装python2.3版本的话，会自动找到，不需要设置。<br /><br />设置好了，WinCVS输出窗口：<br /><br /><table style="BORDER-RIGHT: rgb(153,153,153) 1px solid; BORDER-TOP: rgb(153,153,153) 1px solid; FONT-SIZE: 12px; BORDER-LEFT: rgb(153,153,153) 1px solid; WIDTH: 80%; BORDER-BOTTOM: rgb(153,153,153) 1px solid" align="center"><tbody><tr><td>Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32Tk is available, Tk-macros are enabledTCL is available, shell is enabled : help (select and press enter)</td></tr></tbody></table><img src ="http://www.blogjava.net/jiabao/aggbug/230219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-09-21 08:52 <a href="http://www.blogjava.net/jiabao/archive/2008/09/21/230219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[设计模式]jive中的[abstract Factory]</title><link>http://www.blogjava.net/jiabao/archive/2008/09/16/229191.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Tue, 16 Sep 2008 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/09/16/229191.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/229191.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/09/16/229191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/229191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/229191.html</trackback:ping><description><![CDATA[
		<font size="2">　　AbstractFactory模式和可扩展性<br />　　假如要实现较好的可扩展性，AbstractFactory模式确实是一件利器。如上面所说，假如要创建的Forum接口的不同实现，而又不想更改代码的话，就需要用到抽象工厂了。再Jive中，AuthorizationFactory类是一个抽象类，用来创建Authorization对象。这是一个抽象工厂，可以通过不同的子类来创建不同的Authorization对象。这个工厂的实现方法是：<br />　　<br />　　在AuthorizationFactory中使用一个private static变量factory，用来引用具体的抽象工厂的实例：<br />　　private static AuthorizationFactory factory = null;<br />　　<br />　　用一个private static的String，来指明具体的抽象工厂的子类类名：<br />　　private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";<br />　　<br />　　然后是用一个private static的loadAuthorizationFactory方法来给这个factory变量赋值，生成具体的抽象工厂类：<br />　　<br />　　　 private static void loadAuthorizationFactory() {<br />　　　　　　if (factory == null) {<br />　　　　　　　　synchronized(className) {<br />　　　　　　　　　　if (factory == null) {<br />　　　　　　　　　　　　String classNameProp = PropertyManager.getProperty(<br />　　　　　　　　　　　　　　"AuthorizationFactory.className"<br />　　　　　　　　　　　　);<br />　　　　　　　　　　　　if (classNameProp != null) {<br />　　　　　　　　　　　　　　className = classNameProp;<br />　　　　　　　　　　　　}<br />　　　　　　　　　　　　try {<br />　　　　　　　　　　　　　　Class c = Class.forName(className);<br />　　　　　　　　　　　　　　factory = (AuthorizationFactory)c.newInstance();<br />　　　　　　　　　　　　}<br />　　　　　　　　　　　　catch (Exception e) {<br />　　　　　　　　　　　　　　System.err.println("Exception loading class: " + e);<br />　　　　　　　　　　　　　　e.printStackTrace();<br />　　　　　　　　　　　　}<br />　　　　　　　　　　}<br />　　　　　　　　}<br />　　　　　　}<br />　　}<br />　　<br />　　在static的getAuthorization方法返回一个Authorization的过程中，先初始化工厂类factory变量，然后用factory的createAuthorization方法来创建：<br />　　<br />　　　 public static Authorization getAuthorization(String username,<br />　　　　　　　　String passWord) throws UnauthorizedException<br />　　　　{<br />　　　　　　loadAuthorizationFactory();<br />　　　　　　return factory.createAuthorization(username, password);<br />　　}<br />　　<br />　　不同的子类有不同的createAuthorization方法的实现。比如在DbAuthorizationFactory这个AuthorizationFactory的数据库实现子类中，createAuthorization方法是这样实现的：<br />　　<br />　　　 public Authorization createAuthorization(String username, String password)<br />　　　　　　　　throws UnauthorizedException<br />　　　　{<br />　　　　　　if (username == null password == null) {<br />　　　　　　　　throw new UnauthorizedException();<br />　　　　　　}<br />　　　　　　password = StringUtils.hash(password);<br />　　　　　　int userID = 0;<br />　　　　　　Connection con = null;<br />　　　　　　PreparedStatement pstmt = null;<br />　　　　　　try {<br />　　　　　　　　con = DbConnectionManager.getConnection();<br />　　　　　　　　pstmt = con.prepareStatement(AUTHORIZE);<br />　　　　　　　　pstmt.setString(1, username);<br />　　　　　　　　pstmt.setString(2, password);<br />　　<br />　　　　　　　　ResultSet rs = pstmt.executeQuery();<br />　　　　　　　　if (!rs.next()) {<br />　　　　　　　　　　throw new UnauthorizedException();<br />　　　　　　　　}<br />　　　　　　　　userID = rs.getInt(1);<br />　　　　　　}<br />　　　　　　catch( SQLException sqle ) {<br />　　　　　　　　System.err.println("Exception in DbAuthorizationFactory:" + sqle);<br />　　　　　　　　sqle.printStackTrace();<br />　　　　　　　　throw new UnauthorizedException();<br />　　　　　　}<br />　　　　　　finally {<br />　　　　　　　　try {　pstmt.close(); }<br />　　　　　　　　catch (Exception e) { e.printStackTrace(); }<br />　　　　　　　　try {　con.close();　 }<br />　　　　　　　　catch (Exception e) { e.printStackTrace(); }<br />　　　　　　}<br />　　　　　　return new DbAuthorization(userID);<br />　　　　}<br />　　<br />　　在这个类中，可以看到抽象类和具体的子类之间的关系，它们是如何协作的，又是如何划分抽象方法和非抽象方法的，这都是值得注重的地方。一般的，抽象方法需要子类来实现，而抽象类中的非抽象方法应该所有子类所能够共享的，或者可是说，是定义在抽象方法之上的较高层的方法。这确实是一个抽象工厂的好例子！虽然实现的方法已经和GOF中给出的实现相差较远了，但思想没变，这儿的实现，也确实是要巧妙的些。<br />　　<br />　　还有就是静态方法的使用，使得这个类看起来有些Singleton的意味。这使得对于AbstractFactory的创建变得简单。<br />　　<br />　　在AuthorizationFactory中定义的其它方法，涉及到具体的如何创建Authorization，都是作为abstract方法出现，具体实现留给子类来完成。<br />　　<br />　　这样，在需要生成一个Authorization的时候，只需要调用AuthorizationFactory的静态方法getAuthorization就可以了，由子类实现了具体的细节。<br />　　<br />　　其它的，如同上面讲到的，在创建Forum的时候用的ForumFactory，具有同上面一样的实现，这就是模式之所以称为模式的所在了。 <br />资料引用:http://www.knowsky.com/365144.html</font>
<img src ="http://www.blogjava.net/jiabao/aggbug/229191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-09-16 15:57 <a href="http://www.blogjava.net/jiabao/archive/2008/09/16/229191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>题目: IOC 后台机制学习 </title><link>http://www.blogjava.net/jiabao/archive/2008/08/27/225137.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Wed, 27 Aug 2008 12:41:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/08/27/225137.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/225137.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/08/27/225137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/225137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/225137.html</trackback:ping><description><![CDATA[
		<div class="posttitle"> </div>题目: IOC 后台机制学习<br />给定:<br />配置文件 config.txt, 文件内容<br />className = test.JavaBean1<br />field = username<br />value = ABC<br /><br />该文件中的三个值会随时可能变化, 唯一不变的是 className 指定的都是一个 JavaBean(为了简化, 我们假定里面已经有一个 username 属性, 例如:<br /><br />class JavaBeanxxxx {<br />    private String username;<br /><br />    public String getUsername() {<br />        return username;<br />    }<br /><br />    public void setUsername(String uname) {<br />        this.username = uname;<br />    }<br />}<br /><br />要求: 写一段代码, 读取配置文件 config.txt, 然后实现把 className 指定的 JavaBean 类加载(注意这个类名是可以修改的, 可配置的), 然后生成一个实例,<br />并把配置文件中field字段指定的值作为这个实例的属性名(这里是username)所对应的值设置为 ABC(字符串), 并且要读出最后设置的值.<br /><br />此题已经被 TigerTian 解答出来, 欢迎学习, 也感谢 TigerTian:<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,255)">package</span><span style="COLOR: rgb(0,0,0)"> com.gcoresoft.ioc;<br /><br /></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.io.</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.lang.reflect.</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.util.</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)">;<br /></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.beans.</span><span style="COLOR: rgb(0,0,0)">*</span><span style="COLOR: rgb(0,0,0)">;<br /><br /></span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">class</span><span style="COLOR: rgb(0,0,0)"> IOCStudy {<br />    <br />    </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">Load the properties file</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">private</span><span style="COLOR: rgb(0,0,0)"> Properties prop</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> Properties();<br />    <br />    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> loadPropFile(String filename)<br />    {<br />        </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"><br />        {<br />            FileInputStream fin</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> FileInputStream(filename);<br />            prop.load(fin);<br />            fin.close();<br />        }</span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)">(Exception e){<br />            System.out.println(e.toString());<br />        }<br />    }<br />    <br />    </span><span style="COLOR: rgb(0,0,255)">private</span><span style="COLOR: rgb(0,0,0)"> String getValueByName(String Name)<br />    {<br />        </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> prop.getProperty(Name);<br />    }<br />    <br />    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">static</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> main(String[] args)<br />    {<br />        IOCStudy ioc</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> IOCStudy();<br />        ioc.loadPropFile(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">E:\\Work\\GetInIOC\\src\\com\\gcoresoft\\ioc\\Config.txt</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br />        </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"><br />        {<br />            Class bean</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">Class.forName(ioc.getValueByName(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">className</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">));<br />            </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br />                java.beans.BeanInfo info</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">java.beans.Introspector.getBeanInfo(bean);<br />                java.beans.PropertyDescriptor pd[]</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">info.getPropertyDescriptors();<br />                </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br />                    Method mSet</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">,mRead</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">;<br />                    Object obj</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">bean.newInstance();<br />                    </span><span style="COLOR: rgb(0,0,255)">for</span><span style="COLOR: rgb(0,0,0)">(</span><span style="COLOR: rgb(0,0,255)">int</span><span style="COLOR: rgb(0,0,0)"> i</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">0</span><span style="COLOR: rgb(0,0,0)">;i</span><span style="COLOR: rgb(0,0,0)">&lt;</span><span style="COLOR: rgb(0,0,0)">pd.length;i</span><span style="COLOR: rgb(0,0,0)">++</span><span style="COLOR: rgb(0,0,0)">)<br />                        </span><span style="COLOR: rgb(0,0,255)">if</span><span style="COLOR: rgb(0,0,0)">(pd[i].getName().equalsIgnoreCase(ioc.getValueByName(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">field</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">)))<br />                        {<br />                            mSet</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">pd[i].getWriteMethod();<br />                            mRead</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">pd[i].getReadMethod();                            <br />                        }<br />                    </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br />                        mSet.invoke(obj, ioc.getValueByName(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">value</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">));<br />                        String str</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">(String)mRead.invoke(obj, </span><span style="COLOR: rgb(0,0,255)">null</span><span style="COLOR: rgb(0,0,0)">);<br />                        System.out.println(str);<br />                    } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (IllegalArgumentException e) {<br />                        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO Auto-generated catch block</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">                        e.printStackTrace();<br />                    } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (InvocationTargetException e) {<br />                        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO Auto-generated catch block</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">                        e.printStackTrace();<br />                    }<br />                } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (InstantiationException e) {<br />                    </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO Auto-generated catch block</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">                    e.printStackTrace();<br />                } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (IllegalAccessException e) {<br />                    </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO Auto-generated catch block</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">                    e.printStackTrace();<br />                }<br /><br />                <br />            } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (IntrospectionException e) {<br />                </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO Auto-generated catch block</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)">                e.printStackTrace();<br />            }<br />            <br />            <br />        }</span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)">(ClassNotFoundException e){<br />            System.out.println(e.toString());<br />        }<br />        <br />    }<br />    <br />}<br /></span></div><img src ="http://www.blogjava.net/jiabao/aggbug/225137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-08-27 20:41 <a href="http://www.blogjava.net/jiabao/archive/2008/08/27/225137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>