﻿<?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 style="color: #000000">HibernateTemplate.execute(new HibernateCallback() { <br />
　public Object doInHibernate(Session session) throws HibernateException { <br />
　　.... <br />
　} <br />
}</span></span><br />
<span style="color: #000000">　　回调方法提供了session作为参数，有了session，就可以自由的使用Hibernate API编程了。使用了spring的之后，代码修改如下： <br />
</span><strong><br />
</strong><span style="color: #000000">　　web层代码： <br />
<br />
　　java代码: <br />
</span><span style="color: #000000">DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); <br />
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20))); <br />
departmentManager.findByCriteria(detachedCriteria);</span><br />
<span style="color: #000000">　　构造detachedCriteria，作为参数传递给departmentManager <br />
<br />
　　业务层代码使用spring，DepartmentManager的findByCriteria如下： <br />
<br />
　　java代码: <br />
<br />
</span><span style="color: #000000">public List findByCriteria(final DetachedCriteria detachedCriteria) { <br />
　return (List) getHibernateTemplate().execute(new HibernateCallback() { <br />
　　public Object doInHibernate(Session session) throws HibernateException { <br />
　　　Criteria criteria = detachedCriteria.getExecutableCriteria(session); <br />
　　　return criteria.list(); <br />
　　} <br />
　}); <br />
}</span><br />
<span style="color: #000000">　　实际上也就是： <br />
<br />
　　java代码: <br />
</span><span style="color: #000000">Criteria criteria = detachedCriteria.getExecutableCriteria(session); <br />
return criteria.list(); </span><br />
<span style="color: #000000">　　而已 <br />
<br />
　　但是该程序代码执行，会抛出强制类型转换异常！ <br />
<br />
　　我跟踪了一下spring和Hibernate源代码，原因如下： <br />
<br />
　　spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数，但是实际上，默认情况下，HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类，而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类，HibernateTemplate的注释说明，Proxy提供了一些额外的功能，包括自动设置Cachable，Transaction的超时时间，Session资源的更积极的关闭等等。 <br />
<br />
　　java代码: <br />
</span><span style="color: #000000">private boolean exposeNativeSession = false; <br />
... </span><br />
<span style="color: #000000">　　execute方法内部： </span>
<table class="txcode" cellspacing="0" cellpadding="0" align="center" border="0">
    <tbody>
        <tr>
            <td><span style="color: #000000">Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));</span></td>
        </tr>
    </tbody>
</table>
<br />
<span style="color: #000000">　　但是遗憾的是，Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl，但是spring传过来的却是一个Proxy类，因此就报错了。 <br />
<br />
　　java代码: </span>
<table class="txcode" cellspacing="0" cellpadding="0" align="center" border="0">
    <tbody>
        <tr>
            <td><span style="color: #000000">public Criteria getExecutableCriteria(Session session) { <br />
            　impl.setSession( (SessionImpl) session ); // 要求SessionImpl，Spring传递的是Proxy <br />
            　return impl; <br />
            }</span></td>
        </tr>
    </tbody>
</table>
<br />
<span style="color: #000000">　　解决方法，禁止Spring的HibernateTemplate传递Proxy类，强制要求它传递真实的SessionImpl类，即给exexute方法增加一个参数，提供参数为true，如下： <br />
<br />
　　java代码: </span>
<table class="txcode" cellspacing="0" cellpadding="0" align="center" border="0">
    <tbody>
        <tr>
            <td><span style="color: #000000">public List findByCriteria(final DetachedCriteria detachedCriteria) { <br />
            　return (List) getHibernateTemplate().execute(new HibernateCallback() { <br />
            　　public Object doInHibernate(Session session) throws HibernateException { <br />
            　　　Criteria criteria = detachedCriteria.getExecutableCriteria(session); <br />
            　　　return criteria.list(); <br />
            　　} <br />
            　}, true); <br />
            }</span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/lifenote/aggbug/169494.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-22 02:44 <a href="http://www.blogjava.net/lifenote/archive/2007/12/22/169494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>★★oracle易忘函数用法★★</title><link>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 14 Dec 2007 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167677.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167677.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167677.html</trackback:ping><description><![CDATA[<p>===================★★oracle易忘函数用法★★=====================================<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Author:SunXianchao<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2006年于湖南长沙<br />
==============================================================================<br />
一般的to_char是这样用的to_char(sysdate,'YYYY-MM-DD hh:mi:ss AM') ，也有几个突出点的用法：</p>
<p>to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看这是这个月第几个星期</p>
<p>to_char(sysdate, 'mm')&nbsp; 查看这是一年中第几个月</p>
<p>to_char(sysdate, 'yyyy') 查看年份last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天，add_months(sysdate,10)查看若干个月后的今天，next_day(sysdate,'星期五')给个日期查看后面的最近的星期几的日期，不过这个星期五要是换成英文居然有问题，第2个参数可以是数字1-7，分别表示周日到周六。</p>
<p>下面贴个全的，需要的时候顺便查一下。</p>
<p>一、PL/SQL单行函数和组函数详解</p>
<p>函数是一种有零个或多个参数并且有一个返回值的程序。在SQL中Oracle内建了一系列函数，这些函数都可被称为SQL或PL/SQL语句，函数主要分为两大类：单行函数和组函数。</p>
<p>本文将讨论如何利用单行函数以及使用规则。<br />
1、SQL中的单行函数</p>
<p>SQL和PL/SQL中自带很多类型的函数，有字符、数字、日期、转换、和混合型等多种函数用于处理单行数据，因此这些都可被统称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY等子句中，例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等单行函数。</p>
<p>SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename) </p>
<p><br />
单行函数也可以在其他语句中使用，如update的SET子句，INSERT的VALUES子句，DELET的WHERE子句,认证考试特别注意在SELECT语句中使用这些函数，所以我们的注意力也集中在SELECT语句中。</p>
<p>2、NULL和单行函数</p>
<p>在如何理解NULL上开始是很困难的，就算是一个很有经验的人依然对此感到困惑。NULL值表示一个未知数据或者一个空值，算术操作符的任何一个操作数为NULL值，结果均为提个NULL值,这个规则也适合很多函数，只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了NULL参数时能够返回非NULL值。在这些中NVL函数时最重要的，因为他能直接处理NULL值，NVL有两个参数:NVL(x1,x2),x1和x2都式表达式，当x1为null时返回X2,否则返回x1。</p>
<p>下面我们看看emp数据表它包含了薪水、奖金两项，需要计算总的补偿。</p>
<p>column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2 </p>
<p><br />
不是简单的将薪水和奖金加起来就可以了，如果某一行是null值那么结果就将是null，比如下面的例子：</p>
<p>update empset salary=(salary+bonus)*1.1 </p>
<p><br />
这个语句中，雇员的工资和奖金都将更新为一个新的值，但是如果没有奖金，即 salary + null,那么就会得出错误的结论，这个时候就要使用nvl函数来排除null值的影响。</p>
<p>所以正确的语句是：</p>
<p>update empset salary=(salary+nvl(bonus,0)*1.1 </p>
<p><br />
3、单行字符串函数</p>
<p>单行字符串函数用于操作字符串数据，他们大多数有一个或多个参数，其中绝大多数返回字符串。</p>
<p>ASCII()</p>
<p>c1是一字符串，返回c1第一个字母的ASCII码，他的逆函数是CHR()</p>
<p>SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122 </p>
<p><br />
CHR()[NCHAR_CS]</p>
<p>i是一个数字，函数返回十进制表示的字符。</p>
<p>select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B </p>
<p><br />
CONCAT(,)</p>
<p>c1,c2均为字符串，函数将c2连接到c1的后面，如果c1为null,将返回c2.如果c2为null,则返回c1，如果c1、c2都为null，则返回null。他和操作符||返回的结果相同</p>
<p>select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda <br />
INITCAP()</p>
<p>c1为一字符串。函数将每个单词的第一个字母大写其它字母小写返回。单词由空格，控制字符，标点符号限制。</p>
<p>select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici </p>
<p><br />
INSTR(,[,[,]])</p>
<p>c1,c2均为字符串，i,j为整数。函数返回c2在c1中第j次出现的位置，搜索从c1的第i个字符开始。当没有发现需要的字符时返回0,如果i为负数，那么搜索将从右到左进行，但是位置的计算还是从左到右，i和j的缺省值为1。</p>
<p>select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2 </p>
<p><br />
INSTRB(,[,i[,j])</p>
<p>与INSTR()函数一样，只是他返回的是字节，对于单字节INSTRB()等于INSTR()。</p>
<p>LENGTH()</p>
<p>c1为字符串，返回c1的长度，如果c1为null，那么将返回null值。</p>
<p>select LENGTH('Ipso Facto') ergo from dualergo10 </p>
<p><br />
LENGTHb()</p>
<p>与LENGTH()一样，返回字节。</p>
<p>lower()</p>
<p>返回c的小写字符，经常出现在where子串中。</p>
<p>select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite </p>
<p><br />
LPAD(,[,])</p>
<p>c1,c2均为字符串，i为整数。在c1的左侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格，参见RPAD。</p>
<p>select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe </p>
<p><br />
LTRIM(,)</p>
<p>把c1中最左边的字符去掉，使其第一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>select LTRIM('Mississippi','Mis') from dualLTRppi </p>
<p><br />
RPAD(,[,])</p>
<p>在c1的右侧用c2字符串补足致长度i,可多次重复，如果i小于c1的长度，那么只返回i那么长的c1字符，其他的将被截去。c2的缺省值为单空格,其他与LPAD相似。</p>
<p>RTRIM(,)</p>
<p>把c1中最右边的字符去掉，使其第后一个字符不在c2中，如果没有c2，那么c1就不会改变。</p>
<p>REPLACE(,[,])</p>
<p>c1,c2,c3都是字符串，函数用c3代替出现在c1中的c2后返回。</p>
<p>select REPLACE('uptown','up','down') from dualREPLACEdowntown </p>
<p><br />
STBSTR(,[,])</p>
<p>c1为一字符串，i,j为整数，从c1的第i位开始返回长度为j的子字符串，如果j为空，则直到串的尾部。</p>
<p>select SUBSTR('Message',1,4) from dualSUBSMess </p>
<p><br />
SUBSTRB(,[,])</p>
<p>与SUBSTR大致相同，只是I,J是以字节计算。</p>
<p>SOUNDEX()</p>
<p>返回与c1发音相似的词。</p>
<p>select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250 </p>
<p><br />
TRANSLATE(,,)</p>
<p>将c1中与c2相同的字符以c3代替</p>
<p>select TRANSLATE('fumble','uf','ar') test from dualTEXTramble </p>
<p><br />
TRIM([[]] from c3)</p>
<p>将c3串中的第一个，最后一个，或者都删除。</p>
<p>select TRIM(' space padded ') trim from dual TRIMspace padded </p>
<p><br />
UPPER()</p>
<p>返回c1的大写，常出现where子串中</p>
<p>select name from dual where UPPER(name) LIKE 'KI%'NAMEKING </p>
<p><br />
4、单行数字函数</p>
<p>单行数字函数操作数字数据，执行数学和算术运算。所有函数都有数字参数并返回数字值。所有三角函数的操作数和值都是弧度而不是角度，oracle没有提供内建的弧度和角度的转换函数。</p>
<p>ABS()</p>
<p>返回n的绝对值</p>
<p>ACOS()</p>
<p>反余弦函数，返回-1到1之间的数。n表示弧度</p>
<p>select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0 </p>
<p><br />
ASIN()</p>
<p>反正弦函数，返回-1到1，n表示弧度</p>
<p>ATAN()</p>
<p>反正切函数，返回n的反正切值，n表示弧度。</p>
<p>CEIL()</p>
<p>返回大于或等于n的最小整数。</p>
<p>COS()</p>
<p>返回n的余玄值，n为弧度</p>
<p>COSH()</p>
<p>返回n的双曲余玄值，n 为数字。</p>
<p>select COSH(&lt;1.4&gt;) FROM dualCOSH(1.4)2.15089847 </p>
<p><br />
EXP()</p>
<p>返回e的n次幂，e=2.71828183.</p>
<p>FLOOR()</p>
<p>返回小于等于N的最大整数。</p>
<p>LN()</p>
<p>返回N的自然对数，N必须大于0</p>
<p>LOG(,)</p>
<p>返回以n1为底n2的对数</p>
<p>MOD()</p>
<p>返回n1除以n2的余数<br />
POWER(,)</p>
<p>返回n1的n2次方</p>
<p>ROUND(,)</p>
<p>返回舍入小数点右边n2位的n1的值，n2的缺省值为0，这回将小数点最接近的整数，如果n2为负数就舍入到小数点左边相应的位上，n2必须是整数。</p>
<p>select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54 </p>
<p><br />
SIGN()</p>
<p>如果n为负数，返回-1,如果n为正数，返回1，如果n=0返回0</p>
<p>SIN()</p>
<p>返回n的正玄值,n为弧度。</p>
<p>SINH()</p>
<p>返回n的双曲正玄值,n为弧度。</p>
<p>SQRT()</p>
<p>返回n的平方根,n为弧度</p>
<p>TAN()</p>
<p>返回n的正切值,n为弧度</p>
<p>TANH()</p>
<p>返回n的双曲正切值,n为弧度</p>
<p>TRUNC(,)</p>
<p>返回截尾到n2位小数的n1的值，n2缺省设置为0，当n2为缺省设置时会将n1截尾为整数，如果n2为负值，就截尾在小数点左边相应的位上。</p>
<p>5、单行日期函数</p>
<p>单行日期函数操作DATA数据类型，绝大多数都有DATA数据类型的参数，绝大多数返回的也是DATA数据类型的值。</p>
<p>ADD_MONTHS(,)</p>
<p>返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数，那么数据库将隐式的他转换成整数，将会截去小数点后面的部分。</p>
<p>LAST_DAY()</p>
<p>函数返回包含日期d的月份的最后一天</p>
<p>MONTHS_BETWEEN(,)</p>
<p>返回d1和d2之间月的数目,如果d1和d2的日的日期都相同，或者都使该月的最后一天，那么将返回一个整数，否则会返回的结果将包含一个分数。</p>
<p>NEW_TIME(,,)</p>
<p>d1是一个日期数据类型，当时区tz1中的日期和时间是d时，返回时区tz2中的日期和时间。tz1和tz2时字符串。</p>
<p>NEXT_DAY(,)</p>
<p>返回日期d后由dow给出的条件的第一天，dow使用当前会话中给出的语言指定了一周中的某一天，返回的时间分量与d的时间分量相同。</p>
<p>select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004 </p>
<p><br />
ROUND([,])</p>
<p>将日期d按照fmt指定的格式舍入，fmt为字符串。</p>
<p>SYADATE</p>
<p>函数没有参数，返回当前日期和时间。</p>
<p>TRUNC([,])</p>
<p>返回由fmt指定的单位的日期d<br />
6、单行转换函数</p>
<p>单行转换函数用于操作多数据类型，在数据类型之间进行转换。</p>
<p>CHARTORWID()</p>
<p>c 使一个字符串，函数将c转换为RWID数据类型。</p>
<p>SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') </p>
<p><br />
CONVERT(,[,])</p>
<p>c尾字符串，dset、sset是两个字符集，函数将字符串c由sset字符集转换为dset字符集，sset的缺省设置为数据库的字符集。</p>
<p>HEXTORAW()</p>
<p>x为16进制的字符串，函数将16进制的x转换为RAW数据类型。</p>
<p>RAWTOHEX()</p>
<p>x是RAW数据类型字符串，函数将RAW数据类转换为16进制的数据类型。</p>
<p>ROWIDTOCHAR()</p>
<p>函数将ROWID数据类型转换为CHAR数据类型。</p>
<p>TO_CHAR([[,)</p>
<p>x是一个data或number数据类型，函数将x转换成fmt指定格式的char数据类型，如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定小数位和千分位的分隔符，以及货币符号。</p>
<p>NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string" </p>
<p><br />
TO_DATE([,[,)</p>
<p>c表示字符串，fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。</p>
<p>TO_MULTI_BYTE()</p>
<p>c表示一个字符串，函数将c的担子截字符转换成多字节字符。</p>
<p>TO_NUMBER([,[,)</p>
<p>c表示字符串，fmt表示一个特殊格式的字符串，函数返回值按照fmt指定的格式显示。nlsparm表示语言，函数将返回c代表的数字。</p>
<p>TO_SINGLE_BYTE()</p>
<p>将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用</p>
<p>7、其它单行函数</p>
<p>BFILENAME(,) </p>
<p><br />
dir是一个directory类型的对象，file为一文件名。函数返回一个空的BFILE位置值指示符，函数用于初始化BFILE变量或者是BFILE列。</p>
<p>DECODE(,,[,,,[])</p>
<p>x是一个表达式，m1是一个匹配表达式，x与m1比较，如果m1等于x，那么返回r1,否则,x与m2比较，依次类推m3,m4,m5....直到有返回结果。</p>
<p>DUMP(,[,[,[,]]])</p>
<p>x是一个表达式或字符，fmt表示8进制、10进制、16进制、或则单字符。函数返回包含了有关x的内部表示信息的VARCHAR2类型的值。如果指定了n1,n2那么从n1开始的长度为n2的字节将被返回。</p>
<p>EMPTY_BLOB()</p>
<p>该函数没有参数，函数返回 一个空的BLOB位置指示符。函数用于初始化一个BLOB变量或BLOB列。</p>
<p>EMPTY_CLOB()</p>
<p>该函数没有参数，函数返回 一个空的CLOB位置指示符。函数用于初始化一个CLOB变量或CLOB列。</p>
<p>GREATEST()</p>
<p>exp_list是一列表达式，返回其中最大的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，那么返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。<br />
LEAST()</p>
<p>exp_list是一列表达式，返回其中最小的表达式，每个表达式都被隐含的转换第一个表达式的数据类型，如果第一个表达式是字符串数据类型中的任何一个，将返回的结果是varchar2数据类型，同时使用的比较是非填充空格类型的比较。</p>
<p>UID</p>
<p>该函数没有参数，返回唯一标示当前数据库用户的整数。</p>
<p>USER</p>
<p>返回当前用户的用户名</p>
<p>USERENV()</p>
<p>基于opt返回包含当前会话信息。opt的可选值为：</p>
<p>ISDBA　 会话中SYSDBA脚色响应，返回TRUE</p>
<p>SESSIONID 　返回审计会话标示符</p>
<p>ENTRYID 返回可用的审计项标示符</p>
<p>INSTANCE在会话连接后，返回实例标示符。该值只用于运行Parallel 服务器并且有 多个实例的情况下使用。</p>
<p>LANGUAGE返回语言、地域、数据库设置的字符集。</p>
<p>LANG返回语言名称的ISO缩写。</p>
<p>TERMINAL为当前会话使用的终端或计算机返回操作系统的标示符。</p>
<p>VSIZE()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x是一个表达式。返回x内部表示的字节数。</p>
<p>二、SQL中的组函数</p>
<p>组函数也叫集合函数，返回基于多个行的单一结果，行的准确数量无法确定，除非查询被执行并且所有的结果都被包含在内。与单行函数不同的是，在解析时所有的行都是已知的。由于这种差别使组函数与单行函数有在要求和行为上有微小的差异.</p>
<p>1、组(多行)函数</p>
<p>与单行函数相比，oracle提供了丰富的基于组的，多行的函数。这些函数可以在select或select的having子句中使用，当用于select子串时常常都和GROUP BY一起使用。</p>
<p>AVG([{DISYINCT|ALL}])</p>
<p>返回数值的平均值。缺省设置为ALL</p>
<p>SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413 </p>
<p><br />
COUNT({*|DISTINCT|ALL} )</p>
<p>返回查询中行的数目，缺省设置是ALL,*表示返回所有的行。</p>
<p>MAX([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的最大值，如果x是字符串数据类型，他返回一个VARCHAR2数据类型，如果X是一个DATA数据类型，返回一个日期，如果X是numeric数据类型，返回一个数字。注意distinct和all不起作用，应为最大值与这两种设置是相同的。</p>
<p>MIN([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的最小值。</p>
<p>STDDEV([{DISTINCT|ALL}])</p>
<p>返回选者的列表项目的标准差，所谓标准差是方差的平方根。</p>
<p>SUM([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的数值的总和。</p>
<p>VARIANCE([{DISTINCT|ALL}])</p>
<p>返回选择列表项目的统计方差。</p>
<p>2、用GROUP BY给数据分组</p>
<p>正如题目暗示的那样组函数就是操作那些已经分好组的数据，我们告诉数据库用GROUP BY怎样给数据分组或者分类，当我们在SELECT语句的SELECT子句中使用组函数时，我们必须把为分组或非常数列放置在GROUP BY子句中，如果没有用group by进行专门处理，那么缺省的分类是将整个结果设为一类。</p>
<p>select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982 </p>
<p><br />
在这个例子中，我们用state字段分类;如果我们要将结果按照zip_codes排序,可以用ORDER BY语句，ORDER BY子句可以使用列或组函数。</p>
<p>select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982 </p>
<p><br />
3、用HAVING子句限制分组数据</p>
<p>现在你已经知道了在查询的SELECT语句和ORDER BY子句中使用主函数，组函数只能用于两个子串中，组函数不能用于WHERE子串中，例如下面的查询是错误的：</p>
<p>错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)&gt;10000 GROUP BY sales_clerk</p>
<p>这个语句中数据库不知道SUM()是什么，当我们需要指示数据库对行分组，然后限制分组后的行的输出时，正确的方法是使用HAVING语句：</p>
<p>SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)&gt;10000; </p>
<p><br />
4、嵌套函数</p>
<p>函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可继承的执行过程。但函数的优先权只是基于位置，函数遵循由内到外，由左到右的原则。嵌套技术一般用于象DECODE这样的能被用于逻辑判断语句IF....THEN...ELSE的函数。</p>
<p>嵌套函数可以包括在组函数中嵌套单行函数，或者组函数嵌套入单行函数或组函数中。比如下面的例子：</p>
<p>SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2 </p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/167677.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-14 10:02 <a href="http://www.blogjava.net/lifenote/archive/2007/12/14/167677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 软件空间</title><link>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 14 Dec 2007 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167656.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167656.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167656.html</trackback:ping><description><![CDATA[<a href="http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99">注册了一个网站，使用的是下面的这个空间，常来网，无限空间大小完全免费，上传速度很不错，感觉挺好推荐给大家，来注册一个空间上传资料使用<br />
http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99</a><br />
  <img src ="http://www.blogjava.net/lifenote/aggbug/167656.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-14 09:23 <a href="http://www.blogjava.net/lifenote/archive/2007/12/14/167656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tapestry 开发笔记（积累）</title><link>http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 13 Dec 2007 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/167528.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/167528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/167528.html</trackback:ping><description><![CDATA[<p>====================================================================================<br />
'&nbsp;说明：Tapestry 开发笔记<br />
'&nbsp;Note Author:&nbsp;Sunxianchao<br />
'&nbsp;阅读日期：&nbsp;2007-9-18(北京.七彩谷)<br />
'====================================================================================<br />
<br />
<br />
<br />
'先做个小广告 免费的无限空间还可以就是要积分 下面是我的注册地址 直接注册就可以了 奖励10个积分<br />
http://web.99081.com/sysweb/RegTrans.aspx?CodeProvider=sunxian99<br />
麻烦帮忙顶一个 多谢<br />
<br />
<br />
【各种组建使用】<br />
说明：只是说明一些需要注意的东西，更多的学习参考Tapestry官方文档<br />
1、For<br />
source:是对应的java类里的List 对象或者是个数组 需要抽象 或者提供set get方法<br />
value:是循环这个source对象代表当前的一个 ，需要在page文件中设置问一个属性，可以不在对应的java类里有这个属性<br />
index:是循环的索引值 同value一样 在page文件中设置一个属性即可 &lt;property name="index"/&gt;<br />
在循环的时候 会自动为vlaue和index赋当前的值</p>
<p>2、Foreach 和For一样使用</p>
<p>3、Hidden组件 总是多余S的处理<br />
&nbsp;&lt;input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/&gt;</p>
<p><br />
4、 Insert 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;input type="text" jwcid="name@Insert" value="ognl:user.name"/&gt; <br />
&nbsp;&nbsp;&nbsp; 页面表现时,将会到页面类中寻找getUser().getName()方法获取初值并输出 <br />
&nbsp;&nbsp;&nbsp; 相当于在页面上显示数据.</p>
<p>5、 TextField 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;input type="text" jwcid="username@TextField" value="ognl:username"/&gt; <br />
&nbsp;&nbsp;&nbsp; 页面表现时,将会到页面类中寻找getUsername()方法获取初值 <br />
&nbsp;&nbsp;&nbsp; *如果是修改信息页面,通常初始值要在页面表现之前由setUsername()手动设置从数据库中读取出来的值 <br />
&nbsp;&nbsp;&nbsp; 表单提交时,通过setUsername()写入新值(即用户输入值),在类中通过getUsername()获取新值 <br />
&nbsp;&nbsp;&nbsp; 相当于在修改个人信息时,首先读出用户名赋予文本框(用户名)初值,用户修改时填入新值,后台获取之 <br />
&nbsp;&nbsp;&nbsp; *Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true") <br />
&nbsp;&nbsp;&nbsp; readonly属性设置只读 readonly="true"为只读(后台可读取) <br />
&nbsp;&nbsp;&nbsp; *disabled属性设置是否可写 diabled="true"为不可写(后台也不可读取)</p>
<p>6、 TextArea 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"&gt;&lt;/textarea&gt; <br />
&nbsp;&nbsp;&nbsp; 页面表现时,将会到页面类中寻找getContent()方法获取初值 <br />
&nbsp;&nbsp;&nbsp; 工作原理同TextField</p>
<p>7、 RadioGroup/Radio 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="headImage@RadioGroup" selected="ognl:headImage"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="1"/&gt;头像1 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="2"/&gt;头像2 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="3"/&gt;头像3 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="4"/&gt;头像4 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="5"/&gt;头像5 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input jwcid="@Radio" type="radio" value="6"/&gt;头像6 <br />
&nbsp;&nbsp;&nbsp; &lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性值，并且只有一个Radio能够被选中. <br />
&nbsp;&nbsp;&nbsp; 页面提交时，RadioGroup组件就利用OGNL表达式向headImage字段写入被选中的Radio组件的value参数值. <br />
&nbsp;&nbsp;&nbsp; 页面表现时(修改页面),将会到页面类中寻找getHeadImage()方法获取初值,然后寻找@Radio组件中与其相同的组件并勾选上.</p>
<p>8、 PropertySelection 组件 <br />
&nbsp;&nbsp;&nbsp; 使用PropertySelection组件必须要构造一个类来实现IPropertySelectionModel接口，并且重写该接口的5个方法. <br />
&nbsp;&nbsp;&nbsp; public int getOptionCount() //提供下拉菜单的长度 <br />
&nbsp;&nbsp;&nbsp; public Object getOption(int index) //提供select标签的option <br />
&nbsp;&nbsp;&nbsp; public String getLabel(int index) //提供select标签的Label值，也就是下拉菜单显示的内容 <br />
&nbsp;&nbsp;&nbsp; public String getValue(int index) //提供select标签的value值 <br />
&nbsp;&nbsp;&nbsp; public Object translateValue(String value) //selected后的返回值，value值未必就是我们需要的返回值，可以在这个方法里面对返回的value做对应的转换或修改. <br />
e.g.1. 性别下拉框 <br />
&nbsp;&nbsp;&nbsp; &lt;select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option selected&gt;先生&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;女士&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/select&gt; </p>
<p><br />
代码<br />
GenderSelectionModel.java&nbsp;&nbsp; <br />
public class GenderSelectionModel implements IPropertySelectionModel {&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static final String male = "先生";&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static final String female = "女士";&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static final String[] genderOptions = { male, female };&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getOptionCount() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return genderOptions.length;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object getOption(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.translateValue(genderOptions[index]);&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getLabel(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return genderOptions[index].toString();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getValue(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return genderOptions[index];&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object translateValue(String value) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value.equals("先生")) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "1";&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "0";&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
}&nbsp; </p>
<p>&nbsp;</p>
<p>代码<br />
ModUserInfo.java&nbsp;&nbsp; <br />
public IPropertySelectionModel getSupportedGender() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return new GenderSelectionModel();&nbsp;&nbsp; <br />
}&nbsp; </p>
<p><br />
&nbsp;&nbsp;&nbsp; 存入数据库中"1"代表先生,"0"代表女士,通过translateValue(String value)方法转换 <br />
&nbsp;&nbsp;&nbsp; 页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender(). <br />
&nbsp;&nbsp;&nbsp; 然后通过getGender()方法获取初值,比如获取"0",则在页面显示时寻找value值为"0"的选项即为"女士",并选择之作为初始选择项.</p>
<p>e.g.2. 日志类型下拉框 <br />
&nbsp;&nbsp;&nbsp; &lt;select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;心情日记&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;情感天地&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option&gt;生活感触&lt;/option&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/select&gt; </p>
<p><br />
代码<br />
TypeSelectionModel.java&nbsp;&nbsp; <br />
public class TypeSelectionModel implements IPropertySelectionModel {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; private List typeList = new ArrayList();&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public TypeSelectionModel(List typeList) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.typeList = typeList;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public int getOptionCount() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return typeList.size();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object getOption(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((LogType)typeList.get(index)).getValue();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getLabel(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((LogType) typeList.get(index)).getName();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getValue(int index) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ((LogType) typeList.get(index)).getValue();&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Object translateValue(String value) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <br />
}&nbsp; </p>
<p>&nbsp;</p>
<p>代码<br />
ModLog.java&nbsp;&nbsp; <br />
public IPropertySelectionModel getSupportedType() {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; TypeSelectionModel typeSelectionModel =&nbsp;&nbsp;&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;&nbsp;&nbsp; new TypeSelectionModel(loadType(getUser().getUserId()));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return typeSelectionModel;&nbsp;&nbsp; <br />
}&nbsp;&nbsp; <br />
&nbsp; <br />
private List loadType(int userid) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ...//从数据库载入该用户的日志类型列表&nbsp;&nbsp; <br />
}&nbsp; </p>
<p><br />
&nbsp;&nbsp;&nbsp; 页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType(). <br />
&nbsp;&nbsp;&nbsp; 然后通过value属性给出的初始值即,getLogType()方法获取初值,比如获取"2",则在页面显示时寻找value值为"2"的选项即为"生活感触",并选择之作为初始选择项.</p>
<p>9、 Form组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;form jwcid="logForm@Form"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... <br />
&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&nbsp;&nbsp;&nbsp; Form的监听(listener)方法可以有两种方式: <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 在Form组件中声明. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form jwcid="logForm@Form" listener="ognl:listener:onLogin"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 在submit类型组件中声明. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/&gt;或者 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"&gt;&lt;img src="..." width="" height=""/&gt;&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前一种方式当Form中只要有submit就会触发监听方法,后一种方式是Form中有多个submit,各自实现不同的监听方法.</p>
<p>G) Foreach 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Foreach" source="ognl:logList" value="ognl:item"&gt; <br />
&nbsp;&nbsp;&nbsp; 循环组件,遍历source参数,在表现其内容前更新value参数,将Foreach组件所包含的内容重复表现,其中可以通过value参数获取所需显示内容. <br />
&nbsp;&nbsp;&nbsp; 本例中,页面表现时通过getLogList()方法获取日志列表,循环取出其中数据更新item(日志对象)并予以显示.其中item需要在页面规范(.page)文件中声明: <br />
&nbsp;&nbsp;&nbsp; &lt;property name="item"/&gt; <br />
&nbsp;&nbsp;&nbsp; *class参数用来寻找类似CSS的文件对Foreach进行修饰. <br />
&nbsp;&nbsp;&nbsp; Foreach组件: class="ognl:beans.evenOdd.next" <br />
&nbsp;&nbsp;&nbsp; Page文件: &lt;bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/&gt; <br />
&nbsp;&nbsp;&nbsp; CSS文件: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}</p>
<p>10、 Conditional 组件 <br />
e.g. <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'&gt;先生&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'&gt;女士&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; conditional参数为true时运行Conditional组件中的HTML模板内容. <br />
&nbsp;&nbsp;&nbsp; 在Tapestry4.0以后就不支持该组件了, 可以使用其他组件来实现: <br />
&nbsp;&nbsp;&nbsp; 1. Contrib:Choose和Contrib:When <br />
&nbsp;&nbsp;&nbsp; &lt;library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/&gt;(.application文件中引入Contrib类包) <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@contrib:Choose"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'&gt;先生&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'&gt;女士&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; 2. If组件 <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@If" condition='ognl:item.sex.equals("1")'&gt;先生&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@If" condition='ognl:item.sex.equals("0")'&gt;女士&lt;/span&gt; <br />
&nbsp;&nbsp;&nbsp; 3. Else组件<br />
&nbsp;&nbsp;&nbsp; &lt;span jwcid="@Else"&gt;man&lt;/span&gt; </p>
<p>【============================ts的函数执行顺序========================================】<br />
对之前的该文章进行了一些修正，主要是针对finishLoad()方法。 <br />
我觉得对初学者会有一些帮助。 <br />
下面这几个函数是我在使用的，它们的执行顺序依次从上到下。 <br />
1.protected void finishLoad() {} *** <br />
2.public void pageValidate(PageEvent event) {} <br />
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br />
4.public void pageBeginRender(PageEvent event) {} <br />
// 如果有表单提交，则将form中的各字段的值赋给页面类 <br />
5. ...... 赋值 <br />
6.public void submit() // 表单提交等用listenter:调用的方法 <br />
7.protected void prepareForRender(IRequestCycle cycle) {} <br />
---------------------------------------------------- <br />
1.protected void finishLoad() {} <br />
这个函数最先执行，但是它实际上没有什么用处（我感觉）。因为： <br />
　　这个函数只在页面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱：如果你的tomcat启动时使用了-Dorg.apache.tapestry.disable-caching=true(为了调试方便而设)，那么你每次刷新页面时，它都会执行（因为每个request都会新生成一个页面类对象），造成了它总是执行的假象。在实际的部署时，会使用caching，则这个函数执行的机会很少。所以要注意。 <br />
　　初始化的代码放在4 pageBeginRender()中 <br />
2.public void pageValidate(PageEvent event) {} <br />
如果实现了PageValidateListener接口，则可以在这里进行验证，比如访问权限等。执行完1后，它就开始执行。 <br />
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} <br />
如果实现了IExternalPage接口，则可以从这里取得由外面传过来的参数。执行2后，执行到这里。在这里可以把那些参数取出，赋给页面类。 <br />
4.public void pageBeginRender(PageEvent event) {} <br />
执行完3后，将执行本函数。但是这时从客户端传过来的参数还没有被赋值(如果提交了表单的话)。这里可以进行一些初始化操作。 <br />
5.执行完4后，如果有表单提交，在这里将会取出那些值，赋给对应的字段。(注意：只是将表单中有的值赋过来) <br />
6.public void submit() <br />
如果有表单提交的话，在这里将进行对应的操作。因为此时各字段已经取好值了，所以可以拿来直接用。 <br />
7.protected void prepareForRender(IRequestCycle cycle) {} <br />
最后才执行这个方法。我们可以在其中进行为了在页面上显示数据而进行的操作，比如取得什么对象什么的，因为这里页面类的属性赋值已经结束，可以直接拿来使用了。 <br />
注意：如果执行了6，则还要执行4，再执行7。如果没有6，4完了就直接是7。 <br />
以上是我所总结的执行顺序，不当之处请指出。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>----------------------------------------------------- <br />
最开始学tapestry的时候，觉得&#8220;怎么有这么多地方需要持久啊&#8221;。原来以前只知道pageBeginRender这个函数，什么初始化操作都放在它里面。可是它是在赋值之前执行，所以拿到的字段多都是空的，却都以为是没有持久化的缘故。所以在客户端里放了一大堆的@Hidden，或者session中持久，非常麻烦，，，对tapestry也产生的怀疑。现在才知道那些需要取得客户端传来的参数的代码，最好放在prepareForRender里，很多不必要的持久都可以省掉了</p>
 <img src ="http://www.blogjava.net/lifenote/aggbug/167528.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-13 16:21 <a href="http://www.blogjava.net/lifenote/archive/2007/12/13/167528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>告诉你如何获得request response session 对象</title><link>http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 11 Dec 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166934.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166934.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚刚写了一个小例子，可是发现页面的属性值都是通过setter getter方法赋值的，（这里感觉有些类似一些面向组建的框架如：tapestry，同样使用了功能强大的ognl表达式）如果我们想要通过request 得到某个值 那么struts2中是如何得到的呢<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 众所周知在struts1中
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)&nbsp;{&nbsp;}&nbsp;</span></div>
就有request ，respongse对象<br />
<br />
那么在struts2中有两种方式可以得到这些对象<br />
<p>1、非IoC方式</p>
<p>要获得上述对象，关键Struts 2中<a href="http://www.opensymphony.com/webwork/api/com/opensymphony/xwork/ActionContext.html">com.opensymphony.xwork2.ActionContext</a>类。我们可以通过它的静态方法getContext()获取当前Action的上下文对象。有了这个对象我们想获得其他几个对象就好办了 <br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">ActionContext&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ActionContext.getContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ctx.getSession();</span></div>
<p>细心的朋友可以发现这里的session是个map对象在Struts2中底层的session都被封装成了Map类型我们可以直接操作这个map 进行对session的写入和读取操作而不用去直接操作HttpSession对象<br />
<br />
另外，<a href="http://struts.apache.org/2.x/struts2-core/apidocs/org/apache/struts2/ServletActionContext.html">org.apache.struts2.ServletActionContext</a>作为辅助类（Helper Class），可以帮助您快捷地获得这几个对象。 </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">HttpServletRequest&nbsp;request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getRequest();&nbsp;<br />
HttpServletResponse&nbsp;response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ServletActionContext.getResponse();&nbsp;<br />
HttpSession&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getSession();</span></div>
<p>&nbsp;如果你只是想访问session的属性（Attribute），你也可以通过ActionContext.getContext().getSession()获取或添加session范围（Scoped）的对象。<br />
<br />
<br />
<br />
2、IoC方式（这种方式在tapestry中也是这样实现的）<br />
&nbsp;&nbsp;&nbsp;&nbsp; 要使用IoC方式，我们首先要告诉IoC容器（Container）想取得某个对象的意愿，通过实现相应的接口做到这点。具体实现</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">publicclass&nbsp;IoCServlet&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;SessionAware,&nbsp;ServletRequestAware,&nbsp;ServletResponseAware&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Map&nbsp;att;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletResponse&nbsp;response;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setSession(Map&nbsp;att)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.att&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;att;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setServletRequest(HttpServletRequest&nbsp;request)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;setServletResponse(HttpServletResponse&nbsp;response)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;att.put(</span><span style="color: #000000">"</span><span style="color: #000000">msg</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World&nbsp;from&nbsp;Session!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;StringBuffer(</span><span style="color: #000000">"</span><span style="color: #000000">Message&nbsp;from&nbsp;request:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(request.getParameter(</span><span style="color: #000000">"</span><span style="color: #000000">msg</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;Response&nbsp;Buffer&nbsp;Size:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(response.getBufferSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(</span><span style="color: #000000">"</span><span style="color: #000000">&lt;br&gt;Session&nbsp;ID:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(session.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sb.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/166934.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-11 14:24 <a href="http://www.blogjava.net/lifenote/archive/2007/12/11/166934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 与 Struts1.x比较 </title><link>http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 11 Dec 2007 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166924.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166924.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts作为MVC 2的Web框架，自推出以来不断受到开发者的追捧，得到广泛的应用。作为最成功的Web框架，Struts自然拥有众多的优点：MVC 2模型的使用、功能齐全的标志库（Tag Library）、开放源代码。<br />
<br />
<p style="text-indent: 2em">但是，正所谓&#8220;没有最好，只有更好&#8221;，Struts1.x自身也有不少的缺点：需要编写的代码过多，容易引起&#8220;类爆炸&#8221;、单元测试困难。这些缺点随着Web的发展越来越明显。这就促生了Struts 2，它的诞生能很好的解决上述问题。 </p>
<p style="text-indent: 2em"><strong>一、引言</strong> </p>
<p style="text-indent: 2em">Struts的第一个版本是在2001年5月份发布的。它的最初设想是通过结合JSP和Servlet，使Web应用的视图和业务/应用逻辑得以清晰地分离开来。在Struts之前，最常见的做法是在JSP中加入业务和应用逻辑，或者在Servlet中通过println()来生成视图。 </p>
<p style="text-indent: 2em">自从第一版发布以来，Struts实际上已成为业界公认的Web应用标准。它的炙手可热也为自己带来了改进和变更，所以不但要跟上对Web应用框架不断变化的需求，而且要与日渐增多竞争激烈的众多框架的特性相融合。 </p>
<p style="text-indent: 2em">到最后，产生了几个下一代Struts的解决方案。其中两个最受瞩目的方案是Shale和Struts Ti。Shale是一个基于构件的框架，并在最近成为Apache的顶级项目。而Struts Ti则是在Struts的成功经验基础上继续坚持对前端控制器（Front Controller）和MVC（model-view-controller）模式进行改进。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">WebWork项目是在2002年3月发布的，它对Struts式框架进行了革命性改进，引进了不少新的思想、概念和功能，但和原Struts代码并不兼容。WebWork是一个成熟的框架，经过了好几次重大的改进与发布。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在2005年12月，WebWork与Struts Ti宣布合并。与此同时，Struts Ti改名为Struts Action Framework 2.0，成为Struts真正的继承者。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">最后要注意的是，并不是说Struts或WebWork项目已经停止开发了。由于人们对这两个项目的兴趣仍然很高，而且也有很多开发者仍然愿意使用它们，因此这两个项目还在继续开发中，继续修复Bug，改进功能和继续添加新功能。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>二、 Action的区别</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">对于有着丰富的Struts1.x开发经验的朋友来说，都十分的清楚Action是整个Struts框架的核心内容，当然Struts2也不例外。不过，Struts1.x与Struts2的Action模型很大的区别。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts2和Struts1.x的差别，最明显的就是Struts2是一个pull-MVC架构。这是什么意思呢？从开发者角度看，就是说需要显示给用户的数据可以直接从Action中获取，而不像Struts1.x那样，必须把相应的Bean存到Page、Request或者Session中才能获取。Struts1.x 必须继承org.apache.struts.action.Action或者其子类，表单数据封装在FormBean中。Struts 2无须继承任何类型或实现任何接口，表单数据包含在Action中，通过Getter和Setter获取（如下面的ActionForStruts2的代码示例）。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">虽然，在理论上Struts2的Action无须实现任何接口或者是继承任何的类，但是，在实际编程过程中，为了更加方便的实现Action，大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类，并且重载（Override）此类里的String execute()方法。如下所示： </p>
<p style="text-indent: 2em"><ccid_nobr></ccid_nobr></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;ActionDiffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.DateFormat;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Date;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ActionForStruts2&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;message;<br />
&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;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;This&nbsp;is&nbsp;hello&nbsp;from&nbsp;strtuts2.&nbsp;Now&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateFormat.getInstance().format(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&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;}</span></div>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">首先，从ActionForStruts2可以看出，返回的对象不是ActionForward，而是String。如果你不喜欢以字符串的形式出现在你的代码中，有个Helper接口Action可以以常量方式提供常见结果，如&#8220;success&#8221;、&#8220;none&#8221;、&#8220;error&#8221;、&#8220;input&#8221;和&#8220;login&#8221;。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">另外， 按照惯例，在Struts1.x中只有&#8220;execute&#8221;方法能调用Action,　但在Struts2中并非必要，任何声明为public String methodName() 方法，都能通过配置来调用Action。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">最后，和Struts1.x最大的革命性的不同是，Struts2处理Action过程中调用的方法（&#8220;execute&#8221;方法）是不带参数的。那如何获取所需要的对象呢？答案是使用IoC（反转控制，Inversion of Control)，也叫&#8220;依赖注入（Dependency Injection）&#8221;的模式（想更多地了解这方面信息请看Martin Fowler的文章http://www.martinfowler.com/articles/injection.html）。Spring框架使得这个模式流行起来，然而Struts2的前身（WebWork）也同时应用上了这个模式。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>三、IoC</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">IoC(Inversion of Control，以下译为控制反转），随着Java社区中轻量级容器（Lightweight Contianer）的推广而越来越为大家耳熟能详。在此，无需再多费唇舌来解释&#8220;什么是控制反转&#8221;和&#8220;为什么需要控制反转&#8221;。因为互联网上已经有非常多的文章对诸如此类的问题作了精彩而准确的回答。读者可以去读一下Rod Johnson和Juergen Hoeller合著的《Expert one-on-one J2EE Development without EJB》或Martin Fowler所写的《Inversion of Control Containers and the Dependency Injection pattern》。</p>
<p style="text-indent: 2em">众所周知，Struts2是以Webwork 2作为基础发展出来。而在Webwork 2.2之前的Webwork版本，其自身有一套控制反转的实现，Webwork 2.2在Spring 框架的如火如荼发展的背景下，决定放弃控制反转功能的开发，转由Spring实现。值得一提的是，Spring确实是一个值得学习的框架，因为有越来越多的开源组件（如iBATIS等）都放弃与Spring重叠的功能的开发。因此，Struts2推荐大家通过Spring实现控制反转。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">为了更好地了解反转控制，下面来看一个例子，如何利用IoC在Action处理过程中可以访问到当前请求HttpServerRequest对象。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在例子中，使用的依赖注入机制是接口注入。就如其名称一样，接口注入需要的是已经被实现了的接口。这个接口包含了相应属性的setter，为Action提供值。例子中使用了ServletRequestAware接口，如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;ServletRequestAware&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setServletRequest(HttpServletRequest&nbsp;request);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">当继承这个接口后，原本简单的Action看起来有点复杂了，但是这时可以获取HttpServerRequest对象来使用了。<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;IoCForStruts2&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletRequestAware&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpServletRequest&nbsp;request;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setServletRequest(HttpServletRequest&nbsp;request)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.request&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request;<br />
&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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;可以开始使用request对象进行工作了</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Action.SUCCESS;<br />
&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;<br />
</span></div>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">看起来现在这些属性是类级别的，并不是线程安全的，会出现问题。其实在Struts2里并没有问题，因为每个请求过来的时候都会产生一个新的Action对象实例，它并没有和其他请求共享一个对象，所以不需要考虑线程安全问题。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>四、拦截器</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Interceptor（以下译为拦截器），在AOP（Aspect-Oriented Programming）中用于在某个方法或字段被访问之前，进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者定义在一个action执行的前后执行的代码，也可以在一个action执行前阻止其执行。同时也提供了一种可以提取action中可重用的部分的方式。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts1.x的标准框架中不提供任何形式的拦截器，虽一个名为SAIF的附加项目则实现了这样的功能，但它的适用的范围还很有限。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">拦截器是Struts2的一个强有力的工具，有许多功能（feature）都是构建于它之上，如国际化、转换器，校验等。谈到拦截器，还有一个流行的词——拦截器链（Interceptor Chain，在Struts2中称为拦截器栈Interceptor Stack）。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时，拦截器链中的拦截器就会按其之前定义的顺序被调用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts 2的拦截器实现相对比较简单。当请求到达Struts2的ServletDispatcher时，Struts 2会查找配置文件，并根据其配置实例化相对的拦截器对象，然后串成一个列表（list），最后一一地调用列表中的拦截器。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts 2已经提供丰富多样功能齐全的拦截器实现。读者可以到struts2-all-2.0.6.jar或struts2-core-2.0.6.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">作为&#8220;框架（framework）&#8221;，可扩展性是不可缺少的，因为世上没有放之四海而皆准的东西。虽然，Struts 2为我们提供如此丰富的拦截器实现，但是这并不意味我们失去创建自定义拦截器的能力，恰恰相反，在Struts 2自定义拦截器是相当容易的一件事。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>五、Struts2和Struts1.x的全面比较</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">为了对Struts2和Strtus1.x进行全面的比较，让读者了解这两种框架各自的优缺点，以便于在自己的项目中，根据实际情况，选择合适的框架，对它们两者进行比较，总结了如下表分析比较。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">特性比较: </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Action类 </p>
<p style="text-indent: 2em">Struts1.x要求Action类要扩展自一个抽象基类。Struts1.x的一个共有的问题是面向抽象类编程而不是面向接口编程。 </p>
<p style="text-indent: 2em">Struts2的Action类实现了一个Action接口，连同其他接口一起来实现可选择和自定义的服务。Struts2提供一个名叫ActionSupport的基类来实现一般使用的接口。当然，Action接口不是必须的。任何使用execute方法的POJO对象可以被当作Struts 2的Action对象来使用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">线程模型 </p>
<p style="text-indent: 2em">Struts1.x Action类是单例类，因为只有一个实例来控制所有的请求。单例类策略造成了一定的限制，并且给开发带来了额外的烦恼。Action资源必须是线程安全或者同步的。 </p>
<p style="text-indent: 2em">Struts2 Action对象为每一个请求都实例化对象，所以没有线程安全的问题。（实践中，servlet容器给每一个请求产生许多丟弃的对象，并且不会导致性能和垃圾回收问题）。 <br />
</p>
<br />
<p style="text-indent: 2em">Servlet 依赖 </p>
<p style="text-indent: 2em">Struts1.x的Action类依赖于servlet API，当Action被调用时，以HttpServletRequest和HttpServletResponse作为参数传给execute方法。 </p>
<p style="text-indent: 2em">Struts2的Action和容器无关。Servlet上下文被表现为简单的Maps，允许Action被独立的测试。Struts2的Action可以访问最初的请求(如果需要的话)。但是，尽可能避免或排除其他元素直接访问HttpServletRequest或HttpServletResponse。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">易测性 </p>
<p style="text-indent: 2em">测试Struts1.x的主要问题是execute方法暴露了Servlet API这使得测试要依赖于容器）。第三方的扩展，如Struts TestCase，提供了一套Struts1的模拟对象（来进行测试）。 </p>
<p style="text-indent: 2em">Struts2的Action可以通过初始化、设置属性、调用方法来测试。依赖注入的支持也是测试变得更简单。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">捕获输入 </p>
<p style="text-indent: 2em">Struts1.x使用ActionForm对象来捕获输入。象Action一样，所有的ActionForm必须扩展基类。因为其他的JavaBean不能作为ActionForm使用，开发者经常创建多余的类来捕获输入。DynaBeans可以被用来作为替代ActionForm的类来创建。但是，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。 </p>
<p style="text-indent: 2em">Struts2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">表达式语言 </p>
<p style="text-indent: 2em">Struts1.x整合JSTL，所以它使用JSTL的表达式语言。表达式语言有基本的图形对象移动，但是对集合和索引属性的支持很弱。 </p>
<p style="text-indent: 2em">Struts2使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL)。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">将值绑定到页面 </p>
<p style="text-indent: 2em">Struts1.x使用标准JSP机制来绑定对象到页面上下文。 </p>
<p style="text-indent: 2em">Struts2使用&#8220;ValueStack&#8221;技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">类型转换 </p>
<p style="text-indent: 2em">Struts1.x的ActionForm属性经常都是String。Struts 1.x使用Commons-Beanutils来进行类型转换。转换每一个类，而不是为每一个实例配置。 </p>
<p style="text-indent: 2em">Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">验证 </p>
<p style="text-indent: 2em">Struts1.x支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。 </p>
<p style="text-indent: 2em">Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Action执行控制 </p>
<p style="text-indent: 2em">Struts1.x支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。 </p>
<p style="text-indent: 2em">Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em"><strong>六、结论</strong> </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">前面已经简要介绍了Struts2的起源，并详细对比了Struts2和Struts1.x的差异，读者应该对Struts2的基础有所了解了——包括高层的框架概念和基础的请求流程，并理解Struts1.x和Struts2两者之间在Action方面的差别，Struts2加强了对拦截器与IoC的支持，而在Struts1.x中，这些特性是很难想象的。 </p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">同时，读者应该明白：Struts2是WebWork的升级，而不是Struts 1.x的升级。虽然Struts 2提供了与Struts1.x的兼容，但已经不是Struts1.x的升级。对于已有Struts1.x开发经验的开发者而言，Struts1.x的开发经验对于Struts2并没有太大的帮助；相反，对于已经有WebWork开发经验的开发者而言，WebWork的开发经验对Struts2的开发将有很好的借鉴意义。</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/166924.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-11 13:53 <a href="http://www.blogjava.net/lifenote/archive/2007/12/11/166924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2循序渐进</title><link>http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Tue, 11 Dec 2007 04:34:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166894.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166894.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; Struts是一个非常流行并被许多企业级应用程序采用的WEB框架，Struts2在Struts1.x的基础上进行了大量改造，和WebWork合二为一，引进了更多的新观念、新思想和新技术，使之更符合J2EE应用程序开发的需要。 </p>
<p>学一门新技术时，第一个应用程序非常重要，本文简单介绍了下struts2写了一个hello world程序，并有部分讲解希望能够给struts爱好者提供一点点帮助<br />
<br />
struts2与struts1.x有很大差异，struts2的配置文件为struts.xml相当于struts1中的struts-config.xml文件 其次放的位置也不同 struts.xml放在项目的src下面使用myeclipse发布的时候会自动复制到classes下面<br />
struts.xml代码</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;!</span><span style="color: #000000">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br />
</span><span style="color: #000000">"</span><span style="color: #000000">-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #000000">"</span><span style="color: #000000">http://struts.apache.org/dtds/struts-2.0.dtd</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">struts</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.struts2.demo</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">struts-default</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">action&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Hello</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.struts2.demo.Hello</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">result</span><span style="color: #000000">&gt;/</span><span style="color: #000000">index.jsp</span><span style="color: #000000">&lt;/</span><span style="color: #000000">result</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">action</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000">&nbsp;Add&nbsp;your&nbsp;actions&nbsp;here&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #0000ff">package</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">struts</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<br />
</span></div>
将Struts2所带的过滤器org.apache.struts2.dispatcher.FilterDispatcher配置到工程的web.xml文件中，默认情况下，该过滤器拦截请求字符串中以.action结尾的请求，并将该请求委托给指定的Action进行处理。最直观的表现就是调用Action的execute()方法。代码如下
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">struts2</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.FilterDispatcher&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">mapping</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">struts2</span><span style="color: #000000">&lt;/</span><span style="color: #000000">filter</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">url</span><span style="color: #000000">-</span><span style="color: #000000">pattern</span><span style="color: #000000">&gt;</span><span style="color: #008000">/*</span><span style="color: #008000">&lt;/url-pattern&gt;&nbsp;<br />
&nbsp;&nbsp;&lt;/filter-mapping&gt;&nbsp;</span></div>
我们的java文件 相当于使用struts1的action 但这里是继承了ActionSupport 是webwork中的类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.struts2.demo;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.opensymphony.xwork2.ActionSupport;<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Hello&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;ActionSupport{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMessage(String&nbsp;message){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;message;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMessage(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;my&nbsp;first&nbsp;Struts2&nbsp;demo</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
<p>注：ActionSupport是Struts2提供的类，功能类似于Struts1.x中的Action类，该类封装了几个有用的功能，比如：<br />
getText()：从资源文件中获取国际化消息。<br />
addFieldError()：验证输入未通过时添加错误消息，支持国际化。<br />
execute()：该方法一般会被重写，当客户端向Action发送请求时，会调用此方法。</p>
标签名称 说明<br />
include 包含其他xml文件，在示例中，这意味着struts.xml可以访问定义在struts-default.xml文件中的组件。
<p>该元素可以使得Struts2定义多个配置文件，&#8220;分而治之&#8221;。</p>
<p>要注意的是，任何一个struts2配置文件都应该和struts.xml有相同的格式，包括doctype，并且可以放在类路径下的任何地方。<br />
package 为Action或截拦器分组。</p>
<p>name：名称，必填项，名称自定义，没特别要求。方便别的package引用。<br />
extends：package能继承其他的package，即通过该属性实现，值为另一个package的name。</p>
<p>在示例中，extends =&#8221;struts-default&#8221;是从struts-default.xml中继承的。<br />
action 定义Action，name属性为访问时用到的名称，class属性是Action的类名。<br />
result 根据Action的返回值定义页面导航。</p>
<p>Action的预定义的返回值有：<br />
String SUCCESS = "success";<br />
String NONE&nbsp;&nbsp;&nbsp; = "none";<br />
String ERROR&nbsp;&nbsp; = "error";<br />
String INPUT&nbsp;&nbsp; = "input";<br />
String LOGIN&nbsp;&nbsp; = "login";</p>
<p>比如，当Action返回SUCCESS时希望转到index.jsp页面，则可以这样写：<br />
&lt;result name=&#8221;success&#8221;&gt;index.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; 其中，name的缺省为success。</p>
返回的页面代码
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;%</span><span style="color: #000000">@&nbsp;taglib&nbsp;prefix</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">s</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;uri</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/struts-tags</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">head</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000">Hello&nbsp;World</span><span style="color: #000000">!&lt;/</span><span style="color: #000000">title</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">head</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">h2</span><span style="color: #000000">&gt;&lt;</span><span style="color: #000000">s:property&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;&lt;/</span><span style="color: #000000">h2</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">body</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">html</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
<br />
最后访问<a href="http://127.0.0.1:8081/Hello.action">http://127.0.0.1:8081/Hello.action</a> 可能和你建的项目路径不同<br />
<br />
这样就完成了一个hello world程序<br />
<br />
还在学习中 如果有好的资料希望可以分享一下 最后还是希望可以提出宝贵意见
 <img src ="http://www.blogjava.net/lifenote/aggbug/166894.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-11 12:34 <a href="http://www.blogjava.net/lifenote/archive/2007/12/11/166894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>封装了一个hibernate 整合spring 的dao对象</title><link>http://www.blogjava.net/lifenote/archive/2007/12/10/166636.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 10 Dec 2007 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/10/166636.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166636.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/10/166636.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166636.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两天整理了出来数据访问层的一点实现，同时写了一个小例子，通过下载方便交流，有什么好的建议，和问题还请大家和我交流 <br />
暂时没有写web层 仅用了一个main测试的hibernate 整合spring的部分 框架大概是这样的<br />
StudentDAO 继承AbstractService 这个是我使用spring的hibernate摸板封装好的和数据库访问的方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 实现StudentServer 这个接口是和自己业务相关的方法 在调用StudentDAO 的时候使用接口指向子类<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 724px; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000"><br />
<img id="Codehighlighter1_19_977_Open_Image" onclick="this.style.display='none'; Codehighlighter1_19_977_Open_Text.style.display='none'; Codehighlighter1_19_977_Closed_Image.style.display='inline'; Codehighlighter1_19_977_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_19_977_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_19_977_Closed_Text.style.display='none'; Codehighlighter1_19_977_Open_Image.style.display='inline'; Codehighlighter1_19_977_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Test&nbsp;</span><span id="Codehighlighter1_19_977_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_19_977_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_23_74_Open_Image" onclick="this.style.display='none'; Codehighlighter1_23_74_Open_Text.style.display='none'; Codehighlighter1_23_74_Closed_Image.style.display='inline'; Codehighlighter1_23_74_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_23_74_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_23_74_Closed_Text.style.display='none'; Codehighlighter1_23_74_Open_Image.style.display='inline'; Codehighlighter1_23_74_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_23_74_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_23_74_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;args<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@throws</span><span style="color: #008000">&nbsp;QueryException&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_137_975_Open_Image" onclick="this.style.display='none'; Codehighlighter1_137_975_Open_Text.style.display='none'; Codehighlighter1_137_975_Closed_Image.style.display='inline'; Codehighlighter1_137_975_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_137_975_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_137_975_Closed_Text.style.display='none'; Codehighlighter1_137_975_Open_Image.style.display='inline'; Codehighlighter1_137_975_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;QueryException</span><span id="Codehighlighter1_137_975_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_137_975_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_141_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_141_187_Open_Text.style.display='none'; Codehighlighter1_141_187_Closed_Image.style.display='inline'; Codehighlighter1_141_187_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_141_187_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_141_187_Closed_Text.style.display='none'; Codehighlighter1_141_187_Open_Image.style.display='inline'; Codehighlighter1_141_187_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_141_187_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_141_187_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;修改了配置文件用于测试hibernate整合spring是否正常<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileSystemXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">src/applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StudentServer&nbsp;server&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(StudentDAO)&nbsp;context.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">studentDAO</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_413_607_Open_Image" onclick="this.style.display='none'; Codehighlighter1_413_607_Open_Text.style.display='none'; Codehighlighter1_413_607_Closed_Image.style.display='inline'; Codehighlighter1_413_607_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_413_607_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_413_607_Closed_Text.style.display='none'; Codehighlighter1_413_607_Open_Image.style.display='inline'; Codehighlighter1_413_607_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span id="Codehighlighter1_413_607_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_413_607_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu&nbsp;=&nbsp;new&nbsp;Student();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setStuname("qq22222222");<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setAge(56);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setSex("男");<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setPhone(555);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//server.addStudentByCondition(stu);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.addStudent(stu);</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Student</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;server.getStudent(</span><span style="color: #000000">"</span><span style="color: #000000">s</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">男</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img id="Codehighlighter1_693_742_Open_Image" onclick="this.style.display='none'; Codehighlighter1_693_742_Open_Text.style.display='none'; Codehighlighter1_693_742_Closed_Image.style.display='inline'; Codehighlighter1_693_742_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_693_742_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_693_742_Closed_Text.style.display='none'; Codehighlighter1_693_742_Open_Image.style.display='inline'; Codehighlighter1_693_742_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(Student&nbsp;stu&nbsp;:&nbsp;list)&nbsp;</span><span id="Codehighlighter1_693_742_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_693_742_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stu.getStuname());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_761_972_Open_Image" onclick="this.style.display='none'; Codehighlighter1_761_972_Open_Text.style.display='none'; Codehighlighter1_761_972_Closed_Image.style.display='inline'; Codehighlighter1_761_972_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_761_972_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_761_972_Closed_Text.style.display='none'; Codehighlighter1_761_972_Open_Image.style.display='inline'; Codehighlighter1_761_972_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_761_972_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_761_972_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用select&nbsp;&nbsp;查询字段<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Object[]&gt;&nbsp;list&nbsp;=&nbsp;server.getStudent("s",&nbsp;"男");<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Object[]&nbsp;c&nbsp;:&nbsp;list){<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Object&nbsp;a&nbsp;:&nbsp;c){<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(a&nbsp;+&nbsp;"\t");<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
查询提供了两种方式，一种是使用DAODelegate提供的查询（这和普通的hibernate一样的）<br />
第二种方式是 封装了一个查询类HqlQuery 具体使用例子中有了<br />
</p>
<p>对框架提出以下几点：<br />
1、我现在想把AbstractService&nbsp; 这个类在spring注入的时候设置成为静态的 可以提高效率 但不知会有别的什么影响？？ 还请哪个朋友指点一下 十分感谢</p>
<p>2、StudentServer 这个接口 和StudentDAO这个类 是一一对应的 StudentDAO这个必须实现接口的方法 而接口中就定义和业务相关的方法 StudentDAO在spring中注入 调用时候使用StudentServer 指向子类 <br />
但这样的每在StudentServer 增加一个业务方法就要在dao实现类中添加一个 不知道这样好不好？？<br />
还请朋友们帮忙看下 <br />
<br />
3、因为还没有涉及到web开发 但查询中缺少分页查询，正在整理，有好的分页组件请大家分享下我的邮箱<br />
sunxianchao@gmail.com<br />
<br />
有什么好的建议和提议请大家留言 十分感谢!!!</p>
<p>http://exs.mail.qq.com/cgi-bin/downloadfilepart?svrid=12&amp;fid=644bd873e37da73f4ceeef5962b2eeae94fa6298069572c4<br />
提取码：20dc1eb4<br />
希望可以提出您的宝贵意见</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/166636.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-10 13:41 <a href="http://www.blogjava.net/lifenote/archive/2007/12/10/166636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getHibernateTemplate() 学习的疑问</title><link>http://www.blogjava.net/lifenote/archive/2007/12/10/166573.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Mon, 10 Dec 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/10/166573.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166573.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/10/166573.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166573.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用spring的HibernateTemplate 过程中发现有很多方法和直接使用hibernate 查询的方法不同<br />
1、比如String hql = "select s from ShopInfo s where s.userId=:userid"; 这个hql语句 使用hibernate查询<br />
Query query = this.getDaoDelegate().createQuery( hql ).setParameter("userid", userid);&nbsp; 这样得到一个query了 可以通过setParameter方法写对参数赋值，可是通过HibernateTemplate&nbsp; 如何进行查询啊<br />
2、使用HibernateTemplate 的executeFind 和execute等方法的时候是返回一个HibernateCallback对象 要实现doInHibernate这个方法 这样查询的时候就都使用了一个匿名函数<br />
public List getAll(){<br />
&nbsp;&nbsp;return getHibernateTemplate().executeFind(new HibernateCallback() { <br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object doInHibernate(Session s) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s.createQuery("from Student").list(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;}); <br />
&nbsp;}<br />
感觉这样很麻烦 有什么好的方法解决么 还请朋友多多指教 在线等</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/166573.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-10 09:54 <a href="http://www.blogjava.net/lifenote/archive/2007/12/10/166573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发一个log4j xml格式的配置文件</title><link>http://www.blogjava.net/lifenote/archive/2007/12/07/166099.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 07 Dec 2007 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/07/166099.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/166099.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/07/166099.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/166099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/166099.html</trackback:ping><description><![CDATA[一般都是属性文件 今天写了一个简单的xml格式的 发上来供参考 和大家学习<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">1.0</span><span style="color: #000000">'</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #000000">'</span><span style="color: #000000">UTF-8</span><span style="color: #000000">'</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;!</span><span style="color: #000000">DOCTYPE&nbsp;log4j:configuration&nbsp;SYSTEM&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">log4j.dtd</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">log4j:configuration&nbsp;xmlns:log4j</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://jakarta.apache.org/log4j/</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">appender&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.apache.log4j.DailyRollingFileAppender</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">rollingFile</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DatePattern</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">.yyyy-MM-dd</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">File</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">c:\log\log.log</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">Encoding</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">GBK</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">layout&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.apache.log4j.PatternLayout</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">ConversionPattern</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;%-5p&nbsp;%-5c{3}:%L&nbsp;%X{client}&nbsp;-&amp;gt;&nbsp;%m%n</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">layout</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">appender</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">logger&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.lovebay</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">level&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DEBUG</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">logger</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">logger&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.hibernate.SQL</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">level&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DEBUG</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">logger</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">logger&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.springframework</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">level&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">DEBUG</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">logger</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">root</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">level&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">INFO</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">appender</span><span style="color: #000000">-</span><span style="color: #000000">ref&nbsp;ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">rollingFile</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">root</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">log4j:configuration</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/lifenote/aggbug/166099.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-07 17:29 <a href="http://www.blogjava.net/lifenote/archive/2007/12/07/166099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring整合Hibernate 莫名其妙的错误 </title><link>http://www.blogjava.net/lifenote/archive/2007/12/07/165968.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Fri, 07 Dec 2007 02:20:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/07/165968.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/165968.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/07/165968.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/165968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/165968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 今天写了个程序 Spring整合Hibernate 使用Spring中的HibernateTemplate 通过配置程序可以运行起来 并可以操作数据库 但程序执行过程中会有异常 不知道是什么错误 一下是程序执行的异常<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 219px; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Hibernate:&nbsp;insert&nbsp;into&nbsp;test.student&nbsp;(STUNAME,&nbsp;AGE,&nbsp;SEX,&nbsp;PHONE)&nbsp;values&nbsp;(</span><span style="color: #000000">?</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />java.lang.RuntimeException<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.stu.server.StudentServer.addStudentByCondition(StudentServer.java:</span><span style="color: #000000">30</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.stu.server.StudentServer$$FastClassByCGLIB$$8fef4d1a.invoke(</span><span style="color: #000000">&lt;</span><span style="color: #000000">generated</span><span style="color: #000000">&gt;</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:</span><span style="color: #000000">149</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:</span><span style="color: #000000">696</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:</span><span style="color: #000000">149</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:</span><span style="color: #000000">106</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:</span><span style="color: #000000">171</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:</span><span style="color: #000000">631</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.stu.server.StudentServer$$EnhancerByCGLIB$$f5f4d830.addStudentByCondition(</span><span style="color: #000000">&lt;</span><span style="color: #000000">generated</span><span style="color: #000000">&gt;</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;com.stu.test.Test.main(Test.java:</span><span style="color: #000000">33</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Hibernate:&nbsp;update&nbsp;test.student&nbsp;set&nbsp;STUNAME</span><span style="color: #000000">=?</span><span style="color: #000000">,&nbsp;AGE</span><span style="color: #000000">=?</span><span style="color: #000000">,&nbsp;SEX</span><span style="color: #000000">=?</span><span style="color: #000000">,&nbsp;PHONE</span><span style="color: #000000">=?</span><span style="color: #000000">&nbsp;where&nbsp;ID</span><span style="color: #000000">=?</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
还麻烦各位帮忙指点一下 程序我上传上来了，另外还请哪个大哥帮忙指出这程序的不足之处 <br />
<br />
程序下载地址：<a href="http://www.blogjava.net/Files/lifenote/HibernateInSpring.rar">http://www.blogjava.net/Files/lifenote/HibernateInSpring.rar</a> 
 <img src ="http://www.blogjava.net/lifenote/aggbug/165968.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-07 10:20 <a href="http://www.blogjava.net/lifenote/archive/2007/12/07/165968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j详解</title><link>http://www.blogjava.net/lifenote/archive/2007/12/06/165838.html</link><dc:creator>LifeNote</dc:creator><author>LifeNote</author><pubDate>Thu, 06 Dec 2007 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/lifenote/archive/2007/12/06/165838.html</guid><wfw:comment>http://www.blogjava.net/lifenote/comments/165838.html</wfw:comment><comments>http://www.blogjava.net/lifenote/archive/2007/12/06/165838.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lifenote/comments/commentRss/165838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lifenote/services/trackbacks/165838.html</trackback:ping><description><![CDATA[<p><br />
&nbsp;根据网络资料整理&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<strong><font color="#0000ff">&gt;&gt;&gt;&gt;1. 概述&lt;&lt;&lt;&lt;<br />
</font></strong>　　<strong>1.1. 背景<br />
</strong>　　<br />
　　在应用程序中添加日志记录总的来说基于三个目的：监视代码中变量的变化情况，周期性的记录到文件中供其他应用进行统计分析工作；跟踪代码运行时轨迹，作为日后审计的依据；担当集成开发环境中的调试器的作用，向文件或控制台打印代码的调试信息。<br />
　　<br />
　　最普通的做法就是在代码中嵌入许多的打印语句，这些打印语句可以输出到控制台或文件中，比较好的做法就是构造一个日志操作类来封装此类操作，而不是让一系列的打印语句充斥了代码的主体。<br />
　　<br />
　　<strong>1.2. Log4j简介</strong><br />
　　<br />
　　在强调可重用组件开发的今天，除了自己从头到尾开发一个可重用的日志操作类外，Apache为我们提供了一个强有力的日志操作包-Log4j。<br />
　　<br />
　 　Log4j是Apache的一个开放源代码项目，通过使用Log4j，我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等；我们也可以控制每一条日志的输出格式；通过定义每一条日志信息的级别，我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是，这些可以通过一个配置文件来灵活地进行配置，而不需要修改应用的代码。<br />
　　<br />
　　此外，通过Log4j其他语言接口，您可以在C、C+ +、.Net、PL/SQL程序中使用Log4j，其语法和用法与在Java程序中一样，使得多语言分布式系统得到一个统一一致的日志组件模块。而且，通 过使用各种第三方扩展，您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。<br />
　　<br />
　　本文介绍的Log4j版本是 1.2.3。作者试图通过一个简单的客户/服务器Java程序例子对比使用与不使用Log4j 1.2.3的差别，并详细讲解了在实践中最常使用Log4j的方法和步骤。在强调可重用组件开发的今天，相信Log4j将会给广大的设计开发人员带来方 便。加入到Log4j的队伍来吧！<br />
　　<br />
<font color="#0000ff"><strong>&gt;&gt;&gt;&gt; 2. 一个简单的例子 &lt;&lt;&lt;&lt;</strong></font></p>
<p>　　我们先来看一个简单的例子，它是一个用Java实现的客户/服务器网络程序。刚开始我们不使用Log4j，而是使用了一系列的打印语句，然后我们将使用Log4j来实现它的日志功能。这样，大家就可以清楚地比较出前后两个代码的差别。<br />
　　<br />
　　2.1. 不使用Log4j<br />
　　<br />
　　2.1.1. 客户程序<br />
　　package log4j ;<br />
　　<br />
　　import java.io.* ;<br />
　　import java.net.* ;<br />
　　<br />
　　/**<br />
　　 *<br />
　　 * &lt;p&gt; Client Without Log4j &lt;/p&gt;<br />
　　 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;<br />
　　 * @version 1.0<br />
　　 */<br />
　　public class ClientWithoutLog4j {<br />
　　<br />
　　　　/**<br />
　　　　 *<br />
　　　　 * @param args<br />
　　　　 */<br />
　　　　public static void main ( String args [] ) {<br />
　　<br />
　　　　　　String welcome = null;<br />
　　　　　　String response = null;<br />
　　　　　　BufferedReader reader = null;<br />
　　　　　　PrintWriter writer = null;<br />
　　　　　　InputStream in = null;<br />
　　　　　　OutputStream out = null;<br />
　　　　　　Socket client = null;<br />
　　<br />
　　　　　　try {<br />
　　　　　　　　client = new Socket ( "localhost", 8001 ) ;<br />
　　　　　　　　System.out.println ( "info: Client socket: " + client ) ;<br />
　　　　　　　　in = client.getInputStream () ;<br />
　　　　　　　　out = client.getOutputStream () ;<br />
　　　　　　} catch ( IOException e ) {<br />
　　　　　　　　System.out.println ( "error: IOException : " + e ) ;<br />
　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　}<br />
　　<br />
　　　　　　try{<br />
　　　　　　　　reader = new BufferedReader( new InputStreamReader ( in ) ) ;<br />
　　　　　　　　writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;<br />
　　<br />
　　　　　　　　welcome = reader.readLine () ;<br />
　　　　　　　　System.out.println ( "debug: Server says: '" + welcome + "'" ) ;<br />
　　<br />
　　　　　　　　System.out.println ( "debug: HELLO" ) ;<br />
　　　　　　　　writer.println ( "HELLO" ) ;<br />
　　　　　　　　response = reader.readLine () ;<br />
　　　　　　　　System.out.println ( "debug: Server responds: '" + response + "'") ;<br />
　　<br />
　　　　　　　　System.out.println ( "debug: HELP" ) ;<br />
　　　　　　　　writer.println ( "HELP" ) ;<br />
　　　　　　　　response = reader.readLine () ;<br />
　　　　　　　　System.out.println ( "debug: Server responds: '" + response + "'" ) ;<br />
　　<br />
　　　　　　　　System.out.println ( "debug: QUIT" ) ;<br />
　　　　　　　　writer.println ( "QUIT" ) ;<br />
　　　　　　} catch ( IOException e ) {<br />
　　　　　　　　System.out.println ( "warn: IOException in client.in.readln()" ) ;<br />
　　　　　　　　System.out.println ( e ) ;<br />
　　　　　　}<br />
　　　　　　try{<br />
　　　　　　　　Thread.sleep ( 2000 ) ;<br />
　　　　　　} catch ( Exception ignored ) {}<br />
　　　　}<br />
　　}<br />
　　<br />
　　2.1.2. 服务器程序<br />
　　package log4j ;<br />
　　<br />
　　import java.util.* ;<br />
　　import java.io.* ;<br />
　　import java.net.* ;<br />
　　<br />
　　/**<br />
　　 *<br />
　　 * &lt;p&gt; Server Without Log4j &lt;/p&gt;<br />
　　 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;<br />
　　 * @version 1.0<br />
　　 */<br />
　　public class ServerWithoutLog4j {<br />
　　<br />
　　　　final static int SERVER_PORT = 8001 ; // this server's port<br />
　　<br />
　　　　/**<br />
　　　　 *<br />
　　　　 * @param args<br />
　　　　 */<br />
　　　　public static void main ( String args [] ) {<br />
　　　　　　String clientRequest = null;<br />
　　　　　　BufferedReader reader = null;<br />
　　　　　　PrintWriter writer = null;<br />
　　　　　　ServerSocket server = null;<br />
　　　　　　Socket socket = null;<br />
　　　　　　InputStream in = null;<br />
　　　　　　OutputStream out = null;<br />
　　<br />
　　　　　　try {<br />
　　　　　　　　server = new ServerSocket ( SERVER_PORT ) ;<br />
　　　　　　　　System.out.println ( "info: ServerSocket before accept: " + server ) ;<br />
　　　　　　　　System.out.println ( "info: Java server without log4j, on-line!" ) ;<br />
　　<br />
　　　　　　　　// wait for client's connection<br />
　　　　　　　　socket = server.accept () ;<br />
　　　　　　　　System.out.println ( "info: ServerSocket after accept: " + server )　;<br />
　　<br />
　　　　　　　　in = socket.getInputStream () ;<br />
　　　　　　　　out = socket.getOutputStream () ;<br />
　　<br />
　　　　　　} catch ( IOException e ) {<br />
　　　　　　　　System.out.println( "error: Server constructor IOException: " + e ) ;<br />
　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　}<br />
　　　　　　reader = new BufferedReader ( new InputStreamReader ( in ) ) ;<br />
　　　　　　writer = new PrintWriter ( new OutputStreamWriter ( out ) , true ) ;<br />
　　<br />
　　　　　　// send welcome string to client<br />
　　　　　　writer.println ( "Java server without log4j, " + new Date () ) ;<br />
　　<br />
　　　　　　while ( true ) {<br />
　　　　　　　　try {<br />
　　　　　　　　　　// read from client<br />
　　　　　　　　　　clientRequest = reader.readLine () ;<br />
　　　　　　　　　　System.out.println ( "debug: Client says: " + clientRequest ) ;<br />
　　　　　　　　　　if ( clientRequest.startsWith ( "HELP" ) ) {<br />
　　　　　　　　　　　　System.out.println ( "debug: OK!" ) ;<br />
　　　　　　　　　　　　writer.println ( "Vocabulary: HELP QUIT" ) ;<br />
　　　　　　　　　　}<br />
　　　　　　　　　　else {<br />
　　　　　　　　　　　　if ( clientRequest.startsWith ( "QUIT" ) ) {<br />
　　　　　　　　　　　　　　System.out.println ( "debug: OK!" ) ;<br />
　　　　　　　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　　　　　　　}<br />
　　　　　　　　　　　　else{<br />
　　　　　　　　　　　　　　System.out.println ( "warn: Command '" + <br />
　　 clientRequest + "' not understood." ) ;<br />
　　　　　　　　　　　　　　writer.println ( "Command '" + clientRequest <br />
　　 + "' not understood." ) ;<br />
　　　　　　　　　　　　}<br />
　　　　　　　　　　}<br />
　　　　　　　　} catch ( IOException e ) {<br />
　　　　　　　　　　System.out.println ( "error: IOException in Server " + e ) ;<br />
　　　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　　　}<br />
　　　　　　}<br />
　　　　}<br />
　　}<br />
　　<br />
　　2.2. 迁移到Log4j<br />
　　<br />
　　2.2.1. 客户程序<br />
　　<br />
　　package log4j ;<br />
　　<br />
　　import java.io.* ;<br />
　　import java.net.* ;<br />
　　<br />
　　// add for log4j: import some package<br />
　　import org.apache.log4j.PropertyConfigurator ;<br />
　　import org.apache.log4j.Logger ;<br />
　　import org.apache.log4j.Level ;<br />
　　<br />
　　/**<br />
　　 *<br />
　　 * &lt;p&gt; Client With Log4j &lt;/p&gt;<br />
　　 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;<br />
　　 * @version 1.0<br />
　　 */<br />
　　public class ClientWithLog4j {<br />
　　<br />
　　　　/*<br />
　　　　add for log4j: class Logger is the central class in the log4j package.<br />
　　　　we can do most logging operations by Logger except configuration.<br />
　　　　getLogger(...): retrieve a logger by name, if not then create for it.<br />
　　　　*/<br />
　　　　static Logger logger = Logger.getLogger <br />
　　 ( ClientWithLog4j.class.getName () ) ;<br />
　　<br />
　　　　/**<br />
　　　　 *<br />
　　　　 * @param args : configuration file name<br />
　　　　 */<br />
　　　　public static void main ( String args [] ) {<br />
　　<br />
　　　　　　String welcome = null ;<br />
　　　　　　String response = null ;<br />
　　　　　　BufferedReader reader = null ;<br />
　　　　　　PrintWriter writer = null ;<br />
　　　　　　InputStream in = null ;<br />
　　　　　　OutputStream out = null ;<br />
　　　　　　Socket client = null ;<br />
　　<br />
　　　　　　/*<br />
　　　　　　add for log4j: class BasicConfigurator can quickly configure the package.<br />
　　　　　　print the information to console.<br />
　　　　　　*/<br />
　　　　　　PropertyConfigurator.configure ( "ClientWithLog4j.properties" ) ;<br />
　　<br />
　　　　　　// add for log4j: set the level<br />
　　//　　　　logger.setLevel ( ( Level ) Level.DEBUG ) ;<br />
　　<br />
　　　　　　try{<br />
　　　　　　　　client = new Socket( "localhost" , 8001 ) ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the info level<br />
　　　　　　　　logger.info ( "Client socket: " + client ) ;<br />
　　<br />
　　　　　　　　in = client.getInputStream () ;<br />
　　　　　　　　out = client.getOutputStream () ;<br />
　　　　　　} catch ( IOException e ) {<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the error level<br />
　　　　　　　　logger.error ( "IOException : " + e ) ;<br />
　　<br />
　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　}<br />
　　<br />
　　　　　　try{<br />
　　　　　　　　reader = new BufferedReader ( new InputStreamReader ( in ) ) ;<br />
　　　　　　　　writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;<br />
　　<br />
　　　　　　　　welcome = reader.readLine () ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　logger.debug ( "Server says: '" + welcome + "'" ) ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　logger.debug ( "HELLO" ) ;<br />
　　<br />
　　　　　　　　writer.println ( "HELLO" ) ;<br />
　　　　　　　　response = reader.readLine () ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　logger.debug ( "Server responds: '" + response + "'" ) ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　logger.debug ( "HELP" ) ;<br />
　　<br />
　　　　　　　　writer.println ( "HELP" ) ;<br />
　　　　　　　　response = reader.readLine () ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　logger.debug ( "Server responds: '" + response + "'") ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　logger.debug ( "QUIT" ) ;<br />
　　<br />
　　　　　　　　writer.println ( "QUIT" ) ;<br />
　　　　　　} catch ( IOException e ) {<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the warn level<br />
　　　　　　　　logger.warn ( "IOException in client.in.readln()" ) ;<br />
　　<br />
　　　　　　　　System.out.println ( e ) ;<br />
　　　　　　}<br />
　　　　　　try {<br />
　　　　　　　　Thread.sleep ( 2000 ) ;<br />
　　　　　　} catch ( Exception ignored ) {}<br />
　　　　}<br />
　　}<br />
　　<br />
　　2.2.2. 服务器程序<br />
　　<br />
　　package log4j;<br />
　　<br />
　　import java.util.* ;<br />
　　import java.io.* ;<br />
　　import java.net.* ;<br />
　　<br />
　　// add for log4j: import some package<br />
　　import org.apache.log4j.PropertyConfigurator ;<br />
　　import org.apache.log4j.Logger ;<br />
　　import org.apache.log4j.Level ;<br />
　　<br />
　　/**<br />
　　 *<br />
　　 * &lt;p&gt; Server With Log4j &lt;/p&gt;<br />
　　 * &lt;p&gt; Description: a sample with log4j&lt;/p&gt;<br />
　　 * @version 1.0<br />
　　 */<br />
　　public class ServerWithLog4j {<br />
　　<br />
　　　　final static int SERVER_PORT = 8001 ; // this server's port<br />
　　<br />
　　　　/*<br />
　　　　add for log4j: class Logger is the central class in the log4j package.<br />
　　　　we can do most logging operations by Logger except configuration.<br />
　　　　getLogger(...): retrieve a logger by name, if not then create for it.<br />
　　　　*/<br />
　　　　static Logger logger = Logger.getLogger <br />
　　 ( ServerWithLog4j.class.getName () ) ;<br />
　　<br />
　　　　/**<br />
　　　　 *<br />
　　　　 * @param args<br />
　　　　 */<br />
　　　　public static void main ( String args[]) {<br />
　　　　　　String clientRequest = null ;<br />
　　　　　　BufferedReader reader = null ;<br />
　　　　　　PrintWriter writer = null ;<br />
　　　　　　ServerSocket server = null ;<br />
　　　　　　Socket socket = null ;<br />
　　<br />
　　　　　　InputStream in = null ;<br />
　　　　　　OutputStream out = null ;<br />
　　<br />
　　　　　　/*<br />
　　　　　　add for log4j: class BasicConfigurator can quickly configure the package.<br />
　　　　　　print the information to console.<br />
　　　　　　*/<br />
　　　　　　PropertyConfigurator.configure ( "ServerWithLog4j.properties" ) ;<br />
　　<br />
　　　　　　// add for log4j: set the level<br />
　　//　　　　logger.setLevel ( ( Level ) Level.DEBUG ) ;<br />
　　<br />
　　　　　　try{<br />
　　　　　　　　server = new ServerSocket ( SERVER_PORT ) ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the info level<br />
　　　　　　　　logger.info ( "ServerSocket before accept: " + server ) ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the info level<br />
　　　　　　　　logger.info ( "Java server with log4j, on-line!" ) ;<br />
　　<br />
　　　　　　　　// wait for client's connection<br />
　　　　　　　　socket = server.accept() ;<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the info level<br />
　　　　　　　　logger.info ( "ServerSocket after accept: " + server ) ;<br />
　　<br />
　　　　　　　　in = socket.getInputStream() ;<br />
　　　　　　　　out = socket.getOutputStream() ;<br />
　　<br />
　　　　　　} catch ( IOException e ) {<br />
　　<br />
　　　　　　　　// add for log4j: log a message with the error level<br />
　　　　　　　　logger.error ( "Server constructor IOException: " + e ) ;<br />
　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　}<br />
　　　　　　reader = new BufferedReader ( new InputStreamReader ( in ) ) ;<br />
　　　　　　writer = new PrintWriter ( new OutputStreamWriter ( out ), true ) ;<br />
　　<br />
　　　　　　// send welcome string to client<br />
　　　　　　writer.println ( "Java server with log4j, " + new Date () ) ;<br />
　　<br />
　　　　　　while ( true ) {<br />
　　　　　　　　try {<br />
　　　　　　　　　　// read from client<br />
　　　　　　　　　　clientRequest = reader.readLine () ;<br />
　　<br />
　　　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　　　logger.debug ( "Client says: " + clientRequest ) ;<br />
　　<br />
　　　　　　　　　　if ( clientRequest.startsWith ( "HELP" ) ) {<br />
　　<br />
　　　　　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　　　　　logger.debug ( "OK!" ) ;<br />
　　<br />
　　　　　　　　　　　　writer.println ( "Vocabulary: HELP QUIT" ) ;<br />
　　　　　　　　　　}<br />
　　　　　　　　　　else {<br />
　　　　　　　　　　　　if ( clientRequest.startsWith ( "QUIT" ) ) {<br />
　　<br />
　　　　　　　　　　　　　　// add for log4j: log a message with the debug level<br />
　　　　　　　　　　　　　　logger.debug ( "OK!" ) ;<br />
　　<br />
　　　　　　　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　　　　　　　}<br />
　　　　　　　　　　　　else {<br />
　　<br />
　　　　　　　　　　　　　　// add for log4j: log a message with the warn level<br />
　　　　　　　　　　　　　　logger.warn ( "Command '" <br />
　　 + clientRequest + "' not understood." ) ;<br />
　　<br />
　　　　　　　　　　　　　　writer.println ( "Command '"<br />
　　 + clientRequest + "' not understood." ) ;<br />
　　　　　　　　　　　　}<br />
　　　　　　　　　　}<br />
　　　　　　　　} catch ( IOException e ) {<br />
　　<br />
　　　　　　　　　　// add for log4j: log a message with the error level<br />
　　　　　　　　　　logger.error( "IOException in Server " + e ) ;<br />
　　<br />
　　　　　　　　　　System.exit ( 0 ) ;<br />
　　　　　　　　}<br />
　　　　　　}<br />
　　　　}<br />
　　}<br />
　　<br />
　　2.2.3. 配置文件<br />
　　<br />
　　2.2.3.1. 客户程序配置文件<br />
　　<br />
　　log4j.rootLogger=INFO, A1<br />
　　<br />
　　log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
　　<br />
　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
　　<br />
　　log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
　　<br />
　　2.2.3.2. 服务器程序配置文件<br />
　　<br />
　　log4j.rootLogger=INFO, A1<br />
　　<br />
　　log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
　　<br />
　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
　　<br />
　　log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n<br />
　　<br />
　　2.3. 比较<br />
　　<br />
　 　比较这两个应用可以看出，采用Log4j进行日志操作的整个过程相当简单明了，与直接使用System.out.println语句进行日志信息输出的 方式相比，基本上没有增加代码量，同时能够清楚地理解每一条日志信息的重要程度。通过控制配置文件，我们还可以灵活地修改日志信息的格式，输出目的地等等 方面，而单纯依靠System.out.println语句，显然需要做更多的工作。<br />
<br />
<font color="#0000ff"><strong>&gt;&gt;&gt;&gt; 3 . Log4j日志管理系统简单使用说明 &lt;&lt;&lt;&lt;<br />
</strong></font><br />
&nbsp;&nbsp;&nbsp; 通常，我们都提供一个名为 log4j.properties的文件，在第一次调用到Log4J时，Log4J会在类路径（../web-inf/class/当然也可以放到其它任何目录，只要该目录被包含到类路径中即可）中定位这个文件，并读入这个文件完成的配置。这个配置文件告 诉Log4J以什么样的格式、把什么样的信息、输出到什么地方。<br />
　　Log4j有三个主要的组件：Loggers(记录器)，Appenders(输出源)和Layouts(布局)，这里可简单理解为日志类别，日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松的记录信息的类型和级别，并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明：<br />
　　<br />
　　<strong>1、 Loggers<br />
</strong>　 　Loggers组件在此系统中被分为五个级别：DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的，DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL，分别用来指定这条日志信息的重要程度,明白这一点很重要，这里Log4j有一个规则：假设Loggers级别为P，如果在Loggers中发生了一个级别Q比P高，则可以启动，否则屏蔽掉。<br />
假设你定义的级别是info，那么error和warn的日志可以显示而比他低的debug信息就不显示了。<br />
&nbsp;　<br />
　　Java程序举例来说：<br />
　　<br />
　　//建立Logger的一个实例，命名为&#8220;com.foo&#8221;<br />
　　　Logger　logger = Logger.getLogger("com.foo"); //"com.foo"是实例进行命名，也可以任意<br />
　　//设置logger的级别。通常不在程序中设置logger的级别。一般在配置文件中设置。<br />
　　logger.setLevel(Level.INFO);<br />
　　Logger barlogger = Logger.getLogger("com.foo.Bar");<br />
　　//下面这个请求可用，因为WARN &gt;= INFO<br />
　　logger.warn("Low fuel level.");<br />
　　//下面这个请求不可用，因为DEBUG &lt; INFO<br />
　　logger.debug("Starting search for nearest gas station.");<br />
　　//命名为&#8220;com.foo.bar&#8221;的实例barlogger会继承实例&#8220;com.foo&#8221;的级别。因此，下面这个请求可用，因为INFO &gt;= INFO<br />
　　barlogger.info("Located nearest gas station.");<br />
　　//下面这个请求不可用，因为DEBUG &lt; INFO<br />
　　barlogger.debug("Exiting gas station search");<br />
　　这里&#8220;是否可用&#8221;的意思是能否输出Logger信息。<br />
　　　　在对Logger实例进行命名时，没有限制，可以取任意自己感兴趣的名字。一般情况下建议以类的所在位置来命名Logger实例，这是目前来讲比较有效的Logger命名方式。这样可以使得每个类建立自己的日志信息，便于管理。比如：<br />
　　<br />
　　static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());<br />
　　<br />
　<strong>　2、Appenders<br />
</strong>　　禁用与使用日志请求只是Log4j其中的一个小小的地方，Log4j日志系统允许把日志输出到不同的地方，如控制台（Console）、文件（Files）、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。<br />
　　<br />
　　其语法表示为：<br />
　　<br />
　　org.apache.log4j.ConsoleAppender（控制台）<br />
　　org.apache.log4j.FileAppender（文件）<br />
　　org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />
&nbsp;&nbsp;&nbsp; org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />
　　org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
　　<br />
　　配置时使用方式为：<br />
　　log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />
　　log4j.appender.appenderName.option1 = value1<br />
　　&#8230;<br />
&nbsp;&nbsp;&nbsp; log4j.appender.appenderName.option = valueN<br />
　　这样就为日志的输出提供了相当大的便利。<br />
　　<br />
<strong>　　3、Layouts</strong><br />
　 　有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了 四种日志输出样式，如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。<br />
　　<br />
　　其语法表示为：<br />
　　<br />
　　org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
　　org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
　　org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
　　org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
　　<br />
　　配置时使用方式为：<br />
　　<br />
　　log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class<br />
　　log4j.appender.appenderName.layout.option1 = value1<br />
　　&#8230;<br />
　　log4j.appender.appenderName.layout.option = valueN</p>
<p><strong><font color="#0000ff">&gt;&gt;&gt;&gt;&nbsp; 4 . Log4j的配置 &lt;&lt;&lt;&lt;　</font></strong>　<br />
　　<br />
　　以上是从原理方面说明Log4j的使用方法，在具体Java编程使用Log4j可以参照以下示例：<br />
　　<br />
　　<strong>1、 建立Logger实例</strong>：<br />
　　语法表示：public static Logger getLogger( String name)<br />
　　实际使用：static Logger logger = Logger.getLogger(ServerWithLog4j.class.getName ()) ;<br />
　　<br />
　　<strong>2、 读取配置文件</strong>：<br />
　　获得了Logger的实例之后，接下来将配置Log4j使用环境：<br />
　　语法表示：<br />
　　BasicConfigurator.configure()：自动快速地使用缺省Log4j环境。<br />
　　PropertyConfigurator.configure(String configFilename)：读取使用Java的特性文件编写的配置文件。<br />
　　DOMConfigurator.configure(String filename)：读取XML形式的配置文件。<br />
　　实际使用：<br />
&nbsp;&nbsp;&nbsp; PropertyConfigurator.configure("ServerWithLog4j.properties");<br />
　　<br />
　　<strong>3、 插入日志信息</strong><br />
　　完成了以上连个步骤以后，下面就可以按日志的不同级别插入到你要记录日志的任何地方了。<br />
　　语法表示：<br />
　　Logger.debug(Object message);//调试信息<br />
　　Logger.info(Object message);//一般信息<br />
　　Logger.warn(Object message);//警告信息<br />
　　Logger.error(Object message);//错误信息<br />
　　Logger.fatal(Object message);//致命错误信息</p>
<p>　　实际使用：logger.info("ServerSocket before accept: " + server);<br />
　　<br />
　<strong><font color="#0000ff">&gt;&gt;&gt;&gt; 5. 配置过程 &lt;&lt;&lt;&lt;<br />
<br />
</font></strong>　在实际编程时，要使Log4j真正在系统中运行事先还要对配置文件进行定义。定义步骤就是对Logger、Appender及Layout的分别使用。<br />
&nbsp;&nbsp;&nbsp; Log4j支持两种配置文件格式，一种是XML格式的文件，一种是java properties（key=value）【Java特性文件（键=值）】。下面我们介绍使用Java特性文件做为配置文件的方法<br />
&nbsp;&nbsp; 具体如下：<br />
　　<br />
　　<strong>1、配置根Logger，</strong>其语法为：<br />
　　log4j.rootLogger = [ level ] , appenderName1, appenderName2, &#8230;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; level : 是日志记录的优先级，分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。Log4j建议只使用四个级别，优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别，您可以控制到应用程序中相应级别的日志信息的开关。比如在这里定 义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。<br />
　　&nbsp;&nbsp;&nbsp;&nbsp; appenderName:就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。<br />
&nbsp;&nbsp; 例如：log4j.rootLogger＝info,A1,B2,C3<br />
　　<br />
　　<strong>2、配置日志信息输出目的地</strong>，其语法为：<br />
　　log4j.appender.appenderName = fully.qualified.name.of.appender.class&nbsp; //<br />
　　&nbsp; "fully.qualified.name.of.appender.class" 可以指定下面五个目的地中的一个：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.org.apache.log4j.ConsoleAppender（控制台）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.org.apache.log4j.FileAppender（文件）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>1.ConsoleAppender选项<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Threshold=WARN:指定日志消息的输出最低层次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Target=System.err：默认情况下是：System.out,指定输出控制台<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>2.FileAppender</strong> 选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Threshold=WARN:指定日志消息的输出最低层次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File=mylog.txt:指定消息输出到mylog.txt文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.<strong>DailyRollingFileAppender</strong> 选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Threshold=WARN:指定日志消息的输出最低层次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File=mylog.txt:指定消息输出到mylog.txt文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DatePattern='.'yyyy-ww:每周滚动一次文件，即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)'.'yyyy-MM: 每月<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)'.'yyyy-ww: 每周&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)'.'yyyy-MM-dd: 每天<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)'.'yyyy-MM-dd-a: 每天两次<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5)'.'yyyy-MM-dd-HH: 每小时<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6)'.'yyyy-MM-dd-HH-mm: 每分钟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.<strong>RollingFileAppender</strong> 选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Threshold=WARN:指定日志消息的输出最低层次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File=mylog.txt:指定消息输出到mylog.txt文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Append=false:默认值是true,即将消息增加到指定文件中，false指将消息覆盖指定的文件内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时，将会自动滚动，即将原来的内容移到mylog.log.1文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MaxBackupIndex=2:指定可以产生的滚动文件的最大数。</p>
<p>实际应用：<br />
　　log4j.appender.A1=org.apache.log4j.ConsoleAppender //这里指定了日志输出的第一个位置A1是控制台ConsoleAppender<br />
　　<br />
　　<strong>3、配置日志信息的格式</strong>，其语法为：<br />
　　<strong>A.</strong> <strong>log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;"fully.qualified.name.of.layout.class" 可以指定下面4个格式中的一个：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.HTMLLayout 选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocationInfo=true:默认值是false,输出java文件名称和行号<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Title=my app file: 默认值是 Log4J Log Messages.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.PatternLayout 选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ConversionPattern=%m%n :指定怎样格式化指定的消息。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.XMLLayout&nbsp; 选项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LocationInfo=true:默认值是false,输出java文件和行号<br />
&nbsp;&nbsp; 实际应用：<br />
&nbsp;&nbsp; 　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>B</strong>.<strong> log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里需要说明的就是日志信息格式中几个符号所代表的含义：<br />
　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; －X号: X信息输出时左对齐；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %p: 输出日志信息优先级，即DEBUG，INFO，WARN，ERROR，FATAL,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %d: 输出日志时间点的日期或时间，默认格式为ISO8601，也可以在其后指定格式，比如：%d{yyy MMM dd HH:mm:ss,SSS}，输出类似：2002年10月18日 22：10：28，921<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %r: 输出自应用启动到输出该log信息耗费的毫秒数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %c: 输出日志信息所属的类目，通常就是所在类的全名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %t: 输出产生该日志事件的线程名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %l: 输出日志事件的发生位置，相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程，以及在代码中的行数。举例：Testlog4.main(TestLog4.java:10)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。<br />
&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;&nbsp;&nbsp; %F: 输出日志消息产生时所在的文件名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%L: 输出代码中的行号<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %m: 输出代码中指定的消息,产生的日志具体信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %n: 输出一个回车换行符，Windows平台为"\r\n"，Unix平台为"\n"输出日志信息换行<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp; 1)%20c：指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，默认的情况下右对齐。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)%-20c:指定输出category的名称，最小的宽度是20，如果category的名称小于20的话，"-"号指定左对齐。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3)%.30c:指定输出category的名称，最大的宽度是30，如果category的名称大于30的话，就会将左边多出的字符截掉，但小于30的话也不会有空格。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4)%20.30c:如果category的名称小于20就补空格，并且右对齐，如果其名称长于30字符，就从左边交远销出的字符截掉。</p>
<p>　　这里上面三个步骤是对前面Log4j组件说明的一个简化；下面给出一个具体配置例子，在程序中可以参照执行：<br />
　　log4j.rootLogger=INFO,A1，B2<br />
　　log4j.appender.A1=org.apache.log4j.ConsoleAppender<br />
　　log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />
　　log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n<br />
&nbsp;　　根据上面的日志格式，某一个程序的输出结果如下：<br />
　　0　　INFO　2003-06-13 13:23:46968 ClientWithLog4j Client socket: Socket[addr=localhost/127.0.0.1,port=8002,localport=2014]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server says: 'Java server with log4j, Fri Jun 13 13:23:46 CST 2003'<br />
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j GOOD<br />
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Command 'HELLO' not understood.'<br />
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j HELP<br />
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j Server responds: 'Vocabulary: HELP QUIT'<br />
　　16　 DEBUG 2003-06-13 13:23:46984 ClientWithLog4j QUIT<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> 4. # 当输出信息于回滚文件时</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender&nbsp;&nbsp; //指定以文件的方式输出日志<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.Threshold=ERROR&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.File=rolling.log&nbsp; //文件位置,也可以用变量${java.home}、rolling.log<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.Append=true&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.MaxFileSize=10KB&nbsp; //文件最大尺寸<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.MaxBackupIndex=1&nbsp; //备份数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n&nbsp; 　　</p>
<p>&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br />
<strong><font color="#0000ff">&nbsp;<br />
</font></strong><strong><font color="#0000ff">&gt;&gt;&gt;&gt; 6. Log4j比较全面的配置 &lt;&lt;&lt;&lt;</font></strong></p>
<p>&nbsp;LOG4J的配置之简单使它遍及于越来越多的应用中了：Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了， </p>
<p>&nbsp;log4j.rootLogger=DEBUG,CONSOLE,A1,im <br />
&nbsp;log4j.addivity.org.apache=true </p>
<p>&nbsp;# 应用于控制台 </p>
<p>&nbsp;log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender <br />
&nbsp;log4j.appender.Threshold=DEBUG <br />
&nbsp;log4j.appender.CONSOLE.Target=System.out <br />
&nbsp;log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
&nbsp;#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n </p>
<p>&nbsp;#应用于文件 </p>
<p>&nbsp;log4j.appender.FILE=org.apache.log4j.FileAppender <br />
&nbsp;log4j.appender.FILE.File=file.log <br />
&nbsp;log4j.appender.FILE.Append=false <br />
&nbsp;log4j.appender.FILE.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n <br />
&nbsp;# Use this layout for LogFactor 5 analysis </p>
<p>&nbsp;# 应用于文件回滚 </p>
<p>&nbsp;log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender <br />
&nbsp;log4j.appender.ROLLING_FILE.Threshold=ERROR <br />
&nbsp;log4j.appender.ROLLING_FILE.File=rolling.log&nbsp; //文件位置,也可以用变量${java.home}、rolling.log<br />
&nbsp;log4j.appender.ROLLING_FILE.Append=true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //true:添加&nbsp; false:覆盖<br />
&nbsp;log4j.appender.ROLLING_FILE.MaxFileSize=10KB&nbsp;&nbsp; //文件最大尺寸<br />
&nbsp;log4j.appender.ROLLING_FILE.MaxBackupIndex=1&nbsp; //备份数<br />
&nbsp;log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n </p>
<p><br />
&nbsp;#应用于socket <br />
&nbsp;log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender <br />
&nbsp;log4j.appender.SOCKET.RemoteHost=localhost <br />
&nbsp;log4j.appender.SOCKET.Port=5001 <br />
&nbsp;log4j.appender.SOCKET.LocationInfo=true <br />
&nbsp;# Set up for Log Facter 5 <br />
&nbsp;log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n </p>
<p><br />
&nbsp;# Log Factor 5 Appender <br />
&nbsp;log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender <br />
&nbsp;log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000 </p>
<p>&nbsp;# 发送日志给邮件 </p>
<p>&nbsp;log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender <br />
&nbsp;log4j.appender.MAIL.Threshold=FATAL <br />
&nbsp;log4j.appender.MAIL.BufferSize=10 <br />
&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#111;&#103;&#52;&#106;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#101;&#114;&#46;&#77;&#65;&#73;&#76;&#46;&#70;&#114;&#111;&#109;&#61;&#119;&#101;&#98;&#64;&#119;&#119;&#119;&#46;&#119;&#117;&#115;&#101;&#116;&#46;&#99;&#111;&#109;">log4j.appender.MAIL.From=web@www.wuset.com</a> <br />
&nbsp;log4j.appender.MAIL.SMTPHost=www.wusetu.com <br />
&nbsp;log4j.appender.MAIL.Subject=Log4J Message <br />
&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#108;&#111;&#103;&#52;&#106;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#101;&#114;&#46;&#77;&#65;&#73;&#76;&#46;&#84;&#111;&#61;&#119;&#101;&#98;&#64;&#119;&#119;&#119;&#46;&#119;&#117;&#115;&#101;&#116;&#117;&#46;&#99;&#111;&#109;">log4j.appender.MAIL.To=web@www.wusetu.com</a> <br />
&nbsp;log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n </p>
<p>&nbsp;# 用于数据库 <br />
&nbsp;log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender <br />
&nbsp;log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test <br />
&nbsp;log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver <br />
&nbsp;log4j.appender.DATABASE.user=root <br />
&nbsp;log4j.appender.DATABASE.password= <br />
&nbsp;log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') <br />
&nbsp;log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n </p>
<p><br />
&nbsp;log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />
&nbsp;log4j.appender.A1.File=SampleMessages.log4j <br />
&nbsp;log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' <br />
&nbsp;log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout </p>
<p>&nbsp;#自定义Appender </p>
<p>&nbsp;log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender </p>
<p>&nbsp;log4j.appender.im.host = mail.cybercorlin.net <br />
&nbsp;log4j.appender.im.username = username <br />
&nbsp;log4j.appender.im.password = password <br />
&nbsp;log4j.appender.im.recipient = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#99;&#111;&#114;&#108;&#105;&#110;&#64;&#99;&#121;&#98;&#101;&#114;&#99;&#111;&#114;&#108;&#105;&#110;&#46;&#110;&#101;&#116;">corlin@cybercorlin.net</a> </p>
<p>&nbsp;log4j.appender.im.layout=org.apache.log4j.PatternLayout <br />
&nbsp;log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n</p>
<img src ="http://www.blogjava.net/lifenote/aggbug/165838.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-06 16:47 <a href="http://www.blogjava.net/lifenote/archive/2007/12/06/165838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>