??xml version="1.0" encoding="utf-8" standalone="yes"?>www亚洲一级视频com,亚洲美女视频一区,99久久婷婷国产综合亚洲http://www.tkk7.com/jiabao/zh-cnSat, 10 May 2025 11:35:21 GMTSat, 10 May 2025 11:35:21 GMT60java 数据库缓冲池 使用c3p0http://www.tkk7.com/jiabao/archive/2008/10/23/236102.html金家?/dc:creator>金家?/author>Thu, 23 Oct 2008 02:24:00 GMThttp://www.tkk7.com/jiabao/archive/2008/10/23/236102.htmlhttp://www.tkk7.com/jiabao/comments/236102.htmlhttp://www.tkk7.com/jiabao/archive/2008/10/23/236102.html#Feedback2http://www.tkk7.com/jiabao/comments/commentRss/236102.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/236102.html

c3p0很容易用的开源专业jdbc数据库缓冲池?br />它是sourceforge上的一个开源项目,
目?
http://sourceforge.net/projects/c3p0
他的众多Ҏ这里就不一一介绍了?br />比较爽的一点就?br />当Connection归还~冲池时Qc3p0会很心的关?br />q条q接打开的Statement和ResultSet,免去了用时
自己动手心翼的关闭?/em>

c3p0使用非常单,q里l一个例?/em>

package common.db;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;


import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;

public final class ConnectionManager {
 private static ConnectionManager instance;
 
 public ComboPooledDataSource ds;
 private static String c3p0Properties="c3p0.properties";
 
 private ConnectionManager() throws Exception {
  Properties p = new Properties();
  p.load(this.getClass().getResourceAsStream(c3p0Properties));
  ds = new ComboPooledDataSource();
 }
 
 public static final ConnectionManager getInstance() {
  if (instance == null) {
   try {
    instance = new ConnectionManager();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
  return instance;
 }
 
 public synchronized final Connection getConnection() {
  try {
   return ds.getConnection();
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return null;
 }

 protected void finalize() throws Throwable {
  DataSources.destroy(ds); //关闭datasource
  super.finalize();
 }
 
}

然后在ConnectionManagercȝ目录下再创徏一个配|文件c3p0.properties
内容如下Q?br />#db login parameters
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost/test?useUnicode=no&characterEncoding=GBK
user=test
password=test

#pool parameters
initialPoolSize=2
maxPoolSize=5
#maxIdleTime=10
#idleConnectionTestPeriod=5
autoCommitOnClose=true

完整的配|文件参数参看c3p0的文?/em>

使用connection时很?br />Connection conn = ConnectionManager.getInstance().getConnection();
...
最?conn.close() 卛_Q?/em>



]]>
JDBC也分2.0?.0Q?/title><link>http://www.tkk7.com/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.tkk7.com/jiabao/archive/2008/10/23/236098.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/236098.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2008/10/23/236098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/236098.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/236098.html</trackback:ping><description><![CDATA[如题。研I中...以前没有注意q?img height="19" src="http://www.tkk7.com/Emoticons/red_smile.gif" width="19" border="0" /><img src ="http://www.tkk7.com/jiabao/aggbug/236098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-23 10:10 <a href="http://www.tkk7.com/jiabao/archive/2008/10/23/236098.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>鲤鱼论坛 研究W记Q未Q?/title><link>http://www.tkk7.com/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.tkk7.com/jiabao/archive/2008/10/21/235627.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/235627.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2008/10/21/235627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/235627.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/235627.html</trackback:ping><description><![CDATA[2008.10.21W一?br />|站地址Q?<a >http://www.liyunet.com/</a><br />源码下蝲Q?<a >http://www.liyunet.com/bbs/download.jsp</a><br /><br />我主要是利用该论坛的易性来研究JSP技术,以及~存技术。虽然说目前大部分论坛应用的都是L框架技术,但说回来Q这些框架也只是对JSP{相x术的一个封装,而了解底部应用及其原理更Ҏ让我理解L框架的内部原理机制。不至于让框架把我们变成“傻子”?br /><br /><br />那就开始吧<br />首先Q和某些大虾一L习惯Q我们从WEB-INF下的web.xml开始,从以下代码中可以发现随着tomcat启动Ӟ自动加蝲了InitServletcR这是一个ServletcR?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.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000"><img src="http://www.tkk7.com/images/dot.gif" /><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img align="top" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" /></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">InitServlet</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img align="top" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" />        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">com.bcxy.servlet.InitServlet</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img align="top" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" />        </span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img align="top" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" />      </span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img align="top" src="http://www.tkk7.com/images/OutliningIndicators/None.gif" /><img src="http://www.tkk7.com/images/dot.gif" /></span></div><p>查看<span style="COLOR: #000000">com.bcxy.servlet.InitServletc,代码很简?<br />开始做了一个对此类日志Qlog4j)的绑定。接着通过SystemConfig取得了系l配|中的连接类型conntypeQ查看classes目录下的SystemConfig.xml可知此变量是判断使用q接池的cd0:3P0Q?1:ProxoolQ。接着是初始化操作Q记录一些必要的启动信息(log4j)Q其中做了本地地址和网l访问地址的{换)?br />用DBUtil.close试q接池是否加载成功?br />最后是释放cL做的必要操作。判断用的是哪一U连接池Q然后关闭。这h们的W一个类分析完毕?br />接着需要了解到<br /><font style="BACKGROUND-COLOR: #ff9933">SystemConfigcL加蝲SystemConfig.xml配置文gQƈ讑֮Ҏ去读取。其中有一定的cd转换?br /></font><br />此时g已经找不到头l了。那q样吧。我们就开始访问我们自己搭建的论坛Q从首页开始,也就是index.jsp面?br />览index.jsp代码Q由上向下理解每一个语句的含义Q整体分体)?br /><br />讑֮面~码Q导入IPLocalizerc(应该是做IP昄的工LQ;插入INC/const.jsp(q后会有分析Q;讑֮stats变量数|通过阅读其他jsp面发现Q此变量的作用主要是在于在首|C用L态时Q兼q显C当前用户做览的页面:也就是stats的|q样我们可以在客户可讉K的范围内对stats变量q行讄Q就可以查看在线用户的当前行为)Ql插入INC/theme.jspQ估计是定制论坛模板的文ӞQ?lt;table>标签内部是q接到相xC数据信息的jsp面q加了参数。其中的一些格式是通过上面引用文g中的变量讄Q相对不隄解;论坛消息q播部分Q通过一个可执行jsp面vector昄在首顶部,当中讉K数据库的l节需要进一步研I代码)Q接着是帖子的遍历Q也是首页最关键的部分,q里看v来不是由jsp面来负责获取数据,而是通过ForumcL获取一些过滤之后的数据Q这里所说的qo是例如置帖子,最新帖子等有一些特D标记的数据Q?<br />index.jsp的其他部分就都是大同异了。都是通过一个遍历来展现h相同Ҏ的数据。;大家需要注意一些关于页面表现的而非java技术的部分Q例如信息层的提C,和一些图片连接?br /><em>通过index.jsp的学习,我们大概已经了解了大部分jsp面代码的表现Ş式和含义。当Ӟ一定要注意在这个过E中Q参C递、参数获取的代码部分Q不要遗漏。除了一些我们可以看到的面之外Q上面部分也讲到了一些ƈ不用于显C给用户的页面,q里我们认ؓ它是可执行页面,也就是说它对我们的数据和h做了一些处理,或者说把我们的h转交l了服务器(比如servletQ?br /><br /><strong>预计晚上要研I一下有x据库斚w的存取类JdbcWrapper以及q接获取和释放、数据查询插入?br />2008.10.22<br /></strong></em>大概昨天写的已经忘的差不多了Q那么我们还是从index.jsp文g开始,前几行没有什么问题,都是一些导入文件的标签Q那么我们从SkinUtil.q个cd手。在查看SkinUtilcM码的时候我们发现里面应用了一些com\bcxy\bbs\util 包中c,其中含有三个工具cR(LQ看了文件大,应该代码不多Q我们看看里面都是什么)在开始之前我们应了解一下GCookie.javacȝ大概内容和作用。看导入包我们可以大概了解一下此cȝ作用Q对URL的编码与解码Q生和dCookieQ还有就是做一些日志记?log4j)?br />我们仔细阅读后,了解刎ͼ其中有一个重载方法,也就是setCookieҎQ根据不同的参数Q可以让我们选择直接赋予变量名和值的ҎQ或者是赋予变量名和值另外加上最大保存时间的Ҏ。?cM的另一个方法是获取CookieҎ倹{?br />ParamUtilcM很简单,是取得字W串?取得整数的重载方法,其中的参数决定是否有默认|是否需要{码?br />SysUtilcMҎSystemConfigcM的读取方法读取配|文件systemconfig.propertiesQ按照里面的讄Q来判断是否对参数和数据库读取操作中的参数进行编码。其中还有一个方法是取得真实地址Q当然这些都是根据systemconfig.properties文g中配|而定的?br />BBSCconst.javacȝ单的讄了一些常量。作用是讄数据库表名的时候加上systemconfig.properties中设|的前缀?br />回到SkinUtil.javacM乎看h一些刚刚还陌生的类ҎQ显得明朗。前面设|了一个Cookie的变量名q赋了倹{?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.tkk7.com/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>q里用到了新c,也就是我们昨天说q的要了解的关于数据库连接的cR也是今天要解决的重炏V打开JdbcWrapperc,查看代码.(插一句,看代码的时候,我觉得先看包名,了解大概要用到的cdҎQ去设想q个c要实现的功能)Qyi一眼看来,大概都熟悉,无非是连接数据库 dQ结果保存,异常Q还有一些类似数l的HashMapq有遍历用得Iterator。想惻I大概是数据层的一些基CRUD操作。但是其中有个类不是很熟悉,DatabaseMetaDatac,查看sun公司的在U文,发现q是个接口而且Ҏ奇多Q文的W一句这么写Q?/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.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">Comprehensive information about the database as a whole. </span></div><p>我也不能理解q句话包含了什么内宏V不他Q在E序中慢慢体会吧。JdbcWrapperq个cL炚wQ不q,大部分方法都有类似的作用Q也是说真正不同功能的代码也只有几分之一而已。我看的都想睡觉了?br /><br /><em><strong>在网吧,因ؓ不便Q先d?br /></strong></em>今天q好Q自己有一台电脑,可以不限制时间。l工?...<br />之前研究JdbcWrappercȝ时候有一个小的疑问。如?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.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">######q里有一点不明白Qؓ什么要判断getAutoCloseQ)</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.tkk7.com/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.tkk7.com/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.tkk7.com/images/OutliningIndicators/InBlock.gif" />     * 当需要事务支持时Q需要设|autoClose=falseQ那qC务提交时再关闭数据库q接?br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img align="top" src="http://www.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/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.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">当需要事务支持时Q需要设|autoClose=falseQ那qC务提交时再关闭数据库q接?/span></div><p><br />一时还没有理解开来?br />看过来看q去QJdbcWrappercd我来讲还是有一部分难以理解。烦性不ȝ它,{在下面的代码中出现Ӟ反复查阅应该会有更多的收莗?br /></p><img src ="http://www.tkk7.com/jiabao/aggbug/235627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-21 11:47 <a href="http://www.tkk7.com/jiabao/archive/2008/10/21/235627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于正则表达?/title><link>http://www.tkk7.com/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.tkk7.com/jiabao/archive/2008/10/17/234851.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/234851.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2008/10/17/234851.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/234851.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/234851.html</trackback:ping><description><![CDATA[*匚w除了换行之外的所有字W?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匚wL的空白符、(I格、制表符、换行符、中文全角空|<br />\w匚w字母或数字或下划U或汉字<br /><br /><table cellspacing="0"><caption>?.常用的元字符</caption><thead><tr><th scope="col">代码</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span id="7np1xbp" class="code" bakclassname="code"><font color="#0000ff">.</font></span></td><td><span id="9rlr9t9" class="desc" bakclassname="desc"><u>匚w除换行符以外的Q意字W?/u></span></td></tr><tr><td><span id="hj7hnrj" class="code" bakclassname="code"><font color="#0000ff">\w</font></span></td><td><span id="prrlxbx" class="desc" bakclassname="desc"><u>匚w字母或数字或下划U或汉字</u></span></td></tr><tr><td><span id="9dxpzh1" class="code" bakclassname="code"><font color="#0000ff">\s</font></span></td><td><span id="59hdfxp" class="desc" bakclassname="desc"><u>匚wL的空白符</u></span></td></tr><tr><td><span id="tfhz3vx" class="code" bakclassname="code"><font color="#0000ff">\d</font></span></td><td><span id="7x7tjlr" class="desc" bakclassname="desc"><u>匚w数字</u></span></td></tr><tr><td><span id="pjb9935" class="code" bakclassname="code"><font color="#0000ff">\b</font></span></td><td><span id="r3lddf9" class="desc" bakclassname="desc"><u>匚w单词的开始或l束</u></span></td></tr><tr><td><span id="5lfrtlt" class="code" bakclassname="code"><font color="#0000ff">^</font></span></td><td><span id="ftdn9jl" class="desc" bakclassname="desc"><u>匚w字符串的开?/u></span></td></tr><tr><td><span id="pvxzt1v" class="code" bakclassname="code"><font color="#0000ff">$</font></span></td><td><span id="frzj9fl" class="desc" bakclassname="desc"><u>匚w字符串的l束</u></span></td></tr></tbody></table><br /><br /><table cellspacing="0"><caption>?.常用的限定符</caption><thead><tr><th scope="col">代码/语法</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span id="nhrlfhz" class="code" bakclassname="code"><font color="#0000ff">*</font></span></td><td><span id="dr1t11j" class="desc" bakclassname="desc"><u>重复零次或更多次</u></span></td></tr><tr><td><span id="jtbl9f9" class="code" bakclassname="code"><font color="#0000ff">+</font></span></td><td><span id="z9lx9xh" class="desc" bakclassname="desc"><u>重复一ơ或更多?/u></span></td></tr><tr><td><span id="9zldvt1" class="code" bakclassname="code"><font color="#0000ff">?</font></span></td><td><span id="1xf9r3n" class="desc" bakclassname="desc"><u>重复零次或一?/u></span></td></tr><tr><td><span id="v911nrj" class="code" bakclassname="code"><font color="#0000ff">{n}</font></span></td><td><span id="r97dxpr" class="desc" bakclassname="desc"><u>重复n?/u></span></td></tr><tr><td><span id="lphr9pb" class="code" bakclassname="code"><font color="#0000ff">{n,}</font></span></td><td><span id="5f9zbrb" class="desc" bakclassname="desc"><u>重复nơ或更多?/u></span></td></tr><tr><td><span id="9v3dfvn" class="code" bakclassname="code"><font color="#0000ff">{n,m}</font></span></td><td><span id="brz9fxr" class="desc" bakclassname="desc"><u>重复n到m?/u></span></td></tr></tbody></table><br /><br /><h2 id="backreference">后向引用</h2><p>使用括h定一个子表达式后Q?strong>匚wq个子表辑ּ的文?/strong>(也就是此分组捕获的内?可以在表辑ּ或其它程序中作进一步的处理。默认情况下Q每个分l会自动拥有一?span class="name" bakclassname="name"><strong>l号</strong></span>Q规则是Q从左向叻I以分l的左括号ؓ标志Q第一个出现的分组的组号ؓ1Q第二个?Q以此类推?/p><p><span id="zlnxvpp" class="name" bakclassname="name"><strong>后向引用</strong></span>用于重复搜烦前面某个分组匚w的文本。例如,<span id="fz9h1dd" class="part" bakclassname="part"><font color="#008000">\1</font></span>代表<span id="hnzz3n3" class="desc" bakclassname="desc"><u>分组1匚w的文?/u></span>。难以理解?LCZQ?/p><p><span id="p73nx9j" class="regex" bakclassname="regex"><font color="#ff0000">\b(\w+)\b\s+\1\b</font></span>可以用来匚w<span id="lhrjt33" class="desc" bakclassname="desc"><u>重复的单?/u></span>Q像<span id="djrr19d" 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>Q也是<span id="x73p3rj" class="desc" bakclassname="desc"><u>单词开始处和结束处之间的多于一个的字母或数?/u></span>(<span id="v9lvfvx" class="part" bakclassname="part"><font color="#008000">\b(\w+)\b</font></span>)Q这个单词会被捕获到~号?的分l中Q然后是<span id="bphtjzr" class="desc" bakclassname="desc"><u>1个或几个I白W?/u></span>(<span id="nbt7p9t" class="part" bakclassname="part"><font color="#008000">\s+</font></span>)Q最后是<span id="l1vx9xx" class="desc" bakclassname="desc"><u>分组1中捕L内容Q也是前面匚w的那个单词)</u></span>(<span id="9tltnlv" class="part" bakclassname="part"><font color="#008000">\1</font></span>)?/p><p>你也可以自己指定子表辑ּ?span class="name" bakclassname="name"><strong>l名</strong></span>。要指定一个子表达式的l名Q请使用q样的语法:<span id="hdxz959" class="code" bakclassname="code"><font color="#0000ff">(?<Word>\w+)</font></span>(或者把括h?span class="code" bakclassname="code"><font color="#0000ff">'</font></span>也行Q?span class="code" bakclassname="code"><font color="#0000ff">(?'Word'\w+)</font></span>),q样把<span id="vrln193" class="part" bakclassname="part"><font color="#008000">\w+</font></span>的组名指定ؓ<span id="pllnvn5" class="part" bakclassname="part"><font color="#008000">Word</font></span>了。要反向引用q个分组<span id="9lltn1d" class="name" bakclassname="name"><strong>捕获</strong></span>的内容,你可以?span class="code" bakclassname="code"><font color="#0000ff">\k<Word></font></span>,所以上一个例子也可以写成q样Q?span class="regex" bakclassname="regex"><font color="#ff0000">\b(?<Word>\w+)\b\s+\k<Word>\b</font></span>?/p><p>使用括L时候,q有很多特定用途的语法。下面列Z最常用的一些:</p><table cellspacing="0"><caption>?.常用分组语法</caption><tbody><tr><th scope="col">分类</th><th scope="col">代码/语法</th><th scope="col">说明</th></tr><tr><th rowspan="3">捕获</th><td><span id="7dxxxdp" class="code" bakclassname="code"><font color="#0000ff">(exp)</font></span></td><td><span id="7vnxfz1" class="desc" bakclassname="desc"><u>匚wexp,q捕h本到自动命名的组?/u></span></td></tr><tr><td><span id="dh393pb" class="code" bakclassname="code"><font color="#0000ff">(?<name>exp)</font></span></td><td><span id="d9nnh1x" class="desc" bakclassname="desc"><u>匚wexp,q捕h本到名称为name的组里,也可以写??'name'exp)</u></span></td></tr><tr><td><span id="frtbvnh" class="code" bakclassname="code"><font color="#0000ff">(?:exp)</font></span></td><td><span id="njbrrdl" class="desc" bakclassname="desc"><u>匚wexp,不捕获匹配的文本Q也不给此分l分配组?/u></span></td></tr><tr><th rowspan="4">零宽断言</th><td><span id="h37ddf9" class="code" bakclassname="code"><font color="#0000ff">(?=exp)</font></span></td><td><span id="txh9ltx" class="desc" bakclassname="desc"><u>匚wexp前面的位|?/u></span></td></tr><tr><td><span id="rf9bj9b" class="code" bakclassname="code"><font color="#0000ff">(?<=exp)</font></span></td><td><span id="t3bb3pr" class="desc" bakclassname="desc"><u>匚wexp后面的位|?/u></span></td></tr><tr><td><span id="7rtd1r1" class="code" bakclassname="code"><font color="#0000ff">(?!exp)</font></span></td><td><span id="1ln9rb3" class="desc" bakclassname="desc"><u>匚w后面跟的不是exp的位|?/u></span></td></tr><tr><td><span id="t3ffzz3" class="code" bakclassname="code"><font color="#0000ff">(?<!exp)</font></span></td><td><span id="bfzrbd3" class="desc" bakclassname="desc"><u>匚w前面不是exp的位|?/u></span></td></tr><tr><th>注释</th><td><span id="rxfhj1x" class="code" bakclassname="code"><font color="#0000ff">(?#comment)</font></span></td><td><span id="t7bvdnh" class="desc" bakclassname="desc"><u>q种cd的分l不Ҏ则表辑ּ的处理生Q何媄响,用于提供注释让h阅读</u></span></td></tr></tbody></table><br /><br /><table cellspacing="0"><caption>?.懒惰限定W?/caption><thead><tr><th scope="col">代码/语法</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span id="zhpf1v1" class="code" bakclassname="code"><font color="#0000ff">*?</font></span></td><td><span id="nphz7p9" class="desc" bakclassname="desc"><u>重复Lơ,但尽可能重?/u></span></td></tr><tr><td><span id="lzpjllx" class="code" bakclassname="code"><font color="#0000ff">+?</font></span></td><td><span id="pv7r3h9" class="desc" bakclassname="desc"><u>重复1ơ或更多ơ,但尽可能重?/u></span></td></tr><tr><td><span id="bf79rhd" class="code" bakclassname="code"><font color="#0000ff">??</font></span></td><td><span id="73fhjr9" class="desc" bakclassname="desc"><u>重复0ơ或1ơ,但尽可能重?/u></span></td></tr><tr><td><span id="rv33jzv" class="code" bakclassname="code"><font color="#0000ff">{n,m}?</font></span></td><td><span id="9xn3jbj" class="desc" bakclassname="desc"><u>重复n到mơ,但尽可能重?/u></span></td></tr><tr><td><span id="x9lnhpx" class="code" bakclassname="code"><font color="#0000ff">{n,}?</font></span></td><td><span id="bfprr9p" class="desc" bakclassname="desc"><u>重复nơ以上,但尽可能重?/u></span></td></tr></tbody></table><br /><br /><table cellspacing="0"><caption>?.常用的处理选项</caption><thead><tr><th scope="col">名称</th><th scope="col">说明</th></tr></thead><tbody><tr><td>IgnoreCase(忽略大小?</td><td>匚w时不区分大小写?/td></tr><tr><td>Multiline(多行模式)</td><td>更改<span id="znfhhpz" class="code" bakclassname="code"><font color="#0000ff">^</font></span>?span class="code" bakclassname="code"><font color="#0000ff">$</font></span>的含义,使它们分别在L一行的行首和行֌配,而不仅仅在整个字W串的开头和l尾匚w?在此模式?<span id="hdvxhpr" class="code" bakclassname="code"><font color="#0000ff">$</font></span>的精含意是:匚w\n之前的位|以及字W串l束前的位置.) </td></tr><tr><td>Singleline(单行模式)</td><td>更改<span id="7vxfzbz" class="code" bakclassname="code"><font color="#0000ff">.</font></span>的含义,使它与每一个字W匹配(包括换行W\nQ?</td></tr><tr><td>IgnorePatternWhitespace(忽略I白)</td><td>忽略表达式中的非转义I白q启用由<span id="fjd7phr" class="code" bakclassname="code"><font color="#0000ff">#</font></span>标记的注释?/td></tr><tr><td>RightToLeft(从右向左查找)</td><td>匚w从右向左而不是从左向双行?/td></tr><tr><td>ExplicitCapture(昑ּ捕获)</td><td>仅捕获已被显式命名的l?/td></tr><tr><td>ECMAScript(JavaScript兼容模式)</td><td>使表辑ּ的行Z它在JavaScript里的行ؓ一致?/td></tr></tbody></table><table cellspacing="0"><caption>?.未详细讨论的语?/caption><thead><tr><th scope="col">代码/语法</th><th scope="col">说明</th></tr></thead><tbody><tr><td><span id="9nx1n99" class="code" bakclassname="code"><font color="#0000ff">\a</font></span></td><td><span id="tvnfprz" class="desc" bakclassname="desc"><u>报警字符(打印它的效果是电脑嘀一?</u></span></td></tr><tr><td><span id="p3d3pzp" class="code" bakclassname="code"><font color="#0000ff">\b</font></span></td><td><span id="tvnpbjj" class="desc" bakclassname="desc"><u>通常是单词分界位|,但如果在字符c里使用代表退?/u></span></td></tr><tr><td><span id="7l3xxpf" class="code" bakclassname="code"><font color="#0000ff">\t</font></span></td><td><span id="x7jp9r3" class="desc" bakclassname="desc"><u>制表W,Tab</u></span></td></tr><tr><td><span id="tprhjjd" class="code" bakclassname="code"><font color="#0000ff">\r</font></span></td><td><span id="jvxprbj" class="desc" bakclassname="desc"><u>回R</u></span></td></tr><tr><td><span id="vblxfzh" class="code" bakclassname="code"><font color="#0000ff">\v</font></span></td><td><span id="v939nnn" class="desc" bakclassname="desc"><u>竖向制表W?/u></span></td></tr><tr><td><span id="lf9lnph" class="code" bakclassname="code"><font color="#0000ff">\f</font></span></td><td><span id="vfxfzh9" class="desc" bakclassname="desc"><u>换页W?/u></span></td></tr><tr><td><span id="7xzbdb9" class="code" bakclassname="code"><font color="#0000ff">\n</font></span></td><td><span id="3lt39zb" class="desc" bakclassname="desc"><u>换行W?/u></span></td></tr><tr><td><span id="lp99n1d" class="code" bakclassname="code"><font color="#0000ff">\e</font></span></td><td><span id="pdvnxnn" class="desc" bakclassname="desc"><u>Escape</u></span></td></tr><tr><td><span id="xdtv15p" class="code" bakclassname="code"><font color="#0000ff">\0nn</font></span></td><td><span id="lf9t9bl" class="desc" bakclassname="desc"><u>ASCII代码中八q制代码为nn的字W?/u></span></td></tr><tr><td><span id="l9z9ddx" class="code" bakclassname="code"><font color="#0000ff">\xnn</font></span></td><td><span id="5hjtvdt" class="desc" bakclassname="desc"><u>ASCII代码中十六进制代码ؓnn的字W?/u></span></td></tr><tr><td><span id="l9httnn" class="code" bakclassname="code"><font color="#0000ff">\unnnn</font></span></td><td><span id="3zb5fpp" class="desc" bakclassname="desc"><u>Unicode代码中十六进制代码ؓnnnn的字W?/u></span></td></tr><tr><td><span id="5p9nxx3" class="code" bakclassname="code"><font color="#0000ff">\cN</font></span></td><td><span id="t9hjbbb" class="desc" bakclassname="desc"><u>ASCII控制字符。比如\cC代表Ctrl+C</u></span></td></tr><tr><td><span id="fbv95v3" class="code" bakclassname="code"><font color="#0000ff">\A</font></span></td><td><span id="1h9r9pb" class="desc" bakclassname="desc"><u>字符串开?cM^Q但不受处理多行选项的媄?</u></span></td></tr><tr><td><span id="xjt7ffn" class="code" bakclassname="code"><font color="#0000ff">\Z</font></span></td><td><span id="df33dhp" class="desc" bakclassname="desc"><u>字符串结或行尾(不受处理多行选项的媄?</u></span></td></tr><tr><td><span id="pdnhbt3" class="code" bakclassname="code"><font color="#0000ff">\z</font></span></td><td><span id="1x9t3zz" class="desc" bakclassname="desc"><u>字符串结?cM$Q但不受处理多行选项的媄?</u></span></td></tr><tr><td><span id="bfp71pz" class="code" bakclassname="code"><font color="#0000ff">\G</font></span></td><td><span id="7hjzr9l" class="desc" bakclassname="desc"><u>当前搜烦的开?/u></span></td></tr><tr><td><span id="xtvff19" class="code" bakclassname="code"><font color="#0000ff">\p{name}</font></span></td><td><span id="fttlvpf" class="desc" bakclassname="desc"><u>Unicode中命名ؓname的字W类Q例如\p{IsGreek}</u></span></td></tr><tr><td><span id="9bb9nfv" class="code" bakclassname="code"><font color="#0000ff">(?>exp)</font></span></td><td><span id="7jjbdvh" class="desc" bakclassname="desc"><u>贪婪子表辑ּ</u></span></td></tr><tr><td><span id="vbtdtdl" class="code" bakclassname="code"><font color="#0000ff">(?<x>-<y>exp)</font></span></td><td><span id="xj3n3vx" class="desc" bakclassname="desc"><u>ql?/u></span></td></tr><tr><td><span id="rxp39tn" class="code" bakclassname="code"><font color="#0000ff">(?im-nsx:exp)</font></span></td><td><span id="1z993vn" class="desc" bakclassname="desc"><u>在子表达式exp中改变处理选项</u></span></td></tr><tr><td><span id="3ld9pfz" class="code" bakclassname="code"><font color="#0000ff">(?im-nsx)</font></span></td><td><span id="h9hh9n3" class="desc" bakclassname="desc"><u>辑ּ后面的部分改变处理选项</u></span></td></tr><tr><td><span id="bnvv3j3" class="code" bakclassname="code"><font color="#0000ff">(?(exp)yes|no)</font></span></td><td><span id="xh79399" class="desc" bakclassname="desc"><u>把exp当作零宽正向先行断言Q如果在q个位置能匹配,使用yes作ؓ此组的表辑ּQ否则用no</u></span></td></tr><tr><td><span id="5pzz19t" class="code" bakclassname="code"><font color="#0000ff">(?(exp)yes)</font></span></td><td><span id="tprjjzz" class="desc" bakclassname="desc"><u>同上Q只是用空表达式作为no</u></span></td></tr><tr><td><span id="lx99hzb" class="code" bakclassname="code"><font color="#0000ff">(?(name)yes|no)</font></span></td><td><span id="vb9x9p9" class="desc" bakclassname="desc"><u>如果命名为name的组捕获C内容Q用yes作ؓ表达式;否则使用no</u></span></td></tr><tr><td><span id="pvdvxfr" class="code" bakclassname="code"><font color="#0000ff">(?(name)yes)</font></span></td><td><span id="vprbl33" class="desc" bakclassname="desc"><u>同上Q只是用空表达式作为no</u></span></td></tr></tbody></table><img src ="http://www.tkk7.com/jiabao/aggbug/234851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-17 11:10 <a href="http://www.tkk7.com/jiabao/archive/2008/10/17/234851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene倒排索引原理(? http://www.tkk7.com/jiabao/archive/2008/10/17/234822.html金家?/dc:creator>金家?/author>Fri, 17 Oct 2008 01:43:00 GMThttp://www.tkk7.com/jiabao/archive/2008/10/17/234822.htmlhttp://www.tkk7.com/jiabao/comments/234822.htmlhttp://www.tkk7.com/jiabao/archive/2008/10/17/234822.html#Feedback1http://www.tkk7.com/jiabao/comments/commentRss/234822.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/234822.html
0Q设有两文??
文章1的内容ؓQTom lives in Guangzhou,I live in Guangzhou too.
文章2的内容ؓQHe once lived in Shanghai.

1)׃lucene是基于关键词索引和查询的Q首先我们要取得q两文章的关键词,通常我们需要如下处理措?br />a.我们现在有的是文章内容,即一个字W串Q我们先要找出字W串中的所有单词,卛_词。英文单词由于用I格分隔Q比较好处理。中文单词间是连在一L需要特D的分词处理?br />b.文章中的”in? “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义Q这些不代表概念的词可以qo?br />c.用户通常希望查“He”时能把含“he”,“HE”的文章也找出来Q所以所有单词需要统一大小写?br />d.用户通常希望查“live”时能把含“lives”,“lived”的文章也找出来Q所以需要把“lives”,“lived”还原成“live?br />e.文章中的标点W号通常不表C某U概念,也可以过滤掉
在lucene中以上措施由Analyzercd?br />
l过上面处理?br />    文章1的所有关键词为:[tom] [live] [guangzhou] [i] [live] [guangzhou]
    文章2的所有关键词为:[he] [live] [shanghai]

2) 有了关键词后Q我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关pd过来,变成Q“关键词”对“拥有该关键词的所有文章号”。文?Q?l过倒排后变?br />关键词   文章号
guangzhou  1
he         2
i           1
live       1,2
shanghai   2
tom         1

通常仅知道关键词在哪些文章中出现q不够,我们q需要知道关键词在文章中出现ơ数和出现的位置Q通常有两U位|:a)字符位置Q即记录该词是文章中W几个字W(优点是关键词亮显时定位快Q;b)关键词位|,卌录该词是文章中第几个关键词(优点是节U烦引空间、词l(phaseQ查询快Q,lucene中记录的是q种位置?br />
加上“出现频率”和“出C|”信息后Q我们的索引l构变ؓQ?br />关键词   文章号[出现频率]   出现位置
guangzhou 1[2]               3Q?
he       2[1]               1
i         1[1]               4
live      1[2],2[1]           2Q?Q?
shanghai  2[1]               3
tom      1[1]               1

以live q行Z我们说明一下该l构Qlive在文?中出C2ơ,文章2中出C一ơ,它的出现位置为?,5,2”这表示什么呢Q我们需要结合文章号和出现频率来分析Q文?中出C2ơ,那么?,5”就表示live在文?中出现的两个位置Q文?中出C一ơ,剩下的?”就表示live是文?中第 2个关键字?br />    
以上是lucene索引l构中最核心的部分。我们注意到关键字是按字W顺序排列的Qlucene没有使用B树结构)Q因此lucene可以用二元搜索算法快速定位关键词?br />    
实现时 lucene上面三列分别作典文ӞTerm DictionaryQ、频率文?frequencies)、位|文?(positions)保存。其中词典文件不仅保存有每个关键词,q保留了指向频率文g和位|文件的指针Q通过指针可以扑ֈ该关键字的频率信息和位置信息?br />
    Lucene中用了field的概念,用于表达信息所在位|(如标题中Q文章中Qurl中)Q在建烦引中Q该field信息也记录在词典文g中,每个关键词都有一个field信息(因ؓ每个关键字一定属于一个或多个field)?br />
     Z减小索引文g的大,Lucene对烦引还使用了压~技术。首先,对词典文件中的关键词q行了压~,关键词压~ؓ<前缀长度Q后~>Q例如:当前词ؓ“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压~ؓ<3Q语>。其ơ大量用到的是对数字的压~,数字只保存与上一个值的差|q样可以减小数字的长度,q而减保存该数字需要的字节敎ͼ。例如当前文章号?6389Q不压羃要用3个字节保存)Q上一文章h16382Q压~后保存7Q只用一个字节)?br />    
    下面我们可以通过对该索引的查询来解释一下ؓ什么要建立索引?br />假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文g的指针读出所有文章号Q然后返回结果。词兔R常非常,因而,整个q程的时间是毫秒U的?br />而用普通的序匚w法Q不建烦引,而是Ҏ有文章的内容q行字符串匹配,q个q程会相当~慢Q当文章数目很大Ӟ旉往往是无法忍受的?


]]>
struts2标签http://www.tkk7.com/jiabao/archive/2008/10/13/234029.html金家?/dc:creator>金家?/author>Mon, 13 Oct 2008 07:46:00 GMThttp://www.tkk7.com/jiabao/archive/2008/10/13/234029.htmlhttp://www.tkk7.com/jiabao/comments/234029.htmlhttp://www.tkk7.com/jiabao/archive/2008/10/13/234029.html#Feedback1http://www.tkk7.com/jiabao/comments/commentRss/234029.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/234029.html 

一?
写jsp面的时候,在struts2中,用的是s标记Q先引入标记Q?
<%@ taglib prefix="s" uri="/struts-tags"%>
二?
struts2的标{֒1是完全不同的?
struts2的标{ֈZ大类Q非UI标志和UI标志 struts1 标志库按功能分成HTML、Tiles、Logic和Bean{几部分
下面׃lstrut2的具体标{:
1、UI
UI标志又可以分单UI和非表单UI两部分。表单UI部分基本与Struts 1.x相同Q都是对HTML表单元素的包装。不q,Struts 2.0加了几个我们l常在项目中用到的控件如Qdatepicker、doubleselect、timepicker、optiontransferselect{。因些标志很多都l常用到Q而且参数也很多,要在一文章详l说明ƈ非易事?
下面主要是ui标签的一些用?
form:
<s:form action="exampleSubmit" method="post" enctype="multipart/form-data">
<s:submit />
    <s:reset />

</s:form>可以上传文g的form?
textfieldQ?
<s:textfield
            label="姓名Q?
            name="name"
            tooltip="Enter your Name here" />
datepickerQ?
<s:datepicker
            tooltip="Select Your Birthday"
            label="生日"
            name="birthday" />
textareaQ?
<s:textarea
            tooltip="Enter your remart"
            label="备注"
            name="remart"
            cols="20"
            rows="3"/>
select:
<s:select
            tooltip="Choose user_type"
            label=""
            list="#{'free':'免费','vip':'收费'}" value="#{'free':'免费'}"  
           name="bean.user_type"
            emptyOption="true"
            headerKey="None"
            headerValue="None"/>
<s:select
            tooltip="Choose user_type"
            label=""
            list="#{'free':'免费','vip':'收费'}" value="#{'free':'免费'}"  
           name="bean.user_type"
            emptyOption="true"
            headerKey="None"
            headerValue="None"/>
<s:select
list="venderList"
listKey="id"
listValue="name"
value="%{profile.companyName}"
name="companyName" cssClass="sel_style_w_180"/>  
挺好用的
checkboxlistQ?
<s:checkboxlist
            tooltip="Choose your Friends"
            label="朋友"
            list="{'Patrick', 'Jason', 'Jay', 'Toby', 'Rene'}"
            name="friends"/>
checkboxQ?
   <s:checkbox
            tooltip="Confirmed that your are Over 18"
            label="q龄"
            name="legalAge"
            value="18"/>
file:
   <s:file
            tooltip="Upload Your Picture"
            label="Picture"
            name="picture" />
a:
<s:a href="getP.jsp">链接提?lt;/s:a>
date :
<s:date name="ad_end_time" format="yyyy-MM-dd"/>


2、非UI
if、elseif和else 描述Q?
执行基本的条件流转?
参数Q?
名称必需默认cd描述备注test是Boolean军_标志里内Ҏ否显C的表达式else标志没有q个参数id否Object/String用来标识元素的id。在UI和表单中为HTML的id属?例子Q?
<%@ page c %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>Condition Flow</title>
    </head>
    <body>
        <h3>Condition Flow</h3>            
        <!--
            q里有点技巧:
            本来可以?parameters.name[0]来获得,h中name的倹{但是,在我实现include例子Ӟ
            无论我用param标志lname赋Q何|#parameters里面不会含有M|所?parameters.name也ؓI倹{?
            
            其原因ؓQ?
            当用include标志Ӟ被包含的面QincludedQ里#parameters拿到的是包含面里的h参数?
            
            因此Q这里必L工调用request.getParameter("name")?
        -->
    <s:iterator value="linkList" status="bean">
   <tr>
    <td class="data_tab_tdcl">
     <s:property value="#bean.Index+1" />    </td>
    <td class="data_tab_tdcl"><s:property value="link_title" /></td>
    <td class="data_tab_tdcl"><s:property value="link_url" /></td>
    <td class="data_tab_tdcl">
    <s:if test="link_type == 1">
                   文字
                </s:if>
                <s:elseif test="link_type == 2">
                   囄
                </s:elseif>
                 <s:else>
                 -----
               </s:else>   
    </td>

   
    </body>
</html>
? condition.jsp
iterator 描述Q?
用于遍历集合Qjava.util.CollectionQ或枚D|java.util.IteratorQ?
参数Q?
名称必需默认cd描述status否String如果讄此参敎ͼ一个IteratorStatus的实例将会压入每个遍历的堆栈value否Object/String要遍历的可枚丄QiteratableQ数据源Q或者将攑օ新列表(ListQ的对象id否Object/String用来标识元素的id。在UI和表单中为HTML的id属?例子Q?
<%@ page c %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
    List list = new ArrayList();
    list.add("Max");
    list.add("Scott");
    list.add("Jeffry");
    list.add("Joe");
    list.add("Kelvin");
    request.setAttribute("names", list);
%>
<html>
    <head>
        <title>Iterator</title>
    </head>
    <body>
        <h3>Names: </h3>
        <!--
            1、此处的Iproperty元素用于获得当前iterator的?
            2、status被设成stutsQ在iterator的里面就可以通过#stuts取得IteratorStatus的对象。IteratorStatuscd含当前序号信息,如是否第一个或最后一个,是否为奇数序受这些信息在我们做格式化的时候,昑־非常有用?
        -->
        <ol>
            <s:iterator value="#request.names" status="stuts">                
                <s:if test="#stuts.odd == true">
                    <li>White <s:property /></li>
                </s:if>
                <s:else>
                    <li style="background-color:gray"><s:property /></li>
                </s:else>
            </s:iterator>
        </ol>
    </body>
</html>



]]>
JavaW试题(部分Q?/title><link>http://www.tkk7.com/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.tkk7.com/jiabao/archive/2008/10/09/233317.html</guid><wfw:comment>http://www.tkk7.com/jiabao/comments/233317.html</wfw:comment><comments>http://www.tkk7.com/jiabao/archive/2008/10/09/233317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jiabao/comments/commentRss/233317.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jiabao/services/trackbacks/233317.html</trackback:ping><description><![CDATA[     摘要: EJB 斚w   94 ? EJB2.0 ...  <a href='http://www.tkk7.com/jiabao/archive/2008/10/09/233317.html'>阅读全文</a><img src ="http://www.tkk7.com/jiabao/aggbug/233317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-09 11:56 <a href="http://www.tkk7.com/jiabao/archive/2008/10/09/233317.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装WinCVS时Python不可用的问题http://www.tkk7.com/jiabao/archive/2008/09/21/230219.html金家?/dc:creator>金家?/author>Sun, 21 Sep 2008 00:52:00 GMThttp://www.tkk7.com/jiabao/archive/2008/09/21/230219.htmlhttp://www.tkk7.com/jiabao/comments/230219.htmlhttp://www.tkk7.com/jiabao/archive/2008/09/21/230219.html#Feedback1http://www.tkk7.com/jiabao/comments/commentRss/230219.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/230219.html   
TCL or Python are not available, shell is disabled?/td>
有的|友说是版本的问题,我今天安装时也是一P装了好三四个版本Q都一P最后在CSDN上找C{案?br />
解决办法Q?br />
在admin-〉Preferences->wincvs中有关于python的设|,  
  其中python是指你的python虚拟机的位置Q一般是python2X.dll的位|。在你来说就是python24.dll的位|,一般这个文件会在你的系l文件中扑ֈ? 
  Tcl则一般会在python文g架的dlls子文件架中找刎ͼ一般名UCؓtclxx.dllQ在你大概就是tcl84.dll。如果是安装python2.3版本的话Q会自动扑ֈQ不需要设|?br />
讄好了QWinCVS输出H口Q?br />
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)


]]>
[设计模式]jive中的[abstract Factory]http://www.tkk7.com/jiabao/archive/2008/09/16/229191.html金家?/dc:creator>金家?/author>Tue, 16 Sep 2008 07:57:00 GMThttp://www.tkk7.com/jiabao/archive/2008/09/16/229191.htmlhttp://www.tkk7.com/jiabao/comments/229191.htmlhttp://www.tkk7.com/jiabao/archive/2008/09/16/229191.html#Feedback0http://www.tkk7.com/jiabao/comments/commentRss/229191.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/229191.html  AbstractFactory模式和可扩展?br />  假如要实现较好的可扩展性,AbstractFactory模式实是一件利器。如上面所_假如要创建的Forum接口的不同实玎ͼ而又不想更改代码的话Q就需要用到抽象工厂了。再Jive中,AuthorizationFactorycL一个抽象类Q用来创建Authorization对象。这是一个抽象工厂,可以通过不同的子cL创徏不同的Authorization对象。这个工厂的实现Ҏ是:
  
  在AuthorizationFactory中用一个private static变量factoryQ用来引用具体的抽象工厂的实例:
  private static AuthorizationFactory factory = null;
  
  用一个private static的StringQ来指明具体的抽象工厂的子类cdQ?br />  private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";
  
  然后是用一个private static的loadAuthorizationFactoryҎ来给q个factory变量赋|生成具体的抽象工厂类Q?br />  
    private static void loadAuthorizationFactory() {
      if (factory == null) {
        synchronized(className) {
          if (factory == null) {
            String classNameProp = PropertyManager.getProperty(
              "AuthorizationFactory.className"
            );
            if (classNameProp != null) {
              className = classNameProp;
            }
            try {
              Class c = Class.forName(className);
              factory = (AuthorizationFactory)c.newInstance();
            }
            catch (Exception e) {
              System.err.println("Exception loading class: " + e);
              e.printStackTrace();
            }
          }
        }
      }
  }
  
  在static的getAuthorizationҎq回一个Authorization的过E中Q先初始化工厂类factory变量Q然后用factory的createAuthorizationҎ来创建:
  
    public static Authorization getAuthorization(String username,
        String passWord) throws UnauthorizedException
    {
      loadAuthorizationFactory();
      return factory.createAuthorization(username, password);
  }
  
  不同的子cL不同的createAuthorizationҎ的实现。比如在DbAuthorizationFactoryq个AuthorizationFactory的数据库实现子类中,createAuthorizationҎ是这样实现的Q?br />  
    public Authorization createAuthorization(String username, String password)
        throws UnauthorizedException
    {
      if (username == null password == null) {
        throw new UnauthorizedException();
      }
      password = StringUtils.hash(password);
      int userID = 0;
      Connection con = null;
      PreparedStatement pstmt = null;
      try {
        con = DbConnectionManager.getConnection();
        pstmt = con.prepareStatement(AUTHORIZE);
        pstmt.setString(1, username);
        pstmt.setString(2, password);
  
        ResultSet rs = pstmt.executeQuery();
        if (!rs.next()) {
          throw new UnauthorizedException();
        }
        userID = rs.getInt(1);
      }
      catch( SQLException sqle ) {
        System.err.println("Exception in DbAuthorizationFactory:" + sqle);
        sqle.printStackTrace();
        throw new UnauthorizedException();
      }
      finally {
        try { pstmt.close(); }
        catch (Exception e) { e.printStackTrace(); }
        try { con.close();  }
        catch (Exception e) { e.printStackTrace(); }
      }
      return new DbAuthorization(userID);
    }
  
  在这个类中,可以看到抽象cd具体的子cM间的关系Q它们是如何协作的,又是如何划分抽象Ҏ和非抽象Ҏ的,q都是值得注重的地斏V一般的Q抽象方法需要子cL实现Q而抽象类中的非抽象方法应该所有子cL能够׃n的,或者可是说Q是定义在抽象方法之上的较高层的Ҏ。这实是一个抽象工厂的好例子!虽然实现的方法已l和GOF中给出的实现相差较远了,但思想没变Q这儿的实现Q也实是要巧妙的些?br />  
  q有是静态方法的使用Q得这个类看v来有些Singleton的意呟뀂这使得对于AbstractFactory的创建变得简单?br />  
  在AuthorizationFactory中定义的其它ҎQ涉及到具体的如何创建AuthorizationQ都是作为abstractҎ出现Q具体实现留l子cL完成?br />  
  q样Q在需要生成一个Authorization的时候,只需要调用AuthorizationFactory的静态方法getAuthorization可以了Q由子类实现了具体的l节?br />  
  其它的,如同上面讲到的,在创建Forum的时候用的ForumFactoryQ具有同上面一L实现Q这是模式之所以称为模式的所在了?
资料引用:http://www.knowsky.com/365144.html

]]>
题目: IOC 后台机制学习 http://www.tkk7.com/jiabao/archive/2008/08/27/225137.html金家?/dc:creator>金家?/author>Wed, 27 Aug 2008 12:41:00 GMThttp://www.tkk7.com/jiabao/archive/2008/08/27/225137.htmlhttp://www.tkk7.com/jiabao/comments/225137.htmlhttp://www.tkk7.com/jiabao/archive/2008/08/27/225137.html#Feedback0http://www.tkk7.com/jiabao/comments/commentRss/225137.htmlhttp://www.tkk7.com/jiabao/services/trackbacks/225137.html 题目: IOC 后台机制学习
l定:
配置文g config.txt, 文g内容
className = test.JavaBean1
field = username
value = ABC

该文件中的三个g随时可能变化, 唯一不变的是 className 指定的都是一?JavaBean(Z? 我们假定里面已经有一?username 属? 例如:

class JavaBeanxxxx {
    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String uname) {
        this.username = uname;
    }
}

要求: 写一D代? d配置文g config.txt, 然后实现?className 指定?JavaBean cd?注意q个cd是可以修改的, 可配|的), 然后生成一个实?
q把配置文g中field字段指定的g个实例的属性名(q里是username)所对应的D|ؓ ABC(字符?, q且要读出最后设|的?

此题已经?TigerTian 解答出来, Ƣ迎学习, 也感?TigerTian:
package com.gcoresoft.ioc;

import java.io.*;
import java.lang.reflect.*;
import java.util.*;
import java.beans.*;

public class IOCStudy {
    
    
//Load the properties file
    private Properties prop=new Properties();
    
    
public void loadPropFile(String filename)
    {
        
try
        {
            FileInputStream fin
=new FileInputStream(filename);
            prop.load(fin);
            fin.close();
        }
catch(Exception e){
            System.out.println(e.toString());
        }
    }
    
    
private String getValueByName(String Name)
    {
        
return prop.getProperty(Name);
    }
    
    
public static void main(String[] args)
    {
        IOCStudy ioc
=new IOCStudy();
        ioc.loadPropFile(
"E:\\Work\\GetInIOC\\src\\com\\gcoresoft\\ioc\\Config.txt");
        
try
        {
            Class bean
=Class.forName(ioc.getValueByName("className"));
            
try {
                java.beans.BeanInfo info
=java.beans.Introspector.getBeanInfo(bean);
                java.beans.PropertyDescriptor pd[]
=info.getPropertyDescriptors();
                
try {
                    Method mSet
=null,mRead=null;
                    Object obj
=bean.newInstance();
                    
for(int i=0;i<pd.length;i++)
                        
if(pd[i].getName().equalsIgnoreCase(ioc.getValueByName("field")))
                        {
                            mSet
=pd[i].getWriteMethod();
                            mRead
=pd[i].getReadMethod();                            
                        }
                    
try {
                        mSet.invoke(obj, ioc.getValueByName(
"value"));
                        String str
=(String)mRead.invoke(obj, null);
                        System.out.println(str);
                    } 
catch (IllegalArgumentException e) {
                        
// TODO Auto-generated catch block
                        e.printStackTrace();
                    } 
catch (InvocationTargetException e) {
                        
// TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } 
catch (InstantiationException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                } 
catch (IllegalAccessException e) {
                    
// TODO Auto-generated catch block
                    e.printStackTrace();
                }

                
            } 
catch (IntrospectionException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
        }
catch(ClassNotFoundException e){
            System.out.println(e.toString());
        }
        
    }
    
}


]]>
վ֩ģ壺 MM1313޾Ʒþ| һɫþ88ۺ޾Ʒ| þþƷAVӰ| ĻƵ߹ۿ | AVһδ| ѿƵ| ëƬѹۿ| ȫѵһëƬ| ĻƷѾþӰԺ| ŷɫŷ| ѿƷ鶹| Ѹ߹ۿ| ޾Ʒɫ| þһ| ѨƬ߹ۿ| ߹ۿ޵Ӱ| һƵ߹ۿ| ڵֻˬվ| AVһȾþ | ˵Ӱ| ˼˼reѾƷƵ66| ˳ɸ߲| ëƬ߹ۿ| ţţ߾Ʒۿ | 91޾ƷƵ| ëƬaëƬѹۿ| պǧ| ɫƷvrһ| 㽶Ƶ߲| AVƬ߹ۿ| 91ƷƵѹۿ| AVպۺһ | ޺ݺۺϾþ| þþþѿAƬAPP| ѿһ߳ëƬ| Ƶ߹ۿ| ҹƷѹۿ| Ƭ߹ۿƵ| ŷ޸| ˳Ƶ߹ۿƵ| Avһ|