﻿<?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 -随笔分类-Java</title><link>http://www.blogjava.net/lifenote/category/27919.html</link><description>&amp;nbsp;
Try to find something different in your life and then write it down&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;strong&gt;Java乐园：&lt;a href='http://www.java-bj.cn' target='_blank'&gt;&lt;font color='red' size="+1"&gt;www.java-bj.cn&lt;/font&gt;&lt;/a&gt;  资料下载&lt;/strong&gt;
&lt;div style="float:left"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4636496036365579";
/* 468x60, 创建于 08-4-23 */
google_ad_slot = "3356926921";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/div&gt;
&lt;div style="float:left"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-4636496036365579";
/* 468x60, 创建于 08-4-23 */
google_ad_slot = "5017273295";
google_ad_width = 468;
google_ad_height = 60;
//--&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/div&gt;
&lt;div style="clear:both;"&gt;&lt;/div&gt;</description><language>zh-cn</language><lastBuildDate>Thu, 24 Apr 2008 07:51:18 GMT</lastBuildDate><pubDate>Thu, 24 Apr 2008 07:51:18 GMT</pubDate><ttl>60</ttl><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>3</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>0</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>两种特殊的java容器类list和set分析</title><link>http://www.blogjava.net/lifenote/archive/2008/03/03/183432.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 03 Mar 2008 04:23:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/03/03/183432.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/183432.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/03/03/183432.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/183432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/183432.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
    <tbody>
        <tr bgcolor="#ffffff">
            <td>容器类可以大大提高编程效率和编程能力<img style="cursor: pointer" onclick="javascript:window.open(this.src);" height="0" alt="" src="http://www.woseo.net/images/woseo.gif" width="0" onload="return imgzoom(this,550);" border="0" />，在java2中，所有的容器都由sun公司的joshua bloch进行了重新设计，丰富了容器类库的功能。 <br />
            java2容器类类库的用途是&#8220;保存对象&#8221;，它分为两类： <br />
            collection----一组独立的元素，通常这些元素都服从某种规则。list必须保持元素特定的顺序，而set不能有重复元素。 <br />
            map----一组成对的&#8220;键值对&#8221;对象，即其元素是成对的对象，最典型的应用就是数据字典，并且还有其它广泛的应用。另外，map可以返回其所有键组成的set和其所有值组成的collection，或其键值对组成的set，并且还可以像数组一样扩展多维map，只要让map中键值对的每个&#8220;值&#8221;是一个map即可。 <br />
            1.迭代器 <br />
            迭代器是一种设计模式，它是一个对象，它可以遍历并选择序列中的对象，而开发人员不需要了解该序列的底层结构。迭代器通常被称为&#8220;轻量级&#8221;对象，因为创建它的代价小。 <br />
            java中的iterator功能比较简单，并且只能单向移动： <br />
            (1) 使用方法iterator()要求容器返回一个iterator。第一次调用iterator的next()方法时，它返回序列的第一个元素。 <br />
            (2) 使用next()获得序列中的下一个元素。 <br />
            (3) 使用hasnext()检查序列中是否还有元素。 <br />
            (4) 使用remove()将迭代器新返回的元素删除。 <br />
            iterator是java迭代器最简单的实现，为list设计的listiterator具有更多的功能，它可以从两个方向遍历list，也可以从list中插入和删除元素。 <br />
            2.list的功能方法 <br />
            list(interface): 次序是list最重要的特点；它确保维护元素特定的顺序。list为collection添加了许多方法，使得能够向list中间插入与移除元素(只推荐linkedlist使用)。一个list可以生成listiterator，使用它可以从两个方向遍历list，也可以从list中间插入和删除元素。 <br />
            arraylist: 由数组实现的list。它允许对元素进行快速随机访问，但是向list中间插入与移除元素的速度很慢。listiterator只应该用来由后向前遍历arraylist，而不是用来插入和删除元素，因为这比linkedlist开销要大很多。 <br />
            linkedlist: 对顺序访问进行了优化，向list中间插入与删除得开销不大，随机访问则相对较慢(可用arraylist代替)。它具有方法addfirst()、addlast()、getfirst()、getlast()、removefirst()、removelast()，这些方法(没有在任何接口或基类中定义过)使得linkedlist可以当作堆栈、队列和双向队列使用。 <br />
            3.set的功能方法 <br />
            set(interface): 存入set的每个元素必须是唯一的，因为set不保存重复元素。加入set的object必须定义equals()方法以确保对象的唯一性。set与collection有完全一样的接口。set接口不保证维护元素的次序。 <br />
            hashset: 为快速查找而设计的set。存入hashset的对象必须定义hashcode()。 <br />
            treeset: 保持次序的set，底层为树结构。使用它可以从set中提取有序的序列。 <br />
            linkedhashset: 具有hashset的查询速度，且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历set时，结果会按元素插入的次序显示。 hashset采用散列函数对元素进行排序，这是专门为快速查询而设计的；treeset采用红黑树的数据结构进行排序元素；linkedhashset内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己的类时，set需要维护元素的存储顺序，因此要实现comparable接口并定义compareto()方法。<br />
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/lifenote/aggbug/183432.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-03 12:23 <a href="http://www.blogjava.net/lifenote/archive/2008/03/03/183432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《J2EE核心模式》(DAO模式)</title><link>http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 15 Feb 2008 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/180110.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/180110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/180110.html</trackback:ping><description><![CDATA[<p>很多的J2EE应用程序需要使用持久性数据(数据库、文件等)。不同的程序，持久性存储是各不相同的，并且用来访问这些不同的持久性存储机制的API也有很大的不同。如果应用程序要在不同的持久性存储间迁移，这些访问特定持久存储层的代码将面临重写。<br />
如何解决这个问题?且看"DAO模式"</p>
<p>数据访问对象(Data&nbsp;Acess&nbsp;Object)&nbsp;模式<br />
一.环境<br />
根据数据源不同，数据访问也不同。根据存储的类型(关系数据库、面向对象数据库、文件等等)和供应商实现不同，持久性存储(比如数据库)的访问差别也很大</p>
<p>二.问题<br />
许多真是的J2EE应用程序需要在一定程度上使用持久性数据。对于许多应用程序，持久性存储是使用不同的机制实现的,并且用来访问这些不同的持久性存储机制的API也有很大的不同。<br />
比如，应用程序使用实体bean(这里应该是指BMP的bean，CMP的bean已大大降低了与RDBMS的耦合)的分布式组件来表示持久性数据，或者使用JDBC&nbsp;API来访问驻留在某关系数据库管理系统(RDBMS)中的数据，这些组件中包含连接性性和数据访问代码会引入这些组件与数据源实现之间的紧密耦合。组件中这类代码依赖性使应用程序从某种数据源迁移到其他种类的数据源将变得非常麻烦和困难。当数据源变化时，组件也需要改变，以便于能够处理新类型的数据源</p>
<p>(举个例子来说，我们UPTEL系统是使用JDBC&nbsp;API对&nbsp;ORACLE数据库进行连接和数据访问的，这些JDBC&nbsp;API与SQL语句散布在系统中，当我们需要将UPTEL迁移到其他RDBMS时，比如曾经迁移到INFORMIX，就面临重写数据库连接和访问数据的模块。)</p>
<p>三.作用力<br />
1.诸如bean管理的实体bean、会话bean、servlet等组件往往需要从持久性存储数据源中检索数据，以及进行数据存储等操作。<br />
2.根据产品供应商的不同，持久性存储API差别也很大，这些API和其能力同样根据存储的类型不同也有差别，这样存在以下缺点，即访问这些独立系统的API很不统一。<br />
3.组件需要透明于实际的持久性存储或者数据源实现，以便于提供到不同供应商产品、不同存储类型和不同数据源类型的更容易的移植性。</p>
<p>四.解决方案<br />
使用数据访问对象(DAO)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。<br />
DAO实现了用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File等。依赖于DAO的业务组件为其客户端使用DAO提供更简单的接口。DAO完全向客户端隐藏了数据源实现细节。由于当低层数据源实现变化时，DAO向客户端提供的接口不会变化，所有该模式允许DAO调整到不同的存储模式，而不会影响其客户端或者业务组件。重要的是,DAO充当组件和数据源之间的适配器。</p>
<p>(按照这个理论，如果我们UPTEL系统使用了DAO模式,就可以无缝的从ORACLE迁移到任何一个RDBMS了。梦想总是很完美的，且看看DAO模式如何实现)</p>
 <img src ="http://www.blogjava.net/lifenote/aggbug/180110.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-02-15 17:09 <a href="http://www.blogjava.net/lifenote/archive/2008/02/15/180110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF中文输入乱码问题解决方法</title><link>http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 31 Jan 2008 07:05:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/178680.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/178680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/178680.html</trackback:ping><description><![CDATA[<p class="content">该方法已知适用的版本tomact5.0.18,tomcat5.0.9。<br />
已知不适用的版本为tomcat5.0.28。<br />
问题描述：<br />
在inputtext中输入中文，然后在输出，显示为乱码。<br />
解决方法：<br />
1、自定义转器<br />
package util;<br />
import java.util.Map;<br />
import javax.faces.component.UIComponent;<br />
import javax.faces.convert.Converter;<br />
import javax.faces.context.FacesContext;<br />
import javax.faces.convert.ConverterException; </p>
<p class="content">public class StringConverter implements Converter {<br />
&nbsp;public Object getAsObject(FacesContext context, UIComponent component,<br />
&nbsp;&nbsp;&nbsp;String newValues) throws ConverterException {<br />
&nbsp;&nbsp;String newstr = "";<br />
&nbsp;&nbsp;if (newValues == null) {<br />
&nbsp;&nbsp;&nbsp;newValues = "";<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;byte[] byte1 = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;byte1 = newValues.getBytes("ISO-8859-1");<br />
&nbsp;&nbsp;&nbsp;newstr = new String(byte1, "GB2312");<br />
&nbsp;&nbsp;&nbsp;UIInput input=(UIInput)component;//<br />
&nbsp;&nbsp;&nbsp;input.setSubmittedValue(newstr);<br />
&nbsp;&nbsp;} catch (UnsupportedEncodingException e) {<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}</p>
<p class="content">&nbsp;&nbsp;return newstr;</p>
<p class="content">&nbsp;}</p>
<p class="content">&nbsp;public String getAsString(FacesContext context, UIComponent component,<br />
&nbsp;&nbsp;&nbsp;Object Values) throws ConverterException {&nbsp;<br />
&nbsp;&nbsp;return (String) Values;<br />
&nbsp;}<br />
}</p>
<p class="content">2、注册转换器<br />
faces-config.xml片段<br />
&lt;converter&gt;<br />
&nbsp; &lt;converter-id&gt;util.stringconverter&lt;/converter-id&gt;<br />
&nbsp; &lt;converter-class&gt;util.StringConverter&lt;/converter-class&gt;<br />
&lt;/converter&gt;</p>
<p class="content">3、在页面使用转换器<br />
&lt;h:inputText id="account" value="#{util.account}" required="true" styleClass="input" &gt;&nbsp;<br />
&nbsp;&lt;f:converter converterId="utilstringconverter"/&gt;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/178680.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-01-31 15:05 <a href="http://www.blogjava.net/lifenote/archive/2008/01/31/178680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat,Weblogic 等服务器  SSL 安全登陆的例子---附证书文件生成器</title><link>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 15 Jan 2008 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/175432.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/175432.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/175432.html</trackback:ping><description><![CDATA[<p>公司今天一个登陆的地方要修改，需要加一个SSL安全登陆,于是查些资料并总结如下，希望对有用的着的朋友有帮助<br />
文件打包地址：http://www.blogjava.net/Files/lifenote/tomcat配置ssl.rar<br />
一下为帮助说明：<br />
<br />
1.1.&nbsp;安全登录 SSL<br />
1.1.1&nbsp;&nbsp;WebLogic下面SSL配置：<br />
1．生成 keystoreFile：<br />
&nbsp;* keystoreFile 文件的生成：<br />
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks</p>
<p>&nbsp;* csr 文件的生成：<br />
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks</p>
<p>&nbsp;* 注意： http 的默认端口是80，https 的默认端口是433，ftp 的默认端口是21。<br />
2．部署keystore 文件<br />
在 &lt;http://hostname:7001/console&gt;&nbsp; 中配置刚才生成的 testKey.jks 文件。</p>
<p>1.1.2&nbsp;Tomcat 下面SSL配置</p>
<p><br />
1．生成 keystoreFile：<br />
&nbsp;* keystoreFile 文件的生成：<br />
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks</p>
<p>Example for inner test：<br />
[root@localhost ~]# <br />
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks<br />
Enter keystore password:&nbsp; someday2007<br />
What is your first and last name?<br />
&nbsp; [Unknown]:&nbsp; lifenote<br />
What is the name of your organizational unit?<br />
&nbsp; [Unknown]:&nbsp; Java<br />
What is the name of your organization?<br />
&nbsp; [Unknown]:&nbsp; Sunxc<br />
What is the name of your City or Locality?<br />
&nbsp; [Unknown]:&nbsp; Beijing<br />
What is the name of your State or Province?<br />
&nbsp; [Unknown]:&nbsp; Beijing<br />
What is the two-letter country code for this unit?<br />
&nbsp; [Unknown]:&nbsp; ZH<br />
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?<br />
&nbsp; [no]:&nbsp; y</p>
<p>Enter key password for &lt;localhost-tomcat&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (RETURN if same as keystore password):&nbsp; someday2007<br />
[root@localhost ~]#</p>
<p>&nbsp;</p>
<p>&nbsp;* csr 文件的生成：<br />
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks</p>
<p>&nbsp;* 注意： http 的默认端口是80，https 的默认端口是433，ftp 的默认端口是21。</p>
<p><br />
2．部署keystore 文件<br />
&nbsp; 打开 server.xml 文件，修改内容如下：<br />
&nbsp;<br />
&nbsp;* 只需去掉 server.xml 中对SSL定义的注释，在加上 keystoreFile、keystorePass 这两个属性即可。<br />
&nbsp; &lt;Service<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="Catalina"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8080"<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&lt;!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这里 --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;Connector port="8443" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="e:/temp_E/ssl/testKey.jks" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="aaaaaa"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;Connector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; port="8009"<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;<br />
&nbsp;...<br />
Example for inner test：<br />
&nbsp;&nbsp;&nbsp; &lt;Connector port="443" maxHttpHeaderSize="8192"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="password"/&gt;</p>
<p><br />
&nbsp;注意需默认要使用 443 而不是 8443，要使用8443要在apache中配置，保证从apache请求tomcat 采用 &lt;https://ip:8443/&gt;... 的格式。</p>
<p><br />
1.1.3&nbsp;使用http访问WebService s的客户端配置<br />
Servlet服务器配置好SSL之后，客户端可以使用https访问了。<br />
对于用户使用浏览器访问https的方式，浏览器会弹出安装证书的对话框，确认之后可以正常使用https访问。<br />
&nbsp;对于WebService 通过https方式访问，按照一下步骤：<br />
1．&nbsp;WebService客户端要先取得keyStore文件；<br />
2．&nbsp;虚拟机系统使用 System.setProperties(&#8230;) 设置keyStore信息；<br />
3．&nbsp;使用 url=&lt;https://ip:port/...&gt; 访问WebService服务</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/175432.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-01-15 12:32 <a href="http://www.blogjava.net/lifenote/archive/2008/01/15/175432.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Struts的上传下载文件的程序</title><link>http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 14 Jan 2008 13:24:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/175299.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/175299.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/175299.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 参看了一些资料实现了一个Struts的上传下载文件的程序，提供下载学习，有什么不好的地方请留言多多指教<br />
为了节省空间，文件中没有导入java包，导入eclipse后请自行加入java包<br />
<a href="http://www.blogjava.net/Files/lifenote/"><br />
http://www.blogjava.net/Files/lifenote/</a>使用struts实现文件上传下载.rar<br />
<br />
要把上面的地址都复制哦
<img src ="http://www.blogjava.net/lifenote/aggbug/175299.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-01-14 21:24 <a href="http://www.blogjava.net/lifenote/archive/2008/01/14/175299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java.lang.OutOfMemoryError 的解决办法</title><link>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Wed, 09 Jan 2008 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/173982.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/173982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/173982.html</trackback:ping><description><![CDATA[最近在使用Tomcat +Tapestry的时候遇见一个问题，由于Tapestry修改些内容后要重新启动（即使配置了一下那参数有时候也要重启）当我修改了页面的内容 需要调试不断刷新，发现页面显示的速度越来越慢 最后就出现了 500错误java.lang.OutOfMemoryError&nbsp; 内存溢出，在网上查了一下资料<br />
最后总结如下希望可以帮你解决同样的问题<br />
解决java.lang.OutOfMemoryError的方法有如下几种：<br />
1。增加jvm的内存大小。方法有：&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1）在执行某个class文件时候，可以使用java&nbsp;-Xmx256M&nbsp;aa.class来设置运行aa.class时jvm所允许占用的最大内存为256M。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2）对tomcat容器，可以在启动时对jvm设置内存限度。对tomcat，可以在catalina.bat中添加：<br />
&nbsp;&nbsp;set&nbsp;CATALINA_OPTS=-Xms128M&nbsp;-Xmx256M<br />
&nbsp;&nbsp;&nbsp;set&nbsp;JAVA_OPTS=-Xms128M&nbsp;-Xmx256M<br />
或者把%CATALINA_OPTS%和%JAVA_OPTS%代替为-Xms128M&nbsp;-Xmx256M
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3）对resin容器，同样可以在启动时对jvm设置内存限度。在bin文件夹下创建一个startup.bat文件，内容如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@echo&nbsp;off<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;"httpd.exe"&nbsp;&nbsp;"-Xms128M"&nbsp;"-Xmx256M"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:end&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中"-Xms128M"为最小内存，"-Xmx256M"为最大内存。</p>
<p>&nbsp;2.&nbsp;&nbsp;&nbsp;&nbsp;优化程序，释放垃圾。</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/173982.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-01-09 13:27 <a href="http://www.blogjava.net/lifenote/archive/2008/01/09/173982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多模块Struts应用程序的几个问题（及部分解决方法）</title><link>http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 04 Jan 2008 05:35:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/172726.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/172726.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/172726.html</trackback:ping><description><![CDATA[<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">Struts</a>从1.1版本开始支持把应用程序分为多个模块，每个模块可以看作独立的应用程序，在带来方便的同时，我也发现了一些问题。比如有一个<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>应用程序分了大约十个模块，现在有以下问题不知道大家一般是怎么解决的：<br />
<div&nbsp;class=posttext><br />
<p>1、因为要进行验证，所以在每个模块对应的资源文件里都要有&#8220;errors.required={0}&nbsp;is&nbsp;required.&#8221;等资源，有没有只用在一个文件里定义的方法？</p>
<br />
<p>2、用tiles的时候，要在每个模块对应的tiles-defs.xml里定义几乎相同的definition，有没有只用在一个文件里定义的方法？（我试过在缺省模块里定义一个definition，然后在模块里extends它，但不行，extends似乎只找当前模块）</p>
<br />
<p>3、使用ExceptionHandler的时候，为什么在exception标签里指定了bundle属性还是只在当前模块里找资源？我希望把一些重复使用的异常处理声明在一个文件里，例如NotLoginException、NoSuchObjectException等等，并且它们对应的key也指向同一个资源文件里的资源（利用bundle属性），怎么实现？</p>
<br />
<p>经过一段时间的摸索，第一个和第三个问题基本上解决了，其实它们可以看作同一类问题，就是资源的问题。在<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>-config-xxx.xml里定义资源文件时，可以指定一个factory属性，不指定时使用缺省的&#8220;org.apache.<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>.util.PropertyMessageResourcesFactory&#8221;类。我的解决方法是自定义一个CustomMessageResourcesFactory类，将多个资源文件以逗号分隔的形式作为参数（即message-resources的parameter属性）传给它，在需要资源的地方会遍历它们进行查找。同时还要自定义一个CustomMessageResources类，它的getMessage()方法里是查找资源的关键代码，而factory只是解析逗号分隔的参数构造并返回CustomMessageResources实例。</p>
<br />
<p>CustomMessageResourcesFactory的代码比较简单，如下所示：</p>
<br />
<DIV&NBSP;STYLE="BACKGROUND:&NBSP;#E6E6E6;&NBSP;BORDER-BOTTOM:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-LEFT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-RIGHT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-TOP:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;PADDING-BOTTOM:&NBSP;4PX;&NBSP;PADDING-LEFT:&NBSP;5.4PT;&NBSP;PADDING-RIGHT:&NBSP;5.4PT;&NBSP;PADDING-TOP:&NBSP;4PX;&NBSP;WIDTH:&NBSP;98%;&NBSP;WORD-BREAK:&NBSP;BREAK-ALL"><br />
<div><IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">package&nbsp;eg;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />import&nbsp;java.util.Arrays;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />import&nbsp;org.apache.<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>.util.MessageResources;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />import&nbsp;org.apache.<a class="UBBWordLink" href="http://www.java-bj.cn/article/sort022/www.java-bj.cn" target="_blank">struts</a>.util.MessageResourcesFactory;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />public&nbsp;class&nbsp;CustomMessageResourcesFactory&nbsp;extends&nbsp;MessageResourcesFactory{<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MessageResources&nbsp;createResources(String&nbsp;config)&nbsp;{<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">return</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">new</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">&nbsp;CustomMessageResources(Arrays.asList(config.split(</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">,</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000">)));<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />}<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /></span>&nbsp;</div>
<br />
<p>&nbsp;</p>
<br />
<p>CustomMessageResources就稍微复杂一些，不过很幸运，我在网上找到了一个完全符合自己要求的类，下载地址在<A&NBSP;HREF="HTTP: javaboutique.internet.com tutorials Dynaform source.zip?><br />
<div><IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">&lt;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#800000">message-resources&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000">factory</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">="eg.CustomMessageResourcesFactory"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000">&nbsp;<br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; />&nbsp;&nbsp;&nbsp;&nbsp;parameter</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">="eg.ApplicationResources,eg.ErrorResources"</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000">&nbsp;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF">/&gt;</span><SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"><br />
<IMG&NBSP;ALIGN=TOP&NBSP;HEIGHT=16&NBSP;SRC="HTTP: style="cursor: pointer" onclick="javascript:window.open(this.src);" www.cnblogs.com Images OutliningIndicators onload="return imgzoom(this,550);" width="11"  None.gif?&nbsp; /></span>&nbsp;</div>
<br />
<p>&nbsp;</p>
<br />
<p>上面参考了这篇文章</SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#FF0000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#800000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></DIV&NBSP;STYLE="BACKGROUND:&NBSP;#E6E6E6;&NBSP;BORDER-BOTTOM:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-LEFT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-RIGHT:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;BORDER-TOP:&NBSP;WINDOWTEXT&NBSP;0.5PT&NBSP;SOLID;&NBSP;PADDING-BOTTOM:&NBSP;4PX;&NBSP;PADDING-LEFT:&NBSP;5.4PT;&NBSP;PADDING-RIGHT:&NBSP;5.4PT;&NBSP;PADDING-TOP:&NBSP;4PX;&NBSP;WIDTH:&NBSP;98%;&NBSP;WORD-BREAK:&NBSP;BREAK-ALL">
</SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></SPAN&NBSP;STYLE="COLOR:&NBSP;#0000FF"></SPAN&NBSP;STYLE="COLOR:&NBSP;#000000"></p>
<img src ="http://www.blogjava.net/lifenote/aggbug/172726.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-01-04 13:35 <a href="http://www.blogjava.net/lifenote/archive/2008/01/04/172726.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF和Spring集成</title><link>http://www.blogjava.net/lifenote/archive/2008/01/03/172506.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 03 Jan 2008 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2008/01/03/172506.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/172506.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2008/01/03/172506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/172506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/172506.html</trackback:ping><description><![CDATA[<p>JSF和Spring集成原理是获得彼此的上下文引用,以此进一步获得各自管理的bean,这是可能的,因为两者是web应用框架都遵循servlet规范,为二者整合提供了可能和基础.<br />
&nbsp;<br />
在Spring中ApplicationContext是相当重要的类,对于web应用,它还包装了javax.servlet.ServletContext,为web应用提供了所有可以利用的数据,包括可管理bean,Faces中通过FacesContext类可以获得所有可以利用的资源,同样包括JSF的可管理支持bean,它们都围绕着ServletContext提供了自己的门面,通过各自的门面在Servlet容器的世界里彼此相通.<br />
本文介绍两种方式,实现二者集成:<br />
1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过写自己的类来完成二者的连通,实际上只是获得彼此世界里存活的bean,对于JSF中事件处理可能需要更进一步的构思和编码,为了这点,第二个方法介绍了一种框架.<br />
2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用框架完成二者集成.<br />
&nbsp;<br />
一&nbsp; 自己动手,下面的代码以示例为主,其它涉及的类和接口略去.<br />
这个工具类提供在JSF世界里查找Spring管理的bean.也实现在Spring中查找JSF组件的方法.<br />
package com.skysoft.rbac.dao;<br />
&nbsp;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.web.context.support.WebApplicationContextUtils;<br />
import javax.faces.context.FacesContext;<br />
import javax.servlet.ServletContext;<br />
import javax.faces.el.ValueBinding;<br />
import javax.faces.FactoryFinder;<br />
import javax.faces.application.Application;<br />
import javax.faces.application.ApplicationFactory;<br />
&nbsp;<br />
public final class SpringFacesUtil {<br />
&nbsp; public SpringFacesUtil() {<br />
&nbsp; }<br />
&nbsp; /**<br />
&nbsp;&nbsp; * 从Spring中查找bean.<br />
&nbsp;&nbsp; * @param beanname String<br />
&nbsp;&nbsp; * @return Object<br />
&nbsp;&nbsp; */<br />
&nbsp; public static Object findBean(String beanname) {<br />
&nbsp;&nbsp;&nbsp; ServletContext context = (ServletContext) FacesContext.getCurrentInstance().<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getExternalContext().getContext();<br />
&nbsp;&nbsp;&nbsp; ApplicationContext appctx = WebApplicationContextUtils.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getRequiredWebApplicationContext(context);<br />
&nbsp;&nbsp;&nbsp; return appctx.getBean(beanname);<br />
&nbsp; }<br />
&nbsp; /**<br />
&nbsp;&nbsp; * 从JSF中查找bean.<br />
&nbsp;&nbsp; * @param beanname String<br />
&nbsp;&nbsp; * @return Object<br />
&nbsp;&nbsp; */<br />
&nbsp; public static Object lookupBean(String beanname) {<br />
&nbsp;&nbsp;&nbsp; Object obj = getValueBinding(getJsfEl(beanname)).getValue(FacesContext.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getCurrentInstance());<br />
&nbsp;&nbsp;&nbsp; return obj;<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; private static ValueBinding getValueBinding(String el) {<br />
&nbsp;&nbsp;&nbsp; return getApplication().createValueBinding(el);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; private static Application getApplication() {<br />
&nbsp;&nbsp;&nbsp; ApplicationFactory appFactory = (ApplicationFactory) FactoryFinder.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getFactory(FactoryFinder.APPLICATION_FACTORY);<br />
&nbsp;&nbsp;&nbsp; //FactoryFinder.FACES_CONTEXT_FACTORY<br />
&nbsp;&nbsp;&nbsp; //FactoryFinder.RENDER_KIT_FACTORY<br />
&nbsp;&nbsp;&nbsp; return appFactory.getApplication();<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; private static String getJsfEl(String value) {<br />
&nbsp;&nbsp;&nbsp; return "#{" + value + "}";<br />
&nbsp; }<br />
}<br />
下面定义一个由JSF管理的bean:<br />
package com.skysoft.rbac.dao;<br />
&nbsp;<br />
import javax.servlet.ServletContext;<br />
&nbsp;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.web.context.support.WebApplicationContextUtils;<br />
import org.skysoft.struts.jsf.util.FacesUtils;<br />
&nbsp;<br />
public class ServiceLocatorBean<br />
&nbsp;&nbsp;&nbsp; implements ServiceLocator {<br />
&nbsp; private static final String DAO_SERVICE_BEAN_NAME = "userDAO";<br />
&nbsp; //这个dao就是由Spring提供的管理bean,这个dao可以使用Hibernate实现.<br />
&nbsp; private UserDAO dao;<br />
&nbsp;<br />
&nbsp; public ServiceLocatorBean() {<br />
&nbsp;&nbsp;&nbsp; this.dao = (UserDAO)SpringFacesUtil.findBean(DAO_SERVICE_BEAN_NAME);<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; public UserDAO getDao() {<br />
&nbsp;&nbsp;&nbsp; return dao;<br />
&nbsp; }<br />
}<br />
下面是一个使用ServiceLocatorBean的类.<br />
public class UserDAOImp<br />
&nbsp;&nbsp;&nbsp; extends HibernateDaoSupport implements UserDAO {<br />
&nbsp; private UserDAO dao;<br />
&nbsp; private List list;<br />
&nbsp;<br />
&nbsp; public UserDAOImp() {}<br />
&nbsp;<br />
&nbsp; public List getList() {<br />
&nbsp;&nbsp;&nbsp; if (list == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list = dao.getList();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return list;<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; public UserDAO getDao() {<br />
&nbsp;&nbsp;&nbsp; return dao;<br />
&nbsp; }<br />
&nbsp;<br />
&nbsp; public void setDao(UserDAO dao) {<br />
&nbsp;&nbsp;&nbsp; this.dao = dao;<br />
&nbsp; }<br />
}<br />
&nbsp;<br />
在faces-config.xml中的配置:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;serviceLocatorBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;com.skysoft.rbac.dao.ServiceLocatorBean&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;User&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;com.skysoft.rbac.User&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;serviceLocator&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-class&gt;com.skysoft.rbac.dao.ServiceLocatorBean&lt;/property-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;#{serviceLocatorBean}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt;<br />
在applicationContext.xml中的配置:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="userDAO" class="com.skysoft.rbac.dao.UserDAOImp"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
二 使用框架<br />
1 介绍<br />
这个框架是Spring相关项目,提供一个包de.mindmatters.faces.spring,这个包包含JSF和Spring框架综合集成的粘合代码,这些代码以独立于一个实现的方式完成,这样它能和任何JSF实现一起使用.<br />
本包的提供的代码主要目的是尽可能透明的集成两个框架,主要特征:<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSF/JSP开发者应该能访问Spring管理的Beans,就好象它们是由JSF管理的.<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSF可管理beans应能集成入Spring.<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RequestHandledEvent事件也应该能被发布到Spring.<br />
2&nbsp; JSF配置集成<br />
本包构造了一个基于faces配置文件(e.g. /WEB-INF/faces-config.xml)的WebApplicationContext类, 让它成为遵循"spring-beans" DTD配置文件(e.g. defined in /WEB-INF/applicationContext.xml)来配置的ApplicationContext的孩子,这样依从"faces-config" DTD的WebApplicationContext就是全特征的,即自动拥有如下功能: <br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSF可管理beans实现了Spring的*Aware interfaces:<br />
ApplicationContextAware <br />
BeanFactoryAware <br />
BeanNameAware <br />
ResourceLoaderAware <br />
ServletContextAware <br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSF可管理beans实现Spring的lifecycle interfaces:<br />
InitializingBean <br />
DisposableBean <br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现Spring的FactoryBean interface<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现Spring的ApplicationListener interface <br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发布ApplicationEvent事件.<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从资源中读取消息.<br />
等等,更多可看Spring.<br />
3 访问方式<br />
1) 从JSF中程序化的访问Spring管理的beans.<br />
因为在FacesWebApplicationContext和ApplicationContext之间有层次关系,所以你的JSF可管理支持beans能容易的实现ApplicationContextAware接口,并能通过getBean方法访问它而不管它是否定义在FacesWebApplicationContext中还是定义在父ApplicationContext类对象中.<br />
2) 通过JSF EL从JSF中访问Spring管理的beans.<br />
能够使用JSF EL访问beans无论你引用的bean由JSF管理还是由Spring管理.两个bean上下文在存取时间合并.<br />
a) 直接访问:<br />
如果一个带有请求名字的bean只存在于Spring上下文内的话,这个bean被使用,bean的singleton属性设置被完全保持.<br />
b) 区域化访问(scoped access):<br />
如果你要从JSF定义bean的作用域的能力上得益还想让那个bean由Spring管理,那么就要在两个上下文中定义,只是对于JSF上下文中的定义的类类型要使用de.mindmatters.faces.spring.SpringBeanFactory类,你还应该设置那个bean的singleton属性到false,因这能覆盖你的作用域设置.在你使用JSF EL访问bean时,你总能获得一个遵从你在JSF上下文中定义的作用域设置的由Spring管理的bean的实例.<br />
&nbsp;<br />
三 用法<br />
通常,就象设置任何其它JSF web应用一样设置你的web应用,下面的样例配置展示怎样使能上面提到的特征。<br />
在web.xml配置中必须加入下列配置条目,同时注意把该库的jsf-spring.jar放在适当的位置.<br />
&lt;web-app&gt;<br />
&nbsp;&nbsp;&nbsp; .........<br />
&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过滤器用于向Spring发布RequestHandledEvent,它应该影射到和FacesServlet url相同的模式.<br />
&nbsp;&nbsp;&nbsp; --&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;RequestHandled&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;de.mindmatters.faces.spring.support.RequestHandledFilter&lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;RequestHandled&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.faces&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 这个侦听器用于装入Spring beans的父应用上下文.<br />
&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/listener&gt;<br />
&nbsp;&nbsp;&nbsp; .........<br />
&lt;/web-app&gt;<br />
下面的一些说明,都可以通过下载这个Spring相关项目得到,列在这里只为演示上面的说明的功能.<br />
WEB-INF/faces-config.xml <br />
&lt;!-- 一个纯JSF管理的bean --&gt;<br />
&lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;jsfBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;example.NameBean&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;name&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
&lt;!--一个SpringBeanScope用来定义Spring可管理bean的作用域.--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;scopedAccessSpringBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;de.mindmatters.faces.spring.SpringBeanScope&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt;<br />
&lt;!-- 这是一个纯JSF可管理bean,它持有一个到Spring可管理bean的一个引用. --&gt;<br />
&lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;referencingBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;example.ReferencingBean&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;referencedBean&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;#{managedPropertyAccessSpringBean}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
WEB-INF/applicationContext.xml (partial)<br />
&lt;!-- 一个纯Spring的可管理bean --&gt;<br />
&lt;bean id="directAccessSpringBean" class="example.NameBean"/&gt;<br />
&lt;!-- 一个向JSF作用域提供的可管理bean.&nbsp; --&gt;<br />
&lt;bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/&gt;<br />
&lt;!-- 一个纯Spring的可管理bean,它由一个JSF可管理bean引用.(当然了,它也能被直接访问啦.) --&gt;<br />
&lt;bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/&gt;<br />
参考:<br />
http://jsf-spring.sourceforge.net/&nbsp;&nbsp; JSF-Spring,Spring相关项目官方站点,提供本文介绍的框架下载以及实例下载.<br />
javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html"&gt;http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html 一篇关于JSF和Spring的文章.<br />
bean的singleton属性设置被完全保持. </p>
<p>b) 区域化访问(scoped access):<br />
如果你要从JSF定义bean的作用域的能力上得益还想让那个bean由Spring管理,那么就要在两个上下文中定义,只是对于JSF上下文中的定义的类类型要使用de.mindmatters.faces.spring.SpringBeanFactory类,你还应该设置那个bean的singleton属性到false,因这能覆盖你的作用域设置.在你使用JSF EL访问bean时,你总能获得一个遵从你在JSF上下文中定义的作用域设置的由Spring管理的bean的实例.<br />
&nbsp;<br />
三 用法<br />
通常,就象设置任何其它JSF web应用一样设置你的web应用,下面的样例配置展示怎样使能上面提到的特征。<br />
在web.xml配置中必须加入下列配置条目,同时注意把该库的jsf-spring.jar放在适当的位置.<br />
&lt;web-app&gt;<br />
&nbsp;&nbsp;&nbsp; .........<br />
&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过滤器用于向Spring发布RequestHandledEvent,它应该影射到和FacesServlet url相同的模式.<br />
&nbsp;&nbsp;&nbsp; --&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;RequestHandled&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;de.mindmatters.faces.spring.support.RequestHandledFilter&lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;RequestHandled&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.faces&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp; 这个侦听器用于装入Spring beans的父应用上下文.<br />
&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/listener&gt;<br />
&nbsp;&nbsp;&nbsp; .........<br />
&lt;/web-app&gt;<br />
下面的一些说明,都可以通过下载这个Spring相关项目得到,列在这里只为演示上面的说明的功能.<br />
WEB-INF/faces-config.xml <br />
&lt;!-- 一个纯JSF管理的bean --&gt;<br />
&lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;jsfBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;example.NameBean&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;name&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
&lt;!--一个SpringBeanScope用来定义Spring可管理bean的作用域.--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;scopedAccessSpringBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;de.mindmatters.faces.spring.SpringBeanScope&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt;<br />
&lt;!-- 这是一个纯JSF可管理bean,它持有一个到Spring可管理bean的一个引用. --&gt;<br />
&lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;referencingBean&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;example.ReferencingBean&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;referencedBean&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;#{managedPropertyAccessSpringBean}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt;<br />
&lt;/managed-bean&gt;<br />
WEB-INF/applicationContext.xml (partial)<br />
&lt;!-- 一个纯Spring的可管理bean --&gt;<br />
&lt;bean id="directAccessSpringBean" class="example.NameBean"/&gt;<br />
&lt;!-- 一个向JSF作用域提供的可管理bean.&nbsp; --&gt;<br />
&lt;bean id="scopedAccessSpringBean" class="example.NameBean" singleton="false"/&gt;<br />
&lt;!-- 一个纯Spring的可管理bean,它由一个JSF可管理bean引用.(当然了,它也能被直接访问啦.) --&gt;<br />
&lt;bean id="managedPropertyAccessSpringBean" class="example.NameBean" singleton="false"/&gt;<br />
参考:<br />
http://jsf-spring.sourceforge.net/&nbsp;&nbsp; JSF-Spring,Spring相关项目官方站点,提供本文介绍的框架下载以及实例下载.<br />
http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html 一篇关于JSF和Spring的文章.<br />
</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/172506.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-01-03 16:31 <a href="http://www.blogjava.net/lifenote/archive/2008/01/03/172506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>博客搬家程序是如何实现的</title><link>http://www.blogjava.net/lifenote/archive/2007/12/27/170914.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 27 Dec 2007 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/27/170914.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/170914.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/27/170914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/170914.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/170914.html</trackback:ping><description><![CDATA[如题，找有开发过这样功能的朋友介绍一下，是分析html代码么&nbsp; 那比如sina 的和163的 代码肯定不一样的 那不是要写很多这样的程序 疑惑中。。。
<img src ="http://www.blogjava.net/lifenote/aggbug/170914.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> 2007-12-27 16:28 <a href="http://www.blogjava.net/lifenote/archive/2007/12/27/170914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由MyEclipse内存不足谈谈JVM内存 </title><link>http://www.blogjava.net/lifenote/archive/2007/12/25/170298.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 25 Dec 2007 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/25/170298.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/170298.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/25/170298.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/170298.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/170298.html</trackback:ping><description><![CDATA[<div class="declaration">原文出处: <a href="http://www.javatang.com/archives/2007/12/03/1653250.html">http://www.javatang.com/archives/2007/12/03/1653250.html</a><br />
作者: Jet Mah from <a href="http://www.javatang.com/">Java堂</a><br />
声明: <strong>可以非商业性任意转载, 转载时请务必以超链接形式标明文章原始出处、作者信息及此声明！</strong> </div>
<p>如果没有进行设置的话，在使用MyEclipse的经常出现如下图所示内存不足的提示。<br />
<img alt="myeclipse.png" src="http://www.javatang.com/wp-content/myeclipse.png" /><br />
提示中说的很明白：&#8220;MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains.&#8221;意思是说当前只有小于5%的非堆内存是空闲的。所以我们只要将这个值设置大一些就可以了。</p>
<p>提示中给出了设置的参数：</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline">-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M </li>
</ol>
</div>
<p>这里有几个问题：<br />
1. 各个参数的含义什么？<br />
2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动，而有些机器无法启动？<br />
3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置？</p>
<p>下面我们一一进行回答</p>
<p><strong>1. 各个参数的含义什么？</strong></p>
<p>参数中-vmargs的意思是设置JVM参数，所以后面的其实都是JVM的参数了，我们首先了解一下JVM内存管理的机制，然后再解释每个参数代表的含义。</p>
<blockquote>
<li><strong>堆(Heap)和非堆(Non-heap)内存</strong><br />
按照官方的说法：&#8220;Java 虚拟机具有一个堆，堆是运行时数据区域，所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。&#8221;&#8220;在JVM中堆之外的内存称为非堆内存(Non-heap memory)&#8221;。可以看出JVM主要管理两种类型的内存：堆和非堆。简单来说堆就是Java代码可及的内存，是留给开发人员使用的；非堆就是JVM留给自己用的，所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
<li><strong>堆内存分配</strong><br />
JVM初始分配的内存由-Xms指定，默认是物理内存的1/64；JVM最大分配的内存由-Xmx指定，默认是物理内存的1/4。默认空余堆内存小于40%时，JVM就会增大堆直到-Xmx的最大限制；空余堆内存大于70%时，JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
<li><strong>非堆内存分配</strong><br />
JVM使用-XX:PermSize设置非堆内存初始值，默认是物理内存的1/64；由XX:MaxPermSize设置最大非堆内存的大小，默认是物理内存的1/4。
<li><strong>JVM内存限制(最大值)</strong><br />
首先JVM内存限制于实际的最大物理内存(废话！呵呵)，假设物理内存无限大的话，JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制，这个限制一般是2GB-3GB（一般来说Windows系统下为1.5G-2G，Linux系统下为2G-3G），而64bit以上的处理器就不会有限制了。 </li>
</blockquote>
<p><strong>2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动，而有些机器无法启动？</strong></p>
<p>通过上面对JVM内存管理的介绍我们已经了解到JVM内存包含两种：堆内存和非堆内存，另外JVM最大内存首先取决于实际的物理内存和操作系统。所以说设置VM参数导致程序无法启动主要有以下几种原因：</p>
<blockquote>
<p>1) 参数中-Xms的值大于-Xmx，或者-XX:PermSize的值大于-XX:MaxPermSize；</p>
<p>2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制，比如当前操作系统最大内存限制，或者实际的物理内存等等。说到实际物理内存这里需要说明一点的是，如果你的内存是1024MB，但实际系统中用到的并不可能是1024MB，因为有一部分被硬件占用了。 </p>
</blockquote>
<p><strong>3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置？</strong></p>
<p>那为什么同样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢？这是因为我们没有遵守eclipse.ini文件的设置规则：</p>
<blockquote>
<p>参数形如&#8220;项 值&#8221;这种形式，中间有空格的需要换行书写，如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机，在eclipse.ini文件中要写成这样：</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline">-vm
    <li>C:\Java\jre1.6.0\bin\javaw.exe </li>
</ol>
</div>
</blockquote>
<p>按照上面所说的，最后参数在eclipse.ini中可以写成这个样子：</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline">-vmargs
    <li>-Xms128M
    <li>-Xmx512M
    <li>-XX:PermSize=64M
    <li>-XX:MaxPermSize=128M </li>
</ol>
</div>
<p>实际运行的结果可以通过Eclipse中&#8220;Help&#8221;-&#8220;About Eclipse SDK&#8221;窗口里面的&#8220;Configuration Details&#8221;按钮进行查看。</p>
<p>另外需要说明的是，Eclipse压缩包中自带的eclipse.ini文件内容是这样的：</p>
<div class="hl-surround">
<ol class="hl-main ln-show" ondblclick="linenumber(this)" title="Double click to hide line number.">
    <li class="hl-firstline">-showsplash
    <li>org.eclipse.platform
    <li>--launcher.XXMaxPermSize
    <li>256m
    <li>-vmargs
    <li>-Xms40m
    <li>-Xmx256m </li>
</ol>
</div>
<p>其中&#8211;launcher.XXMaxPermSize（注意最前面是两个连接线）跟-XX:MaxPermSize参数的含义基本是一样的，我觉得唯一的区别就是前者是eclipse.exe启动的时候设置的参数，而后者是eclipse所使用的JVM中的参数。其实二者设置一个就可以了，所以这里可以把&#8211;launcher.XXMaxPermSize和下一行使用#注释掉。</p>
 <img src ="http://www.blogjava.net/lifenote/aggbug/170298.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> 2007-12-25 13:56 <a href="http://www.blogjava.net/lifenote/archive/2007/12/25/170298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Eclipse启动错误 jvm terminated. exit code 1</title><link>http://www.blogjava.net/lifenote/archive/2007/12/25/170288.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 25 Dec 2007 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/25/170288.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/170288.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/25/170288.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/170288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/170288.html</trackback:ping><description><![CDATA[<p align="justify">&nbsp;</p>
MyEclipse时弹出了下面得错误：
<p>JVM terminated. Exit code=1<br />
C:\WINNT\system32\javaw.exe<br />
-Xms40m<br />
-Xmx256m<br />
-jar D:\eclipse-SDK-3.1.2-win32\startup.jar<br />
-os win32<br />
-ws win32<br />
-arch x86<br />
-launcher D:\eclipse-SDK-3.1.2-win32\eclipse.exe<br />
-name Eclipse<br />
-showsplash 600<br />
-exitdata ad0_a0<br />
-vm C:\WINNT\system32\javaw.exe<br />
-vmargs<br />
-Xms40m<br />
-Xmx256m<br />
-jar E:\eclipse-SDK-3.1.2-win32\startup.jar<br />
<br />
<br />
原以为只是软件安装得问题，可是反复的安装了几遍之后还是不行，搜集了下也有出现类似问题的人，按照他们的办法终于可以用了。之所以我还要重复一遍写它，是因为原文并没有完全解决问题<br />
<br />
</p>
<p>1 修改eclipse.ini文件如下：(eclipse 和myeclipse下的eclipse都有这个文件)</p>
<p>-debug<br />
options<br />
-vm<br />
d:\Java\jdk1.5\bin\javaw.exe<br />
-Xms40m<br />
-Xmx256m<br />
-vmargs</p>
<p>2 将文件夹configuration下除config.ini外的所有文件删除；</p>
<p>3 最后还是不行就 将workspace下的.metadata删除；</p>
<p>再次启动 就没问题了<br />
<br />
具体是不是myeclipse启动内存不足的问题呢？</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/170288.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> 2007-12-25 13:18 <a href="http://www.blogjava.net/lifenote/archive/2007/12/25/170288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(tomcat、weblogic)Jndi查找数据源配置</title><link>http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 24 Dec 2007 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/170005.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/170005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/170005.html</trackback:ping><description><![CDATA[<p>&nbsp;这是我在项目当中积累的资料关于配置tomcat和 weblogic的数据源，贴出来和大家分享，有什么问题还请多指教，共同学习，共同进步<br />
一、tomcat数据源的配制<br />
★★注意将数据库驱动程序最好放在common里，tomcat最先加载这里的驱动，放在server里有时候会出现找不到驱动程序的错误</p>
<p>&nbsp;在tomcat5.5中需要下载apache-tomcat-5.5admin.tar.rar 这个包才可以进行配制<br />
&nbsp;&nbsp; 1.首先进入tomcat的配制数据源的页面Data Sources中配制jndi等连接信息如(jndi为hdb)<br />
&nbsp;&nbsp; 2.在自己应用中的WEB-INF中的web.xml中添加如下：<br />
&nbsp;&lt;resource-ref&gt;<br />
&nbsp;&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; Resource reference to a factory for java.sql.Connection<br />
&nbsp;&nbsp;&nbsp;&nbsp; instances that may be used for talking to a particular<br />
&nbsp;&nbsp;&nbsp;&nbsp; database that is configured in the server.xml file.<br />
&nbsp;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp; &lt;res-ref-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; hdb<br />
&nbsp;&nbsp; &lt;/res-ref-name&gt;<br />
&nbsp;&nbsp; &lt;res-type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; javax.sql.DataSource<br />
&nbsp;&nbsp; &lt;/res-type&gt;<br />
&nbsp;&nbsp; &lt;res-auth&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; Container<br />
&nbsp;&nbsp; &lt;/res-auth&gt;<br />
&nbsp;&lt;/resource-ref&gt;<br />
&nbsp;&nbsp;&nbsp; 3.在META-INF中添加context.xml文件内容如下：<br />
&nbsp;&nbsp;&nbsp; &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&nbsp;&lt;Context&gt;<br />
&nbsp;&nbsp; &lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt;<br />
&nbsp;&nbsp; &lt;Resource name="hdb" auth="Container"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource" username="wangwin" password="wangwin"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="oracle.jdbc.driver.OracleDriver"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:oracle:thin:@127.0.0.1:1521:ora9"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="10" maxIdle="2"/&gt;<br />
&nbsp;&lt;/Context&gt;<br />
&nbsp;&nbsp; 4.在程序中通过JNDI得到连接对象内容如下：<br />
&nbsp;&nbsp; try {<br />
&nbsp;Context initCtx = new InitialContext();<br />
&nbsp;Context envCtx = (Context) initCtx.lookup("java:comp/env");//这里这是必须的。。。<br />
&nbsp;DataSource ds = (DataSource)(envCtx.lookup( "hdb" ));<br />
&nbsp;if (ds != null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = ds.getConnection();／／得到连接对象测试内容<br />
&nbsp;&nbsp;&nbsp;&nbsp; conn.setAutoCommit(false);<br />
&nbsp;&nbsp;&nbsp;&nbsp; Statement stm = conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stm.executeQuery("select * from tshp_flow");<br />
&nbsp;&nbsp;&nbsp;&nbsp; while(rs.next()){<br />
&nbsp;&nbsp;System.out.println(rs.getString(1));<br />
&nbsp;&nbsp;System.out.println(rs.getString(2));<br />
&nbsp;&nbsp;System.out.println(rs.getString(3));<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;} catch (NamingException ex) {<br />
&nbsp;&nbsp;ex.printStackTrace();<br />
&nbsp;}<br />
二、weblogic数据源的配制<br />
&nbsp;1.打开weblogic的控制台-服务-JDBC-连接缓冲池 配制数据库的连接信息<br />
&nbsp;2.服务-JDBC-数据源创建JNDI－继续－选择刚刚配制好的数据库JDBC<br />
&nbsp;3.得到连接对象</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/170005.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> 2007-12-24 12:02 <a href="http://www.blogjava.net/lifenote/archive/2007/12/24/170005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3 的DetachedCriteria 学习</title><link>http://www.blogjava.net/lifenote/archive/2007/12/22/169494.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 21 Dec 2007 18:44:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/22/169494.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/169494.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/22/169494.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/169494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/169494.html</trackback:ping><description><![CDATA[<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate一直都认为比较简单 就那么影射一下：）但最近项目当中遇见很多问题，今天看见别人在项目当中使用了　</span><a href="http://dev.21tx.com/java/struts/" target="_blank"><span style="color: #000000">Hibernate</span></a><span style="color: #000000">3的DetachedCriteria，感觉真的是太好了，于是就花了点时间研究了一下，希望和大家分享一下吧<br />
　　针对这种需求，对于分层应用程序来说，Web层需要传递一个查询的条件列表给业务层对象，业务层对象获得这个条件列表之后，然后依次取出条件，构造查询语句。这里的一个难点是条件列表用什么来构造？传统上使用Map，但是这种方式缺陷很大，Map可以传递的信息非常有限，只能传递name和value，无法传递究竟要做怎样的条件运算，究竟是大于，小于，like，还是其它的什么，业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变，业务层对象的查询构造算法必须相应修改，但是这种查询条件的改变是隐式约定的，而不是程序代码约束的，因此非常容易出错。 <br />
<br />
　　DetachedCriteria可以解决这个问题，即在web层，程序员使用DetachedCriteria来构造查询条件，然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后，可以在session范围内直接构造Criteria，进行查询。就此，查询语句的构造完全被搬离到web层实现，而业务层则只负责完成持久化和查询的封装即可，与查询条件构造完全解耦，非常完美！这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧！ <br />
<br />
　　示例代码片段如下： <br />
<br />
　　web层程序构造查询条件： <br />
<br />
　　</span><a href="http://dev.21tx.com/java/" target="_blank"><span style="color: #000000">Java</span></a><span style="color: #000000">代码: <br />
<span style="color: #000000">DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); <br />
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));</span><br />
</span><br />
<span style="color: #000000">　　Department和Employee是一对多关联，查询条件为： <br />
<br />
　　名称是&#8220;department&#8221;开发部门； <br />
　　部门里面的雇员年龄大于20岁； <br />
<br />
　　业务层对象使用该条件执行查询： <br />
<br />
　　java代码: <span style="color: #000000">detachedCriteria.getExecutableCriteria(session).list();</span></span><br />
<span style="color: #000000">　　最大的意义在于，业务层代码是固定不变的，所有查询条件的构造都在web层完成，业务层只负责在session内执行之。这样代码就可放之四海而皆准，都无须修改了。<br />
<br />
　　然而Spring和Hibernate3的DetachedCriteria有不兼容的问题，因此在Spring环境下面使用Hibernate3需要注意： <br />
<br />
　　Spring的HibernateTemplate提供了Hibernate的完美封装，即通过匿名类实现回调，来保证Session的自动资源管理和事务的管理。其中核心方法是： <br />
<br />
　　java代码: <br />
<span 