﻿<?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-LifeNote </title><link>http://www.blogjava.net/lifenote/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 04:04:21 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 04:04:21 GMT</pubDate><ttl>60</ttl><item><title>迎奥运，抗雪灾，援震灾</title><link>http://www.blogjava.net/lifenote/archive/2008/05/14/200367.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 14 May 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/05/14/200367.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/200367.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/05/14/200367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/200367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/200367.html</trackback:ping><description><![CDATA[<div style="float: left"><script type="text/javascript"><!--
google_ad_client = "pub-4636496036365579";
/* 钱本草300x250, 创建于 08-4-2 */
google_ad_slot = "5946777016";
google_ad_width = 300;
google_ad_height = 250;
//-->
</script><script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今年中国实在多灾多难，2008注定是特别的一年，先是年前南方五十年不遇的特大雪灾，春天般的温暖刚刚融化了南方的暴雪，紧接着是西藏骚乱，整个西方都在谴责中国，为了阻止中国奥运还有人抢奥运火炬。接下来火车又出现大事故，胶济铁路两列火车相撞导致火车出轨，然后是全国数万人感染手足口病，现在则是几十年一遇的特大地震，地震达到了1976年唐山大地震的震级。五个月时间，各种天灾人祸纷纷上演。。。看来，2008的中国依真是多灾多难啊。我们真心的希望灾难就截止在2008年的5月这场大地震吧！
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一场里氏7.8级的特大地震昨天14时28分在中国的四川省<a href="http://news.sina.com.cn/z/08earthquake/index.shtml">爆发</a>，台湾媒体用&#8221;半个亚洲&#8221;形容这次地壳晃动的波及面，直接有震感的地区远及泰国的曼谷和越南的河内。截止现在为止，死亡人数接近10000人。震级与32年前唐山大地震相同，相当于400颗美国1945年投在广岛的原子弹，四川现在是什么样的了，在这里阿草哥通过<a href="http://www.taobao.com/onefound/1jijin.php" target="_blank">支付宝</a>的<a href="http://www.taobao.com/onefound/1jijin.php" target="_blank">李连杰壹基金计划</a>&nbsp; 想震灾人民捐赠50元人民币 钱不多但希望通过我自己的一份力量支援灾区</p>
<p>&nbsp;&nbsp;&nbsp; 最后让我们一起祈祷吧，2008年从此一切顺利！</p>
<p>补充一下：终于接到了个feedsky的话题还是个<a href="http://review.feedsky.com/review/feedsky/sunxc/~/txt/171/r.html" target="_blank">公益话题</a>的，顺便就拿这个当作话题广告吧！<img style="width: 104px; height: 15px" height="15" alt="" src="http://review.feedsky.com/review/feedsky/sunxc/~/img/171/cw.gif" width="104" border="0" /></p><img src ="http://www.blogjava.net/lifenote/aggbug/200367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-05-14 11:25 <a href="http://www.blogjava.net/lifenote/archive/2008/05/14/200367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>奥运火炬传全球</title><link>http://www.blogjava.net/lifenote/archive/2008/04/25/195854.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 25 Apr 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/04/25/195854.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/195854.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/04/25/195854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/195854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/195854.html</trackback:ping><description><![CDATA[<img height="15" alt="" src="http://review.feedsky.com/review/feedsky/sunxc/~/img/170/cw.gif " width="104" border="0" />很就没有收到<a href="http://www.feedsky.com/" target="_blank">feedsky</a>的话题广告了，昨天发现GTalk弹出一个提示feedsky话题广告，非常高兴，于是豪不犹豫的接受了这个话题广告！<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在今年 3 月底完成希腊雅典点火与北京交接仪式之后，2008 全球火炬接力已经开始了它经历世界 134 个城市、长达四个月的接力旅程，以完成在全球传递友谊与和平讯息的使命。为此，Google 携手本届运动会的官方互联网转播机构央视国际 CCTV.com , 推出简体中文版的&#8221; <a href="http://review.feedsky.com/review/feedsky/sunxc/~/txt/170/r.html " target="_blank">2008全球火炬接力报道路线图</a>&#8220;(测试版本)。中文繁体以及英、法、西、意、荷等其它五种语言的版本也将于近日在全球推出，以方便世界各国的人们通过 Google 地图产品与技术平台, 来追踪圣火传递路线，畅游接力途经全部城市，并在线观看来自 CCTV.com 的每一地的接力视频<br />
<strong>关于这一路线图的亮点：</strong><br />
1.<strong>全程路线追踪：</strong>你将可以随着它，清晰看到接力全程路线和到达日期，其中的红色路线代表接力已经走过的部分。<br />
2.<strong>城市详情：</strong>点击图中的每个城市点或者右侧的城市列表，一个小窗口会打开，你可以在这里了解接力路线上这一城市的基本状况、浏览城市风景图片，以及层层推进看到这个城市详细的地图。点击其中的相关链接如&#8221;更多城市图片&#8221;，你还可以直接看到用这个城市名在谷歌搜索图片的结果。如果您要了解更多的内容请<a href="http://googlechinablog.com/2008/04/googlecctvcom-2008.html" target="_blank">点击这里</a>
<p>以下是本站的<a href="http://review.feedsky.com/review/feedsky/sunxc/~/txt/170/r.html " target="_blank"><a href="http://review.feedsky.com/review/feedsky/qbencao/~/txt/170/r.html" target="_blank">2008全球火炬接力报道路线图</a><br />
</a></p>
<iframe name="torch_relay_map_api" src="http://torch2008.googlecode.com/svn/trunk/maps/torch.html#utm_source=fblog&utm_medium=blog&utm_content=fblogger&utm_campaign=torchrelay1 <http://torch2008.googlecode.com/svn/trunk/maps/torch.html?utm_source=fblog&utm_medium=blog&utm_content=fblogger&utm_campaign=torchrelay1>" width="760px" height="520px" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" /></iframe> <img src ="http://www.blogjava.net/lifenote/aggbug/195854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-04-25 10:08 <a href="http://www.blogjava.net/lifenote/archive/2008/04/25/195854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse下的Java反编译插件：Jode Decompiler</title><link>http://www.blogjava.net/lifenote/archive/2008/04/24/195588.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 24 Apr 2008 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/04/24/195588.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/195588.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/04/24/195588.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/195588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/195588.html</trackback:ping><description><![CDATA[这个工具感觉非常方便 介绍给大家<br />
安装方法： <br />
&nbsp;&nbsp;&nbsp;&nbsp;help =&gt; Software Updates =&gt; Find and Install... =&gt; Search for new features to install,单击"New Remote Site..." 在URL栏输入 <a onclick="showLinkBubble(this);return false" href="http://www.technoetic.com/eclipse/update" target="_blank" link="http://www.technoetic.com/eclipse/update">http://www.technoetic.com/eclipse/update</a><wbr>.然后下一步，就可以看到&#8220;jode decompiler plugin *.*&#8221;，选上安装就可以了。 <br />
<br />
安装好后可以看到Window =&gt; Preferences... =&gt; Java =&gt; Jode Decompiler选项卡。 <br />
<br />
配置：Window =&gt; Preferences... =&gt; General =&gt; Editors =&gt; File Associations找到"*.class"在"Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮. <br />
<br />
在Eclipse中展开jar文件,双击class文件即可看到反编译之后的源代码.<br />
<script type="text/javascript"><!--
google_ad_client = "pub-4636496036365579";
/* 468x15, 创建于 08-3-15 */
google_ad_slot = "8335100285";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script><script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<img src ="http://www.blogjava.net/lifenote/aggbug/195588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-04-24 15:05 <a href="http://www.blogjava.net/lifenote/archive/2008/04/24/195588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java数据库操作基本流程</title><link>http://www.blogjava.net/lifenote/archive/2008/04/24/195431.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 24 Apr 2008 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/04/24/195431.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/195431.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/04/24/195431.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/195431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/195431.html</trackback:ping><description><![CDATA[<div class="NewsContent" id="NewsContentLabel"><span class="t18"><span class="a14c" id="zoom"><font face="Times New Roman" size="3">1.Java数据库操作基本流程<br />
a .数据库连接1.Drivermanager 链接数据库<br />
String className,url,uid,pwd;<br />
className="Oracle.jdbc.driver.OracleDriver";<br />
uid="scott";<br />
pwd="tiger";<br />
url="jdbc:oracle:thin:@localhost:1521:ora92";<br />
Class.forName(classname);<br />
Connection conn=DriverManager.getConnection(url,uid,pwd);<br />
2.JNDI链接数据库<br />
String jndi ="jdbc/db"; //&nbsp; e20-040 9L0-609 数据源的名称<br />
//context是一组名称到对象的绑定组成<br />
Hashtable env=new Hashtable ();<br />
Context ctx=(Context)new InitialContext.lookup("env");// 获得数据源所在的上下文点的对象<br />
DataSource ds=(DataSource)ctx.lookup(jndi);//找到数据源</font>
<p class="Ltw305"></p>
<p>&nbsp;</p>
<font face="Times New Roman" size="3">
<p><br />
Connection conn=ds.getConnection();//<br />
b.执行 sql语句<br />
String sql;<br />
StateMent stat=conn.createStatement();<br />
ResultSet rs=stat.executeQuery(sql);//执行数据的查询语句(select);<br />
stat.executeUpdate(sql);//执行数据的更新语句(inset into ,delete ,update ,drop)<br />
stat.close();<br />
c.用preparedStatement 来执行sql语句<br />
String sql="inset into table(id,name) values(?,?)";<br />
PreparedStatement ps=conn.prepareStatement(sql);<br />
ps.setInt(1,001);<br />
ps.setString(2,"zhangmanli"); <font color="#ffffff"></font></p>
<p>ps.executeQuery();<br />
int count=ps.executeUpdate();<br />
d.处理执行结果<br />
查询语句，返回记录集ResultSet对象<br />
更新语句，返回数字，表示该更新影响的记录数<br />
javax.sql.*<br />
javax.naming.*;<br />
数据处理：<br />
1关闭connection 的自动提交<br />
conn.setAutoCommit(false);<br />
2执行一系列sql 语句，<br />
Statement sm;<br />
sm=conn.createStatement(sql);<br />
sm.executeUpdate();<br />
sm.close(); </p>
<p>3.提交： <br />
conn.commit();<br />
4.回滚机制；<br />
conn.rollback();<br />
e:线程处理：<br />
D：jndi和dataSource 来获得数据库的链接：<br />
import java.sql.ResultSet ;<br />
import java.sql.*;<br />
import javax.sql.DataSource;<br />
import javax.naming.Context;<br />
import javax.naming.InitialContext;<br />
import java.util.Hashtable;<br />
import java.util.Properties;<br />
import java.io.*;<br />
public class BasicExample{<br />
&nbsp;public static void main(String args[]){<br />
&nbsp; Connection conn=null;<br />
&nbsp; try{<br />
&nbsp;&nbsp; Properties prop =new Properties();<br />
&nbsp;&nbsp; prop.load(new FileInputStream("simple.properties"));<br />
&nbsp;&nbsp; Hashtable env =new Hashtable();<br />
&nbsp;&nbsp; env.put(Context.INITIAL_CONTEXT_FACTORY,prop.getProperty("INITIAL_CONTEXT_FACTORY"));<br />
&nbsp;&nbsp; env.put(Context.PROVIDER_URL,prop.getProperty("PROVIDER_URL"));<br />
&nbsp;&nbsp; InitialContext ctx=new InitialContext(env);<br />
&nbsp; DataSource ds=(DataSource)ctx.lookup("Book");
<p class="Ltw305"></p>
<br />
&nbsp;&nbsp; Conn=ds.getConnection();<br />
&nbsp;&nbsp; Statement stat=conn.createStatement();;<br />
&nbsp;&nbsp; ResultSet rs=stmt.executeQuery(sql);<br />
&nbsp;&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;&nbsp; int id=Integer.parseInt(rs.getString("userId"));<br />
&nbsp;&nbsp;&nbsp; String userName=rs.getString ("username");<br />
<br />
&nbsp;&nbsp; }<br />
&nbsp; }catch(SQLException e){<br />
&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp; }finally{<br />
&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp; if(conn!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp;}<br />
}; </font></span></span></div>
<img src ="http://www.blogjava.net/lifenote/aggbug/195431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-04-24 10:36 <a href="http://www.blogjava.net/lifenote/archive/2008/04/24/195431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用动态代理实现用AOP对数据库进行操作</title><link>http://www.blogjava.net/lifenote/archive/2008/04/22/194687.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 22 Apr 2008 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/04/22/194687.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/194687.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/04/22/194687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/194687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/194687.html</trackback:ping><description><![CDATA[<div class="NewsContent" id="NewsContentLabel"><span class="t18">要实现对数据库的操作，离不开数据源（DataSource）或者连接（Connection）,但是通常来说对数据库的操作都应该放在DAO中，而DAO又不应该与应用服务器相关联，所以一般都使用连接（Connection）。现在我们这里就有一个问题了，怎么在拦截器中获得连接。我想可以通过两种方式获得：<br />
在分别讨论这两种方法之前，我们需要先讨论一下在处理数据库的时候的异常的处理。我这里做了一个TransactionException继承至RuntimeException然后在拦截器里面抛出，再又应用框架处理这个异常。下面试这个类的代码：<br />
public&nbsp;class&nbsp;TransactionException&nbsp;extends&nbsp;RuntimeException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Throwable&nbsp;superException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;myMessage;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TransactionException(Throwable&nbsp;throwable){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(throwable);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.superException&nbsp;=&nbsp;throwable;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TransactionException(Throwable&nbsp;throwable,String&nbsp;message){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(message,throwable);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.superException&nbsp;=&nbsp;throwable;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.myMessage&nbsp;=&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;Returns&nbsp;the&nbsp;myMessage.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getMessage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;myMessage;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;Returns&nbsp;the&nbsp;superException.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Throwable&nbsp;getSuperException()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;superException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;myMessage&nbsp;The&nbsp;myMessage&nbsp;to&nbsp;set.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setMyMessage(String&nbsp;message)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.myMessage&nbsp;=&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;superException&nbsp;The&nbsp;superException&nbsp;to&nbsp;set.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSuperException(Throwable&nbsp;superException)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.superException&nbsp;=&nbsp;superException;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
1）&nbsp;&nbsp;&nbsp;&nbsp;通过方法的第一个参数传进去<br />
l&nbsp;&nbsp;&nbsp;&nbsp;DAO<br />
import&nbsp;java.sql.Connection;<br />
<br />
public&nbsp;class&nbsp;TestDao&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;insertA(Connection&nbsp;con,String&nbsp;a,String&nbsp;b,&#8230;&#8230;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
一系列操作<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;queryA(Connection&nbsp;con,&#8230;&#8230;.){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
一系列操作<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;updateA(Connection&nbsp;con,&#8230;&#8230;.){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
一系列操作<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
}<br />
}<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp;拦截器<br />
import&nbsp;java.sql.Connection;<br />
import&nbsp;java.sql.SQLException;<br />
import&nbsp;java.util.ArrayList;<br />
import&nbsp;java.util.List;<br />
<br />
public&nbsp;class&nbsp;TransactionInterceptor&nbsp;implements&nbsp;Interceptor&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;before(InvokeJniInfo&nbsp;invInfo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isNeedTransactions(invInfo)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;(Connection)&nbsp;invInfo.getArgs()[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setAutoCommit(false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;after(InvokeJniInfo&nbsp;invInfo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isNeedTransactions(invInfo)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;(Connection)&nbsp;invInfo.getArgs()[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(conn&nbsp;!=&nbsp;null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e,"Close&nbsp;Connection&nbsp;is&nbsp;failure!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;exceptionThrow(InvokeJniInfo&nbsp;invInfo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isNeedTransactions(invInfo)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;(Connection)&nbsp;invInfo.getArgs()[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.rollback();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(conn&nbsp;!=&nbsp;null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e,"Close&nbsp;Connection&nbsp;is&nbsp;failure!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&nbsp;getNeedTransaction(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;needTransactions&nbsp;=&nbsp;new&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needTransactions.add("insert");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needTransactions.add("update");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;needTransactions;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isNeedTransactions(InvokeJniInfo&nbsp;invInfo){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;needTransaction&nbsp;=&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;needTransactions&nbsp;=&nbsp;getNeedTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;i<needtransactions.size();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needTransaction&nbsp;=&nbsp;(String)needTransactions.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(invInfo.getMethod().getName().startsWith(needTransaction)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
需要注意的是：getNeedTransaction就是需要进行事务处理的方法的开头，这个方法可以写成一个从配置文件里面去读，这里我就写死在里面了。只是对insert和update开头的方法进行事务控制。<br />
2）&nbsp;&nbsp;&nbsp;&nbsp;将Connection对象放在ThreadLocal中<br />
l&nbsp;&nbsp;&nbsp;&nbsp;ConnectionUtil类：<br />
import&nbsp;java.sql.Connection;<br />
<br />
public&nbsp;final&nbsp;class&nbsp;ConnectionUtil&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;ThreadLocal&nbsp;connections&nbsp;=&nbsp;new&nbsp;ThreadLocal();<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Connection&nbsp;getConnection(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;(Connection)&nbsp;connections.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(conn&nbsp;==&nbsp;null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;=&nbsp;getRealConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connections.set(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;realseConnection(Connection&nbsp;conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connections.set(null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Connection&nbsp;getRealConnection()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现自己获取连接的代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
l&nbsp;&nbsp;&nbsp;&nbsp;DAO类<br />
public&nbsp;class&nbsp;TestDao&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;insertA(String&nbsp;a,String&nbsp;b){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
一系列操作<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;queryA(Connection&nbsp;con,&#8230;&#8230;.){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
一系列操作<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;updateA(Connection&nbsp;con,&#8230;&#8230;.){<br />
Connection&nbsp;conn&nbsp;=&nbsp;getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
一系列操作<br />
&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Connection&nbsp;getConnection(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ConnectionUtil.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
l&nbsp;&nbsp;&nbsp;&nbsp;拦截器<br />
import&nbsp;java.sql.Connection;<br />
import&nbsp;java.sql.SQLException;<br />
import&nbsp;java.util.ArrayList;<br />
import&nbsp;java.util.List;<br />
<br />
public&nbsp;class&nbsp;TransactionInterceptor&nbsp;implements&nbsp;Interceptor&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;before(InvokeJniInfo&nbsp;invInfo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isNeedTransactions(invInfo)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.setAutoCommit(false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;after(InvokeJniInfo&nbsp;invInfo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isNeedTransactions(invInfo)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(conn&nbsp;!=&nbsp;null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;releaseConnection(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e,"Close&nbsp;Connection&nbsp;is&nbsp;failure!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;exceptionThrow(InvokeJniInfo&nbsp;invInfo)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(isNeedTransactions(invInfo)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;=&nbsp;getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.rollback();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}finally{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(conn&nbsp;!=&nbsp;null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;releaseConnection(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SQLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;TransactionException(e,"Close&nbsp;Connection&nbsp;is&nbsp;failure!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Connection&nbsp;getConnection(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ConnectionUtil.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;releaseConnection(Connection&nbsp;conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionUtil.releaseConnection(conn);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&nbsp;getNeedTransaction(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;needTransactions&nbsp;=&nbsp;new&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needTransactions.add("insert");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needTransactions.add("update");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;needTransactions;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;isNeedTransactions(InvokeJniInfo&nbsp;invInfo){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;needTransaction&nbsp;=&nbsp;"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;needTransactions&nbsp;=&nbsp;getNeedTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i&nbsp;=&nbsp;0;i<needtransactions.size();i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needTransaction&nbsp;=&nbsp;(String)needTransactions.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(invInfo.getMethod().getName().startsWith(needTransaction)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp;最后将这个拦截器添加到AOP拦截框架中去，InterceptorHandler类中的getIntercetors方法中添加一个：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;synchronized&nbsp;List&nbsp;getIntercetors(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null&nbsp;==&nbsp;interceptors){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;interceptors&nbsp;=&nbsp;new&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
interceptors.add(new&nbsp;TransactionInterceptor&nbsp;());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;interceptors;<br />
}<br />
</span></div>
<img src ="http://www.blogjava.net/lifenote/aggbug/194687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-04-22 09:54 <a href="http://www.blogjava.net/lifenote/archive/2008/04/22/194687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何获得鼠标的当前位置</title><link>http://www.blogjava.net/lifenote/archive/2008/03/27/189055.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 27 Mar 2008 08:52:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/03/27/189055.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/189055.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/03/27/189055.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/189055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/189055.html</trackback:ping><description><![CDATA[用window.event对象的属性，总共有四对属性用来取得鼠标位置,分别是： &nbsp; <br />
&nbsp; clientX和clientY &nbsp; &nbsp; &nbsp; &nbsp; screenX和screenY &nbsp; &nbsp; &nbsp; offsetX和offsetY &nbsp; &nbsp; &nbsp; &nbsp; x和y &nbsp; <br />
&nbsp; 一 &nbsp; clientX和clientY &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设置或接收相对于浏览器窗口客户区的鼠标x、y坐标，客户区不包括窗口滚动条及边框 &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 大小(MSDN原文:Sets &nbsp; or &nbsp; retrieves &nbsp; the &nbsp; x-coordinate/y-coordinate &nbsp; of &nbsp; the &nbsp; mouse &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pointer's &nbsp; position &nbsp; relative &nbsp; to &nbsp; the &nbsp; client &nbsp; area &nbsp; of &nbsp; the &nbsp; window, &nbsp; excluding &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window &nbsp; decorations &nbsp; and &nbsp; scroll &nbsp; bars.) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在IE4里，这一对属性只读不可写，IE5及以后版本里则可读可写(MSDN原文:The &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; property &nbsp; is &nbsp; read-only &nbsp; in &nbsp; Microsoft&amp;reg; &nbsp; Internet &nbsp; Explorer &nbsp; 4.0, &nbsp; and &nbsp; read/write &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; in &nbsp; Microsoft&amp;reg; &nbsp; Internet &nbsp; Explorer &nbsp; 5 &nbsp; and &nbsp; later.) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 语法: &nbsp; &nbsp; event.clientX=[iPos] &nbsp; &nbsp; event.clientY=[iPos] &nbsp; &nbsp; &nbsp; &nbsp; iPos应该是一个整数 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 二 &nbsp; screenX和screenY &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设置或接收相对于用户屏幕的鼠标坐标 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在IE4里，这一对属性只读不可写，IE5及以后版本里则可读可写 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 语法: &nbsp; &nbsp; event.screenX=[iSize] &nbsp; &nbsp; event.screenY=[iSize] &nbsp; &nbsp; &nbsp; &nbsp; iSize应该是一个整数 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 三 &nbsp; offsetX和offsetY &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设置或接收鼠标指针在鼠标所在的元素上的偏移量 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在IE4里，这一对属性只读不可写，IE5及以后版本里则可读可写 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 语法: &nbsp; &nbsp; event.screenX=[iCoord] &nbsp; &nbsp; event.screenY=[iCoord] &nbsp; &nbsp; &nbsp; iCoord应该是一个整数 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; 四 &nbsp; x和y &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 设置或接收相对于鼠标所在的元素的父元素的坐标(MSDN原文:Sets &nbsp; or &nbsp; retrieves &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the &nbsp; &nbsp; x-coordinate, &nbsp; in &nbsp; pixels, &nbsp; of &nbsp; the &nbsp; mouse &nbsp; pointer's &nbsp; position &nbsp; relative &nbsp; to &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; the &nbsp; parent &nbsp; element.) &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在IE4里，这一对属性只读不可写，IE5及以后版本里则可读可写,但IE5以前的版式本里 &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x和y坐标并不相对于鼠标所在的元素的父元素，只相对于浏览器窗口的客户区 &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 如果在检测鼠标位置时，鼠标却在浏览器窗口的外面，则x和y都返回-1&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/lifenote/aggbug/189055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-03-27 16:52 <a href="http://www.blogjava.net/lifenote/archive/2008/03/27/189055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javascript----文件操作</title><link>http://www.blogjava.net/lifenote/archive/2008/03/25/188417.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 25 Mar 2008 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/03/25/188417.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/188417.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/03/25/188417.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/188417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/188417.html</trackback:ping><description><![CDATA[一、功能实现核心：FileSystemObject 对象 <br />
&nbsp;&nbsp;&nbsp;&nbsp;要在javascript中实现文件操作功能，主要就是依靠FileSystemobject对象。<br />
二、FileSystemObject编程 <br />
使用FileSystemObject 对象进行编程很简单，一般要经过如下的步骤： 创建FileSystemObject对象、应用相关方法、访问对象相关属性 。 <br />
（一）创建FileSystemObject对象 <br />
创建FileSystemObject对象的代码只要1行： <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
上述代码执行后，fso就成为一个FileSystemObject对象实例。 <br />
（二）应用相关方法 <br />
创建对象实例后，就可以使用对象的相关方法了。比如，使用CreateTextFile方法创建一个文本文件： <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var f1 = fso.createtextfile("c:\\myjstest.txt",true"); <br />
（三）访问对象相关属性 <br />
要访问对象的相关属性，首先要建立指向对象的句柄，这就要通过get系列方法实现：GetDrive负责获取驱动器信息，GetFolder负责获取文件夹信息，GetFile负责获取文件信息。比如，指向下面的代码后，f1就成为指向文件c:\test.txt的句柄： <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var f1 = fso.GetFile("c:\\myjstest.txt"); <br />
然后，使用f1访问对象的相关属性。比如： <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var f1 = fso.GetFile("c:\\myjstest.txt"); <br />
alert("File last modified: " + f1.DateLastModified); <br />
执行上面最后一句后，将显示c:\myjstest.txt的最后修改日期属性值。 <br />
但有一点请注意：对于使用create方法建立的对象，就不必再使用get方法获取对象句柄了，这时直接使用create方法建立的句柄名称就可以： <br />
var fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
var f1 = fso.createtextfile("c:\\myjstest.txt",true"); <br />
alert("File last modified: " + f1.DateLastModified); <br />
三、操作驱动器（Drives） <br />
使用FileSystemObject对象来编程操作驱动器（Drives）和文件夹（Folders）很容易，这就象在Windows文件浏览器中对文件进行交互操作一样，比如：拷贝、移动文件夹，获取文件夹的属性。 <br />
（一）Drives对象属性 <br />
Drive对象负责收集系统中的物理或逻辑驱动器资源内容，它具有如下属性： <br />
l TotalSize：以字节（byte）为单位计算的驱动器大小。 <br />
l AvailableSpace或FreeSpace：以字节（byte）为单位计算的驱动器可用空间。 <br />
l DriveLetter：驱动器字母。 <br />
l DriveType：驱动器类型，取值为：removable（移动介质）、fixed（固定介质）、network（网络资源）、CD-ROM或者RAM盘。 <br />
l SerialNumber：驱动器的系列码。 <br />
l FileSystem：所在驱动器的文件系统类型，取值为FAT、FAT32和NTFS。 <br />
l IsReady：驱动器是否可用。 <br />
l ShareName：共享名称。 <br />
l VolumeName：卷标名称。 <br />
l Path和RootFolder：驱动器的路径或者根目录名称。 <br />
（二）Drive对象操作例程 <br />
下面的例程显示驱动器C的卷标、总容量和可用空间等信息： <br />
var fso, drv, s =""; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
drv = fso.GetDrive(fso.GetDriveName("c:\\")); <br />
s += "Drive C:" + " - "; <br />
s += drv.VolumeName + "\n"; <br />
s += "Total Space: " + drv.TotalSize / 1024; <br />
s += " Kb" + "\n"; <br />
s += "Free Space: " + drv.FreeSpace / 1024; <br />
s += " Kb" + "\n"; <br />
alert(s); <br />
四、操作文件夹（Folders） <br />
涉及到文件夹的操作包括创建、移动、删除以及获取相关属性。 <br />
Folder对象操作例程 :<br />
下面的例程将练习获取父文件夹名称、创建文件夹、删除文件夹、判断是否为根目录等操作： <br />
var fso, fldr, s = ""; <br />
// 创建FileSystemObject对象实例 <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
// 获取Drive 对象 <br />
fldr = fso.GetFolder("c:\\"); <br />
// 显示父目录名称 <br />
alert("Parent folder name is: " + fldr + "\n"); <br />
// 显示所在drive名称 <br />
alert("Contained on drive " + fldr.Drive + "\n"); <br />
// 判断是否为根目录 <br />
if (fldr.IsRootFolder) <br />
alert("This is the root folder."); <br />
else <br />
alert("This folder isn't a root folder."); <br />
alert("\n\n"); <br />
// 创建新文件夹 <br />
fso.CreateFolder ("C:\\Bogus"); <br />
alert("Created folder C:\\Bogus" + "\n"); <br />
// 显示文件夹基础名称，不包含路径名 <br />
alert("Basename = " + fso.GetBaseName("c:\\bogus") + "\n"); <br />
// 删除创建的文件夹 <br />
fso.DeleteFolder ("C:\\Bogus"); <br />
alert("Deleted folder C:\\Bogus" + "\n"); <br />
五、操作文件（Files） <br />
对文件进行的操作要比以上介绍的驱动器（Drive）和文件夹（Folder）操作复杂些，基本上分为以下两个类别：对文件的创建、拷贝、移动、删除操作和对文件内容的创建、添加、删除和读取操作。下面分别详细介绍。 <br />
（一）创建文件 <br />
一共有3种方法可用于创建一个空文本文件，这种文件有时候也叫做文本流（text stream）。 <br />
第一种是使用CreateTextFile方法。代码如下： <br />
var fso, f1; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
f1 = fso.CreateTextFile("c:\\testfile.txt", true); <br />
第二种是使用OpenTextFile方法，并添加上ForWriting属性，ForWriting的值为2。代码如下： <br />
var fso, ts; <br />
var ForWriting= 2; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
ts = fso.OpenTextFile("c:\\test.txt", ForWriting, true); <br />
第三种是使用OpenAsTextStream方法，同样要设置好ForWriting属性。代码如下： <br />
var fso, f1, ts; <br />
var ForWriting = 2; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
fso.CreateTextFile ("c:\\test1.txt"); <br />
f1 = fso.GetFile("c:\\test1.txt"); <br />
ts = f1.OpenAsTextStream(ForWriting, true); <br />
（二）添加数据到文件 <br />
当文件被创建后，一般要按照&#8220;打开文件－&gt;填写数据－&gt;关闭文件&#8221;的步骤实现添加数据到文件的目的。 <br />
打开文件可使用FileSystemObject对象的OpenTextFile方法，或者使用File对象的OpenAsTextStream方法。 <br />
填写数据要使用到TextStream对象的Write、WriteLine或者WriteBlankLines方法。在同是实现写入数据的功能下，这3者的区别在于：Write方法不在写入数据末尾添加新换行符，WriteLine方法要在最后添加一个新换行符，而WriteBlankLines则增加一个或者多个空行。 <br />
关闭文件可使用TextStream对象的Close方法。 <br />
（三）创建文件及添加数据例程 <br />
下面的代码将创建文件、添加数据、关闭文件几个步骤结合起来进行应用： <br />
var fso, tf; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
// 创建新文件 <br />
tf = fso.CreateTextFile("c:\\testfile.txt", true); <br />
// 填写数据，并增加换行符 <br />
tf.WriteLine("Testing 1, 2, 3.") ; <br />
// 增加3个空行 <br />
tf.WriteBlankLines(3) ; <br />
// 填写一行，不带换行符 <br />
tf.Write ("This is a test."); <br />
// 关闭文件 <br />
tf.Close(); <br />
（四）读取文件内容 <br />
从文本文件中读取数据要使用TextStream对象的Read、ReadLine或ReadAll 方法。Read方法用于读取文件中指定数量的字符；ReadLine方法读取一整行，但不包括换行符；ReadAll方法则读取文本文件的整个内容。读取的内容存放于字符串变量中，用于显示、分析。在使用Read或ReadLine方法读取文件内容时，如果要跳过一些部分，就要用到Skip或SkipLine方法。 <br />
下面的代码演示打开文件、填写数据，然后读取数据： <br />
var fso, f1, ts, s; <br />
var ForReading = 1; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
// 创建文件 <br />
f1 = fso.CreateTextFile("c:\\testfile.txt", true); <br />
// 填写一行数据 <br />
f1.WriteLine("Hello World"); <br />
f1.WriteBlankLines(1); <br />
// 关闭文件 <br />
f1.Close(); <br />
// 打开文件 <br />
ts = fso.OpenTextFile("c:\\testfile.txt", ForReading); <br />
// 读取文件一行内容到字符串 <br />
s = ts.ReadLine(); <br />
// 显示字符串信息 <br />
alert("File contents = '" + s + "'"); <br />
// 关闭文件 <br />
ts.Close(); <br />
（五）移动、拷贝和删除文件 <br />
对于以上三种文件操作，javascript各有两种对应的方法：File.Move 或 FileSystemObject.MoveFile用于移动文件；File.Copy 或 FileSystemObject.CopyFile用于拷贝文件；File.Delete 或 FileSystemObject.DeleteFile用于删除文件。 <br />
下面的代码演示在驱动器C的根目录下创建一个文本文件，填写一些内容，然后将文件移动到\tmp目录下，再在目录\temp下面建立一个文件拷贝，最后删除这两个目录的文件： <br />
var fso, f1, f2, s; <br />
fso = new ActiveXObject("Scripting.FileSystemObject"); <br />
f1 = fso.CreateTextFile("c:\\testfile.txt", true); <br />
// 写一行 <br />
f1.Write("This is a test."); <br />
// 关闭文件 <br />
f1.Close(); <br />
// 获取C:\根目录下的文件句柄 <br />
f2 = fso.GetFile("c:\\testfile.txt"); <br />
// 移动文件到\tmp目录下 <br />
f2.Move ("c:\\tmp\\testfile.txt"); <br />
// 拷贝文件到\temp目录下 <br />
f2.Copy ("c:\\temp\\testfile.txt"); <br />
// 获取文件句柄 <br />
f2 = fso.GetFile("c:\\tmp\\testfile.txt"); <br />
f3 = fso.GetFile("c:\\temp\\testfile.txt"); <br />
// 删除文件 <br />
f2.Delete(); <br />
f3.Delete(); <br />
六、结 语 <br />
通过以上对FileSystemObject的各种对象、属性和方法的介绍和示例，相信你已经对如何使用javascript语言在页面中操作驱动器、文件和文件夹有了清晰的认识。但是上述提及的例程都非常简单，要全面、灵活地掌握javascript文件操作技术，还需要大量的实践练习。而且还有一点提醒大家，由于涉及到在浏览器中进行文件读写这样的高级操作，对于默认的浏览器安全级别而言，在代码运行前都会有一个信息提示，这点请在实际环境中提示访问者注意。
<img src ="http://www.blogjava.net/lifenote/aggbug/188417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-03-25 09:39 <a href="http://www.blogjava.net/lifenote/archive/2008/03/25/188417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中Criteria的完整用法 </title><link>http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 12 Mar 2008 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/185708.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/185708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/185708.html</trackback:ping><description><![CDATA[最近在项目中使用 Spring 和 Hibernate 进行开发，有感于 Criteria 比较好用，在查询方法<br />
<br />
<font face="Times New Roman" size="4">设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 Hibernate的Criteria 的用法进行总结：</font><br />
<font face="Times New Roman" size="4">&nbsp;&nbsp; Hibernate 设计了 CriteriaSpecification 作为 Criteria 的父接口，下面提供了 Criteria和DetachedCriteria </font>。 <br />
&nbsp;&nbsp; Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样， Criteria 是在线的，所</font><br />
<font face="Times New Roman" size="4">以它是由 Hibernate Session 进行创建的；而 DetachedCriteria 是离线的，创建时无需 </font><br />
<font face="Times New Roman" size="4">Session，DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) </font><br />
<font face="Times New Roman" size="4">进行DetachedCriteria 实例的创建。 Spring 的框架提供了getHibernateTemplate</font><br />
<font face="Times New Roman" size="4">().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结</font><br />
<font face="Times New Roman" size="4">果。 <br />
&nbsp;&nbsp; Criteria 和 DetachedCriteria 均可使用 Criterion 和 Projection 设置查询条件。可以设</font><br />
<font face="Times New Roman" size="4">置 FetchMode( 联合查询抓取的模式 ) ，设置排序方式。对于 Criteria 还可以设置 FlushModel </font><br />
<font face="Times New Roman" size="4">（冲刷 Session 的方式）和 LockMode （数据库锁模式）。 </font><br />
<font face="Times New Roman" size="4">下面对 Criterion 和 Projection 进行详细说明。</font><br />
<font face="Times New Roman" size="4">&nbsp;&nbsp;&nbsp;&nbsp; Criterion 是 Criteria 的查询条件。Criteria 提供了 add(Criterion criterion) 方法来</font><br />
<font face="Times New Roman" size="4">添加查询条件。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Criterion 接口的主要实现包括： Example 、 Junction 和 SimpleExpression 。而 </font><br />
<font face="Times New Roman" size="4">Junction 的实际使用是它的两个子类 conjunction 和 disjunction ，分别是使用 AND 和 OR 操</font><br />
<font face="Times New Roman" size="4">作符进行来联结查询条件集合。<br />
&nbsp;&nbsp;&nbsp;&nbsp; Criterion 的实例可以通过 Restrictions 工具类来创建，Restrictions 提供了大量的静态</font><br />
<font face="Times New Roman" size="4">方法，如 eq （等于）、 ge （大于等于）、 between 等来方法的创建 Criterion 查询条件 </font><br />
<font face="Times New Roman" size="4">（SimpleExpression 实例）。除此之外， Restrictions 还提供了方法来创建 conjunction 和 </font><br />
<font face="Times New Roman" size="4">disjunction 实例，通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询条件集合</font><br />
<font face="Times New Roman" size="4">。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 至于 Example 的创建有所不同， Example 本身提供了一个静态方法 create(Object </font><br />
<font face="Times New Roman" size="4">entity) ，即根据一个对象（实际使用中一般是映射到数据库的对象）来创建。然后可以设置一些</font><br />
<font face="Times New Roman" size="4">过滤条件： <br />
Example exampleUser =Example.create(u) <br />
.ignoreCase() // 忽略大小写 <br />
.enableLike(MatchMode.ANYWHERE); <br />
// 对 String 类型的属性，无论在那里值在那里都匹配。相当于 %value% </font><br />
<font face="Times New Roman" size="4">&nbsp; Project 主要是让 Criteria 能够进行报表查询，并可以实现分组。 Project 主要有 </font><br />
<font face="Times New Roman" size="4">SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 </font><br />
<font face="Times New Roman" size="4">ProjectionList 的实例化是由内建的 Projections 来完成，如提供的 avg 、 count 、 max 、 </font><br />
<font face="Times New Roman" size="4">min 、 sum 可以让开发者很容易对某个字段进行统计查询。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Property 是对某个字段进行查询条件的设置，如通过Porperty.forName(&#8220;color&#8221;).in</font><br />
<font face="Times New Roman" size="4">(new String[]{&#8220;black&#8221;,&#8221;red&#8221;,&#8221;write&#8221;}); 则可以创建一个 Project 实例。通过 </font><br />
<font face="Times New Roman" size="4">criteria 的 add(Project) 方法加入到查询条件中去。 </font><br />
<font face="Times New Roman" size="4">&nbsp;&nbsp;&nbsp; 使用 Criteria 进行查询，主要要清晰的是 Hibernate 提供了那些类和方法来满足开发中查</font><br />
<font face="Times New Roman" size="4">询条件的创建和组装，下面介绍几种用法：</font><br />
<font face="Times New Roman" size="4">1. 创建一个Criteria 实例<br />
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。<br />
Criteria crit = sess.createCriteria(Cat.class);<br />
crit.setMaxResults(50);<br />
List cats = crit.list();<br />
&nbsp;<br />
2. 限制结果集内容<br />
一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。</font><br />
<br />
<font face="Times New Roman" size="4">org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "Fritz%") )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.between("weight", minWeight, maxWeight) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4">约束可以按逻辑分组。 <br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "Fritz%") )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.or(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Restrictions.eq( "age", new Integer(0) ),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Restrictions.isNull("age")<br />
&nbsp;&nbsp;&nbsp; ) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.isNull("age") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("age", new Integer(0) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("age", new Integer(1) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("age", new Integer(2) ) )<br />
&nbsp;&nbsp;&nbsp; ) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许</font><br />
<br />
<font face="Times New Roman" size="4">你直接使用SQL。<br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", </font><br />
<br />
<font face="Times New Roman" size="4">Hibernate.STRING) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
{alias}占位符应当被替换为被查询实体的列别名。 <br />
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个</font><br />
<br />
<font face="Times New Roman" size="4">Property。 <br />
&nbsp;<br />
&nbsp; Property age = Property.forName("age");<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.isNull() )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.eq( new Integer(0) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.eq( new Integer(1) ) )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( age.eq( new Integer(2) ) )<br />
&nbsp;&nbsp;&nbsp; ) )<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
3. 结果集排序<br />
你可以使用org.hibernate.criterion.Order来为查询结果排序。 <br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "F%")<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("name") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("age") )<br />
&nbsp;&nbsp;&nbsp; .setMaxResults(50)<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("name").like("F%") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Property.forName("name").asc() )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Property.forName("age").desc() )<br />
&nbsp;&nbsp;&nbsp; .setMaxResults(50)<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
4. 关联<br />
你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。<br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "F%")<br />
&nbsp;&nbsp;&nbsp; .createCriteria("kittens")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "F%")<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
注意第二个 createCriteria()返回一个新的 Criteria实例，该实例引用kittens 集合中的元素。 <br />
接下来，替换形态在某些情况下也是很有用的。<br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .createAlias("kittens", "kt")<br />
&nbsp;&nbsp;&nbsp; .createAlias("mate", "mt")<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.eqProperty("kt.name", "mt.name") )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
(createAlias()并不创建一个新的 Criteria实例。) <br />
Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得</font><br />
<br />
<font face="Times New Roman" size="4">符合条件的kittens， 你必须使用returnMaps()。 <br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .createCriteria("kittens", "kt")<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("name", "F%") )<br />
&nbsp;&nbsp;&nbsp; .returnMaps()<br />
&nbsp;&nbsp;&nbsp; .list();<br />
Iterator iter = cats.iterator();<br />
while ( iter.hasNext() ) {<br />
&nbsp;&nbsp;&nbsp; Map map = (Map) iter.next();<br />
&nbsp;&nbsp;&nbsp; Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);<br />
&nbsp;&nbsp;&nbsp; Cat kitten = (Cat) map.get("kt");<br />
}</font><br />
<br />
<font face="Times New Roman" size="4">5. 动态关联抓取<br />
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。 <br />
&nbsp;<br />
List cats = sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.like("name", "Fritz%") )<br />
&nbsp;&nbsp;&nbsp; .setFetchMode("mate", FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp; .setFetchMode("kittens", FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
这个查询可以通过外连接抓取mate和kittens。<br />
&nbsp;<br />
6. 查询示例<br />
org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。<br />
&nbsp;<br />
Cat cat = new Cat();<br />
cat.setSex('F');<br />
cat.setColor(Color.BLACK);<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Example.create(cat) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 <br />
可以自行调整Example使之更实用。 <br />
&nbsp;<br />
Example example = Example.create(cat)<br />
&nbsp;&nbsp;&nbsp; .excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //exclude zero valued properties<br />
&nbsp;&nbsp;&nbsp; .excludeProperty("color")&nbsp; //exclude the property named "color"<br />
&nbsp;&nbsp;&nbsp; .ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //perform case insensitive string comparisons<br />
&nbsp;&nbsp;&nbsp; .enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //use like for string comparisons<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add(example)<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
甚至可以使用examples在关联对象上放置条件。<br />
&nbsp;<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Example.create(cat) )<br />
&nbsp;&nbsp;&nbsp; .createCriteria("mate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Example.create( cat.getMate() ) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
7. 投影(Projections)、聚合（aggregation）和分组（grouping）<br />
org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 </font><br />
<br />
<font face="Times New Roman" size="4">setProjection()应用投影到一个查询。 <br />
&nbsp;<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.rowCount() )<br />
&nbsp;&nbsp;&nbsp; .add( Restrictions.eq("color", Color.BLACK) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.rowCount() )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.avg("weight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.max("weight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.groupProperty("color") )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />

<p><font face="Times New Roman" size="4"><br />
在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影，他</font><br />
<br />
<font face="Times New Roman" size="4">们也出现在SQL的group by子句中。 </font><br />
<br />
<font face="Times New Roman" size="4">可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的</font><br />
<br />
<font face="Times New Roman" size="4">实现方式：<br />
&nbsp;<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("colr") )<br />
&nbsp;&nbsp;&nbsp; .list();</font></p>
<br />

<p><font face="Times New Roman" size="4">List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.groupProperty("color").as("colr") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("colr") )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
&nbsp;<br />
alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之，</font><br />
<br />
<font face="Times New Roman" size="4">当你添加一个投影到一个投影列表中时 你可以为它指定一个别名： <br />
&nbsp;<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.rowCount(), "catCountByColor" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.avg("weight"), "avgWeight" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.max("weight"), "maxWeight" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.groupProperty("color"), "color" )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("catCountByColor") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("avgWeight") )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
List results = session.createCriteria(Domestic.class, "cat")<br />
&nbsp;&nbsp;&nbsp; .createAlias("kittens", "kit")<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.property("cat.name"), "catName" )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.property("kit.name"), "kitName" )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("catName") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.asc("kitName") )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
也可以使用Property.forName()来表示投影：<br />
&nbsp;<br />
List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("name") )<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("color").eq(Color.BLACK) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<font face="Times New Roman" size="4">List results = session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Projections.rowCount().as("catCountByColor") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Property.forName("weight").avg().as("avgWeight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Property.forName("weight").max().as("maxWeight") )<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .add( Property.forName("color").group().as("color" )<br />
&nbsp;&nbsp;&nbsp; )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("catCountByColor") )<br />
&nbsp;&nbsp;&nbsp; .addOrder( Order.desc("avgWeight") )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
8. 离线(detached)查询和子查询<br />
DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的 Session来</font><br />
<br />
<font face="Times New Roman" size="4">执行它。<br />
&nbsp;<br />
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("sex").eq('F') );<br />
//创建一个Session<br />
Session session = .;<br />
Transaction txn = session.beginTransaction();<br />
List results = query.getExecutableCriteria(session).setMaxResults(100).list();<br />
txn.commit();<br />
session.close();</font><br />
<br />
<font face="Times New Roman" size="4"><br />
DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者</font><br />
<font face="Times New Roman" size="4">Property获得。<br />
&nbsp;<br />
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("weight").avg() );<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("weight).gt(avgWeight) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<font face="Times New Roman" size="4">DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("weight") );<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp; .add( Subqueries.geAll("weight", weights) )<br />
&nbsp;&nbsp;&nbsp; .list();</font><br />
<font face="Times New Roman" size="4"><br />
相互关联的子查询也是有可能的：<br />
&nbsp;<br />
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")<br />
&nbsp;&nbsp;&nbsp; .setProjection( Property.forName("weight").avg() )<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("cat2.sex").eqProperty("cat.sex") );<br />
session.createCriteria(Cat.class, "cat")<br />
&nbsp;&nbsp;&nbsp; .add( Property.forName("weight).gt(avgWeightForSex) )<br />
&nbsp;&nbsp;&nbsp; .list();<br />
</font></p>
<img src ="http://www.blogjava.net/lifenote/aggbug/185708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-03-12 15:24 <a href="http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超越梦想----动感十足的福特S-MAX</title><link>http://www.blogjava.net/lifenote/archive/2008/03/09/184858.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Sun, 09 Mar 2008 09:30:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/03/09/184858.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/184858.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/03/09/184858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/184858.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/184858.html</trackback:ping><description><![CDATA[<p><span style="color: black; font-family: 宋体">&nbsp;&nbsp;&nbsp; 去年刚刚毕业并没有急于找工作而是在家里先去学驾驶，经过一段时间的学习终于拿到了驾驶证，并且来到北京这个繁华的国际大都市，寻找着自己的梦想，我希望有一天我能够向那些</span><strong><span style="font-weight: normal; font-family: 宋体">富足和积极向上的社会成功人士一样，开着属于自己的车穿梭在城市中！</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">今天在网上搜索汽车寻找自己中意的车型，无意中看见长安福特</span>S-MAX<span style="font-family: 宋体">一款动感设计的车型吸引了我，于是浏览更多的相关信息，发现在北京富特</span>S-MAX<span style="font-family: 宋体">有一个春日踏青自驾游活动。我的梦想终于可以实现了，虽然只是一次活动，但这也会让我更加珍惜这次机会而且会更加促使我不断努力为梦想而前进。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">三月春天明媚照人，这样的季节，带着全家老小，自背行囊沿着海边一路游下去好不惬意。这时候你是不是为轿车的空间烦恼？不要让这些小事影响你的出游计划。这款定位为</span>&#8220;<span style="font-family: 宋体">都市多功能用车</span>&#8221;<span style="font-family: 宋体">的新佳乐具有</span>MPV<span style="font-family: 宋体">的空间，</span>SUV<span style="font-family: 宋体">的款式；</span>MPV<span style="font-family: 宋体">的实用，</span>SUV<span style="font-family: 宋体">的稳固。在解决你对空间的烦恼之余，也不输掉对家人的保护。</span><span style="font-size: 11pt; font-family: 宋体">福特</span><span style="font-size: 11pt">S-MAX</span><span style="font-size: 11pt; font-family: 宋体">是福特第一款采用了福特欧洲动感设计</span><span style="font-size: 11pt">(Kinetic Design)</span><span style="font-size: 11pt; font-family: 宋体">的车型，取代了较早的新边锋设计，其充满运动和时尚风格的造型设计体现了</span><span style="font-size: 11pt">&#8220;</span><span style="font-size: 11pt; font-family: 宋体">运动中的能量</span><span style="font-size: 11pt">&#8221;</span><span style="font-size: 11pt; font-family: 宋体">。<br />
</span><span style="font-size: 11pt"><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">&nbsp;<img alt="" src="http://cimg2.163.com/catchpic/3/37/372C4738EFDDF2D5CD335F62423C4B7F.jpg" border="0" name="PostPic" /><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S-MAX</span><span style="font-size: 11pt; font-family: 宋体">前端以鲜明的楔角车头为特征，富于动感的前照灯为它的外表增添了一种果断。<span style="color: #000099">雾灯</span>是嵌入式的，高高地布置在前保险杠上，赋予汽车一种动感美。牌照板下的大型梯形格栅与上格栅形成互补</span><span style="font-size: 11pt">——</span><span style="font-size: 11pt; font-family: 宋体">这是福特的特征，同时也给前部外观平添一分霸气。下格栅两侧类似于</span><span style="font-size: 11pt">&#8220;</span><span style="font-size: 11pt; font-family: 宋体">鲨鱼鳃</span><span style="font-size: 11pt">&#8221;</span><span style="font-size: 11pt; font-family: 宋体">的设计，形成了自己独有的特色。<br />
</span><span style="font-size: 11pt"><img alt="" src="http://cimg2.163.com/catchpic/1/12/1204E070EDFA63555511DF44C97600F6.jpg" border="0" name="PostPic" /><br />
</span><span style="font-size: 11pt; color: #333333; font-family: 宋体">　　从福特</span><span style="font-size: 11pt; color: #333333; font-family: ˎ̥">S-MAX</span><span style="font-size: 11pt; color: #333333; font-family: 宋体">运动式的侧影，使人不难看出福特动感设计的意图所在。流线的车顶线条带着拱曲汇入发动机罩，突出的轮拱带有后沿出风口并以独特的上弯与窗玻璃后部相接。所有这一切都无不体现出福特</span><span style="font-size: 11pt; color: #333333; font-family: ˎ̥">S-MAX</span><span style="font-size: 11pt; color: #333333; font-family: 宋体">是一部魅力四射、活力迸发的汽车。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">还忧郁什么呢这么好的车，这么好这么难得的机会难道不心动么，赶快去参加自驾游活动吧，这次试驾活动在</span><span style="font-family: Arial">3</span><span style="font-family: 宋体">月底至</span><span style="font-family: Arial">4</span><span style="font-family: 宋体">月中旬举行，现在正是报名时间哦我已经报名了！而且更惊喜的是还有机会获得海外旅游大奖啊！我最大的希望就是能够有一天带着我的爸爸妈妈出去交游一天，这么好的机会我是绝对不能错过了！<br />
<img height="20" alt="" src="http://count.800.bolaa.com/sunxianchao/44/count.gif" width="85" border="0" /><br />
tag:福特，S-MAX，SAV，FORD，长安福特，公务，商务，安全，中级车，高级车，私家车<br />
</span></p>
<img src ="http://www.blogjava.net/lifenote/aggbug/184858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-03-09 17:30 <a href="http://www.blogjava.net/lifenote/archive/2008/03/09/184858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解Tapestry的Rewind</title><link>http://www.blogjava.net/lifenote/archive/2008/03/08/184695.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Sat, 08 Mar 2008 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/03/08/184695.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/184695.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/03/08/184695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/184695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/184695.html</trackback:ping><description><![CDATA[Tapestry的rewind一直是学习和使用Tapestry的难点，rewind是用来处理表单提交的，表单默认使用的是DirectService来提交。在详细介绍之前，先说明下此文中需要用到的一些概念，首先是表单组件，我这里指的是指继承自AbstractFormComponent类的组件，例如：TextField、TextArea、Checkbox等，而不是具体的Form组件，表单组件使用时必须在Form组件中，这些组件在rewind时调用继承自AbstractFormComponent的rewindFormComponent来读取数据，并将数据赋值给容器或者页面。 <br />
我们来看一下最简单的TextField组件，组件定义如下 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/article/41724#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>&lt;input&nbsp;&nbsp;jwcid=</span><span class="string">"price@TextField"</span><span>&nbsp;type=</span><span class="string">"text"</span><span>&nbsp;value=</span><span class="string">"ognl:picture.price"</span><span>&nbsp;&nbsp;translator=</span><span class="string">"translator:number,pattern=##.##"</span><span>&nbsp;&nbsp;validators=</span><span class="string">"validators:min=0"</span><span>&nbsp;displayName=</span><span class="string">"价格"</span><span>&nbsp;</span><span class="keyword">class</span><span>=</span><span class="string">"input_text"</span><span>/&gt;&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">&lt;input  jwcid="price@TextField" type="text" value="ognl:picture.price"  translator="translator:number,pattern=##.##"  validators="validators:min=0" displayName="价格" class="input_text"/&gt;</pre>
<br />
再看一下TextField中的rewindFormComponent组件方法 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/article/41724#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;rewindFormComponent(IMarkupWriter&nbsp;writer,&nbsp;IRequestCycle&nbsp;cycle)&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//从请求中得到参数值 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;cycle.getParameter(getName()); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//用translator来转换值 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;object&nbsp;=&nbsp;getTranslatedFieldSupport().parse(</span><span class="keyword">this</span><span>,&nbsp;value); &nbsp;&nbsp;</span></span>
    <li><span class="comment">//用validators来验证值 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getValidatableFieldSupport().validate(</span><span class="keyword">this</span><span>,&nbsp;writer,&nbsp;cycle,&nbsp;object); &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//赋值给容器或者页面 </span><span>&nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setValue(object); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(ValidatorException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getForm().getDelegate().record(e); &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<pre class="java" style="display: none" name="code">protected void rewindFormComponent(IMarkupWriter writer, IRequestCycle cycle) {
//从请求中得到参数值
String value = cycle.getParameter(getName());
try {
//用translator来转换值
Object object = getTranslatedFieldSupport().parse(this, value);
//用validators来验证值
getValidatableFieldSupport().validate(this, writer, cycle, object);
//赋值给容器或者页面
setValue(object);
} catch (ValidatorException e) {
getForm().getDelegate().record(e);
}
}</pre>
<br />
可以看到在rewindFormComponent中，主要是从请求中取得用户输入的值，然后进行处理，最后赋值给容器或者页面，上面的例子中会调用页面类的getPicture().setPrice(&#8220;用户输入的值&#8221;)来进行赋值。这样整个表单的提交就可以理解为所有的表单组件读取用户输入的值并赋值给页面的过程。 <br />
整个表单提交的详细处理过程如下： <br />
<ul>* initialize():页面初始化 <br />
    * pageBeginRender() ("rewind"):getRequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>()为true <br />
    * rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取值赋值 <br />
    * Deferred listeners (for Submit components):调用Submit组件的listener <br />
    * Form's listener：调用Form组件的listener <br />
    * pageEndRender() ("rewind"): getRequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>()为true <br />
    * pageBeginRender() (normal): getRequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>()为false <br />
    * pageEndRender() (normal): getRequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>()为false</ul>
    我们可以看到pageBeginRender和pageEndRender被调用了两次，两次中的区别为RequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>，因为我们在使用时经常利用pageBeginRender的初始化值，所以这里有很多使用上的误区，如果在pageBeginRender中从数据库读取数据来初始化跟表单提交无关的变量的话，就可能被调用两次，这个是应该避免的。什么叫跟表单提交无关的变量呢，就是表单组件中跟赋值无关的，例如上边提到的value="ognl:picture.price",这时picture就是与表单提交相关的变量，如果你没有初始化，那么在赋值时调用getPicture().setPrice()就会出现空指针异常，因为这是的picture为null。我们举个例子来看一下表单无关的变量，假如这个picture页面会显示一个创建picture的表单和所有picture的列表，那这个picture的列表就是与表单提交无关的变量，如果你在pageBeginRender中初始化的话，就需要区分是否rewind，否则表单提交时就会被初始化两次，让我们看一下代码： <br />
    <div class="dp-highlighter">
    <div class="bar">
    <div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/article/41724#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
    </div>
    <ol class="dp-j">
        <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPictures(List&lt;Picture&gt;&nbsp;pictures); &nbsp;&nbsp;</span></span>
        <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPictureInList();</span><span class="comment">//用于For中的value </span><span>&nbsp;&nbsp;</span></span>
        <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setPicture(Picture&nbsp;picture);</span><span class="comment">//用于表单创建 </span><span>&nbsp;&nbsp;</span></span>
        <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">abstract</span><span>&nbsp;Picture&nbsp;getPicture(); &nbsp;&nbsp;</span></span>
        <li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;pageBeginRender(PageEvent&nbsp;event)&nbsp;{ &nbsp;&nbsp;</span></span>
        <li><span class="keyword">if</span><span>(getPicture()==</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></span>
        <li><span>setPicture(</span><span class="keyword">new</span><span>&nbsp;Picture()); &nbsp;&nbsp;</span></span>
        <li><span>} &nbsp;&nbsp;</span>
        <li><span>setPictures(getPictureService().findAll()); &nbsp;&nbsp;</span>
        <li><span>}&nbsp;&nbsp;</span> </li>
    </ol>
    </div>
    <pre class="java" style="display: none" name="code">public abstract void setPictures(List&lt;Picture&gt; pictures);
    public abstract void setPictureInList();//用于For中的value
    public abstract void setPicture(Picture picture);//用于表单创建
    public abstract Picture getPicture();
    public void pageBeginRender(PageEvent event) {
    if(getPicture()==null){
    setPicture(new Picture());
    }
    setPictures(getPictureService().findAll());
    }</pre>
    判断picture是否为null并赋值在页面显示和rewind中都是需要的，因为页面显示时，需要调用getPicture().getPrice(),页面rewind时，需要调用getPicture().setPrice(),这两个阶段中的picture都不能为null。但setPictures会在表单提交时被调用两次，在rewind阶段初始化它是没有用处的，所以这时就要对是否rewind进行判断。修改后的代码如下： <br />
    <div class="dp-highlighter">
    <div class="bar">
    <div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/article/41724#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
    </div>
    <ol class="dp-j">
        <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;pageBeginRender(PageEvent&nbsp;event)&nbsp;{ &nbsp;&nbsp;</span></span>
        <li><span class="keyword">if</span><span>(getPicture()==</span><span class="keyword">null</span><span>){ &nbsp;&nbsp;</span></span>
        <li><span>setPicture(</span><span class="keyword">new</span><span>&nbsp;Picture()); &nbsp;&nbsp;</span></span>
        <li><span>} &nbsp;&nbsp;</span>
        <li><span class="keyword">if</span><span>&nbsp;(!event.getRequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>())&nbsp;{ &nbsp;&nbsp;</span></span>
        <li><span>setPictures(getPictureService().findAll()); &nbsp;&nbsp;</span>
        <li><span>} &nbsp;&nbsp;</span>
        <li><span>}&nbsp;&nbsp;</span> </li>
    </ol>
    </div>
    <pre class="java" style="display: none" name="code">public void pageBeginRender(PageEvent event) {
    if(getPicture()==null){
    setPicture(new Picture());
    }
    if (!event.getRequestCycle().<span class="hilite1"><span class="hilite1">isRewinding</span></span>()) {
    setPictures(getPictureService().findAll());
    }
    }</pre>
    这样就可以避免在rewind时对pictures进行不必要的赋值。这里还要提到的一点是页面显示和提交后的页面很可能不是同一个页面类的实例，大家都知道页面类的实例是从实例池取到的，用户打开页面显示表单完后的页面类实例和用户提交表单时的用来rewind的页面类实例不一定是同一个，即使是一个实例，也是被重新初始化过的，不要想当然的认为显示表单后再提交那个实例应该保存原来显示的东西，这个应该理清楚。 <br />
    <br />
    原文地址：http://www.javaeye.com/article/41724
<img src ="http://www.blogjava.net/lifenote/aggbug/184695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lifenote/" target="_blank">LifeNote</a> 2008-03-08 16:03 <a href="http://www.blogjava.net/lifenote/archive/2008/03/08/184695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>