﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-刘文涛-随笔分类-java 开源框架</title><link>http://www.blogjava.net/liuwentao253/category/10172.html</link><description>I am a coder</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:55:17 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:55:17 GMT</pubDate><ttl>60</ttl><item><title>主流企业应用框架中大都包含对以下问题的现成解决方案：</title><link>http://www.blogjava.net/liuwentao253/archive/2007/01/31/96984.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 31 Jan 2007 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/01/31/96984.html</guid><description><![CDATA[目前，主流企业应用框架中大都包含对以下问题的现成解决方案： <br />* 持久性（persistence）：实现数据存储、处理，数据与对象映射，数据缓存（caching）。 <br />* 事务（transaction）：确保一组关联操作正常、完整的执行。 <br />* 安全性（security）：保证系统的通信安全、数据安全。 <br />* 负载均衡（load balance）：在大量并发访问时，保持系统可用。 <br />* 监控（system monitoring/management）：监控系统运行状况，设置系统参数。 <br />* 日志（logging）：记录系统运行情况和异常，记录特定用户操作。 <br />* 应用集成 （application integration）：与其他系统、应用程序集成。 <br />* 认证/权限/组织角色管理（authentication/authorization）：管理系统用户、组织职权结构，限制特定用户对特定功能、特定数据的访问。 <br />* 业务模型（domain model）：管理系统中业务对象的属性、字段。 <br />* 业务逻辑（business logic/rules）：实现业务规则和业务逻辑。 <br />* 工作流（work flow）：实现多用户、多环节之间的业务处理流程。 <br />* 文件管理（file management）：管理文档，实现系统内部的文件传递。 <br />* 报表/打印 （reporting/printing）：实现数据打印，实现报表的定制和输出。 <br />* 门户/信息发布 （portal solution）：发布企业相关的信息、新闻，提供企业客户的访问入口。 <br />* 通信（communication/messaging）：系统内部的消息、通知；系统与外部角色（比如企业客户）之间通过不同通信媒介（电话、网站、邮件等）的互动。 <br /><img src ="http://www.blogjava.net/liuwentao253/aggbug/96984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-01-31 15:23 <a href="http://www.blogjava.net/liuwentao253/archive/2007/01/31/96984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是模式？什么是框架？</title><link>http://www.blogjava.net/liuwentao253/archive/2006/11/15/81214.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 15 Nov 2006 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/11/15/81214.html</guid><description><![CDATA[
		<p>1．什么是模式？<br />模式，即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度，那就是模式。</p>
		<p>Alexander给出的经典定义是：每个模式都描述了一个在我们的环境中不断出现的问题，然后描述了该问题的解决方案的核心。通过这种方式，你可以无数次地使用那些已有的解决方案，无需在重复相同的工作。</p>
		<p>模式有不同的领域，建筑领域有建筑模式，软件设计领域也有设计模式。当一个领域逐渐成熟的时候，自然会出现很多模式。</p>
		<p>什么是框架？<br />框架，即framework。其实就是某种应用的半成品，就是一组组件，供你选用完成你自己的系统。简单说就是使用别人搭好的舞台，你来做表演。而且，框架一般是成熟的，不断升级的软件。</p>
		<p>2．为什么要用模式？<br />因为模式是一种指导，在一个良好的指导下，有助于你完成任务，有助于你作出一个优良的设计方案，达到事半功倍的效果。而且会得到解决问题的最佳办法。</p>
		<p>为什么要用框架？<br />因为软件系统发展到今天已经很复杂了，特别是服务器端软件，设计到的知识，内容，问题太多。在某些方面使用别人成熟的框架，就相当于让别人帮你完成一些基础工作，你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟，稳健的，他可以处理系统很多细节问题，比如，事物处理，安全性，数据流控制等问题。还有框架一般都经过很多人使用，所以结构很好，所以扩展性也很好，而且它是不断升级的，你可以直接享受别人升级代码带来的好处。<br />框架一般处在低层应用平台（如J2EE）和高层业务逻辑之间的中间层。</p>
		<p>软件为什么要分层？<br />为了实现“高内聚、低耦合”。把问题划分开来各个解决，易于控制，易于延展，易于分配资源…总之好处很多啦：）。</p>
		<p>3．以下所述主要是JAVA，J2EE方面的模式和框架：<br />常见的设计模式有什么？<br />首先，你要了解的是GOF的《设计模式--可复用面向对象软件的基础》一书（这个可以说是程序员必备的了），注意：GOF不是一个人，而是指四个人。它的原意是Gangs Of Four,就是“四人帮”，就是指此书的四个作者：Erich Gamma,Richard Helm，Ralph Johnson,John Vlissides。这本书讲了23种主要的模式，包括：抽象工厂、适配器、外观模式等。<br />还有其他的很多模式，估计有100多种。</p>
		<p>软件设计模式太多，就我的理解简单说一下最常见的MVC模式。<br />MVC模式是1996年由Buschmann提出的：<br />模型（Model）：就是封装数据和所有基于对这些数据的操作。<br />视图（View）：就是封装的是对数据显示，即用户界面。<br />控制器（Control）：就是封装外界作用于模型的操作和对数据流向的控制等。</p>
		<p>另外：<br />RUP（Rational Unified Process）软件统一过程，XP（Extreme Programming）极端编程，这些通常被叫做“过程方法”，是一种软件项目实施过程的方法论，它是针对软件项目的实施过程提出的方法策略。也是另一个角度的模式。</p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/81214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-11-15 12:21 <a href="http://www.blogjava.net/liuwentao253/archive/2006/11/15/81214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于连接池</title><link>http://www.blogjava.net/liuwentao253/archive/2006/11/03/78854.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Fri, 03 Nov 2006 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/11/03/78854.html</guid><description><![CDATA[
		<p>接下来我们来配置在Tomcat和Hibernate<font color="#0000ff"><strong>中共用的</strong></font>数据库连接池。也就是说Tomcat会提供经过池处理的<strong><font color="#0000ff">JDBC连接</font></strong>（用它内置的<font color="#0000ff"><strong>DBCP连接池</strong></font>），Hibernate通过JNDI方式来请求获得JDBC连接。作为替代方案，你也可以让Hibernate自行管理连接池。Tomcat把连接池绑定到JNDI,我们要在Tomcat的主配置文件（<tt class="literal">TOMCAT/conf/server.xml</tt>）中加一个资源声明: <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">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Context path</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/quickstart</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> docBase</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">quickstart</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Resource name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">jdbc/quickstart</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> scope</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Shareable</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> type</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">javax.sql.DataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">ResourceParams name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">jdbc/quickstart</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">factory</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">org.apache.commons.dbcp.BasicDataSourceFactory</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;!--</span>
				<span style="COLOR: #000000"> DBCP database connection settings </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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">jdbc:postgresql:</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">localhost/quickstart&lt;/value&gt;</span>
				<span style="COLOR: #008000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #000000">        </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">parameter</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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">driverClassName</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</span>
				<span style="COLOR: #000000">&gt;&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">org.postgresql.Driver</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">username</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">quickstart</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">password</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">secret</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #000000">&lt;!--</span>
				<span style="COLOR: #000000"> DBCP connection pooling options </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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">maxWait</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">3000</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">maxIdle</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">100</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</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">parameter</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">name</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">maxActive</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">name</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">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">10</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</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">parameter</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">ResourceParams</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">Context</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/78854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-11-03 10:00 <a href="http://www.blogjava.net/liuwentao253/archive/2006/11/03/78854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 中的悲观锁和乐观锁的实现</title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/20/53934.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 20 Jun 2006 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/20/53934.html</guid><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/liuwentao253/aggbug/53934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-20 11:42 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/20/53934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate hates Spring </title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/04/50240.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sun, 04 Jun 2006 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/04/50240.html</guid><description><![CDATA[
		<span class="postbody">
				<a href="http://houseofhaug.net/blog/archives/2005/08/12/hibernate-hates-spring/" target="_blank">http://houseofhaug.net/blog/archives/2005/08/12/hibernate-hates-spring/</a>
				<br />
				<br />一个由org.springframwork.orm 设计而展开的论战,spring和hibernate的不和已经是大家共知的事实．今天的一场大战可谓惊心动魄，先后很多重量级的人物参加．最后<font color="#0000ff"><strong>Gavin King</strong></font>那个臭脾气又让大家骂了一通．<br /><br />主要有几个观点: <br /><br />1.spring提供的hibernate的模板的问题. <br /><br />hibernate团队认为,spring提供的hibernate的模板是欺骗,没意义. <br /><br />spring团队认为,他们开发的TEMPLATE减少了用户的代码量.并指责hibnate不为用户考虑. <br /><br />hibernate团队回应,他们已做了这样的工作了,就是使用JBOSS的EJB3或hibernate的实体(EJB的 CMP). <br /><br /><br />2.Spring和EJB的问题 <br /><br />Hibernate团队认为EJB必定成功,并且可以用JBOSS <br />独立的EJB容器插件,和别的JSP容器结合. <br /><br />spring则反之.认为Hibernate是个怪物. <br /><br /><br />---- Hibernate和Spring之争对我们的影响. <br /><br />1. JAVAEYE论坛上的社区人员,大多数是反EJB的,并且论坛以HIBERNATE技术为主, 现在HIBERNATE的开发团队投到EJB一方去了. <br />并且HIBERNATE越来越象EJB了,出了个什么HibernateEntiy越看越象EJB. <br /><br />2. 很多人使用 spring+hibernate技术模式,现在两家吵起来了,以后可Spring可能不做Hibernate的整合.程序升级成了问题.<br /><br />--------------------------------------------------------------------------<br /><br />你的观点全都是错的！ 这个问题已经充分讨论过了，还是先看帖子再说话。 <br /><br /><a href="http://forum.javaeye.com/viewtopic.php?t=16363" target="_blank">http://forum.javaeye.com/viewtopic.php?t=16363</a><br /><br />Hibernate和Spring之争，本质上是<font color="#0000ff"><strong>JBoss EJB3容器</strong></font>和<font color="#0000ff"><strong>Spring容器</strong></font>之争。因为Spring容器在开源框架领域是JBoss EJB3容器的最大直接竞争对手，所以JBoss要打击Spring的目的是非常明确而且直接的。 <br /><br /><font color="#0000ff"><strong>JBoss EJB3容器</strong></font>虽然和<font color="#0000ff"><strong>BEA，IBM，Oracle的EJB3容器</strong></font>也会有竞争关系，但是他们面向的市场重叠性很低（前者面向中低端市场，开源领域，后者面向高端商业市场），反而和Spring容器面向的市场高度重叠，所以斗争是注定不可避免的。 <br /><br />还有很重要的一点，在吸引开源以及轻量级容器爱好者方面，JBoss EJB3和Spring也有直接的冲突！BEA和IBM注定不会提供嵌入式的EJB3容器，而Oracle注定不会提供开源版本的EJB3容器，因此JBoss和他们不存在直接竞争关系。<span style="COLOR: red">对于像我们这样的比较倾向开源和轻量级的开发人员来说，选择容器往往可以不在乎它是不是业界标准，但是非常在乎它是否开源，是否轻量级！</span>而JBoss和Spring都具备这样的条件，最要命的是，现在两家都是商业公司了，商业行为决定了他们必须斗争。不过这并不意味着Spring不再支持Hibernate（如果那样的话，Spring将失去大部分支持者），相反，Spring会一如既往的提供对Hibernate的良好支持。 <br /><br />对于我们来说，我们将在Spring之外多了一种选择，既可以选择使用Spring 搭配Hibernate，也可以选择使用嵌入式版本的JBoss EJB3容器，对于开发者来说，是件好事，而不是坏事，竞争可以促使双方不断改进自己的框架。 <br /><br />最后要说的是，JBoss EJB3和Spring虽然存在竞争，但是也有非常多不相重叠的部分，例如<font color="#0000ff"><strong>Spring额外提供了很多流行开源框架的整合的方便接口，这一点是EJB3不具备的</strong></font>。</span>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/50240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-04 11:39 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/04/50240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE5到底有什么系列:JPA 1.0 </title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/04/50205.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sun, 04 Jun 2006 00:28:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/04/50205.html</guid><description><![CDATA[
		<span class="postbody">Java EE5作为新一代Java企业开发平台的规范，从开始设计就引来了整个java开发社区的注目，引起无数的辩论和带来了众多的期盼。Java EE5作为J2EE平台诞生几近6年后的第4代规范重点关注的是目前java开发的几个热点：开发效率，运行效率和企业应用整合。目标也是让J2EE开发简单，简单再简单。那我们就看看J2EE5规范到底有什么，是否真的能给开发者/企业带来真正的实惠？ <br /><br />Java EE5规范是一个所谓的雨伞规范(Umbrella)，在其下是一系列的子规范,主要包括：<br /> <br />EJB 3.0 (JSR 220) <br /><font color="#0000ff"><strong>Java Persistence API 1.0 (JSR 220)</strong></font><br />JSP 2.1 (JSR 245) <br />JSF 1.2 (JSR 252) <br />JAX-WS 2.0 (JSR 224) <br />StAX 1.0 (JSR 173) <br />JAXB 2.0 (JSR 222) <br />Web Services Annotations 1.0 (JSR 181) <br />Common Annotations 1.0 (JSR 250) <br />SAAJ 1.3 maintenance JTA 1.1 maintenance <br />JavaMail 1.4 &amp; JAF 1.1 maintenance <br />JSTL 1.2 maintenance <br />Java EE Mgmt maintenance <br />JACC maintenance <br />Servlet maintenance <br />Java EE Deployment maintenance <br />WSEE maintenance <br /><br />Java Persistence API 1.0( EJB3 Entity Bean) 在Java EE5中, Entity Bean做为EJB规范中负责持久化的组件将逐渐成为一个历史名词了，作为J2EE 4规范中最为人所垢病的Entity Bean在Java EE5中被推到重来，取而代之的是java开发的通用持久化规范Java Persistence API 1.0, 其实就是完全重新定义了的Entity Bean规范（目前在很多场合中，由于历史原因我们仍然使用ejb3持久化来称呼这个规范）。JPA作为java中负责关系数据持久化的组件已经完全独立出来成为一个单独的规范，而不再属于Enterprise Java Bean的范畴(EJB更多的是指Stateless/Stateful session bean和Message Driven Bean)。 <br /><br />Java Persistence AP(JPA)可以说是java持久化技术的一个集大成者，它吸取了Hiberante,JDO,TopLink等优秀技术和框架，将这几年发展成熟起来的基于POJO模型的O/R Mapping技术标准化，成为在J2EE和J2SE环境中通用的java持久化API。值得注意的是Java Persistence API并不是J2EE环境专用，而是在java中的通用API。意味着我们可以在任何需要访问关系数据库的地方使用JPA，甚至包括swing开发的桌面应用。JPA也不要求一定在J2EE容器中才能运行，而是任何有JVM的环境都可以运用。 这就使得我们可以很容易的把JPA作为一个持久化组件自由地和各种容器／框架（EJB3容器, Spring等等）组合。 <br /><br />JPA如何简化原来EJB2中Entity Bean的开发，看一个简单对比：</span>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/50205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-04 08:28 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/04/50205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork2.2.1正式发布 </title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/03/50132.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sat, 03 Jun 2006 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/03/50132.html</guid><description><![CDATA[
		<span class="postbody">
				<a class="" title="http://www.opensymphony.com/webwork/" href="http://www.opensymphony.com/webwork/" target="">http://www.opensymphony.com/webwork/</a>
				<br />
				<br />修改了一堆2.2发行以来大大小小的bug，使用2.2开发项目的朋友一定要升级。</span>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/50132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-03 15:35 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/03/50132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web框架的统一努力 </title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/02/50006.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Fri, 02 Jun 2006 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/02/50006.html</guid><description><![CDATA[
		<span class="postbody">Java Web框架种类繁多，花样迭出，主流一点的就有Struts，Webwork，SpringMVC，JSF，Tapestry，至于非主流的就更加不计其数了。还有很多基于这些框架的衍生框架，例如基于Struts的beehive，基于JSF的JBoss Seam，基于JSF的MyFaces，Shale等等。对于开发人员来说，过多的选择是一种沉重的负担，不但需要花更多的时间去学习，也需要更多的时间去维护基于不同框架的代码。 <br /><br />由于面临着".net"统一的web框架webforms以及异军突起的rails的强势挑战，Java业界也感受到竞争的丝丝寒意，这不，众多Java Web框架的核心开发人员终于可以坐到一起，商量着Web框架的统一和互操作的问题了。 <br /><br /><a href="http://opensource2.atlassian.com/confluence/oss/display/WAG/Home" target="_blank">http://opensource2.atlassian.com/confluence/oss/display/WAG/Home</a><br /><br />由众多Java Web框架的开发人员组成的一个团队……Java Web Alignment Group，这其中包括了Struts，Webwork，JSF，Beehive，JBoss Seam，Spring MVC等众多框架核心开发人员组成，目标则是加强交流和合作，促进各个Web框架之间的协作，给Java开发人员提供尽量方便的解决方案。 <br /><br />他们讨论的内容在Yahoo Group：http://groups.yahoo.com/group/java_web_alignment/ <br />加入这个mailist需要批准。 <br /><br />目前这个Group的讨论已经得到了一个显著的进步：struts，webwork和beehive的合并！ <br /><br />我们知道Web框架主流上分为两类：<br /><br /><font color="#ff0000">MVC</font><font color="#000000">框架</font>   和 <font color="#ff0000">事件响应机制</font>框架。<br /><br />MVC框架有Struts，Webwork，Spring MVC，以及一些基于这些框架的框架，如Spring Webflow， Beehive等等；<br /><br />事件框架有JSF，Tapestry，Echo等。<br /><br />除此之外，还有一些连接两者的框架，如Struts Shale等等。 <br /><br />经过一段时间的讨论，Struts，Webwork和beehive三方宣布合并，共同发展下一代MVC模式的MVC框架……<font color="#0000ff">Struts Ti</font>。<br /><br />它将主要以Webwork为核心，集成Beehive的annotataion和pageflow功能，<br />推向Struts用户群体，并且加强和JSF的集成能力。 <br /><br />这次合并的前景是值得期待的，在MVC领域，主流的选择将在Struts Ti和Spring MVC之间。不过从目前的情况来看，Struts Ti不会进一步和Spring MVC进行合并。Spring MVC的开发人员希望保护现有的Spring MVC合作伙伴和客户，以及在Spring webflow上面的巨大投入。 <br /><br />让我们期待该组织的更进一步的成果吧</span>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/50006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-02 17:34 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/02/50006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>