??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲欧洲视频在线观看,亚洲国产一区二区a毛片,亚洲国产精品一区二区成人片国内http://m.tkk7.com/jiabao/zh-cnSun, 11 May 2025 14:51:31 GMTSun, 11 May 2025 14:51:31 GMT60java 数据库缓冲池 使用c3p0http://m.tkk7.com/jiabao/archive/2008/10/23/236102.html金家?/dc:creator>金家?/author>Thu, 23 Oct 2008 02:24:00 GMThttp://m.tkk7.com/jiabao/archive/2008/10/23/236102.htmlhttp://m.tkk7.com/jiabao/comments/236102.htmlhttp://m.tkk7.com/jiabao/archive/2008/10/23/236102.html#Feedback2http://m.tkk7.com/jiabao/comments/commentRss/236102.htmlhttp://m.tkk7.com/jiabao/services/trackbacks/236102.html

c3p0很容易用的开源专业jdbc数据库缓冲池?br />它是sourceforge上的一个开源项目,
目?
http://sourceforge.net/projects/c3p0
他的众多Ҏ(gu)这里就不一一介绍了?br />比较爽的一点就?br />当Connection归还~冲池时Qc3p0?x)很心的关?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://m.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://m.tkk7.com/jiabao/archive/2008/10/23/236098.html</guid><wfw:comment>http://m.tkk7.com/jiabao/comments/236098.html</wfw:comment><comments>http://m.tkk7.com/jiabao/archive/2008/10/23/236098.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jiabao/comments/commentRss/236098.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jiabao/services/trackbacks/236098.html</trackback:ping><description><![CDATA[如题。研I中...以前没有注意q?img height="19" src="http://m.tkk7.com/Emoticons/red_smile.gif" width="19" border="0" /><img src ="http://m.tkk7.com/jiabao/aggbug/236098.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-23 10:10 <a href="http://m.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://m.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://m.tkk7.com/jiabao/archive/2008/10/21/235627.html</guid><wfw:comment>http://m.tkk7.com/jiabao/comments/235627.html</wfw:comment><comments>http://m.tkk7.com/jiabao/archive/2008/10/21/235627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jiabao/comments/commentRss/235627.html</wfw:commentRss><trackback:ping>http://m.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技术,以及(qing)~存技术。虽然说目前大部分论坛应用的都是L框架技术,但说回来Q这些框架也只是对JSP{相x术的一个封装,而了解底部应用及(qing)其原理更Ҏ(gu)让我理解L框架的内部原理机制。不至于让框架把我们变成“傻子”?br /><br /><br />那就开始吧<br />首先Q和某些大虾一L(fng)?fn)惯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://m.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000"><img src="http://m.tkk7.com/images/dot.gif" /><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img align="top" src="http://m.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://m.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://m.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://m.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://m.tkk7.com/images/OutliningIndicators/None.gif" /><img src="http://m.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ƈ讑֮Ҏ(gu)去读取。其中有一定的cd转换?br /></font><br />此时g已经找不到头l了。那q样吧。我们就开始访问我们自己搭建的论坛Q从首页开始,也就是index.jsp面?br />览index.jsp代码Q由上向下理解每一个语句的含义Q整体分体)?br /><br />讑֮面~码Q导入IPLocalizerc(应该是做IP昄的工L(fng)Q;插入INC/const.jsp(q后?x)有分析Q;讑֮stats变量数|通过阅读其他jsp面发现Q此变量的作用主要是在于在首|C用L(fng)态时Q兼q显C当前用户做览的页面:(x)也就是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(h)是例如置帖子,最新帖子等有一些特D标记的数据Q?<br />index.jsp的其他部分就都是大同异了。都是通过一个遍历来展现h相同Ҏ(gu)的数据。;大家需要注意一些关于页面表现的而非java技术的部分Q例如信息层的提C,和一些图片连接?br /><em>通过index.jsp的学?fn),我们大概已经了解了大部分jsp面代码的表现Ş式和含义。当Ӟ一定要注意在这个过E中Q参C递、参数获取的代码部分Q不要遗漏。除了一些我们可以看到的面之外Q上面部分也讲到了一些ƈ不用于显C给用户的页面,q里我们认ؓ(f)它是可执行页面,也就是说它对我们的数据和h做了一些处理,或者说把我们的h转交l了服务器(比如servletQ?br /><br /><strong>预计晚上要研I一下有x据库斚w的存取类JdbcWrapper以及(qing)q接获取和释放、数据查询插入?br />2008.10.22<br /></strong></em>大概昨天写的已经忘的差不多了Q那么我们还是从index.jsp文g开始,前几行没有什么问题,都是一些导入文件的标签Q那么我们从SkinUtil.q个cd手。在查看SkinUtilcM码的时候我们发现里面应用了一些com\bcxy\bbs\util 包中c,其中含有三个工具cR(L(fng)Q看了文件大,应该代码不多Q我们看看里面都是什么)在开始之前我们应了解一下GCookie.javacȝ大概内容和作用。看导入包我们可以大概了解一下此cȝ作用Q对URL的编码与解码Q生和dCookieQ还有就是做一些日志记?log4j)?br />我们仔细阅读后,了解刎ͼ其中有一个重载方法,也就是setCookieҎ(gu)Q根据不同的参数Q可以让我们选择直接赋予变量名和值的Ҏ(gu)Q或者是赋予变量名和值另外加上最大保存时间的Ҏ(gu)。?cM的另一个方法是获取CookieҎ(gu)倹{?br />ParamUtilcM很简单,是取得字W串?取得整数的重载方法,其中的参数决定是否有默认|是否需要{码?br />SysUtilcMҎ(gu)SystemConfigcM的读取方法读取配|文件systemconfig.propertiesQ按照里面的讄Q来判断是否对参数和数据库读取操作中的参数进行编码。其中还有一个方法是取得真实地址Q当然这些都是根据systemconfig.properties文g中配|而定的?br />BBSCconst.javacȝ单的讄了一些常量。作用是讄数据库表名的时候加上systemconfig.properties中设|的前缀?br />回到SkinUtil.javacM乎看h一些刚刚还陌生的类Ҏ(gu)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://m.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Ҏ(gu)Q去设想q个c要实现的功能)Qyi一眼看来,大概都熟(zhn),无非是连接数据库 dQ结果保存,异常Q还有一些类似数l的HashMapq有遍历用得Iterator。想惻I大概是数据层的一些基CRUD操作。但是其中有个类不是很熟(zhn),DatabaseMetaDatac,查看sun公司的在U文,发现q是个接口而且Ҏ(gu)奇多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://m.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序中慢慢体?x)吧。JdbcWrapperq个cL炚wQ不q,大部分方法都有类似的作用Q也是说真正不同功能的代码也只有几分之一而已。我看的都想睡觉了?br /><br /><em><strong>在网吧,因ؓ(f)不便Q先d?br /></strong></em>今天q好Q自己有一台电(sh)脑,可以不限制时间。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://m.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">######q里有一点不明白Qؓ(f)什么要判断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://m.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://m.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://m.tkk7.com/images/OutliningIndicators/InBlock.gif" />     * 当需要事务支持时Q需要设|a(chn)utoClose=falseQ那qC务提交时再关闭数据库q接?br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #008000"><img align="top" src="http://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.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://m.tkk7.com/images/OutliningIndicators/None.gif" /></span></div><p>今天看群里鲤鱼回{内容如下:(x)</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://m.tkk7.com/images/OutliningIndicators/None.gif" /><span style="COLOR: #000000">当需要事务支持时Q需要设|a(chn)utoClose=falseQ那qC务提交时再关闭数据库q接?/span></div><p><br />一时还没有理解开来?br />看过来看q去QJdbcWrappercd我来讲还是有一部分难以理解。烦性不ȝ它,{在下面的代码中出现Ӟ反复查阅应该?x)有更多的收莗?br /></p><img src ="http://m.tkk7.com/jiabao/aggbug/235627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-21 11:47 <a href="http://m.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://m.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://m.tkk7.com/jiabao/archive/2008/10/17/234851.html</guid><wfw:comment>http://m.tkk7.com/jiabao/comments/234851.html</wfw:comment><comments>http://m.tkk7.com/jiabao/archive/2008/10/17/234851.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/jiabao/comments/commentRss/234851.html</wfw:commentRss><trackback:ping>http://m.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="izsbkxw" class="code" bakclassname="code"><font color="#0000ff">.</font></span></td><td><span id="meljamp" class="desc" bakclassname="desc"><u>匚w除换行符以外的Q意字W?/u></span></td></tr><tr><td><span id="wewhodo" class="code" bakclassname="code"><font color="#0000ff">\w</font></span></td><td><span id="htatyrc" class="desc" bakclassname="desc"><u>匚w字母或数字或下划U或汉字</u></span></td></tr><tr><td><span id="pepdvsh" class="code" bakclassname="code"><font color="#0000ff">\s</font></span></td><td><span id="nnyyycv" class="desc" bakclassname="desc"><u>匚wL的空白符</u></span></td></tr><tr><td><span id="lfujqbf" class="code" bakclassname="code"><font color="#0000ff">\d</font></span></td><td><span id="qvkgvkh" class="desc" bakclassname="desc"><u>匚w数字</u></span></td></tr><tr><td><span id="tygewll" class="code" bakclassname="code"><font color="#0000ff">\b</font></span></td><td><span id="jkghlpt" class="desc" bakclassname="desc"><u>匚w单词的开始或l束</u></span></td></tr><tr><td><span id="ugrcaim" class="code" bakclassname="code"><font color="#0000ff">^</font></span></td><td><span id="deordxb" class="desc" bakclassname="desc"><u>匚w字符串的开?/u></span></td></tr><tr><td><span id="wedkkdo" class="code" bakclassname="code"><font color="#0000ff">$</font></span></td><td><span id="ujggnkw" 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="yflhsla" class="code" bakclassname="code"><font color="#0000ff">*</font></span></td><td><span id="bryfqyg" class="desc" bakclassname="desc"><u>重复零次或更多次</u></span></td></tr><tr><td><span id="lpieugo" class="code" bakclassname="code"><font color="#0000ff">+</font></span></td><td><span id="wipalxq" class="desc" bakclassname="desc"><u>重复一ơ或更多?/u></span></td></tr><tr><td><span id="aqmrgrv" class="code" bakclassname="code"><font color="#0000ff">?</font></span></td><td><span id="zlhkkgv" class="desc" bakclassname="desc"><u>重复零次或一?/u></span></td></tr><tr><td><span id="cvgrvdh" class="code" bakclassname="code"><font color="#0000ff">{n}</font></span></td><td><span id="ebxsppi" class="desc" bakclassname="desc"><u>重复n?/u></span></td></tr><tr><td><span id="eayfiqu" class="code" bakclassname="code"><font color="#0000ff">{n,}</font></span></td><td><span id="kdvchll" class="desc" bakclassname="desc"><u>重复nơ或更多?/u></span></td></tr><tr><td><span id="vwwwhpb" class="code" bakclassname="code"><font color="#0000ff">{n,m}</font></span></td><td><span id="jnjfurk" 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会(x)自动拥有一?span class="name" bakclassname="name"><strong>l号</strong></span>Q规则是Q从左向叻I以分l的左括号ؓ(f)标志Q第一个出现的分组的组号ؓ(f)1Q第二个?Q以此类推?/p><p><span id="fgvhjcz" class="name" bakclassname="name"><strong>后向引用</strong></span>用于重复搜烦前面某个分组匚w的文本。例如,<span id="ukyubfy" class="part" bakclassname="part"><font color="#008000">\1</font></span>代表<span id="vwdodsl" class="desc" bakclassname="desc"><u>分组1匚w的文?/u></span>。难以理解?L(fng)CZQ?/p><p><span id="jnuutei" class="regex" bakclassname="regex"><font color="#ff0000">\b(\w+)\b\s+\1\b</font></span>可以用来匚w<span id="lbfuqjn" class="desc" bakclassname="desc"><u>重复的单?/u></span>Q像<span id="shzzvdd" 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="muufqjy" class="desc" bakclassname="desc"><u>单词开始处和结束处之间的多于一个的字母或数?/u></span>(<span id="nccrckl" class="part" bakclassname="part"><font color="#008000">\b(\w+)\b</font></span>)Q这个单词会(x)被捕获到~号?的分l中Q然后是<span id="fcfubxf" class="desc" bakclassname="desc"><u>1个或几个I白W?/u></span>(<span id="rdoxksp" class="part" bakclassname="part"><font color="#008000">\s+</font></span>)Q最后是<span id="swodzkh" class="desc" bakclassname="desc"><u>分组1中捕L(fng)内容Q也是前面匚w的那个单词)</u></span>(<span id="crgkgvd" class="part" bakclassname="part"><font color="#008000">\1</font></span>)?/p><p>你也可以自己指定子表辑ּ?span class="name" bakclassname="name"><strong>l名</strong></span>。要指定一个子表达式的l名Q请使用q样的语法:(x)<span id="wbmiebj" 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="rhswppb" class="part" bakclassname="part"><font color="#008000">\w+</font></span>的组名指定ؓ(f)<span id="sxhwaqy" class="part" bakclassname="part"><font color="#008000">Word</font></span>了。要反向引用q个分组<span id="ktqxxpe" 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(fng)时候,q有很多特定用途的语法。下面列Z最常用的一些:(x)</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="ibbynmf" class="code" bakclassname="code"><font color="#0000ff">(exp)</font></span></td><td><span id="hdkkzzh" class="desc" bakclassname="desc"><u>匚wexp,q捕h本到自动命名的组?/u></span></td></tr><tr><td><span id="rszzvdz" class="code" bakclassname="code"><font color="#0000ff">(?<name>exp)</font></span></td><td><span id="oawpujy" class="desc" bakclassname="desc"><u>匚wexp,q捕h本到名称为name的组里,也可以写??'name'exp)</u></span></td></tr><tr><td><span id="spiaptm" class="code" bakclassname="code"><font color="#0000ff">(?:exp)</font></span></td><td><span id="fruuqjj" class="desc" bakclassname="desc"><u>匚wexp,不捕获匹配的文本Q也不给此分l分配组?/u></span></td></tr><tr><th rowspan="4">零宽断言</th><td><span id="mvfmeix" class="code" bakclassname="code"><font color="#0000ff">(?=exp)</font></span></td><td><span id="lffnyrv" class="desc" bakclassname="desc"><u>匚wexp前面的位|?/u></span></td></tr><tr><td><span id="zbqbixf" class="code" bakclassname="code"><font color="#0000ff">(?<=exp)</font></span></td><td><span id="gzkvoww" class="desc" bakclassname="desc"><u>匚wexp后面的位|?/u></span></td></tr><tr><td><span id="ygrryrr" class="code" bakclassname="code"><font color="#0000ff">(?!exp)</font></span></td><td><span id="axqquny" class="desc" bakclassname="desc"><u>匚w后面跟的不是exp的位|?/u></span></td></tr><tr><td><span id="nhtgucg" class="code" bakclassname="code"><font color="#0000ff">(?<!exp)</font></span></td><td><span id="eiasdsa" class="desc" bakclassname="desc"><u>匚w前面不是exp的位|?/u></span></td></tr><tr><th>注释</th><td><span id="ptsiwhh" class="code" bakclassname="code"><font color="#0000ff">(?#comment)</font></span></td><td><span id="hxpahhl" class="desc" bakclassname="desc"><u>q种cd的分l不Ҏ(gu)则表辑ּ的处理生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="kdvalbu" class="code" bakclassname="code"><font color="#0000ff">*?</font></span></td><td><span id="rowhamy" class="desc" bakclassname="desc"><u>重复Lơ,但尽可能重?/u></span></td></tr><tr><td><span id="mjyuynn" class="code" bakclassname="code"><font color="#0000ff">+?</font></span></td><td><span id="zshxolt" class="desc" bakclassname="desc"><u>重复1ơ或更多ơ,但尽可能重?/u></span></td></tr><tr><td><span id="nufbxfx" class="code" bakclassname="code"><font color="#0000ff">??</font></span></td><td><span id="nkvdsss" class="desc" bakclassname="desc"><u>重复0ơ或1ơ,但尽可能重?/u></span></td></tr><tr><td><span id="czddopi" class="code" bakclassname="code"><font color="#0000ff">{n,m}?</font></span></td><td><span id="axvwhsi" class="desc" bakclassname="desc"><u>重复n到mơ,但尽可能重?/u></span></td></tr><tr><td><span id="pbxawlt" class="code" bakclassname="code"><font color="#0000ff">{n,}?</font></span></td><td><span id="irwipxx" 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="aqufngg" 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="gkkqcaq" class="code" bakclassname="code"><font color="#0000ff">$</font></span>的精含意是:匚w\n之前的位|以?qing)字W串l束前的位置.) </td></tr><tr><td>Singleline(单行模式)</td><td>更改<span id="ixeawle" class="code" bakclassname="code"><font color="#0000ff">.</font></span>的含义,使它与每一个字W匹配(包括换行W\nQ?</td></tr><tr><td>IgnorePatternWhitespace(忽略I白)</td><td>忽略表达式中的非转义I白q启用由<span id="inovngk" 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里的行ؓ(f)一致?/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="mbmiwtb" class="code" bakclassname="code"><font color="#0000ff">\a</font></span></td><td><span id="dslapmn" class="desc" bakclassname="desc"><u>报警字符(打印它的效果是电(sh)脑嘀一?</u></span></td></tr><tr><td><span id="rswlaii" class="code" bakclassname="code"><font color="#0000ff">\b</font></span></td><td><span id="brcgzok" class="desc" bakclassname="desc"><u>通常是单词分界位|,但如果在字符c里使用代表退?/u></span></td></tr><tr><td><span id="yovkvdl" class="code" bakclassname="code"><font color="#0000ff">\t</font></span></td><td><span id="zvcqmxx" class="desc" bakclassname="desc"><u>制表W,Tab</u></span></td></tr><tr><td><span id="mobmbuj" class="code" bakclassname="code"><font color="#0000ff">\r</font></span></td><td><span id="pbxltoh" class="desc" bakclassname="desc"><u>回R</u></span></td></tr><tr><td><span id="osrrnkv" class="code" bakclassname="code"><font color="#0000ff">\v</font></span></td><td><span id="joozdem" class="desc" bakclassname="desc"><u>竖向制表W?/u></span></td></tr><tr><td><span id="efqitxm" class="code" bakclassname="code"><font color="#0000ff">\f</font></span></td><td><span id="qvkrczd" class="desc" bakclassname="desc"><u>换页W?/u></span></td></tr><tr><td><span id="dttipap" class="code" bakclassname="code"><font color="#0000ff">\n</font></span></td><td><span id="ebfufuc" class="desc" bakclassname="desc"><u>换行W?/u></span></td></tr><tr><td><span id="lwahhhs" class="code" bakclassname="code"><font color="#0000ff">\e</font></span></td><td><span id="eueeeim" class="desc" bakclassname="desc"><u>Escape</u></span></td></tr><tr><td><span id="wpybeeq" class="code" bakclassname="code"><font color="#0000ff">\0nn</font></span></td><td><span id="pmtawwl" class="desc" bakclassname="desc"><u>ASCII代码中八q制代码为nn的字W?/u></span></td></tr><tr><td><span id="jgyonrr" class="code" bakclassname="code"><font color="#0000ff">\xnn</font></span></td><td><span id="vznuquc" class="desc" bakclassname="desc"><u>ASCII代码中十六进制代码ؓ(f)nn的字W?/u></span></td></tr><tr><td><span id="yzokgow" class="code" bakclassname="code"><font color="#0000ff">\unnnn</font></span></td><td><span id="vddhdhs" class="desc" bakclassname="desc"><u>Unicode代码中十六进制代码ؓ(f)nnnn的字W?/u></span></td></tr><tr><td><span id="qyeaamm" class="code" bakclassname="code"><font color="#0000ff">\cN</font></span></td><td><span id="abbbxqu" class="desc" bakclassname="desc"><u>ASCII控制字符。比如\cC代表Ctrl+C</u></span></td></tr><tr><td><span id="wixmmqn" class="code" bakclassname="code"><font color="#0000ff">\A</font></span></td><td><span id="dtetemm" class="desc" bakclassname="desc"><u>字符串开?cM^Q但不受处理多行选项的媄?</u></span></td></tr><tr><td><span id="ashkkoz" class="code" bakclassname="code"><font color="#0000ff">\Z</font></span></td><td><span id="wmmvdal" class="desc" bakclassname="desc"><u>字符串结或行尾(不受处理多行选项的媄?</u></span></td></tr><tr><td><span id="amqmmjc" class="code" bakclassname="code"><font color="#0000ff">\z</font></span></td><td><span id="khowfze" class="desc" bakclassname="desc"><u>字符串结?cM$Q但不受处理多行选项的媄?</u></span></td></tr><tr><td><span id="futtpim" class="code" bakclassname="code"><font color="#0000ff">\G</font></span></td><td><span id="imxrcoo" class="desc" bakclassname="desc"><u>当前搜烦的开?/u></span></td></tr><tr><td><span id="tumpaib" class="code" bakclassname="code"><font color="#0000ff">\p{name}</font></span></td><td><span id="dhkggvz" class="desc" bakclassname="desc"><u>Unicode中命名ؓ(f)name的字W类Q例如\p{IsGreek}</u></span></td></tr><tr><td><span id="qynjqyg" class="code" bakclassname="code"><font color="#0000ff">(?>exp)</font></span></td><td><span id="ntibucs" class="desc" bakclassname="desc"><u>贪婪子表辑ּ</u></span></td></tr><tr><td><span id="xjxvvhl" class="code" bakclassname="code"><font color="#0000ff">(?<x>-<y>exp)</font></span></td><td><span id="qjynjnr" class="desc" bakclassname="desc"><u>ql?/u></span></td></tr><tr><td><span id="rgibqgh" class="code" bakclassname="code"><font color="#0000ff">(?im-nsx:exp)</font></span></td><td><span id="qjumlti" class="desc" bakclassname="desc"><u>在子表达式exp中改变处理选项</u></span></td></tr><tr><td><span id="ysddosh" class="code" bakclassname="code"><font color="#0000ff">(?im-nsx)</font></span></td><td><span id="immxmuq" class="desc" bakclassname="desc"><u>辑ּ后面的部分改变处理选项</u></span></td></tr><tr><td><span id="gornrrk" class="code" bakclassname="code"><font color="#0000ff">(?(exp)yes|no)</font></span></td><td><span id="dhdzgkh" class="desc" bakclassname="desc"><u>把exp当作零宽正向先行断言Q如果在q个位置能匹配,使用yes作ؓ(f)此组的表辑ּQ否则用no</u></span></td></tr><tr><td><span id="pbcrngh" class="code" bakclassname="code"><font color="#0000ff">(?(exp)yes)</font></span></td><td><span id="rwwlwpx" class="desc" bakclassname="desc"><u>同上Q只是用空表达式作为no</u></span></td></tr><tr><td><span id="enlncvd" class="code" bakclassname="code"><font color="#0000ff">(?(name)yes|no)</font></span></td><td><span id="yrnkrss" class="desc" bakclassname="desc"><u>如果命名为name的组捕获C内容Q用yes作ؓ(f)表达式;否则使用no</u></span></td></tr><tr><td><span id="otaiifu" class="code" bakclassname="code"><font color="#0000ff">(?(name)yes)</font></span></td><td><span id="kllpmyv" class="desc" bakclassname="desc"><u>同上Q只是用空表达式作为no</u></span></td></tr></tbody></table><img src ="http://m.tkk7.com/jiabao/aggbug/234851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-17 11:10 <a href="http://m.tkk7.com/jiabao/archive/2008/10/17/234851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene倒排索引原理(? http://m.tkk7.com/jiabao/archive/2008/10/17/234822.html金家?/dc:creator>金家?/author>Fri, 17 Oct 2008 01:43:00 GMThttp://m.tkk7.com/jiabao/archive/2008/10/17/234822.htmlhttp://m.tkk7.com/jiabao/comments/234822.htmlhttp://m.tkk7.com/jiabao/archive/2008/10/17/234822.html#Feedback1http://m.tkk7.com/jiabao/comments/commentRss/234822.htmlhttp://m.tkk7.com/jiabao/services/trackbacks/234822.html
0Q设有两文??
文章1的内容ؓ(f)QTom lives in Guangzhou,I live in Guangzhou too.
文章2的内容ؓ(f)QHe once lived in Shanghai.

1)׃lucene是基于关键词索引和查询的Q首先我们要取得q两文章的关键词,通常我们需要如下处理措?br />a.我们现在有的是文章内容,即一个字W串Q我们先要找出字W串中的所有单词,卛_词。英文单词由于用I格分隔Q比较好处理。中文单词间是连在一L(fng)需要特D的分词处理?br />b.文章中的”in? “once” “too”等词没有什么实际意义,中文中的“的”“是”等字通常也无具体含义Q这些不代表概念的词可以qo(h)?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的所有关键词为:(x)[tom] [live] [guangzhou] [i] [live] [guangzhou]
    文章2的所有关键词为:(x)[he] [live] [shanghai]

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

通常仅知道关键词在哪些文章中出现q不够,我们q需要知道关键词在文章中出现ơ数和出现的位置Q通常有两U位|:(x)a)字符位置Q即记录该词是文章中W几个字W(优点是关键词亮显时定位快Q;b)关键词位|,卌录该词是文章中第几个关键词(优点是节U烦引空间、词l(phaseQ查询快Q,lucene中记录的是q种位置?br />
加上“出现频率”和“出C|”信息后Q我们的索引l构变ؓ(f)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?wi)结构)Q因此lucene可以用二元搜索算法快速定位关键词?br />    
实现时 lucene上面三列分别作典文ӞTerm DictionaryQ、频率文?frequencies)、位|文?(positions)保存。其中词典文件不仅保存有每个关键词,q保留了指向频率文g和位|文件的指针Q通过指针可以扑ֈ该关键字的频率信息和位置信息?br />
    Lucene中用了field的概念,用于表达信息所在位|(如标题中Q文章中Qurl中)Q在建烦引中Q该field信息也记录在词典文g中,每个关键词都有一个field信息(因ؓ(f)每个关键字一定属于一个或多个field)?br />
     Z减小索引文g的大,Lucene对烦引还使用了压~技术。首先,对词典文件中的关键词q行了压~,关键词压~ؓ(f)<前缀长度Q后~>Q例如:(x)当前词ؓ(f)“阿拉伯语”,上一个词为“阿拉伯”,那么“阿拉伯语”压~ؓ(f)<3Q语>。其ơ大量用到的是对数字的压~,数字只保存与上一个值的差|q样可以减小数字的长度,q而减保存该数字需要的字节敎ͼ。例如当前文章号?6389Q不压羃要用3个字节保存)Q上一文章h16382Q压~后保存7Q只用一个字节)?br />    
    下面我们可以通过对该索引的查询来解释一下ؓ(f)什么要建立索引?br />假设要查询单词 “live”,lucene先对词典二元查找、找到该词,通过指向频率文g的指针读出所有文章号Q然后返回结果。词兔R常非常,因而,整个q程的时间是毫秒U的?br />而用普通的序匚w法Q不建烦引,而是Ҏ(gu)有文章的内容q行字符串匹配,q个q程会(x)相当~慢Q当文章数目很大Ӟ旉往往是无法忍受的?


]]>
struts2标签http://m.tkk7.com/jiabao/archive/2008/10/13/234029.html金家?/dc:creator>金家?/author>Mon, 13 Oct 2008 07:46:00 GMThttp://m.tkk7.com/jiabao/archive/2008/10/13/234029.htmlhttp://m.tkk7.com/jiabao/comments/234029.htmlhttp://m.tkk7.com/jiabao/archive/2008/10/13/234029.html#Feedback1http://m.tkk7.com/jiabao/comments/commentRss/234029.htmlhttp://m.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的具体标{:(x)
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军_标志里内Ҏ(gu)否显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里有点技巧:(x)
            本来可以?parameters.name[0]来获得,h中name的倹{但是,在我实现include例子Ӟ
            无论我用param标志lname赋Q何|#parameters里面不会(x)含有M|所?parameters.name也ؓ(f)I倹{?
            
            其原因ؓ(f)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的实例将?x)压入每个遍历的堆栈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://m.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://m.tkk7.com/jiabao/archive/2008/10/09/233317.html</guid><wfw:comment>http://m.tkk7.com/jiabao/comments/233317.html</wfw:comment><comments>http://m.tkk7.com/jiabao/archive/2008/10/09/233317.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jiabao/comments/commentRss/233317.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jiabao/services/trackbacks/233317.html</trackback:ping><description><![CDATA[     摘要: EJB 斚w   94 ? EJB2.0 ...  <a href='http://m.tkk7.com/jiabao/archive/2008/10/09/233317.html'>阅读全文</a><img src ="http://m.tkk7.com/jiabao/aggbug/233317.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jiabao/" target="_blank">金家?/a> 2008-10-09 11:56 <a href="http://m.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://m.tkk7.com/jiabao/archive/2008/09/21/230219.html金家?/dc:creator>金家?/author>Sun, 21 Sep 2008 00:52:00 GMThttp://m.tkk7.com/jiabao/archive/2008/09/21/230219.htmlhttp://m.tkk7.com/jiabao/comments/230219.htmlhttp://m.tkk7.com/jiabao/archive/2008/09/21/230219.html#Feedback1http://m.tkk7.com/jiabao/comments/commentRss/230219.htmlhttp://m.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的位|,一般这个文件会(x)在你的系l文件中扑ֈ? 
  Tcl则一般会(x)在python文g架的dlls子文件架中找刎ͼ一般名UCؓ(f)tclxx.dllQ在你大概就是tcl84.dll。如果是安装python2.3版本的话Q会(x)自动扑ֈQ不需要设|?br />
讄好了QW(xu)inCVS输出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://m.tkk7.com/jiabao/archive/2008/09/16/229191.html金家?/dc:creator>金家?/author>Tue, 16 Sep 2008 07:57:00 GMThttp://m.tkk7.com/jiabao/archive/2008/09/16/229191.htmlhttp://m.tkk7.com/jiabao/comments/229191.htmlhttp://m.tkk7.com/jiabao/archive/2008/09/16/229191.html#Feedback0http://m.tkk7.com/jiabao/comments/commentRss/229191.htmlhttp://m.tkk7.com/jiabao/services/trackbacks/229191.html  AbstractFactory模式和可扩展?br />  假如要实现较好的可扩展性,AbstractFactory模式实是一件利器。如上面所_(d)假如要创建的Forum接口的不同实玎ͼ而又不想更改代码的话Q就需要用到抽象工厂了。再Jive中,AuthorizationFactorycL一个抽象类Q用来创建Authorization对象。这是一个抽象工厂,可以通过不同的子cL创徏不同的Authorization对象。这个工厂的实现Ҏ(gu)是:(x)
  
  在AuthorizationFactory中用一个private static变量factoryQ用来引用具体的抽象工厂的实例:(x)
  private static AuthorizationFactory factory = null;
  
  用一个private static的StringQ来指明具体的抽象工厂的子类cdQ?br />  private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";
  
  然后是用一个private static的loadAuthorizationFactoryҎ(gu)来给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Ҏ(gu)q回一个Authorization的过E中Q先初始化工厂类factory变量Q然后用factory的createAuthorizationҎ(gu)来创建:(x)
  
    public static Authorization getAuthorization(String username,
        String passWord) throws UnauthorizedException
    {
      loadAuthorizationFactory();
      return factory.createAuthorization(username, password);
  }
  
  不同的子cL不同的createAuthorizationҎ(gu)的实现。比如在DbAuthorizationFactoryq个AuthorizationFactory的数据库实现子类中,createAuthorizationҎ(gu)是这样实现的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它们是如何协作的,又是如何划分抽象Ҏ(gu)和非抽象Ҏ(gu)的,q都是值得注重的地斏V一般的Q抽象方法需要子cL实现Q而抽象类中的非抽象方法应该所有子cL能够׃n的,或者可是说Q是定义在抽象方法之上的较高层的Ҏ(gu)。这实是一个抽象工厂的好例子!虽然实现的方法已l和GOF中给出的实现相差较远了,但思想没变Q这儿的实现Q也实是要巧妙的些?br />  
  q有是静态方法的使用Q得这个类看v来有些Singleton的意呟뀂这使得对于AbstractFactory的创建变得简单?br />  
  在AuthorizationFactory中定义的其它Ҏ(gu)Q涉?qing)到具体的如何创建AuthorizationQ都是作为abstractҎ(gu)出现Q具体实现留l子cL完成?br />  
  q样Q在需要生成一个Authorization的时候,只需要调用AuthorizationFactory的静态方法getAuthorization可以了Q由子类实现了具体的l节?br />  
  其它的,如同上面讲到的,在创建Forum的时候用的ForumFactoryQ具有同上面一L(fng)实现Q这是模式之所以称为模式的所在了?
资料引用:http://www.knowsky.com/365144.html

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

该文件中的三个g(x)随时可能变化, 唯一不变的是 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|ؓ(f) ABC(字符?, q且要读出最后设|的?

此题已经?TigerTian 解答出来, Ƣ迎学习(fn), 也感?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());
        }
        
    }
    
}


]]>
վ֩ģ壺 鵺̳ƷƵվ| վɫƬѸ| þþžAVѾƷ| һëƬѿa| һaƬɫëƬվ| Ƶ| ޾ƷӰԺ| ɫ͵͵| ޹˸߹ۿ| ޳˻ɫ߹ۿ| ɫһ| þù| av| ޹ƷŮþþþ| Ѹ69ʽƵ߹ۿ| ҹƷһƵ| һѹۿwwwƵ| ĻӰƵۿ| Vþþ| ޹Ƭ߹ۿ| ŮƵƵaѹۿ| þûɫվ| Ů18ëƬˮѲ| ˾þô߽ۺͼƬ| ޾Ʒ鶹ר| ѲŮһëƬ| 16Ůڵ| ߻ɫַ| 쾫Ʒ߹ۿ| һػɫƬ| þþþþþƷο| Ѹ߲| ޹V߹ۿ| ޳ۺӰԺԺ| ĻӰ߾Ʒ| Ʒ鶹ѹۿ| պߵһҳ| www77777| þù׾Ʒһ| mm1313޹ƷŮ| ޵Ӱѹۿ|