﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-学习--共同努力</title><link>http://www.blogjava.net/rendong/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 18 Jun 2026 23:45:44 GMT</lastBuildDate><pubDate>Thu, 18 Jun 2026 23:45:44 GMT</pubDate><ttl>60</ttl><item><title>linux 下tomcat6的开机自动启动脚本</title><link>http://www.blogjava.net/rendong/archive/2010/04/30/319806.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Fri, 30 Apr 2010 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2010/04/30/319806.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/319806.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2010/04/30/319806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/319806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/319806.html</trackback:ping><description><![CDATA[ http://www.blogjava.net/aoxj/archive/2010/04/10/317953.html
<img src ="http://www.blogjava.net/rendong/aggbug/319806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2010-04-30 15:27 <a href="http://www.blogjava.net/rendong/archive/2010/04/30/319806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP/Servlet/JSF:标签库的深入研究 （转http://www.blogjava.net/liuwentao253/archive/2006/11/17/81776.html）</title><link>http://www.blogjava.net/rendong/archive/2006/12/27/90329.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Wed, 27 Dec 2006 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/27/90329.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/90329.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/27/90329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/90329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/90329.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 返回值                                意义SKIP_BODY                         表示不用处理标签体，直接调用doEndTag()方法。SKIP_PAGE                          忽略标签后面的JSP内容。EVAL_PAGE                         处理标签后，继续处理JSP后面的内容。 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/rendong/archive/2006/12/27/90329.html'>阅读全文</a><img src ="http://www.blogjava.net/rendong/aggbug/90329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-27 16:44 <a href="http://www.blogjava.net/rendong/archive/2006/12/27/90329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 中的悲观锁和乐观锁的实现 (转http://www.blogjava.net/liuwentao253/archive/2006/06/20/53934.html)</title><link>http://www.blogjava.net/rendong/archive/2006/12/27/90326.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Wed, 27 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/27/90326.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/90326.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/27/90326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/90326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/90326.html</trackback:ping><description><![CDATA[
		<p>锁（locking） <br />业务逻辑的实现过程中，往往需要保证数据访问的排他性。如在金融系统的日终结算 处理中，我们希望针对某个cut-off时间点的数据进行处理，而不希望在结算进行过程中 （可能是几秒种，也可能是几个小时），数据再发生变化。此时，我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改，这样的机制，在这里，也就是所谓 的“锁”，即<font color="#0000ff"><strong>给我们选定的目标数据上锁，使其无法被其他程序修改</strong></font>。 Hibernate支持两种锁机制：即通常所说的“悲观锁（Pessimistic Locking）” 和“乐观锁（Optimistic Locking）”。</p>
		<p>
				<br />一 ：<font color="#0000ff"><strong>悲观锁</strong></font>（<u>Pessimistic</u> Locking） <br />悲观锁，正如其名，它指的是对数据被外界（包括本系统当前的其他事务，以及来自外部系统的事务处理）修改持保守态度，因此，在整个数据处理过程中，将数据处于锁定 状态。悲观锁的实现，往往依靠数据库提供的锁机制（<font color="#ff0000"><strong><u>也只有数据库层提供的锁机制才能 真正保证数据访问的排他性</u></strong></font>，否则，即使在本系统中实现了加锁机制，也无法保证外部系 统不会修改数据）。 一个典型的倚赖数据库的悲观锁调用： <u>select * from account where name=”Erica” for update 这条sql 语句锁定了account 表中所有符合检索条件（name=”Erica”）的记录。 本次事务提交之前（事务提交时会释放事务过程中的锁），外界无法修改这些记录</u>。 Hibernate的悲观锁，也是基于数据库的锁机制实现。 下面的代码实现了对查询记录的加锁：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">String hqlStr </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">from TUser as user where user.name=’Erica’</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">; <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Query query </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session.createQuery(hqlStr); <br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />query.setLockMode(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">user</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,LockMode.UPGRADE); </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">加锁 </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">List userList </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> query.list();</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">执行查询，</span>
		</div>
		<p>获取数据 <u>query.setLockMode</u> 对查询语句中特定别名所对应的记录进行加锁（我们为 TUser类指定了一个别名“user”），这里也就是对返回的所有user记录进行加锁。 观察运行期Hibernate生成的SQL语句： </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex from t_user tuser0_ where (tuser0_.name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">’Erica’ ) </span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000"> update</span>
		</div>
		<p> 这里Hibernate通过使用数据库的for update子句实现了<font color="#0000ff"><strong>悲观锁</strong></font>机制。 Hibernate的加锁模式有： <br />? LockMode.NONE ： 无锁机制。 <br />? LockMode.WRITE ：Hibernate在Insert和Update记录的时候会自动 获取。 <br />? LockMode.READ ： Hibernate在读取记录的时候会自动获取。 <br /><br />以上这三种锁机制一般由Hibernate内部使用，如Hibernate为了保证Update 过程中对象不会被外界修改，会在save方法实现中自动为目标对象加上WRITE锁。<br /> <br />? LockMode.UPGRADE ：<font color="#0000ff"><strong>利用数据库的for update子句加锁</strong></font>。 <br />? LockMode. UPGRADE_NOWAIT ：Oracle的特定实现，<font color="#0000ff"><strong>利用Oracle的for update nowait子句实现加锁</strong></font>。 <br /><br />上面这两种锁机制是我们在应用层较为常用的，加锁一般通过以下方法实现： <br />Criteria.setLockMode <br />Query.setLockMode <br />Session.lock <br />注意，只有在查询开始之前（也就是Hiberate 生成SQL 之前）设定加锁，才会 真正通过数据库的锁机制进行加锁处理，否则，数据已经通过不包含for update 子句的Select SQL加载进来，所谓数据库加锁也就无从谈起。 </p>
		<p>
				<br />二 ：乐观锁（Optimistic Locking） <br />相对悲观锁而言，乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依 靠数据库的锁机制实现，以保证操作最大程度的独占性。但随之而来的就是数据库 性能的大量开销，特别是对长事务而言，这样的开销往往无法承受。 如一个金融系统，当某个操作员读取用户的数据，并在读出的用户数据的基础上进 行修改时（如更改用户帐户余额），如果采用悲观锁机制，也就意味着整个操作过 程中（从操作员读出数据、开始修改直至提交修改结果的全过程，甚至还包括操作 员中途去煮咖啡的时间），数据库记录始终处于加锁状态，可以想见，如果面对几 百上千个并发，这样的情况将导致怎样的后果。 乐观锁机制在一定程度上解决了这个问题。<font color="#ff0000"><strong>乐观锁 大多是基于数据版本 （Version）记录机制实现</strong></font>。何谓数据版本？即为数据增加一个版本标识，在基于 数据库表的版本解决方案中，一般是通过为数据库表增加一个“version”字段来 实现。 读取出数据时，将此版本号一同读出，之后更新时，对此版本号加一。此时，将提 交数据的版本数据与数据库表对应记录的当前版本信息进行比对，如果提交的数据 版本号大于数据库表当前版本号，则予以更新，否则认为是过期数据。 对于上面修改用户帐户信息的例子而言，假设 ：<br /><br />数据库中帐户信息表中有一个 version字段，当前值为1；而当前帐户余额字段（balance）为$100。 <br />1 ：操作员A 此时将其读出（version=1），并从其帐户余额中扣除$50 （$100-$50）。 <br />2 ： 在操作员A操作的过程中，操作员B也读入此用户信息（version=1），并 从其帐户余额中扣除$20（$100-$20）。 <br />3： 操作员A完成了修改工作，将数据版本号加一（version=2），连同帐户扣 除后余额（balance=$50），提交至数据库更新，此时由于提交数据版本大 于数据库记录当前版本，数据被更新，数据库记录version更新为2。 <br />4： 操作员B完成了操作，也将版本号加一（version=2）试图向数据库提交数 据（balance=$80），但此时比对数据库记录版本时发现，操作员B提交的 数据版本号为2，数据库记录当前版本也为2，不满足“提交版本必须大于记 录当前版本才能执行更新“的乐观锁策略，因此，操作员B 的提交被驳回。 这样，就避免了操作员B 用基于version=1 的旧数据修改的结果覆盖操作 员A的操作结果的可能。 <br /><br />从上面的例子可以看出，乐观锁机制避免了长事务中的数据库加锁开销（操作员A 和操作员B操作过程中，都没有对数据库数据加锁），大大提升了大并发量下的系 统整体性能表现。 需要注意的是，乐观锁机制往往基于系统中的数据存储逻辑，因此也具备一定的局 限性，如在上例中，由于乐观锁机制是在我们的系统中实现，来自外部系统的用户 余额更新操作不受我们系统的控制，因此可能会造成脏数据被更新到数据库中。在 系统设计阶段，我们应该充分考虑到这些情况出现的可能性，并进行相应调整（如 将乐观锁策略在数据库存储过程中实现，对外只开放基于此存储过程的数据更新途 径，而不是将数据库表直接对外公开）。 <font color="#0000ff"><strong>Hibernate 在其数据访问引擎中内置了乐观锁实现</strong></font>。如果不用考虑外部系统对数 据库的更新操作，利用Hibernate提供的透明化乐观锁实现，将大大提升我们的 生产力。 Hibernate中可以通过class描述符的optimistic-lock属性结合version 描述符指定。 <br />现在，我们为之前示例中的TUser加上乐观锁机制。<br /> <br />1． 首先为TUser的class描述符添加optimistic-lock属性：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">hibernate</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">org.hibernate.sample.TUser</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />table</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">t_user</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dynamic</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">update</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dynamic</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">insert</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />optimistic</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">lock</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">version</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />…… <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">hibernate</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>optimistic-lock属性有如下可选取值： <br />? none 无乐观锁 <br />? version 通过版本机制实现乐观锁 <br />? dirty 通过检查发生变动过的属性实现乐观锁 <br />? all 通过检查所有属性实现乐观锁 <br /><br />其中<font color="#0000ff"><strong>通过version实现的乐观锁机制是Hibernate官方推荐的乐观锁实现</strong></font>，同时也 是Hibernate中，<u>目前唯一在数据对象脱离Session发生修改的情况下依然有效的锁机 制</u>。因此，一般情况下，我们都选择version方式作为Hibernate乐观锁实现机制。 <br /><br />2． 添加一个Version属性描述符 <br />代码内容<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">hibernate</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">org.hibernate.sample.TUser</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />table</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">t_user</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dynamic</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">update</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dynamic</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">insert</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />optimistic</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">lock</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">version</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">id  <br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">id</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />column</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">id</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />type</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">java.lang.Integer</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">generator </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">native</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">generator</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">id</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">17</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">version  <br /></span>
				<span style="COLOR: #008080">18</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />column</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">version</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">19</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">version</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">20</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />type</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">java.lang.Integer</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">21</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">22</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />……  <br /></span>
				<span style="COLOR: #008080">23</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">24</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">hibernate</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">mapping</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">  <br /></span>
				<span style="COLOR: #008080">25</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>注意version 节点必须出现在ID 节点之后。 这里我们声明了一个version属性，用于存放用户的版本信息，保存在TUser表的 version字段中。 此时如果我们尝试编写一段代码，更新TUser表中记录数据，如： <br />代码内容</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Criteria criteria </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session.createCriteria(TUser.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />criteria.add(Expression.eq(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Erica</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));  <br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />List userList </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> criteria.list();  <br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TUser user </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(TUser)userList.get(</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Transaction tx </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session.beginTransaction();  <br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />user.setUserType(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">); </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">更新UserType字段  </span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #008000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">tx.commit();  <br /></span>
				<span style="COLOR: #008080">8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>每次对TUser进行更新的时候，我们可以发现，数据库中的version都在递增。 而如果我们尝试在tx.commit 之前，启动另外一个Session，对名为Erica 的用 户进行操作，以模拟并发更新时的情形： <br />代码内容</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Session session</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> getSession();  <br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Criteria criteria </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session.createCriteria(TUser.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />criteria.add(Expression.eq(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Erica</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));  <br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Session session2 </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> getSession();  <br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Criteria criteria2 </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session2.createCriteria(TUser.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />criteria2.add(Expression.eq(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Erica</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">));  <br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />List userList </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> criteria.list();  <br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />List userList2 </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> criteria2.list();TUser user </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(TUser)userList.get(</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />TUser user2 </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">(TUser)userList2.get(</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Transaction tx </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session.beginTransaction();  <br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Transaction tx2 </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> session2.beginTransaction();  <br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />user2.setUserType(</span>
				<span style="COLOR: #000000">99</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080">13</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />tx2.commit();  <br /></span>
				<span style="COLOR: #008080">14</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />user.setUserType(</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">);  <br /></span>
				<span style="COLOR: #008080">15</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />tx.commit();  <br /></span>
				<span style="COLOR: #008080">16</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>执行以上代码，代码将在tx.commit()处抛出<font color="#0000ff"><strong>StaleObjectStateException</strong></font>异 常，并指出版本检查失败，当前事务正在试图提交一个过期数据。通过捕捉这个异常，我 们就可以在乐观锁校验失败时进行相应处理。 <br /></p>
<img src ="http://www.blogjava.net/rendong/aggbug/90326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-27 16:40 <a href="http://www.blogjava.net/rendong/archive/2006/12/27/90326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lucene实例</title><link>http://www.blogjava.net/rendong/archive/2006/12/25/89849.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Mon, 25 Dec 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/25/89849.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/89849.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/25/89849.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/89849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/89849.html</trackback:ping><description><![CDATA[
		<p>说明一下,这一篇文章的用到的lucene,是用2.0版本的,主要在查询的时候2.0版本的lucene与以前的版本有了一些区别. <br />其实这一些代码都是早几个月写的,自己很懒,所以到今天才写到自己的博客上,高深的文章自己写不了，只能记录下一些简单的记录与点滴，其中的代码算是自娱自乐的，希望高手不要把重构之类的砸下来...</p>
		<p>1、在windows系统下的的C盘，建一个名叫s的文件夹,在该文件夹里面随便建三个txt文件，随便起名啦，就叫"1.txt","2.txt"和"3.txt"啦 <br />其中1.txt的内容如下： <br /></p>
		<div class="code_title">代码</div>
		<div class="code_div">
				<div class="dp-highlighter">
						<div class="bar">
						</div>
						<ol class="dp-j">
								<li class="alt">
										<span>
												<span>中华人民共和国   </span>
										</span>
								</li>
								<li class="">
										<span>全国人民   </span>
								</li>
								<li class="alt">
										<span>
										</span>
										<span class="number">2006</span>
										<span>年  </span>
								</li>
						</ol>
				</div>
		</div>
		<script><![CDATA[ender_code();]]&gt;</script>
		<br />而"2.txt"和"3.txt"的内容也可以随便写几写，这里懒写，就复制一个和1.txt文件的内容一样吧 
<p></p><p>2、下载lucene包，放在classpath路径中 <br />建立索引: <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> lighter.javaeye.com;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> java.io.BufferedReader;   </span></li><li class=""><span></span><span class="keyword">import</span><span> java.io.File;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> java.io.FileInputStream;   </span></li><li class=""><span></span><span class="keyword">import</span><span> java.io.IOException;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> java.io.InputStreamReader;   </span></li><li class=""><span></span><span class="keyword">import</span><span> java.util.Date;   </span></li><li class="alt"><span>  </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.Analyzer;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.standard.StandardAnalyzer;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.document.Document;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.document.Field;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.index.IndexWriter;   </span></li><li class="alt"><span>  </span></li><li class=""><span></span><span class="comment">/** </span> </li><li class="alt"><span><span class="comment"> * author lighter date 2006-8-7 </span> </span></li><li class=""><span><span class="comment"> */</span><span>  </span></span></li><li class="alt"><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> TextFileIndexer {   </span></li><li class=""><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) </span><span class="keyword">throws</span><span> Exception {   </span></li><li class="alt"><span>        </span><span class="comment">/* 指明要索引文件夹的位置,这里是C盘的S文件夹下 */</span><span>  </span></li><li class=""><span>        File fileDir = </span><span class="keyword">new</span><span> File(</span><span class="string">"c:\\s"</span><span>);   </span></li><li class="alt"><span>  </span></li><li class=""><span>        </span><span class="comment">/* 这里放索引文件的位置 */</span><span>  </span></li><li class="alt"><span>        File indexDir = </span><span class="keyword">new</span><span> File(</span><span class="string">"c:\\index"</span><span>);   </span></li><li class=""><span>        Analyzer luceneAnalyzer = </span><span class="keyword">new</span><span> StandardAnalyzer();   </span></li><li class="alt"><span>        IndexWriter indexWriter = </span><span class="keyword">new</span><span> IndexWriter(indexDir, luceneAnalyzer,   </span></li><li class=""><span>                </span><span class="keyword">true</span><span>);   </span></li><li class="alt"><span>        File[] textFiles = fileDir.listFiles();   </span></li><li class=""><span>        </span><span class="keyword">long</span><span> startTime = </span><span class="keyword">new</span><span> Date().getTime();   </span></li><li class="alt"><span>           </span></li><li class=""><span>        </span><span class="comment">//增加document到索引去 </span><span>  </span></li><li class="alt"><span>        </span><span class="keyword">for</span><span> (</span><span class="keyword">int</span><span> i = </span><span class="number">0</span><span>; i &lt; textFiles.length; i++) {   </span></li><li class=""><span>            </span><span class="keyword">if</span><span> (textFiles[i].isFile()   </span></li><li class="alt"><span>                    &amp;&amp; textFiles[i].getName().endsWith(</span><span class="string">".txt"</span><span>)) {   </span></li><li class=""><span>                System.out.println(</span><span class="string">"File "</span><span> + textFiles[i].getCanonicalPath()   </span></li><li class="alt"><span>                        + </span><span class="string">"正在被索引...."</span><span>);   </span></li><li class=""><span>                String temp = FileReaderAll(textFiles[i].getCanonicalPath(),   </span></li><li class="alt"><span>                        </span><span class="string">"GBK"</span><span>);   </span></li><li class=""><span>                System.out.println(temp);   </span></li><li class="alt"><span>                Document document = </span><span class="keyword">new</span><span> Document();   </span></li><li class=""><span>                Field FieldPath = </span><span class="keyword">new</span><span> Field(</span><span class="string">"path"</span><span>, textFiles[i].getPath(),   </span></li><li class="alt"><span>                        Field.Store.YES, Field.Index.NO);   </span></li><li class=""><span>                Field FieldBody = </span><span class="keyword">new</span><span> Field(</span><span class="string">"body"</span><span>, temp, Field.Store.YES,   </span></li><li class="alt"><span>                        Field.Index.TOKENIZED,   </span></li><li class=""><span>                        Field.TermVector.WITH_POSITIONS_OFFSETS);   </span></li><li class="alt"><span>                document.add(FieldPath);   </span></li><li class=""><span>                document.add(FieldBody);   </span></li><li class="alt"><span>                indexWriter.addDocument(document);   </span></li><li class=""><span>            }   </span></li><li class="alt"><span>        }   </span></li><li class=""><span>        </span><span class="comment">//optimize()方法是对索引进行优化 </span><span>  </span></li><li class="alt"><span>        indexWriter.optimize();   </span></li><li class=""><span>        indexWriter.close();   </span></li><li class="alt"><span>           </span></li><li class=""><span>        </span><span class="comment">//测试一下索引的时间 </span><span>  </span></li><li class="alt"><span>        </span><span class="keyword">long</span><span> endTime = </span><span class="keyword">new</span><span> Date().getTime();   </span></li><li class=""><span>        System.out   </span></li><li class="alt"><span>                .println(</span><span class="string">"这花费了"</span><span>  </span></li><li class=""><span>                        + (endTime - startTime)   </span></li><li class="alt"><span>                        + </span><span class="string">" 毫秒来把文档增加到索引里面去!"</span><span>  </span></li><li class=""><span>                        + fileDir.getPath());   </span></li><li class="alt"><span>    }   </span></li><li class=""><span>  </span></li><li class="alt"><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> String FileReaderAll(String FileName, String charset)   </span></li><li class=""><span>            </span><span class="keyword">throws</span><span> IOException {   </span></li><li class="alt"><span>        BufferedReader reader = </span><span class="keyword">new</span><span> BufferedReader(</span><span class="keyword">new</span><span> InputStreamReader(   </span></li><li class=""><span>                </span><span class="keyword">new</span><span> FileInputStream(FileName), charset));   </span></li><li class="alt"><span>        String line = </span><span class="keyword">new</span><span> String();   </span></li><li class=""><span>        String temp = </span><span class="keyword">new</span><span> String();   </span></li><li class="alt"><span>           </span></li><li class=""><span>        </span><span class="keyword">while</span><span> ((line = reader.readLine()) != </span><span class="keyword">null</span><span>) {   </span></li><li class="alt"><span>            temp += line;   </span></li><li class=""><span>        }   </span></li><li class="alt"><span>        reader.close();   </span></li><li class=""><span>        </span><span class="keyword">return</span><span> temp;   </span></li><li class="alt"><span>    }   </span></li><li class=""><span>}  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>索引的结果： <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>File C:\s\</span><span class="number">1</span><span>.txt正在被索引....   </span></span></li><li class=""><span>中华人民共和国全国人民</span><span class="number">2006</span><span>年   </span></li><li class="alt"><span>File C:\s\</span><span class="number">2</span><span>.txt正在被索引....   </span></li><li class=""><span>中华人民共和国全国人民</span><span class="number">2006</span><span>年   </span></li><li class="alt"><span>File C:\s\</span><span class="number">3</span><span>.txt正在被索引....   </span></li><li class=""><span>中华人民共和国全国人民</span><span class="number">2006</span><span>年   </span></li><li class="alt"><span>这花费了</span><span class="number">297</span><span> 毫秒来把文档增加到索引里面去!c:\s  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>3、建立了索引之后，查询啦.... <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> lighter.javaeye.com;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> java.io.IOException;   </span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.Analyzer;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.standard.StandardAnalyzer;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.queryParser.ParseException;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.queryParser.QueryParser;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.search.Hits;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.search.IndexSearcher;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.search.Query;   </span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> TestQuery {   </span></li><li class=""><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) </span><span class="keyword">throws</span><span> IOException, ParseException {   </span></li><li class="alt"><span>        Hits hits = </span><span class="keyword">null</span><span>;   </span></li><li class=""><span>        String queryString = </span><span class="string">"中华"</span><span>;   </span></li><li class="alt"><span>        Query query = </span><span class="keyword">null</span><span>;   </span></li><li class=""><span>        IndexSearcher searcher = </span><span class="keyword">new</span><span> IndexSearcher(</span><span class="string">"c:\\index"</span><span>);   </span></li><li class="alt"><span>  </span></li><li class=""><span>        Analyzer analyzer = </span><span class="keyword">new</span><span> StandardAnalyzer();   </span></li><li class="alt"><span>        </span><span class="keyword">try</span><span> {   </span></li><li class=""><span>            QueryParser qp = </span><span class="keyword">new</span><span> QueryParser(</span><span class="string">"body"</span><span>, analyzer);   </span></li><li class="alt"><span>            query = qp.parse(queryString);   </span></li><li class=""><span>        } </span><span class="keyword">catch</span><span> (ParseException e) {   </span></li><li class="alt"><span>        }   </span></li><li class=""><span>        </span><span class="keyword">if</span><span> (searcher != </span><span class="keyword">null</span><span>) {   </span></li><li class="alt"><span>            hits = searcher.search(query);   </span></li><li class=""><span>            </span><span class="keyword">if</span><span> (hits.length() &gt; </span><span class="number">0</span><span>) {   </span></li><li class="alt"><span>                System.out.println(</span><span class="string">"找到:"</span><span> + hits.length() + </span><span class="string">" 个结果!"</span><span>);   </span></li><li class=""><span>            }   </span></li><li class="alt"><span>        }   </span></li><li class=""><span>    }   </span></li><li class="alt"><span>  </span></li><li class=""><span>}  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>其运行结果： <br /></p><div class="quote_title">引用</div><div class="quote_div">找到:3 个结果!</div><br />具体的API的用法，这里就不说了，具体的做法参考lucene的官方文档吧... <br />下一篇文章: <br />搜索篇:lucene的简单实例&lt;二&gt; <a href="http://www.javaeye.com/post/190576" target="blank">http://www.javaeye.com/post/190576</a><br />打一个例子吧, <br />这是lucene2.0的API <br /><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>QueryParser qp = </span><span class="keyword">new</span><span> QueryParser(</span><span class="string">"body"</span><span>, analyzer);      </span></span></li><li class=""><span>query = qp.parse(queryString);      </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>这是lucene1.4.3版的API <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>query = QueryParser.parse(key,queryString,</span><span class="keyword">new</span><span> </span><span class="keyword">new</span><span> StandardAnalyzer());  </span></span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />详细的改动看一些官方的文档就清楚啦<br />文章的时候,感觉比较难写的就是标题,有时候不知道起什么名字好,反正这里写的都是关于lucene的一些简单的实例,就随便起啦.
<p>Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索 <br />来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西，叫搜索。</p><p><span style="COLOR: blue">IndexWriter</span>:lucene中最重要的的类之一，它主要是用来将文档加入索引，同时控制索引过程中的一些参数使用。</p><p><span style="COLOR: blue">Analyzer</span>:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。</p><p><span style="COLOR: blue">Directory</span>:索引存放的位置;lucene提供了两种索引存放的位置，一种是磁盘，一种是内存。一般情况将索引放在磁盘上；相应地lucene提供了FSDirectory和RAMDirectory两个类。</p><p><span style="COLOR: blue">Document</span>:文档;Document相当于一个要进行索引的单元，任何可以想要被索引的文件都必须转化为Document对象才能进行索引。</p><p><span style="COLOR: blue">Field</span>：字段。</p><p><span style="COLOR: blue">IndexSearcher</span>:是lucene中最基本的检索工具，所有的检索都会用到IndexSearcher工具;</p><p><span style="COLOR: blue">Query</span>:查询，lucene中支持模糊查询，语义查询，短语查询，组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。</p><p><span style="COLOR: blue">QueryParser</span>: 是一个解析用户输入的工具，可以通过扫描用户输入的字符串，生成Query对象。</p><p><span style="COLOR: blue">Hits</span>:在搜索完成之后，需要把搜索结果返回并显示给用户，只有这样才算是完成搜索的目的。在lucene中，搜索的结果的集合是用Hits类的实例来表示的。</p><p>上面作了一大堆名词解释，下面就看几个简单的实例吧: <br />1、简单的的StandardAnalyzer测试例子 <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> lighter.javaeye.com;   </span></span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">import</span><span> java.io.IOException;   </span></li><li class=""><span></span><span class="keyword">import</span><span> java.io.StringReader;   </span></li><li class="alt"><span>  </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.Analyzer;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.Token;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.TokenStream;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.standard.StandardAnalyzer;   </span></li><li class=""><span>  </span></li><li class="alt"><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> StandardAnalyzerTest    </span></li><li class=""><span>{   </span></li><li class="alt"><span>    </span><span class="comment">//构造函数， </span><span>  </span></li><li class=""><span>    </span><span class="keyword">public</span><span> StandardAnalyzerTest()   </span></li><li class="alt"><span>    {   </span></li><li class=""><span>    }   </span></li><li class="alt"><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args)    </span></li><li class=""><span>    {   </span></li><li class="alt"><span>        </span><span class="comment">//生成一个StandardAnalyzer对象 </span><span>  </span></li><li class=""><span>        Analyzer aAnalyzer = </span><span class="keyword">new</span><span> StandardAnalyzer();   </span></li><li class="alt"><span>        </span><span class="comment">//测试字符串 </span><span>  </span></li><li class=""><span>        StringReader sr = </span><span class="keyword">new</span><span> StringReader(</span><span class="string">"lighter javaeye com is the are on"</span><span>);   </span></li><li class="alt"><span>        </span><span class="comment">//生成TokenStream对象 </span><span>  </span></li><li class=""><span>        TokenStream ts = aAnalyzer.tokenStream(</span><span class="string">"name"</span><span>, sr);    </span></li><li class="alt"><span>        </span><span class="keyword">try</span><span> {   </span></li><li class=""><span>            </span><span class="keyword">int</span><span> i=</span><span class="number">0</span><span>;   </span></li><li class="alt"><span>            Token t = ts.next();   </span></li><li class=""><span>            </span><span class="keyword">while</span><span>(t!=</span><span class="keyword">null</span><span>)   </span></li><li class="alt"><span>            {   </span></li><li class=""><span>                </span><span class="comment">//辅助输出时显示行号 </span><span>  </span></li><li class="alt"><span>                i++;   </span></li><li class=""><span>                </span><span class="comment">//输出处理后的字符 </span><span>  </span></li><li class="alt"><span>                System.out.println(</span><span class="string">"第"</span><span>+i+</span><span class="string">"行:"</span><span>+t.termText());   </span></li><li class=""><span>                </span><span class="comment">//取得下一个字符 </span><span>  </span></li><li class="alt"><span>                t=ts.next();   </span></li><li class=""><span>            }   </span></li><li class="alt"><span>        } </span><span class="keyword">catch</span><span> (IOException e) {   </span></li><li class=""><span>            e.printStackTrace();   </span></li><li class="alt"><span>        }   </span></li><li class=""><span>    }   </span></li><li class="alt"><span>}   </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />显示结果： <br /><div class="quote_title">引用</div><div class="quote_div">第1行:lighter <br />第2行:javaeye <br />第3行:com</div><br />提示一下： <br />StandardAnalyzer是lucene中内置的"标准分析器",可以做如下功能: <br />1、对原有句子按照空格进行了分词 <br />2、所有的大写字母都可以能转换为小写的字母 <br />3、可以去掉一些没有用处的单词，例如"is","the","are"等单词，也删除了所有的标点 <br />查看一下结果与"new StringReader("lighter javaeye com is the are on")"作一个比较就清楚明了。 <br />这里不对其API进行解释了，具体见lucene的官方文档。需要注意一点，这里的代码使用的是lucene2的API，与1.43版有一些明显的差别。 
<p></p><p>2、看另一个实例,简单地建立索引，进行搜索 <br /></p><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span class="keyword">package</span><span> lighter.javaeye.com;   </span></span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.analysis.standard.StandardAnalyzer;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.document.Document;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.document.Field;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.index.IndexWriter;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.queryParser.QueryParser;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.search.Hits;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.search.IndexSearcher;   </span></li><li class="alt"><span></span><span class="keyword">import</span><span> org.apache.lucene.search.Query;   </span></li><li class=""><span></span><span class="keyword">import</span><span> org.apache.lucene.store.FSDirectory;   </span></li><li class="alt"><span>  </span></li><li class=""><span></span><span class="keyword">public</span><span> </span><span class="keyword">class</span><span> FSDirectoryTest {   </span></li><li class="alt"><span>  </span></li><li class=""><span>    </span><span class="comment">//建立索引的路径 </span><span>  </span></li><li class="alt"><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">final</span><span> String path = </span><span class="string">"c:\\index2"</span><span>;   </span></li><li class=""><span>  </span></li><li class="alt"><span>    </span><span class="keyword">public</span><span> </span><span class="keyword">static</span><span> </span><span class="keyword">void</span><span> main(String[] args) </span><span class="keyword">throws</span><span> Exception {   </span></li><li class=""><span>        Document doc1 = </span><span class="keyword">new</span><span> Document();   </span></li><li class="alt"><span>        doc1.add( </span><span class="keyword">new</span><span> Field(</span><span class="string">"name"</span><span>, </span><span class="string">"lighter javaeye com"</span><span>,Field.Store.YES,Field.Index.TOKENIZED));   </span></li><li class=""><span>  </span></li><li class="alt"><span>        Document doc2 = </span><span class="keyword">new</span><span> Document();   </span></li><li class=""><span>        doc2.add(</span><span class="keyword">new</span><span> Field(</span><span class="string">"name"</span><span>, </span><span class="string">"lighter blog"</span><span>,Field.Store.YES,Field.Index.TOKENIZED));   </span></li><li class="alt"><span>  </span></li><li class=""><span>        IndexWriter writer = </span><span class="keyword">new</span><span> IndexWriter(FSDirectory.getDirectory(path, </span><span class="keyword">true</span><span>), </span><span class="keyword">new</span><span> StandardAnalyzer(), </span><span class="keyword">true</span><span>);   </span></li><li class="alt"><span>        writer.setMaxFieldLength(</span><span class="number">3</span><span>);   </span></li><li class=""><span>        writer.addDocument(doc1);   </span></li><li class="alt"><span>        writer.setMaxFieldLength(</span><span class="number">3</span><span>);   </span></li><li class=""><span>        writer.addDocument(doc2);   </span></li><li class="alt"><span>        writer.close();   </span></li><li class=""><span>  </span></li><li class="alt"><span>        IndexSearcher searcher = </span><span class="keyword">new</span><span> IndexSearcher(path);   </span></li><li class=""><span>        Hits hits = </span><span class="keyword">null</span><span>;   </span></li><li class="alt"><span>        Query query = </span><span class="keyword">null</span><span>;   </span></li><li class=""><span>        QueryParser qp = </span><span class="keyword">new</span><span> QueryParser(</span><span class="string">"name"</span><span>,</span><span class="keyword">new</span><span> StandardAnalyzer());   </span></li><li class="alt"><span>           </span></li><li class=""><span>        query = qp.parse(</span><span class="string">"lighter"</span><span>);   </span></li><li class="alt"><span>        hits = searcher.search(query);   </span></li><li class=""><span>        System.out.println(</span><span class="string">"查找\"lighter\" 共"</span><span> + hits.length() + </span><span class="string">"个结果"</span><span>);   </span></li><li class="alt"><span>  </span></li><li class=""><span>        query = qp.parse(</span><span class="string">"javaeye"</span><span>);   </span></li><li class="alt"><span>        hits = searcher.search(query);   </span></li><li class=""><span>        System.out.println(</span><span class="string">"查找\"javaeye\" 共"</span><span> + hits.length() + </span><span class="string">"个结果"</span><span>);   </span></li><li class="alt"><span>  </span></li><li class=""><span>    }   </span></li><li class="alt"><span>  </span></li><li class=""><span>}  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><br />运行结果： <br /><div class="code_title">代码</div><div class="code_div"><div class="dp-highlighter"><div class="bar"></div><ol class="dp-j"><li class="alt"><span><span>查找</span><span class="string">"lighter"</span><span> 共</span><span class="number">2</span><span>个结果   </span></span></li><li class=""><span>查找</span><span class="string">"javaeye"</span><span> 共</span><span class="number">1</span><span>个结果  </span></li></ol></div></div><script><![CDATA[ender_code();]]&gt;</script><p></p><p>很久没有看lucene了，这两三天又复习了一下,上一些代码都是前几个月写的，只是改动了一些字符串和包名显示。转载时请说明，文章来自:http://lighter.javaeye.com。 <br />如有什么错误的地方，恳请指出，谢谢。<br /></p><div class="quote_title">wen19851025 写道</div><div class="quote_div">//测试字符串 <br />StringReader sr = new StringReader("lighter javaeye com"); <br />//生成TokenStream对象 <br />TokenStream ts = aAnalyzer.tokenStream("name", sr); <br />请问:以上的解析是按什么来解析,为什么他会自动的按空格或者","进行字符分割,再一个当SR里输入是中文字符时,他将会对每个字进行分割,请问这是为什么,同时这功能的实现又意为着什么呢.....????</div><p><br />StandardAnalyzer是lucene中内置的"标准分析器",可以做如下功能: <br />1、对原有句子按照空格进行了分词 <br />2、所有的大写字母都可以能转换为小写的字母 <br />3、可以去掉一些没有用处的单词，例如"is","the","are"等单词，也删除了所有的标点 <br />同时也可以对中文进行分词(效果不好),现在有很多的中文分词包可以采用 <br /><br /></p><img src ="http://www.blogjava.net/rendong/aggbug/89849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-25 11:26 <a href="http://www.blogjava.net/rendong/archive/2006/12/25/89849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene</title><link>http://www.blogjava.net/rendong/archive/2006/12/25/89846.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Mon, 25 Dec 2006 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/25/89846.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/89846.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/25/89846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/89846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/89846.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大，api也很简单。总得来说用Lucene来进行建立和搜索和操作数据库是差不多的(有点像)，Document可以看作是数据库的一行记录，Field可以看作是数据库的字段。用lucene实现搜索引擎就像用JDBC实现连接数据库一样简单。																									...&nbsp;&nbsp;<a href='http://www.blogjava.net/rendong/archive/2006/12/25/89846.html'>阅读全文</a><img src ="http://www.blogjava.net/rendong/aggbug/89846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-25 11:05 <a href="http://www.blogjava.net/rendong/archive/2006/12/25/89846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tag大全</title><link>http://www.blogjava.net/rendong/archive/2006/12/24/89775.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Sun, 24 Dec 2006 12:07:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/24/89775.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/89775.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/24/89775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/89775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/89775.html</trackback:ping><description><![CDATA[
		<p>昨天，由于程序中需要用到一个WEB TABS样式的页面，GOOGLE之，才发现这东西真不好找。 <br />displaytag 这个东西计划要支持TABS，为啥只是计划，虽然它的表格样式看起来不错。 <br />webtabs 这个嘛，样子太丑了，拿不出手。 <br />prizetags 这个可控制的属性太少了，不爽。 <br />Ditchnet JSP Tabs Taglib 就是它，为什么没有地方能下载到，哪位好心人能告诉我？</p>
		<p>
		</p>
		<p>下面的这个站收录的比较全，收藏之。 <br />东西还真不少，慢慢学啦，可惜没有我想要的 <br />【Java开源 Jsp标签库】 <br />Posted by E_wsq 2006-3-29 9:32:00 <br />displytag</p>
		<p>
		</p>
		<p>与Struts结合使用最出名的一个tag主要是显示表格数据很漂亮、完善。 <br />500)this.style.width=500;” border=0&gt; <a href="http://displaytag.sourceforge.net/"><font color="#003399">http://displaytag.sourceforge.net/</font></a><br />cewolf tag</p>
		<p>
		</p>
		<p>用来在web上显示复杂图形报表的一个jsp tag。 <br />500)this.style.width=500;” border=0&gt; <a href="http://cewolf.sourceforge.net/"><font color="#003399">http://cewolf.sourceforge.net/</font></a><br />Loading Tab</p>
		<p>
		</p>
		<p>当一个复杂的操作可以加载比较长的时间时，用这个tag。 <br />500)this.style.width=500;” border=0&gt; <a href="http://www.mycgiserver.com/~eboudrant/#taglibs"><font color="#003399">http://www.mycgiserver.com/~eboudrant/#taglibs</font></a><br />DbForms</p>
		<p>
		</p>
		<p>DbForms!它是一个基于 Java (Servlet,JSP/Taglib)的快速应用程序开发环境，可以帮助开发人员快速建造基于Web的数据库应用程序。 <br />500)this.style.width=500;” border=0&gt; <a href="http://jdbforms.sourceforge.net/"><font color="#003399">http://jdbforms.sourceforge.net/</font></a><br />Jakarta Taglibs</p>
		<p>
		</p>
		<p>Jakarta Taglibs 是为JSP定制标签库和相关的项目提供的一个开源仓库，如 TagLibraryValidator类，和对页面生成工具的扩展来支持标签库。Jakarta Taglibs 也包括了对JSP Standard Tag Library (JSTL)的参考实现。这个实现基于项目标准。目前，在Jakarta Taglibs 中没有其它标签库代表了Java Community Process (JCP) 标准。 <br />500)this.style.width=500;” border=0&gt; <a href="http://jakarta.apache.org/taglibs/index.html"><font color="#003399">http://jakarta.apache.org/taglibs/index.html</font></a><br />EasyLDAP</p>
		<div>LDAP标签库为JSP程序员和Web页面设计者提供了最容易的方法来执行任意的LDAP操作。 <br />500)this.style.width=500;” border=0&gt; <a href="http://easyldap.sourceforge.net/"><font color="#003399">http://easyldap.sourceforge.net/</font></a><br />WebJMX</div>
		<div>
				<div>WebJMX标签库项目可以控制你的JMX 接口。WebJMX 这个标签库项目的目的是生成一个JSP标签库，可以让有技巧的JSP开发人员为JMX生成一个可定制的、规范的、基于Web的界面。 <br />500)this.style.width=500;” border=0&gt; <a href="http://webjmx.sourceforge.net/"><font color="#003399">http://webjmx.sourceforge.net/</font></a><br />JPivot</div>
				<div>
						<div>JPivot - 是一个JSP 自定制的标签库，可以绘制一个OLAP表格和图表。用户可以执行典型的OLAP导航，如下钻，切片和方块。它使用Mondrian 作为其OLAP服务器。 <br />500)this.style.width=500;” border=0&gt; <a href="http://jpivot.sourceforge.net/"><font color="#003399">http://jpivot.sourceforge.net/</font></a><br />JSP Tree Tag</div>
						<div>
								<div>JSP Tree Tag是一个显示树型结构jsp标签，它只把需要显示的部分送到客户浏览器。 <br />500)this.style.width=500;” border=0&gt; <a href="http://www.jenkov.dk/projects/treetag/treetag.jsp"><font color="#003399">http://www.jenkov.dk/projects/treetag/treetag.jsp</font></a><br />Google Tag Library</div>
								<div>
										<div>该标记库和 Google 有关。使用该标记库，利用 Google 为你的网站提供网站查询，并且可以直接在你的网页里面显示搜查的结果。 <br />500)this.style.width=500;” border=0&gt; <a href="http://google-taglib.sourceforge.net/"><font color="#003399">http://google-taglib.sourceforge.net/</font></a><br />TableTag</div>
										<div>
												<div>TableTag是类似于DataGrid的Jsp标签库。通过java.util.List填充数据。 <br />500)this.style.width=500;” border=0&gt; <a href="http://tabletag.sourceforge.net/"><font color="#003399">http://tabletag.sourceforge.net/</font></a><br />uitags</div>
												<div>
														<div>uitags利用这个开源自定义标签可以很容易开发出一个友好的用户界面。 <br />500)this.style.width=500;” border=0&gt; <a href="http://uitags.sourceforge.net/"><font color="#003399">http://uitags.sourceforge.net/</font></a><br />ValueList</div>
														<div>
																<div>ValueList利用这个标签可以进行数据过滤，排序，分页。而且界面挺漂亮的。 <br />500)this.style.width=500;” border=0&gt; <a href="http://valuelist.sourceforge.net/"><font color="#003399">http://valuelist.sourceforge.net/</font></a><br />JCE taglib</div>
																<div>
																		<div>JCE taglib把JCE（Java Cryptographic Extensions）包装成TagLib并且包含了EL函数。使用这个标签能够为jsp应用程序加强安全性。 <br />500)this.style.width=500;” border=0&gt; <a href="http://jcetaglib.sourceforge.net/"><font color="#003399">http://jcetaglib.sourceforge.net/</font></a><br />Prize Tags</div>
																		<div>
																				<div>Prize Tags是一个集许多功能于一身的Jsp标签库。其中最受欢迎的Tree Tag，这个Tag可以为不同节点指定不同的图标，而且可以服务端可以监控客户端节点的展开，关闭，选中与未选中等事件。除了Tree Tag还有日历Tag,Icon Tag,Alternate Tag ,Template Tag 等其它的功能。 <br />500)this.style.width=500;” border=0&gt; <a href="http://www.jenkov.com/prizetags/introduction.tmpl"><font color="#003399">http://www.jenkov.com/prizetags/introduction.tmpl</font></a><br />Struts-Layout</div>
																				<div>
																						<div>Struts-Layout是一个用在Struts的标签库.这个强大的标签库可以用来显示面板(panels),输入框,表格,treeviews,sortable lists,datagrids,popups,日历等.使用这些标签可以不用写HTML代码,甚至可以不用懂得HTML.这个项目还提供一个Eclipse下的插件Kiwi帮助使用Struts和Struts-Layout来开发Jsp页面.以下是一张例图: <br />500)this.style.width=500;” border=0&gt;</div>
																						<div>
																								<div>500)this.style.width=500;” border=0&gt; <a href="http://struts.application-servers.com/"><font color="#003399">http://struts.application-servers.com/</font></a><br />JImageTaglib</div>
																								<div>
																										<div>JImageTaglib是一个用在J2EE Web应用程序的Java标签库.它用来在服务端生成与处理图片然后再反馈到JSP页面.可以过滤(filtering)图片,调整图片文件大小,生成条形码等. <br />500)this.style.width=500;” border=0&gt; <a href="http://jimagetaglib.sourceforge.net/"><font color="#003399">http://jimagetaglib.sourceforge.net/</font></a><br />uitags</div>
																										<div>
																												<div>uitags是一个开源的JSP custom-tag库.它让开发友好的用户界面变得简单. <br />500)this.style.width=500;” border=0&gt; <a href="http://uitags.sourceforge.net/"><font color="#003399">http://uitags.sourceforge.net/</font></a><br />AJAX Tags</div>
																												<div>
																														<div>AJAX Tag是一组Jsp标签,用来简化AJAX(Asynchronous JavaScript and XML )技术在JSP页面中的使用. <br />500)this.style.width=500;” border=0&gt; <a href="http://ajaxtags.sourceforge.net/"><font color="#003399">http://ajaxtags.sourceforge.net/</font></a><br />Struts AjaxTags</div>
																														<div>
																																<div>这个AjaxTags是在现有的Struts HTML标签库上添加对AJAX (Asynchronous Javascript+XML)技术的支持。这样就可以为现有的基于Struts HTML标签库的应用程序添加AJAX功能而不用破坏现存的代码并且开发者不需要了解AJAX是怎样工作的。 <br />500)this.style.width=500;” border=0&gt; <a href="http://struts.sourceforge.net/ajaxtags/"><font color="#003399">http://struts.sourceforge.net/ajaxtags/</font></a><br />AWTaglib</div>
																																<div>
																																		<div>AWTaglib是一个Jsp标签可用于创建网格(grid)控件.它还提供一些额外的功能可以把网格中的数据导出为XLS,PDF和CSV(利用JasperReports来实现)并能与Struts框架相结合. <br />500)this.style.width=500;” border=0&gt; <a href="http://awtaglib.sourceforge.net/"><font color="#003399">http://awtaglib.sourceforge.net/</font></a><br />eXtremeTable</div>
																																		<div>
																																				<div>eXtremeTable是一个可扩展的用于以表格的形式来显示数据的一组JSP标签库.</div>
																																		</div>
																																</div>
																														</div>
																												</div>
																										</div>
																								</div>
																						</div>
																				</div>
																		</div>
																</div>
														</div>
												</div>
										</div>
								</div>
						</div>
				</div>
		</div>
<img src ="http://www.blogjava.net/rendong/aggbug/89775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-24 20:07 <a href="http://www.blogjava.net/rendong/archive/2006/12/24/89775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]用Acegi为你的Spring应用加把锁</title><link>http://www.blogjava.net/rendong/archive/2006/12/24/89774.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Sun, 24 Dec 2006 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/24/89774.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/89774.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/24/89774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/89774.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/89774.html</trackback:ping><description><![CDATA[
		<blockquote>
				<p>关键字 J2EE Spring Acegi</p>
				<h3>[简介]</h3>
				<p>对于一个典型的Web应用，完善的认证和授权机制是必不可少的，在SpringFramework中，Juergen Hoeller提供的范例JPetStore给了一些这方面的介绍，但还远远不够，Acegi是一个专门为SpringFramework提供安全机制的 项目，全称为Acegi Security System for Spring，当前版本为0.5.1，就其目前提供的功能，应该可以满足绝大多数应用的需求。</p>
				<p>本文的主要目的是希望能够说明如何在基于Spring构架的Web应用中使用Acegi，而不是详细介绍其中的每个接口、每个类。注意，即使对已经存在的Spring应用，通过下面介绍的步骤，也可以马上享受到Acegi提供的认证和授权。</p>
				<p>[基础工作] <br />在你的Web应用的lib中添加Acegi下载包中的acegi-security.jar</p>
				<p>[web.xml] <br />实现认证和授权的最常用的方法是通过filter，Acegi亦是如此，通常Acegi需要在web.xml添加以下5个filter:</p>
				<p>&lt;filter&gt; <br />&lt;filter-name&gt;Acegi Channel Processing Filter&lt;/filter-name&gt; <br />&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />&lt;init-param&gt; <br />&lt;param-name&gt;targetClass&lt;/param-name&gt; <br />&lt;param-value&gt;net.sf.acegisecurity.securechannel.ChannelProcessingFilter&lt;/param-value&gt; <br />&lt;/init-param&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />&lt;filter-name&gt;Acegi Authentication Processing Filter&lt;/filter-name&gt; <br />&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />&lt;init-param&gt; <br />&lt;param-name&gt;targetClass&lt;/param-name&gt; <br />&lt;param-value&gt;net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter&lt;/param-value&gt; <br />&lt;/init-param&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />&lt;filter-name&gt;Acegi HTTP BASIC Authorization Filter&lt;/filter-name&gt; <br />&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />&lt;init-param&gt; <br />&lt;param-name&gt;targetClass&lt;/param-name&gt; <br />&lt;param-value&gt;net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter&lt;/param-value&gt; <br />&lt;/init-param&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />&lt;filter-name&gt;Acegi Security System for Spring Auto Integration Filter&lt;/filter-name&gt; <br />&lt;filter-class&gt;net.sf.acegisecurity.ui.AutoIntegrationFilter&lt;/filter-class&gt; <br />&lt;/filter&gt; <br />&lt;filter&gt; <br />&lt;filter-name&gt;Acegi HTTP Request Security Filter&lt;/filter-name&gt; <br />&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt; <br />&lt;init-param&gt; <br />&lt;param-name&gt;targetClass&lt;/param-name&gt; <br />&lt;param-value&gt;net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter&lt;/param-value&gt; <br />&lt;/init-param&gt; <br />&lt;/filter&gt;</p>
				<p>最先引起迷惑的是net.sf.acegisecurity.util.FilterToBeanProxy，Acegi自己的文档上解释是： “What FilterToBeanProxy does is delegate the Filter’s methods through to a bean which is obtained from the <br />Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.”，如希望深究的话，去看看源代码应该不难理解。</p>
				<p>再下来就是添加filter-mapping了： <br />&lt;filter-mapping&gt; <br />&lt;filter-name&gt;Acegi Channel Processing Filter&lt;/filter-name&gt; <br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />&lt;filter-name&gt;Acegi Authentication Processing Filter&lt;/filter-name&gt; <br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />&lt;filter-name&gt;Acegi HTTP BASIC Authorization Filter&lt;/filter-name&gt; <br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />&lt;filter-name&gt;Acegi Security System for Spring Auto Integration Filter&lt;/filter-name&gt; <br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt; <br />&lt;filter-mapping&gt; <br />&lt;filter-name&gt;Acegi HTTP Request Security Filter&lt;/filter-name&gt; <br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt;</p>
				<p>这里，需要注意以下两点： <br />1) 这几个filter的顺序是不能更改的，顺序不对将无法正常工作； <br />2) 如果你的应用不需要安全传输，如https，则将”Acegi Channel Processing Filter”相关内容注释掉即可； <br />3) 如果你的应用不需要Spring提供的远程访问机制，如Hessian and Burlap，将”Acegi HTTP BASIC Authorization <br />Filter”相关内容注释掉即可。</p>
				<p>[applicationContext.xml] <br />接下来就是要添加applicationContext.xml中的内容了，从刚才FilterToBeanFactory的解释可以看出，真正的filter都 <br />在Spring的applicationContext中管理：</p>
				<p>1) 首先，你的数据库中必须具有保存用户名和密码的table，Acegi要求table的schema必须如下：</p>
				<p>CREATE TABLE users ( <br />username VARCHAR(50) NOT NULL PRIMARY KEY, <br />password VARCHAR(50) NOT NULL, <br />enabled BIT NOT NULL <br />); <br />CREATE TABLE authorities ( <br />username VARCHAR(50) NOT NULL, <br />authority VARCHAR(50) NOT NULL <br />); <br />CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority ); <br />ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users <br />(username);</p>
				<p>2) 添加访问你的数据库的datasource和Acegi的jdbcDao，如下：</p>
				<p>&lt;bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”&gt; <br />&lt;property name=”driverClassName”&gt;&lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;&lt;/property&gt; <br />&lt;property name=”url”&gt;&lt;value&gt;${jdbc.url}&lt;/value&gt;&lt;/property&gt; <br />&lt;property name=”username”&gt;&lt;value&gt;${jdbc.username}&lt;/value&gt;&lt;/property&gt; <br />&lt;property name=”password”&gt;&lt;value&gt;${jdbc.password}&lt;/value&gt;&lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id=”jdbcDaoImpl” class=”net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl”&gt; <br />&lt;property name=”dataSource”&gt;&lt;ref bean=”dataSource”/&gt;&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>3) 添加DaoAuthenticationProvider:</p>
				<p>&lt;bean id=”daoAuthenticationProvider” class=”net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider”&gt; <br />&lt;property name=”authenticationDao”&gt;&lt;ref bean=”authenticationDao”/&gt;&lt;/property&gt; <br />&lt;property name=”userCache”&gt;&lt;ref bean=”userCache”/&gt;&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>&lt;bean id=”userCache” class=”net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache”&gt; <br />&lt;property name=”minutesToIdle”&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>如果你需要对密码加密，则在daoAuthenticationProvider中加入：&lt;property name=”passwordEncoder”&gt;&lt;ref <br />bean=”passwordEncoder”/&gt;&lt;/property&gt;，Acegi提供了几种加密方法，详细情况可看包 <br />net.sf.acegisecurity.providers.encoding</p>
				<p>4) 添加authenticationManager:</p>
				<p>&lt;bean id=”authenticationManager” class=”net.sf.acegisecurity.providers.ProviderManager”&gt; <br />&lt;property name=”providers”&gt; <br />&lt;list&gt; <br />&lt;ref bean=”daoAuthenticationProvider”/&gt; <br />&lt;/list&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>5) 添加accessDecisionManager:</p>
				<p>&lt;bean id=”accessDecisionManager” class=”net.sf.acegisecurity.vote.AffirmativeBased”&gt; <br />&lt;property name=”allowIfAllAbstainDecisions”&gt; <br />&lt;value&gt;false&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;property name=”decisionVoters”&gt; <br />&lt;list&gt;&lt;ref bean=”roleVoter”/&gt;&lt;/list&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id=”roleVoter” class=”net.sf.acegisecurity.vote.RoleVoter”/&gt;</p>
				<p>6) 添加authenticationProcessingFilterEntryPoint:</p>
				<p>&lt;bean id=”authenticationProcessingFilterEntryPoint” <br />class=”net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint”&gt; <br />&lt;property name=”loginFormUrl”&gt;&lt;value&gt;/acegilogin.jsp&lt;/value&gt;&lt;/property&gt; <br />&lt;property name=”forceHttps”&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>其中acegilogin.jsp是登陆页面，一个最简单的登录页面如下：</p>
				<p>&lt;%@ taglib prefix=’c’ uri=’http://java.sun.com/jstl/core’ %&gt; <br />&lt;%@ page import=”net.sf.acegisecurity.ui.AbstractProcessingFilter” %&gt; <br />&lt;%@ page import=”net.sf.acegisecurity.AuthenticationException” %&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;Login&lt;/title&gt; <br />&lt;/head&gt;</p>
				<p>&lt;body&gt; <br />&lt;h1&gt;Login&lt;/h1&gt; <br />&lt;form action=”&lt;c:url value=’j_acegi_security_check’/&gt;” method=”POST”&gt; <br />&lt;table&gt; <br />&lt;tr&gt;&lt;td&gt;User:&lt;/td&gt;&lt;td&gt;&lt;input type=’text’ name=’j_username’&gt;&lt;/td&gt;&lt;/tr&gt; <br />&lt;tr&gt;&lt;td&gt;Password:&lt;/td&gt;&lt;td&gt;&lt;input type=’password’ name=’j_password’&gt;&lt;/td&gt;&lt;/tr&gt; <br />&lt;tr&gt;&lt;td colspan=’2′&gt;&lt;input name=”submit” type=”submit”&gt;&lt;/td&gt;&lt;/tr&gt; <br />&lt;tr&gt;&lt;td colspan=’2′&gt;&lt;input name=”reset” type=”reset”&gt;&lt;/td&gt;&lt;/tr&gt; <br />&lt;/table&gt; <br />&lt;/form&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;</p>
				<p>7) 添加filterInvocationInterceptor:</p>
				<p>&lt;bean id=”filterInvocationInterceptor” <br />class=”net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor”&gt; <br />&lt;property name=”authenticationManager”&gt; <br />&lt;ref bean=”authenticationManager”/&gt; <br />&lt;/property&gt; <br />&lt;property name=”accessDecisionManager”&gt; <br />&lt;ref bean=”accessDecisionManager”/&gt; <br />&lt;/property&gt; <br />&lt;property name=”objectDefinitionSource”&gt; <br />&lt;value&gt; <br />CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br />\A/sec/administrator.*\Z=ROLE_SUPERVISOR <br />\A/sec/user.*\Z=ROLE_TELLER <br />&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>这里请注意，要objectDefinitionSource中定义哪些页面需要权限访问，需要根据自己的应用需求进行修改，我上面给出 <br />的定义的意思是这样的： <br />a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比较请求路径时全部转换为小写 <br />b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有权限为ROLE_SUPERVISOR才能访问/sec/administrator*的页面 <br />c. \A/sec/user.*\Z=ROLE_TELLER意思是只有权限为ROLE_TELLER的用户才能访问/sec/user*的页面</p>
				<p>8) 添加securityEnforcementFilter:</p>
				<p>&lt;bean id=”securityEnforcementFilter” class=”net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter”&gt; <br />&lt;property name=”filterSecurityInterceptor”&gt; <br />&lt;ref bean=”filterInvocationInterceptor”/&gt; <br />&lt;/property&gt; <br />&lt;property name=”authenticationEntryPoint”&gt; <br />&lt;ref bean=”authenticationProcessingFilterEntryPoint”/&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>9) 添加authenticationProcessingFilter:</p>
				<p>&lt;bean id=”authenticationProcessingFilter” <br />class=”net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter”&gt; <br />&lt;property name=”authenticationManager”&gt; <br />&lt;ref bean=”authenticationManager”/&gt; <br />&lt;/property&gt; <br />&lt;property name=”authenticationFailureUrl”&gt; <br />&lt;value&gt;/loginerror.jsp&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;property name=”defaultTargetUrl”&gt; <br />&lt;value&gt;/&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;property name=”filterProcessesUrl”&gt; <br />&lt;value&gt;/j_acegi_security_check&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br />其中authenticationFailureUrl是认证失败的页面。</p>
				<p>10) 如果需要一些页面通过安全通道的话，添加下面的配置:</p>
				<p>&lt;bean id=”channelProcessingFilter” class=”net.sf.acegisecurity.securechannel.ChannelProcessingFilter”&gt; <br />&lt;property name=”channelDecisionManager”&gt; <br />&lt;ref bean=”channelDecisionManager”/&gt; <br />&lt;/property&gt; <br />&lt;property name=”filterInvocationDefinitionSource”&gt; <br />&lt;value&gt; <br />CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br />\A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL <br />\A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL <br />\A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL <br />\A.*\Z=REQUIRES_INSECURE_CHANNEL <br />&lt;/value&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt;</p>
				<p>&lt;bean id=”channelDecisionManager” class=”net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl”&gt; <br />&lt;property name=”channelProcessors”&gt; <br />&lt;list&gt; <br />&lt;ref bean=”secureChannelProcessor”/&gt; <br />&lt;ref bean=”insecureChannelProcessor”/&gt; <br />&lt;/list&gt; <br />&lt;/property&gt; <br />&lt;/bean&gt; <br />&lt;bean id=”secureChannelProcessor” class=”net.sf.acegisecurity.securechannel.SecureChannelProcessor”/&gt; <br />&lt;bean id=”insecureChannelProcessor” class=”net.sf.acegisecurity.securechannel.InsecureChannelProcessor”/&gt;</p>
				<p>[缺少了什么？] <br />Acegi目前提供了两种”secure object”，分别对页面和方法进行安全认证管理，我这里介绍的只是利用 <br />FilterSecurityInterceptor对访问页面的权限控制，除此之外，Acegi还提供了另外一个Interceptor– <br />MethodSecurityInterceptor，它结合runAsManager可实现对对象中的方法的权限控制，使用方法可参看Acegi自带的文档 <br />和contact范例。</p>
				<p>[最后要说的] <br />本来以为只是说明如何使用Acegi而已，应该非常简单，但真正写起来才发现想要条理清楚的理顺所有需要的bean还是很 <br />困难的，但愿我没有遗漏太多东西，如果我的文章有什么遗漏或错误的话，还请参看Acegi自带的quick-start范例，但请 <br />注意，这个范例是不能直接拿来用的。</p>
				<p>原文在这里：</p>
				<p>Trackback: <a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=54881">http://tb.blog.csdn.net/TrackBack.aspx?PostId=54881</a></p>
		</blockquote>
<img src ="http://www.blogjava.net/rendong/aggbug/89774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-24 20:05 <a href="http://www.blogjava.net/rendong/archive/2006/12/24/89774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate 文档</title><link>http://www.blogjava.net/rendong/archive/2006/12/02/85075.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Sat, 02 Dec 2006 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/02/85075.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/85075.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/02/85075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/85075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/85075.html</trackback:ping><description><![CDATA[
		<a href="http://www.hibernate.org/hib_docs/v3/reference/en/pdf/hibernate_reference.pdf">http://www.hibernate.org/hib_docs/v3/reference/en/pdf/hibernate_reference.pdf</a>
<img src ="http://www.blogjava.net/rendong/aggbug/85075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-02 20:03 <a href="http://www.blogjava.net/rendong/archive/2006/12/02/85075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c3p0</title><link>http://www.blogjava.net/rendong/archive/2006/12/02/85058.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Sat, 02 Dec 2006 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/02/85058.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/85058.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/02/85058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/85058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/85058.html</trackback:ping><description><![CDATA[&lt;hibernate-configuration&gt; <br />&lt;session-factory&gt; 
<p>&lt;property name="dialect"&gt;org.hibernate.dialect.Oracle9Dialect&lt;/property&gt; <br />&lt;property name="show_sql"&gt;true&lt;/property&gt; <br />&lt;property name="current_session_context_class"&gt;thread&lt;/property&gt; <br />&lt;!--Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数--&gt; <br />&lt;property name="jdbc.fetch_size"&gt;20&lt;/property&gt; <br />&lt;!--Batch Size是设定对数据库进行批量删除，批量更新和批量插入的时候的批次大小，有点相当于设置Buffer缓冲区大小的意思--&gt; <br />&lt;property name="jdbc.batch_size "&gt;20&lt;/property&gt; <br />&lt;property name="connection.username"&gt;HNMC&lt;/property&gt; <br />&lt;property name="connection.password"&gt;sundy&lt;/property&gt; <br />&lt;property name="connection.url"&gt;jdbc:oracle:thin:@192.168.0.20:1521:ora9&lt;/property&gt; <br />&lt;property name="connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt;</p><p>&lt;!--  在这种情况下，没问题啊 --&gt;<br />&lt;property name="c3p0.timeout"&gt;60&lt;/property&gt; <br />&lt;property name="c3p0.idle_test_period"&gt;600&lt;/property&gt;<br /><br /><br />&lt;!--     <br /></p><p>&lt;!--&lt;property name="c3p0.idle_test_period"&gt;120&lt;/property&gt;--&gt; <br />如改以下俩值，或他们差距很大：</p><p>&lt;property name="c3p0.timeout"&gt;600&lt;/property&gt;</p><p>&lt;!--&lt;property name="c3p0.idle_test_period"&gt;60&lt;/property&gt;--&gt;</p><p>当我启动tomcat，运行程序后，空闲600后出现下列异常,但程序还照常运行<br /><br />--&gt;<br /><br />&lt;!--  </p><p>Hibernate里可以设置的属性不多： <br />#c3p0-native property name hibernate configuration key <br />#c3p0.acquireIncrement hibernate.c3p0.acquire_increment <br />#c3p0.idleConnectionTestPeriod hibernate.c3p0.idle_test_period <br />#c3p0.initialPoolSize not available -- uses minimum size <br />#c3p0.maxIdleTime hibernate.c3p0.timeout <br />#c3p0.maxPoolSize hibernate.c3p0.max_size <br />#c3p0.maxStatements hibernate.c3p0.max_statements <br />#c3p0.minPoolSize hibernate.c3p0.min_size <br />#c3p0.testConnectionsOnCheckout hibernate.c3p0.validate hibernate 2.x only!</p><p>另外的属性你需要配置c3p0.properties <br />比如： <br />c3p0.acquireRetryDelay=111 <br />c3p0.acquireRetryAttempts=22 <br />c3p0.breakAfterAcquireFailure=true<br /><br />--&gt;<br /><br /><br /><br />&lt;property name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/property&gt; <br />&lt;property name="hibernate.c3p0.max_size"&gt;2&lt;/property&gt; <br />&lt;property name="hibernate.c3p0.min_size"&gt;2&lt;/property&gt; <br />&lt;property name="hibernate.c3p0.timeout"&gt;50000&lt;/property&gt; <br />&lt;property name="hibernate.c3p0.max_statements"&gt;100&lt;/property&gt; <br />&lt;property name="hibernate.c3p0.idle_test_period"&gt;3000&lt;/property&gt; <br />&lt;property name="hibernate.c3p0.acquire_increment"&gt;2&lt;/property&gt; <br /><br />&lt;!-- 另&lt;property name="hibernate.c3p0.validate"&gt;false&lt;/property&gt;确实在hibernate中不可设置  --&gt;<br />&lt;property name="hibernate.c3p0.validate"&gt;false&lt;/property&gt;<br /><br /><br />&lt;!--C3P0 setting--&gt;</p><p>&lt;property name="c3p0.max_size"&gt;20&lt;/property&gt; <br />&lt;property name="c3p0.min_size"&gt;5&lt;/property&gt; <br />&lt;!--获取连接的等待时间--&gt; <br />&lt;property name="c3p0.timeout"&gt;3600&lt;/property&gt; <br />&lt;property name="c3p0.max_statements"&gt;100&lt;/property&gt; <br />&lt;!--每隔3600毫秒测试连接是否可以正常使用--&gt; <br />&lt;property name="c3p0.idle_test_period"&gt;3600&lt;/property&gt; <br />&lt;property name="c3p0.acquire_increment"&gt;2&lt;/property&gt;</p><p>&lt;mapping resource="com/sundy/hnmc/beans/AccountBean.hbm.xml"/&gt; <br />&lt;/session-factory&gt; <br />&lt;/hibernate-configuration&gt; <br /><br /><br /><br />另一个设置<br /> <span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"> 数据源配置 </span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="dataSource"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.mchange.v2.c3p0.ComboPooledDataSource"</span><span style="COLOR: #ff0000"> destroy-method</span><span style="COLOR: #0000ff">="close"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="driverClass"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">org.gjt.mm.mysql.Driver</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="jdbcUrl"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">jdbc:mysql://localhost/tycho?useUnicode=true</span><span style="COLOR: #ff0000">&amp;amp;</span><span style="COLOR: #000000">characterEncoding=utf-8</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="properties"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="hibernate.hbm2ddl.auto"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">update</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="c3p0.minPoolSize"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="hc3p0.maxPoolSize"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">10</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="hc3p0.timeout"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">60</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="c3p0.max_statement"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">50</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="c3p0.testConnectionOnCheckout"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="hibernate.c3p0.testConnectionOnCheckout"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">false</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="user"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">root</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="password"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">root</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;<br /><br /><br /><br /><font color="#000000">&lt;property name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/property&gt;<br />&lt;property name="hibernate.c3p0.max_size"&gt;20&lt;/property&gt;<br />&lt;property name="hibernate.c3p0.min_size"&gt;5&lt;/property&gt;<br />&lt;property name="hibernate.c3p0.timeout"&gt;120&lt;/property&gt;<br />&lt;property name="hibernate.c3p0.max_statements"&gt;100&lt;/property&gt;<br />&lt;property name="hibernate.c3p0.idle_test_period"&gt;120&lt;/property&gt;<br />&lt;property name="hibernate.c3p0.acquire_increment"&gt;2&lt;/property&gt; </font><br /><br /></span></p><p><span style="COLOR: #0000ff"></span> </p><p><span style="COLOR: #0000ff"></span> </p><p><span style="COLOR: #0000ff"></span> </p><p><span style="COLOR: #0000ff"> </span></p><img src ="http://www.blogjava.net/rendong/aggbug/85058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-02 17:32 <a href="http://www.blogjava.net/rendong/archive/2006/12/02/85058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache负载</title><link>http://www.blogjava.net/rendong/archive/2006/12/02/85047.html</link><dc:creator>rendong</dc:creator><author>rendong</author><pubDate>Sat, 02 Dec 2006 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/rendong/archive/2006/12/02/85047.html</guid><wfw:comment>http://www.blogjava.net/rendong/comments/85047.html</wfw:comment><comments>http://www.blogjava.net/rendong/archive/2006/12/02/85047.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rendong/comments/commentRss/85047.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rendong/services/trackbacks/85047.html</trackback:ping><description><![CDATA[
		<ol>
				<li class="">
						<span>LoadModule proxy_module modules/mod_proxy.so   </span>
				</li>
				<li class="alt">
						<span>LoadModule proxy_ajp_module modules/mod_proxy_ajp.so   </span>
				</li>
				<li class="">
						<span>LoadModule proxy_balancer_module modules/mod_proxy_balancer.so   </span>
				</li>
				<li class="alt">
						<span>  </span>
				</li>
				<li class="">
						<span>ProxyPass /admin balancer://tomcatcluster/admin </span>
						<span class="attribute">lbmethod</span>
						<span>=</span>
						<span class="attribute-value">byrequests</span>
						<span> </span>
						<span class="attribute">stickysession</span>
						<span>=</span>
						<span class="attribute-value">JSESSIONID</span>
						<span> </span>
						<span class="attribute">nofailover</span>
						<span>=</span>
						<span class="attribute-value">Off</span>
						<span> </span>
						<span class="attribute">timeout</span>
						<span>=</span>
						<span class="attribute-value">5</span>
						<span> </span>
						<span class="attribute">maxattempts</span>
						<span>=</span>
						<span class="attribute-value">3</span>
						<span>  </span>
				</li>
				<li class="alt">
						<span>ProxyPassReverse /admin balancer://tomcatcluster/admin   </span>
				</li>
				<li class="">
						<span>  </span>
				</li>
				<li class="alt">
						<span>
						</span>
						<span class="tag">&lt;</span>
						<span class="tag-name">Proxy</span>
						<span> balancer://tomcatcluster</span>
						<span class="tag">&gt;</span>
						<span>  </span>
				</li>
				<li class="">
						<span>BalancerMember ajp://localhost:8009 </span>
						<span class="attribute">route</span>
						<span>=</span>
						<span class="attribute-value">web1</span>
						<span>  </span>
				</li>
				<li class="alt">
						<span>BalancerMember ajp://localhost:10009 </span>
						<span class="attribute">smax</span>
						<span>=</span>
						<span class="attribute-value">10</span>
						<span> </span>
						<span class="attribute">route</span>
						<span>=</span>
						<span class="attribute-value">web2</span>
						<span>  </span>
				</li>
				<li class="">
						<span>BalancerMember ajp://localhost:11009 </span>
						<span class="attribute">route</span>
						<span>=</span>
						<span class="attribute-value">web3</span>
						<span>  </span>
				</li>
				<li class="alt">
						<span>BalancerMember ajp://localhost:12009 </span>
						<span class="attribute">smax</span>
						<span>=</span>
						<span class="attribute-value">10</span>
						<span> </span>
						<span class="attribute">route</span>
						<span>=</span>
						<span class="attribute-value">web4</span>
						<span>  </span>
				</li>
				<li class="">
						<span>
						</span>
						<span class="tag">&lt;/</span>
						<span class="tag-name">Proxy</span>
						<span class="tag">&gt;</span>
						<span>  </span>
				</li>
		</ol>
<img src ="http://www.blogjava.net/rendong/aggbug/85047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rendong/" target="_blank">rendong</a> 2006-12-02 16:58 <a href="http://www.blogjava.net/rendong/archive/2006/12/02/85047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>