﻿<?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-XZC.Log-随笔分类-Spring</title><link>http://www.blogjava.net/xzclog/category/17330.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 09 Aug 2011 21:11:52 GMT</lastBuildDate><pubDate>Tue, 09 Aug 2011 21:11:52 GMT</pubDate><ttl>60</ttl><item><title>Spring事务管理与数据库连接</title><link>http://www.blogjava.net/xzclog/archive/2011/08/09/356124.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Tue, 09 Aug 2011 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2011/08/09/356124.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/356124.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2011/08/09/356124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/356124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/356124.html</trackback:ping><description><![CDATA[<div>转自：<a href="http://www.iteye.com/topic/11738">http://www.iteye.com/topic/11738</a><br />前几天解释了Spring的抽象事务机制。这次讲讲Spring中的DataSource 事务。 <br />DataSource事务相关的类比较多，我们一步步来拨开其中的密团。 <br /><br />1 如何获得连接 <br />看DataSourceUtils代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Connection&nbsp;doGetConnection(DataSource&nbsp;dataSource,&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;allowSynchronization); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionHolder&nbsp;conHolder&nbsp;=&nbsp;(ConnectionHolder);&nbsp;TransactionSynchronizationManager.getResource(dataSource);; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(conHolder&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>);&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conHolder.requested();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;conHolder.getConnection();; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;dataSource.getConnection();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(allowSynchronization&nbsp;&amp;&amp;&nbsp;TransactionSynchronizationManager.isSynchronizationActive(););&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conHolder&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ConnectionHolder(con);; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.bindResource(dataSource,&nbsp;conHolder);; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.registerSynchronization(</span><span class="keyword">new</span><span>&nbsp;ConnectionSynchronization(conHolder,&nbsp;dataSource););; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conHolder.requested();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;con; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="0" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">protected static Connection doGetConnection(DataSource dataSource, boolean allowSynchronization);
			throws SQLException {
		
		ConnectionHolder conHolder = (ConnectionHolder); TransactionSynchronizationManager.getResource(dataSource);;
		if (conHolder != null); {
			conHolder.requested();;
			return conHolder.getConnection();;
		}

		
		Connection con = dataSource.getConnection();;
		if (allowSynchronization &amp;&amp; TransactionSynchronizationManager.isSynchronizationActive();); {
						conHolder = new ConnectionHolder(con);;
			TransactionSynchronizationManager.bindResource(dataSource, conHolder);;
			TransactionSynchronizationManager.registerSynchronization(new ConnectionSynchronization(conHolder, dataSource););;
			conHolder.requested();;
		}

		return con;
	}</pre><br />原来连接是从TransactionSynchronizationManager中获取，如果TransactionSynchronizationManager中已经有了，那么拿过来然后调用conHolder.requested()。否则从原始的DataSource这创建一个连接，放到一个ConnectionHolder，然后再调用TransactionSynchronizationManager.bindResource绑定。 <br />好，我们又遇到两个新的类TransactionSynchronizationManager和ConnectionHolder和。继续跟踪 <br /><br /><br />2 TransactionSynchronizationManager <br />看其中的一些代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;ThreadLocal&nbsp;resources&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ThreadLocal();; &nbsp;&nbsp;</span></li><li><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;Object&nbsp;getResource(Object&nbsp;key);&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;(Map);&nbsp;resources.get();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(map&nbsp;==&nbsp;</span><span class="keyword">null</span><span>);&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value&nbsp;=&nbsp;map.get(key);; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;value; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;bindResource(Object&nbsp;key,&nbsp;Object&nbsp;value);&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IllegalStateException&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;=&nbsp;(Map);&nbsp;resources.get();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(map&nbsp;==&nbsp;</span><span class="keyword">null</span><span>);&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap();; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resources.set(map);; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(key,&nbsp;value);; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="1" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">private static ThreadLocal resources = new ThreadLocal();;
public static Object getResource(Object key); {
		Map map = (Map); resources.get();;
		if (map == null); {
			return null;
		}
		Object value = map.get(key);;
				return value;
	}
public static void bindResource(Object key, Object value); throws IllegalStateException {
		Map map = (Map); resources.get();;
				if (map == null); {
			map = new HashMap();;
			resources.set(map);;
		}
		map.put(key, value);;
			}</pre>原来TransactionSynchronizationManager内部建立了一个ThreadLocal的resources，这个resources又是和一个map联系在一起的，这个map在某个线程第一次调用bindResource时生成。 <br />联系前面的DataSourceUtils代码，我们可以总结出来。 <br />某个线程使用DataSourceUtils，当第一次要求创建连接将在TransactionSynchronizationManager中创建出一个ThreadLocal的map。然后以DataSource作为键，ConnectionHolder为值放到map中。等这个线程下一次再请求的这个DataSource的时候，就从这个map中获取对应的ConnectionHolder。用map是为了解决同一个线程上多个DataSource。 <br />然后我们来看看ConnectionHolder又是什么？ <br /><br /><br /><br />3 对连接进行引用计数 <br />看ConnectionHolder代码，这个类很简单，看不出个所以然，只好再去看父类代码ResourceHolderSupport，我们感兴趣的是这两个方法 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;requested();&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.referenceCount++; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;released();&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.referenceCount--; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="2" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">public void requested(); {
		this.referenceCount++;
	}

	public void released(); {
		this.referenceCount--;
	}</pre><br />看得出这是一个引用计数的技巧。原来Spring中对Connection是竟量使用已创建的对象，而不是每次都创建一个新对象。这就是DataSourceUtils中 
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">if</span><span>&nbsp;(conHolder&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>);&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conHolder.requested();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;conHolder.getConnection();; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="3" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">if (conHolder != null); {
			conHolder.requested();;
			return conHolder.getConnection();;
		}</pre>的原因 <br /><br /><br />4 释放连接 <br />完成事物后DataSourceTransactionManager有这样的代码 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doCleanupAfterCompletion(Object&nbsp;transaction);&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSourceTransactionObject&nbsp;txObject&nbsp;=&nbsp;(DataSourceTransactionObject);&nbsp;transaction; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Remove&nbsp;the&nbsp;connection&nbsp;holder&nbsp;from&nbsp;the&nbsp;thread. </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.unbindResource(</span><span class="keyword">this</span><span>.dataSource);; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txObject.getConnectionHolder();.clear();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSourceUtils.closeConnectionIfNecessary(con,&nbsp;this.dataSource);; </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="4" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">protected void doCleanupAfterCompletion(Object transaction); {
		DataSourceTransactionObject txObject = (DataSourceTransactionObject); transaction;

		// Remove the connection holder from the thread.
		TransactionSynchronizationManager.unbindResource(this.dataSource);;
		txObject.getConnectionHolder();.clear();;

		//...		DataSourceUtils.closeConnectionIfNecessary(con, this.dataSource);;
	}</pre><br />DataSourceUtils <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doCloseConnectionIfNecessary(Connection&nbsp;con,&nbsp;DataSource&nbsp;dataSource);&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(con&nbsp;==&nbsp;</span><span class="keyword">null</span><span>);&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionHolder&nbsp;conHolder&nbsp;=&nbsp;(ConnectionHolder);&nbsp;TransactionSynchronizationManager.getResource(dataSource);; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(conHolder&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;con&nbsp;==&nbsp;conHolder.getConnection(););&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;It's&nbsp;the&nbsp;transactional&nbsp;Connection:&nbsp;Don't&nbsp;close&nbsp;it. </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conHolder.released();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Leave&nbsp;the&nbsp;Connection&nbsp;open&nbsp;only&nbsp;if&nbsp;the&nbsp;DataSource&nbsp;is&nbsp;our </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;special&nbsp;data&nbsp;source,&nbsp;and&nbsp;it&nbsp;wants&nbsp;the&nbsp;Connection&nbsp;left&nbsp;open. </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(!(dataSource&nbsp;</span><span class="keyword">instanceof</span><span>&nbsp;SmartDataSource);&nbsp;||&nbsp;((SmartDataSource);&nbsp;dataSource);.shouldClose(con););&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span class="string">"Closing&nbsp;JDBC&nbsp;connection"</span><span>);; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;con.close();; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="5" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">protected static void doCloseConnectionIfNecessary(Connection con, DataSource dataSource); throws SQLException {
		if (con == null); {
			return;
		}

		ConnectionHolder conHolder = (ConnectionHolder); TransactionSynchronizationManager.getResource(dataSource);;
		if (conHolder != null &amp;&amp; con == conHolder.getConnection();); {
			// It's the transactional Connection: Don't close it.
			conHolder.released();;
			return;
		}
		
		// Leave the Connection open only if the DataSource is our
		// special data source, and it wants the Connection left open.
		if (!(dataSource instanceof SmartDataSource); || ((SmartDataSource); dataSource);.shouldClose(con);); {
			logger.debug("Closing JDBC connection");;
			con.close();;
		}
	}</pre><br />恍然大悟。如果事物完成，那么就 <br />TransactionSynchronizationManager.unbindResource(this.dataSource);将当前的ConnectionHolder <br />从TransactionSynchronizationManager上脱离，然后doCloseConnectionIfNecessary。最后会把连接关闭掉。 <br /><br />5 两个辅助类JdbcTemplate和TransactionAwareDataSourceProxy <br />JdbcTemplate中的execute方法的第一句和最后一句 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;Object&nbsp;execute(PreparedStatementCreator&nbsp;psc,&nbsp;PreparedStatementCallback&nbsp;action); &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">throws</span><span>&nbsp;DataAccessException&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;DataSourceUtils.getConnection(getDataSource(););; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//其他代码 </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;DataSourceUtils.closeConnectionIfNecessary(con,&nbsp;getDataSource(););; &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="6" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">public Object execute(PreparedStatementCreator psc, PreparedStatementCallback action);
			throws DataAccessException {

		Connection con = DataSourceUtils.getConnection(getDataSource(););;
		//其他代码
	DataSourceUtils.closeConnectionIfNecessary(con, getDataSource(););;
		}
	}</pre><br />作用不言自明了吧 <br /><br />从TransactionAwareDataSourceProxy中获取的连接是这个样子的 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;Connection&nbsp;getConnection();&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;DataSourceUtils.doGetConnection(getTargetDataSource();,&nbsp;</span><span class="keyword">true</span><span>);; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;getTransactionAwareConnectionProxy(con,&nbsp;getTargetDataSource(););; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="7" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">public Connection getConnection(); throws SQLException {
		Connection con = DataSourceUtils.doGetConnection(getTargetDataSource();, true);;
		return getTransactionAwareConnectionProxy(con, getTargetDataSource(););;
	}</pre><br />万变不离其宗，不过我们还是看看getTransactionAwareConnectionProxy <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">protected</span><span>&nbsp;Connection&nbsp;getTransactionAwareConnectionProxy(Connection&nbsp;target,&nbsp;DataSource&nbsp;dataSource);&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(Connection);&nbsp;Proxy.newProxyInstance( &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConnectionProxy.</span><span class="keyword">class</span><span>.getClassLoader();, &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;Class[]&nbsp;{ConnectionProxy.</span><span class="keyword">class</span><span>}, &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;TransactionAwareInvocationHandler(target,&nbsp;dataSource););; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="8" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">protected Connection getTransactionAwareConnectionProxy(Connection target, DataSource dataSource); {
		return (Connection); Proxy.newProxyInstance(
				ConnectionProxy.class.getClassLoader();,
				new Class[] {ConnectionProxy.class},
				new TransactionAwareInvocationHandler(target, dataSource););;
	}</pre><br />原来返回的是jdk的动态代理。继续看TransactionAwareInvocationHandler <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.CopyToClipboard(this);return false;" href="http://www.iteye.com/topic/11738#"><img alt="复制代码" src="http://www.iteye.com/images/icon_copy.gif" /></a>&nbsp;<a title="收藏这段代码" onclick="code_favorites_do_favorite(this);return false;" href="javascript:void()"><img class="star" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /><img class="spinner" style="display: none" src="http://www.iteye.com/images/spinner.gif"  alt="" /></a></div></div>
<ol class="dp-j"><li><span class="keyword">public</span><span>&nbsp;Object&nbsp;invoke(Object&nbsp;proxy,&nbsp;Method&nbsp;method,&nbsp;Object[]&nbsp;args);&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable&nbsp;{ &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(method.getName();.equals(CONNECTION_CLOSE_METHOD_NAME););&nbsp;{ </span><span>&nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(</span><span class="keyword">this</span><span>.dataSource&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>);&nbsp;{ &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSourceUtils.doCloseConnectionIfNecessary(</span><span class="keyword">this</span><span>.target,&nbsp;</span><span class="keyword">this</span><span>.dataSource);; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol></div><pre class="java" title="Spring事务管理与数据库连接" style="display: none" pre_index="9" source_url="http://www.iteye.com/topic/11738#67412" codeable_id="67412" codeable_type="Post" name="code">public Object invoke(Object proxy, Method method, Object[] args); throws Throwable {
		//...			if (method.getName();.equals(CONNECTION_CLOSE_METHOD_NAME);); {
				if (this.dataSource != null); {
					DataSourceUtils.doCloseConnectionIfNecessary(this.target, this.dataSource);;
				}
				return null;
			}

					}</pre><br />TransactionAwareDataSourceProxy会先从DataSourceUtils获取连接。然后将这个连接用jdk的动态代理包一下返回。外部代码如果调用的这个冒牌的Connection，就会先调用TransactionAwareInvocationHandler的invoke，在这个invoke 中，完成原来调用DataSourceUtils的功能。 <br /><br />总结上面的流程 <br />Spring 对DataSource进行事务管理的关键在于ConnectionHolder和TransactionSynchronizationManager。 <br />&nbsp; 0.先从TransactionSynchronizationManager中尝试获取连接 <br />&nbsp; 1.如果前一步失败则在每个线程上，对每个DataSouce只创建一个Connection <br />&nbsp;&nbsp; 2.这个Connection用ConnectionHolder包装起来，由TransactionSynchronizationManager管理 <br />&nbsp; 3.再次请求同一个连接的时候，从TransactionSynchronizationManager返回已经创建的ConnectionHolder，然后调用ConnectionHolder的request将引用计数+1 <br />&nbsp; 4.释放连接时要调用ConnectionHolder的released，将引用计数-1 <br />&nbsp; 5.当事物完成后，将ConnectionHolder从TransactionSynchronizationManager中解除。当谁都不用，这个连接被close <br /><br />以上所有都是可以调用DataSourceUtils化简代码，而JdbcTemplate又是调用DataSourceUtils的。所以在Spring文档中要求尽量首先使用JdbcTemplate，其次是用DataSourceUtils来获取和释放连接。至于TransactionAwareDataSourceProxy，那是下策的下策。不过可以将Spring事务管理和遗留代码无缝集成。 <br /><br />所以如某位朋友说要使用Spring的事务管理，但是又不想用JdbcTemplate，那么可以考虑TransactionAwareDataSourceProxy。这个类是原来DataSource的代理。 <br />其次，想使用Spring事物，又不想对Spring进行依赖是不可能的。与其试图自己模拟DataSourceUtils，不如直接使用现成的。 <br /></div><img src ="http://www.blogjava.net/xzclog/aggbug/356124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2011-08-09 14:59 <a href="http://www.blogjava.net/xzclog/archive/2011/08/09/356124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>j2ee异常处理机制</title><link>http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 13 Mar 2010 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/315329.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/315329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/315329.html</trackback:ping><description><![CDATA[转自：<a href="http://mofeichen.javaeye.com/blog/557426">http://mofeichen.javaeye.com/blog/557426<br />
<div class="blog_content">
<p>异常的处理是每个Java程序员时常面对的问题，但是很多人没有原则，遇到异常也不知道如何去处理，于是遇到检查异常就胡乱try...catch...一把，然后e.printStackTrace()一下了事，这种做法通常除了调试排错有点作用外，没任何价值。对于运行时异常，则干脆置之不理。</p>
<p>　　原因是很多开发者缺乏对异常的认识和分析，首先应该明白Java异常体系结构，一种分层继承的关系，你必须对层次结构熟烂于心：</p>
<p>　　Throwable(必须检查)</p>
<p>　　Error(非必须检查)</p>
<p>　　Exception(必须检查)</p>
<p>　　RuntimeException(非必须检查)</p>
<p>　　一般把Exception异常及其直接子类(除了RuntimeException之外)的异常称之为检查异常。把RuntimeException以及其子类的异常称之为非检查异常，也叫运行时异常。</p>
<p>　　对于Throwable和Error，则用的很少，一般会用在一些基础框架中，这里不做讨论。</p>
<p>　　下面针对J2EE的分层架构：DAO层、业务层、控制层、展示层的异常处理做个分析，并给出一般处理准则。</p>
<p>　<strong><span style="color: #bc0e07">　一、DAO层异常处理</span></strong></p>
<p>　　如果你用了Spring的DAO模板来实现，则DAO层没有检查异常抛出，代码非常的优雅。但是，如果你的DAO采用了原始的JDBC来写，这时候，你不能不对异常做处理了，因为难以避免的SQLException会如影随形的跟着你。对已这种DAO级别的异常，异常了你又能如何呢?与其这样胡乱try...catch...，囫囵吞枣消灭了异常不如让异常以另外一种非检查的方式向外传递。这样做好处有二：</p>
<p>　　1)、DAO的接口不被异常所污染，假设你抛出了SQLException，以后要是换了Spring DAO模板，那DAO接口就不再抛出了SQLException，这样，你的接口抛出异常就是对接口的污染。</p>
<p>　　2)、DAO异常向外传播给更高层处理，以便异常的错误原因不丢失，便于排查错误或进行捕获处理。</p>
<p>　　这里还有一个设计上常常令人困扰的问题：很多人会问，那定义一个什么样的异常抛出呢，或者是直接抛出一个throw RuntimeException(e)? 对于这个问题，需要分场合，如果系统小，你可以直接抛出一个throw RuntimeException(e)，但对于一个庞大的多模块系统来说，不要抛这种原生的非检查异常，而要抛出自定义的非检查异常，这样不但利于排错，而且有利于系统异常的处理，通常针对每一个模块，粗粒度的定义一个运行时DAO异常。比如：throw new ModelXxxDAORuntimeException(".....",e)，对于msg信息，你可写也可不写，根据需要灵活抛出。</p>
<p>　　这里常见一个很愚昧的处理方式，为每个DAO定义一个异常，呵呵，这样累不累啊，有多大意义，在Service层中调用时候，如果要捕获，还要捕获出一堆异常。这样致命的问题是代码混乱，维护困难，阅读也困难，DAO的异常应该是粗粒度的。</p>
<p><strong><span style="color: #bc0e07">　　二、业务层异常处理</span></strong></p>
<p>　　习惯上把业务层称之为Service层或者服务层，Service层的代表的是业务逻辑，不要迷信分太多太多层有多大好处，除非需要，否则别盲目划分不必要的层，层越多，效率越差，根据需要够用就行了。</p>
<p>　　Service接口中的每个方法代表一个特定的业务，而这个业务一定是一个完整的业务，通常会看到一些傻X的做法，数据库事务配置在Service层，而Service的实现就是DAO的直接调用，然后在控制层(Action)中，调用了好多Service去完成一个业务，你气得已经无语了，低头找砖头去!!!</p>
<p>　　搞明白以上两个问题后再回过头看异常怎么处理，Service层通常依赖DAO，而Service层的通常也会因为调用别的非检查异常方法而必须面对异常处理的问题，这里和DAO层又有所不同，彼一时，此一时嘛!</p>
<p>　　一般来说一个小模块对应一个Service，当然也许有两个或多个，针对这个模块的Service定义一个非检查异常，以应付那些不可避免的异常检查，这个自定义异常可以简单的命名为XxxServiceRuntimeException，将捕获到的异常顺势转译为非检查异常后抛出。我喜欢这么做，因为前台是J2EE应用，前台是web页面，它们的Struts2等框架会自动捕获所有Service层的异常，并把异常交给开发者去自由处理。</p>
<p>　　但是还有一种情况，由于一些特殊的限制，如果某个异常一旦发生，必须做什么什么处理，而这种处理时硬性要求，或者调用某个Service方法，必须检查处理什么异常，也可以抛出非检查的自定义异常，往往出现这种情况的是政治原因。不推崇这种做法，但也不排斥。</p>
<p>　　总之，对于接口，尽可能不去用异常污染她!</p>
<p><strong><span style="color: #bc0e07">　　三、控制层异常</span></strong></p>
<p>　　控制层说的简单些就是常见的Action层，主要是控制页面请求的处理。控制层通常都依赖于Service层，现在比较流行的框架对控制层做得都相当的到位，比如Struts2、SpringMVC等等，他们的控制层框架会捕获业务层的所有异常，并在控制层中声明可能抛出Exception，因此控制层一般不处理什么异常。</p>
<p>　　如果是控制层中因为调用了一些非检查异常的方法，比如IO操作等，可以简单处理下异常，保证流的安全，这才是目的。</p>
<p>　<strong><span style="color: #bc0e07">　四、显示层异常处理</span></strong></p>
<p>　　对于页面异常，处理的方式多种多样，一是不处理异常，一旦异常了，页面就报错。二是定义出错页面，根据异常的类型以及所在的模块，导航到出错页面。</p>
<p>　　一般来说，出错页面是更友好的做法。</p>
<p>　　另外还有特殊的处理方式，展示页面的模板可以捕获异常，并根据情况将异常信息铺到相应的位置，这样就更友好了，不过复杂度较高。</p>
<p>　　怎么处理，就看需要了。</p>
<p><strong><span style="color: #bc0e07">　　五、总结</span></strong></p>
<p>　　1)、对于异常处理，应该从设计、需要、维护等多个角度综合考虑，有一个通用准则：千万别捕获了异常什么事情都不干，这样一旦出现异常了，你没法依据异常信息来排错。</p>
<p>　　2)、对于J2EE多层架构系统来说，尽可能避免(因抛出异常带来的)接口污染。</p>
</div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script></a>
<img src ="http://www.blogjava.net/xzclog/aggbug/315329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-03-13 11:59 <a href="http://www.blogjava.net/xzclog/archive/2010/03/13/315329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>proxool连接池配置详细说明</title><link>http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 30 Jan 2010 04:02:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/311320.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/311320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/311320.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目前市面上三个主流连接池从性能上排名如下：proxool&gt;c3p0&gt;dbcp，proxool还提供了可视化的连接池实时监控工具，所以既稳定又方便，配置也是非常容易的事情。下面我来讲讲我如何配置proxool连接池的。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、下载相关资源。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从http://pr...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/311320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-01-30 12:02 <a href="http://www.blogjava.net/xzclog/archive/2010/01/30/311320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的三种连接池设置C3P0、Proxool和DBCP </title><link>http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 30 Jan 2010 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/311319.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/311319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/311319.html</trackback:ping><description><![CDATA[<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;JDBC驱动程序&nbsp;--&gt;</span>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.driver_class"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>com.mysql.jdbc.Driver<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.url"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>jdbc:mysql://localhost:3306/struts?<span class="attribute" style="color: #ff0000; background-color: #ffffff">useUnicode</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">true</span>&amp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">characterEncoding</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">GBK</span><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;数据库用户名&nbsp;--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.username"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>root<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;数据库密码&nbsp;--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.password"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>8888<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;!-- JDBC驱动程序 --&gt; &lt;property name="connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; &lt;property name="connection.url"&gt;jdbc:mysql://localhost:3306/struts?useUnicode=true&amp;characterEncoding=GBK&lt;/property&gt; &lt;!-- 数据库用户名 --&gt; &lt;property name="connection.username"&gt;root&lt;/property&gt; &lt;!-- 数据库密码 --&gt; &lt;property name="connection.password"&gt;8888&lt;/property&gt; </span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
<br />
上面的一段配置，在<span class="hilite2" style="background-color: #ffffff">c3p0</span>和<span class="hilite1" style="background-color: #ffffff">dbcp</span>中，都是必需的，因为hibernate会根据上述的配置来生成connections，再交给<span class="hilite2" style="background-color: #ffffff">c3p0</span>或<span class="hilite1" style="background-color: #ffffff">dbcp</span>管理.<br />
<br />
1 <span class="hilite2" style="background-color: #ffffff">C3P0</span> <br />
<br />
只需在hibernate.cfg.xml中加入 <br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.min_size"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>5<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.max_size"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>30<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.time_out"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>1800<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite2" style="background-color: #ffffff">c3p0</span><span style="color: #0000ff; background-color: #ffffff">.max_statement"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>50<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.min_size"&gt;5&lt;/property&gt; &lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.max_size"&gt;30&lt;/property&gt; &lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.time_out"&gt;1800&lt;/property&gt; &lt;property name="<span class="hilite2" style="background-color: #ffffff">c3p0</span>.max_statement"&gt;50&lt;/property&gt; </span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
<br />
还有在classespath中加入<span class="hilite2" style="background-color: #ffffff">c3p0</span>-0.8.4.5.jar <br />
<br />
<br />
2 <span class="hilite1" style="background-color: #ffffff">dbcp</span> <br />
<br />
在hibernate.cfg.xml中加入 <br />
<br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.maxActive"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>100<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.whenExhaustedAction"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>1<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.maxWait"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>60000<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.maxIdle"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>10<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.maxActive"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>100<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.whenExhaustedAction"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>1<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.maxWait"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>60000<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="background-color: #ffffff"><span style="color: #0000ff; background-color: #ffffff">"</span><span class="hilite1" style="background-color: #ffffff">dbcp</span><span style="color: #0000ff; background-color: #ffffff">.ps.maxIdle"</span></span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>10<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.maxActive"&gt;100&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.whenExhaustedAction"&gt;1&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.maxWait"&gt;60000&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.maxIdle"&gt;10&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.maxActive"&gt;100&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.whenExhaustedAction"&gt;1&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.maxWait"&gt;60000&lt;/property&gt; &lt;property name="<span class="hilite1" style="background-color: #ffffff">dbcp</span>.ps.maxIdle"&gt;10&lt;/property&gt;</span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
还有在classespath中加入commons-pool-1.2.jar 和commons-<span class="hilite1" style="background-color: #ffffff">dbcp</span>-1.2.1.jar. <br />
<br />
<br />
3 proxool <br />
<br />
由于数据库connection在较长时间没有访问下会自动断开连接，导致浏览出错，增加proxool作为数据库pool。它有自动连接功能。<br />
1)、从</span><a href="http://proxool.sourceforge.net/" target="_blank"><span style="color: #006600; background-color: #ffffff">http://proxool.sourceforge...</span></a><span style="background-color: #ffffff">下载proxool，释放proxool.jar到WEB-INF/lib<br />
<br />
2)、在hibernate.cfg.xml中增加：<br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"hibernate.proxool.pool_alias"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>dbpool<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"hibernate.proxool.xml"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>proxool.xml<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"connection.provider_class"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>org.hibernate.connection.ProxoolConnectionProvider<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">property</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;property name="hibernate.proxool.pool_alias"&gt;dbpool&lt;/property&gt; &lt;property name="hibernate.proxool.xml"&gt;proxool.xml&lt;/property&gt; &lt;property name="connection.provider_class"&gt;org.hibernate.connection.ProxoolConnectionProvider&lt;/property&gt;</span></pre>
</div>
<div class="textbox-content"><span style="background-color: #ffffff"><br />
<br />
3)、在与hibernate.cfg.xml同级目录（src根目录下）增加proxool.xml文件：<br />
</div>
</span>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><span style="background-color: #ffffff">Xml代码 </span><a title="复制代码" href="http://wmswu.javaeye.com/blog/202376#"  ="dp.sh.Toolbar.CopyToClipboard(this);return false;"></a></div>
</div>
<ol class="dp-xml">
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;?</span><span class="tag-name" style="background-color: #ffffff">xml</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">version</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"1.0"</span>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">encoding</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"utf-8"</span><span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">?&gt;</span></strong></span>&nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff">&lt;!--&nbsp;the&nbsp;proxool&nbsp;configuration&nbsp;can&nbsp;be&nbsp;embedded&nbsp;within&nbsp;your&nbsp;own&nbsp;application's. &nbsp;&nbsp;</span>
    <li><span style="background-color: #ffffff">&nbsp;Anything&nbsp;outside&nbsp;the&nbsp;"proxool"&nbsp;tag&nbsp;is&nbsp;ignored.&nbsp;--<span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">&gt;</span></strong></span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">something-else-entirely</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">proxool</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">alias</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>dbpool<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">alias</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--proxool只能管理由自己产生的连接--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">driver-url</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc:mysql://127.0.0.1:3306/wlsh?<span class="attribute" style="color: #ff0000; background-color: #ffffff">characterEncoding</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">GBK</span>&amp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">useUnicode</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">true</span>&amp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">autoReconnect</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">true</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">driver-url</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">driver-class</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>com.mysql.jdbc.Driver<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">driver-class</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">driver-properties</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"user"</span>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">value</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"root"</span>&nbsp;<span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">/&gt;</span></strong></span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">property</span></span></strong>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">name</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"password"</span>&nbsp;<span class="attribute" style="color: #ff0000; background-color: #ffffff">value</span>=<span class="attribute-value" style="color: #0000ff; background-color: #ffffff">"123456"</span>&nbsp;<span class="tag" style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff">/&gt;</span></strong></span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">driver-properties</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">house-keeping-sleep-time</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>90000<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">house-keeping-sleep-time</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;最少保持的空闲连接数--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">prototype-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>5<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">prototype-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;允许最大连接数,超过了这个连接，再有请求时，就排在队列中等候，最大的等待请求数由maximum-new-connections决定--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">maximum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>100<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">maximum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<span class="comments" style="color: #008200; background-color: #ffffff">&lt;!--&nbsp;最小连接数--&gt;</span>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;&nbsp;&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;</span><span class="tag-name" style="background-color: #ffffff">minimum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>10<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">minimum-connection-count</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff">&nbsp;<strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">proxool</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span>
    <li><span style="background-color: #ffffff"><strong><span style="color: #006699; background-color: #ffffff"><span class="tag" style="background-color: #ffffff">&lt;/</span><span class="tag-name" style="background-color: #ffffff">something-else-entirely</span><span class="tag" style="background-color: #ffffff">&gt;</span></span></strong>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<div class="textbox-content">
<pre class="xml" style="display: none" name="code"><span style="background-color: #ffffff">&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;!-- the proxool configuration can be embedded within your own application's. Anything outside the "proxool" tag is ignored. --&gt; &lt;something-else-entirely&gt; &lt;proxool&gt; &lt;alias&gt;dbpool&lt;/alias&gt; &lt;!--proxool只能管理由自己产生的连接--&gt; &lt;driver-url&gt; jdbc:mysql://127.0.0.1:3306/wlsh?characterEncoding=GBK&amp;useUnicode=true&amp;autoReconnect=true &lt;/driver-url&gt; &lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt; &lt;driver-properties&gt; &lt;property name="user" value="root" /&gt; &lt;property name="password" value="123456" /&gt; &lt;/driver-properties&gt; &lt;!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--&gt; &lt;house-keeping-sleep-time&gt;90000&lt;/house-keeping-sleep-time&gt; &lt;!-- 最少保持的空闲连接数--&gt; &lt;prototype-count&gt;5&lt;/prototype-count&gt; &lt;!-- 允许最大连接数,超过了这个连接，再有请求时，就排在队列中等候，最大的等待请求数由maximum-new-connections决定--&gt; &lt;maximum-connection-count&gt;100&lt;/maximum-connection-count&gt; &lt;!-- 最小连接数--&gt; &lt;minimum-connection-count&gt;10&lt;/minimum-connection-count&gt; &lt;/proxool&gt;&lt;/something-else-entirely&gt;</span></pre>
</div>
<span style="background-color: #ffffff">
<div class="textbox-content"><br />
<span style="font-size: 10pt; background-color: #ffffff"><span style="color: #330099">于在hibernate3.0中，已经不再支持dbcp了，hibernate的作者在hibernate.org中，明确指出在实践中发现dbcp有 BUG,在某些种情会产生很多空连接不能释放，所以抛弃了对dbcp的支持。至于</span><strong style="color: black; background-color: #ffff66">c3p0</strong><span style="color: #330099; background-color: #ffffff">，有评论说它的算法不是最优的，因为网上查资料得知：有网友做了一个实验，在同一项目中分别用了几个常用的连接池，然后测试其性能，发现</span><strong style="color: black; background-color: #ffff66">c3p0</strong><span style="color: #330099; background-color: #ffffff">占用资源</span><strong style="color: black; background-color: #99ff99">比较</strong><span style="color: #330099; background-color: #ffffff">大，效率也不高。所以，基于上述原因，</span><strong style="color: black; background-color: #a0ffff">proxool</strong><span style="color: #330099; background-color: #ffffff">不少行家推荐使用，而且暂时来说，是负面评价是最少的一个。在三星中也有项目是用</span><strong style="color: black; background-color: #a0ffff">proxool</strong><span style="color: #330099; background-color: #ffffff">的。<span style="color: #000000">从性能和出错率来说，proxool稍微比前两种好些。<strong><span style="background-color: #ffff66">C3P0</span></strong>，稳定性似乎不错，在这方面似乎有很好的口碑。至于<strong style="color: black; background-color: #99ff99">性能</strong>，应该不是最好的，算是中规中矩的类型。 <br />
　　<strong style="color: black; background-color: #a0ffff">Proxool</strong>的口碑似乎很好，不大见到负面的评价，从官方资料上来看，有许多有用的特性和特点，也是许多人推荐的。</span></span></span></div>
</span>
<img src ="http://www.blogjava.net/xzclog/aggbug/311319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2010-01-30 12:00 <a href="http://www.blogjava.net/xzclog/archive/2010/01/30/311319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring获取webapplicationcontext,applicationcontext几种方法详解 </title><link>http://www.blogjava.net/xzclog/archive/2009/10/22/299410.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 22 Oct 2009 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/10/22/299410.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/299410.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/10/22/299410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/299410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/299410.html</trackback:ping><description><![CDATA[<p>转自:http://www.blogjava.net/Todd/archive/2009/09/15/295112.html<br />
方法一：在初始化时保存ApplicationContext对象<br />
代码：<br />
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");<br />
ac.getBean("beanId");<br />
说明：这种方式适用于采用Spring框架的独立应用程序，需要程序通过配置文件手工初始化Spring的情况。</p>
<p>方法二：通过Spring提供的工具类获取ApplicationContext对象<br />
代码：<br />
import org.springframework.web.context.support.WebApplicationContextUtils;<br />
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);<br />
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);<br />
ac1.getBean("beanId");<br />
ac2.getBean("beanId");<br />
说明：<br />
这种方式适合于采用Spring框架的B/S系统，通过ServletContext对象获取ApplicationContext对象，然后在通过它获取需要的类实例。</p>
<p><span style="color: red">上面两个工具方式的区别是，前者在获取失败时抛出异常，后者返回null。</span></p>
<p><span style="color: red">其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外，由于spring是注入的对象放在ServletContext中的，所以可以直接在ServletContext取出 WebApplicationContext 对象： WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);</span></p>
<p>方法三：继承自抽象类ApplicationObjectSupport<br />
说明：抽象类ApplicationObjectSupport提供getApplicationContext()方法，可以方便的获取到ApplicationContext。<br />
Spring初始化时，会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。</p>
<p>方法四：继承自抽象类WebApplicationObjectSupport<br />
说明：类似上面方法，调用getWebApplicationContext()获取WebApplicationContext</p>
方法五：实现接口ApplicationContextAware<br />
说明：实现该接口的setApplicationContext(ApplicationContext context)方法，并保存ApplicationContext 对象。<br />
Spring初始化时，会通过该方法将ApplicationContext对象注入。<br />
<br />
<br />
在web应用中一般用ContextLoaderListener加载webapplication,如果需要在action之外或者control类之外获取webapplication思路之一是，单独写个类放在static变量中，<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;AppContext&nbsp;{<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;AppContext&nbsp;instance;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;AbstractApplicationContext&nbsp;appContext;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;AppContext&nbsp;getInstance()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(instance&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;AppContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;instance;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;AppContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.appContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;AbstractApplicationContext&nbsp;getAppContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;appContext;<br />
&nbsp;&nbsp;}<br />
} <br />
</span></div>
<br />
不过这样，还是加载了2次applicationcontext,servlet一次，路径加载一次；觉得不如直接用路径加载，舍掉servlet加载<br />
在网上也找了些其他说法:实现<span><span>ApplicationContextAware，，， 接口，或者servletcontext</span></span><span><span>Aware接口,</span></span><span><span>还要写配置文件。有的竟然要把配置文件里的</span></span>listener，<span style="color: red">换成</span>自己的类，这样纯粹多此一举。不过有的应用不是替换，是在补一个listener，<br />
我在一版的jpetstore（具体那一版不知道）里发现了这个：<br />
[web.xml]里<br />
&nbsp; &nbsp;&nbsp;&nbsp; <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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.springframework.web.context.ContextLoaderListener</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.ibatis.jpetstore.util.SpringInit</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span></div>
其中SpringInit实现接口<span style="color: #000000">ServletContextListener </span>：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.ibatis.jpetstore.util;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.ServletContextEvent;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.ServletContextListener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.web.context.WebApplicationContext;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.web.context.support.WebApplicationContextUtils;<br />
<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;SpringInit&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletContextListener&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;WebApplicationContext&nbsp;springContext;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SpringInit()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">();<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;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;springContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<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;contextDestroyed(ServletContextEvent&nbsp;event)&nbsp;{<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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;ApplicationContext&nbsp;getApplicationContext()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;springContext;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
}<br />
</span></div>
<br />
在其中的一个bean的构造里SpringInit获取applicationcontext,代码：<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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;OrderBean()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(AccountService)&nbsp;SpringInit.getApplicationContext().getBean(</span><span style="color: #000000">"</span><span style="color: #000000">accountService</span><span style="color: #000000">"</span><span style="color: #000000">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(OrderService)&nbsp;SpringInit.getApplicationContext().getBean(</span><span style="color: #000000">"</span><span style="color: #000000">orderService</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;);<br />
&nbsp;&nbsp;}</span></div>
<br />
恩，这种在action,servlet之外的bean里获取applicationcontext的方法值得参考，应该有用<br />
<img src ="http://www.blogjava.net/xzclog/aggbug/299410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-10-22 18:02 <a href="http://www.blogjava.net/xzclog/archive/2009/10/22/299410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.5 标注开发的简单例子</title><link>http://www.blogjava.net/xzclog/archive/2009/06/25/284109.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 25 Jun 2009 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/06/25/284109.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/284109.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/06/25/284109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/284109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/284109.html</trackback:ping><description><![CDATA[<p>研究了很久新出的 Spring 2.5, 总算大致明白了如何用标注定义 Bean, 但是如何定义和注入类型为 java.lang.String 的 bean 仍然未解决, 希望得到高人帮助.</p>
<p>总的来看 Java EE 5 的标注开发方式开来是得到了大家的认可了.</p>
<p>@Service 相当于定义 bean, 自动根据 bean 的类名生成一个首字母小写的 bean</p>
<p>@Autowired 则是自动注入依赖的类, 它会在类路径中找成员对应的类/接口的实现类, 如果找到多个, 需要用 @Qualifier("chineseMan") 来指定对应的 bean 的 ID.<br />
</p>
<p>一定程度上大大简化了代码的编写, 例如一对一的 bean 映射现在完全不需要写任何额外的 bean 定义了.<br />
</p>
<p>下面是代码的运行结果:</p>
<p>man.sayHello()=抽你丫的<br />
SimpleMan said: Hi<br />
org.example.EnglishMan@12bcd4b said: Fuck you! </p>
<p>&nbsp;</p>
<p>代码:</p>
<p>beans.xml</p>
<div>
<pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #0000ff">&lt;?</span><span style="color: #800000">xml</span> <span style="color: #ff0000">version</span><span style="color: #0000ff">="1.0"</span> <span style="color: #ff0000">encoding</span><span style="color: #0000ff">="UTF-8"</span>?<span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span> <span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span>
<span style="color: #ff0000">xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span>
<span style="color: #ff0000">xmlns:context</span><span style="color: #0000ff">="http://www.springframework.org/schema/context"</span>
<span style="color: #ff0000">xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">context:annotation-config</span><span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">context:component-scan</span> <span style="color: #ff0000">base-package</span><span style="color: #0000ff">="org.example"</span><span style="color: #0000ff">/&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></pre>
</div>
<p>测试类:</p>
<p>import org.example.IMan;<br />
import org.example.SimpleMan;<br />
import org.springframework.context.ApplicationContext;<br />
import org.springframework.context.support.ClassPathXmlApplicationContext; </p>
<p>public class SpringTest {<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleMan dao = (SimpleMan) ctx.getBean("simpleMan");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(dao.hello());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IMan man = (IMan) ctx.getBean("usMan");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(man.sayHello());<br />
&nbsp;&nbsp;&nbsp; }<br />
} </p>
<p>自动探测和注入bean的类:</p>
<p>package org.example; </p>
<p>import org.springframework.beans.factory.annotation.Autowired;<br />
import org.springframework.beans.factory.annotation.Qualifier;<br />
import org.springframework.stereotype.Service; </p>
<p>@Service<br />
public class SimpleMan {<br />
&nbsp;&nbsp;&nbsp; // 自动注入名称为 Man 的 Bean<br />
&nbsp;&nbsp;&nbsp; @Autowired(required = false)<br />
&nbsp;&nbsp;&nbsp; @Qualifier("chineseMan")<br />
&nbsp;&nbsp;&nbsp; //@Qualifier("usMan")<br />
&nbsp;&nbsp;&nbsp; private IMan man;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return the man<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public IMan getMan() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return man;<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param man the man to set<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void setMan(IMan man) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.man = man;<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public String hello() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("man.sayHello()=" + man.sayHello());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "SimpleMan said: Hi";<br />
&nbsp;&nbsp;&nbsp; }<br />
} </p>
<p>&nbsp;</p>
<p>一个接口和两个实现类:</p>
<p>package org.example; </p>
<p>/**<br />
* 抽象的人接口.<br />
* @author BeanSoft<br />
* @version 1.0<br />
*/<br />
public interface IMan {<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 打招呼的抽象定义.<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @return 招呼的内容字符串<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public String sayHello();<br />
} </p>
<p>&nbsp;</p>
<p>package org.example; </p>
<p>import org.springframework.stereotype.Service; </p>
<p>/**<br />
* 中国人的实现.<br />
* @author BeanSoft<br />
*/<br />
@Service<br />
public class ChineseMan implements IMan { </p>
<p>&nbsp;&nbsp;&nbsp; public String sayHello() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "抽你丫的";<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>} </p>
<p>&nbsp; </p>
<p>package org.example; </p>
<p>import org.springframework.stereotype.Service; </p>
<p>/**<br />
* @author BeanSoft<br />
* 美国大兵<br />
*/<br />
@Service("usMan")<br />
// 这里定义了一个 id 为 usMan 的 Bean, 标注里面的属性是 bean 的 id<br />
public class EnglishMan implements IMan { </p>
<p>&nbsp;&nbsp;&nbsp; public String sayHello() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this + " said: Fuck you!";<br />
&nbsp;&nbsp;&nbsp; } </p>
<p>} </p>
<img src ="http://www.blogjava.net/xzclog/aggbug/284109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-06-25 15:06 <a href="http://www.blogjava.net/xzclog/archive/2009/06/25/284109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中autowire属性</title><link>http://www.blogjava.net/xzclog/archive/2009/06/25/284065.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Thu, 25 Jun 2009 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2009/06/25/284065.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/284065.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2009/06/25/284065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/284065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/284065.html</trackback:ping><description><![CDATA[<table style="border-collapse: collapse; word-wrap: break-word" cellspacing="0" cellpadding="0" width="760" align="center" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td align="center" height="30"><font style="font-size: 14pt" color="#02368d"><strong>Spring中autowire属性</strong></font><br />
            </td>
        </tr>
        <tr>
            <td align="center" height="9"><img height="9" alt="" src="http://blog.chinaunix.net/templates/default/images/right_line.gif" width="502" border="0" /></td>
        </tr>
        <tr>
            <td align="center">
            <table style="border-collapse: collapse; word-wrap: break-word" cellspacing="0" cellpadding="0" width="740" border="0">
                <tbody>
                    <tr>
                        <td width="740">
                        <div id="art" style="margin: 15px" width="560">default-autowire="x"<br />
                        x有4个选择：byName,byType,constructor和autodetect<br />
                        <br />
                        我感觉byName和byType用的多点<br />
                        <br />
                        1. byName:<br />
                        <br />
                        Service.java<br />
                        <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
                            <tbody>
                                <tr>
                                    <td>
                                    <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">class</span> Service<br />
                                    <span style="color: rgb(0,0,204)">{</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,204)">;</span><br />
                                    <br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> <span style="color: rgb(255,0,0)">setSource</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,204)">)</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">source</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">source</span><span style="color: rgb(0,0,204)">;</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
                                    <span style="color: rgb(0,0,204)">}</span></span></code></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <br />
                        applicationContext.xml<br />
                        <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
                            <tbody>
                                <tr>
                                    <td>
                                    <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)">&lt;</span>beans <br />
                                    </span></code></p>
                                    <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)">&nbsp;&nbsp; ...</span></code></p>
                                    <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)">&nbsp;&nbsp; default-autowire<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"byName"</span><span style="color: rgb(0,0,204)">&gt;</span><br />
                                    &nbsp;&nbsp;&nbsp; <br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">&lt;</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"source"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.DBCPSource"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">/</span><span style="color: rgb(0,0,204)">&gt;</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">&lt;</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"service"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.Service"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">&gt;</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">/</span>bean<span style="color: rgb(0,0,204)">&gt;</span><br />
                                    <span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">/</span>beans<span style="color: rgb(0,0,204)">&gt;</span></span></code></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <br />
                        <font size="2"><code style="color: rgb(0,1,2)">cn.hh.spring.DBCPSource实现了Source接口<br />
                        xml中并没有给 bean service配Source属性，但在beans中设置了autowire="byName",这样配置文件会自动根据 cn.hh.spring.Service 中的set<span style="color: rgb(255,1,2)">Source</span>找bean id="<span style="color: rgb(255,1,2)">Source</span>"的bean ，然后自动配上去，如果没找到就不装配。<br />
                        注意：byName的name是java中setXxxx 的Xxxx, 和上面设置的Source source中source拼写毫无关系，完全可以是<br />
                        </code></font>
                        <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
                            <tbody>
                                <tr>
                                    <td>
                                    <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">class</span> Service<br />
                                    <span style="color: rgb(0,0,204)">{</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source1</span><span style="color: rgb(0,0,204)">;</span><br />
                                    <br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,255)">void</span> <span style="color: rgb(255,0,0)">setSource</span><span style="color: rgb(0,0,204)">(</span><span style="color: rgb(255,0,0)">Source</span> <span style="color: rgb(255,0,0)">source1</span><span style="color: rgb(0,0,204)">)</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">{</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,255)">this</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(255,0,0)">source1</span> <span style="color: rgb(0,0,204)">=</span> <span style="color: rgb(255,0,0)">source1</span><span style="color: rgb(0,0,204)">;</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">}</span><br />
                                    <br />
                                    <span style="color: rgb(0,0,204)">}</span></span></code></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <br />
                        结果相同。<br />
                        <br />
                        2. byType:<br />
                        <br />
                        Service.java同上<br />
                        <br />
                        applicationContext.xml<br />
                        <table style="border-collapse: collapse" bordercolor="#999999" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f1f1f1" border="1">
                            <tbody>
                                <tr>
                                    <td>
                                    <p style="margin: 5px; line-height: 150%"><code><span style="color: rgb(0,0,0)"><span style="color: rgb(0,0,204)">&lt;</span>beans<br />
                                    &nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><span style="color: rgb(0,0,204)">.</span><br />
                                    &nbsp;&nbsp;&nbsp;default-autowire<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"byType"</span><span style="color: rgb(0,0,204)">&gt;</span><br />
                                    &nbsp;&nbsp;&nbsp;<br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">&lt;</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"dbcpSource"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.DBCPSource"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">/</span><span style="color: rgb(0,0,204)">&gt;</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">&lt;</span>bean id<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"service"</span> class<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"cn.hh.spring.Service"</span> scope<span style="color: rgb(0,0,204)">=</span><span style="color: rgb(255,0,255)">"prototype"</span><span style="color: rgb(0,0,204)">&gt;</span><br />
                                    &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">/</span>bean<span style="color: rgb(0,0,204)">&gt;</span><br />
                                    <span style="color: rgb(0,0,204)">&lt;</span><span style="color: rgb(0,0,204)">/</span>beans<span style="color: rgb(0,0,204)">&gt;</span></span></code></p>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <br />
                        同样没有配置setSource，autowire改成 "byType"，配置文件会找实现了Source接口的bean,这里 <font size="2"><code style="color: rgb(0,1,2)">cn.hh.spring.DBCPSource 实现了Source接口，所以自动装配，如果没找到则不装配。<br />
                        如果同个配制文件中两个bean实现了Source接口，则报错。<br />
                        这里的 Type是指setSource(<span style="color: rgb(255,1,2)">Source</span> source)中参数的类型。<br />
                        <br />
                        </code></font>3. constructor: <br />
                        <br />
                        试图在容器中寻找与需要自动装配的bean的构造函数参数一致的一个或多个bean，如果没找到则抛出异常。<br />
                        <br />
                        <br />
                        4. autodetect: <br />
                        <br />
                        首先尝试使用constructor来自动装配，然后再使用<span style="color: rgb(255,1,2)">byType</span>方式。<br />
                        </div>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/xzclog/aggbug/284065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2009-06-25 09:44 <a href="http://www.blogjava.net/xzclog/archive/2009/06/25/284065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring的applicationContext.xml文件</title><link>http://www.blogjava.net/xzclog/archive/2008/06/07/206514.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 07 Jun 2008 05:48:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/06/07/206514.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/206514.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/06/07/206514.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/206514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/206514.html</trackback:ping><description><![CDATA[想必用过<a href="http://www.3y11.com/tags_article.asp?tag_id=spring" target="_blank">Spring</a>的程序员们都有这样的感觉，Spring把逻辑层封装的太完美了（个人感觉View层封装的不是很好）。以至于有的初学者都不知道Spring配置文件的意思，就拿来用了。所以今天我给大家详细解释一下Spring的applicationContext.xml<a href="http://www.3y11.com/tags_article.asp?tag_id=文件" target="_blank">文件</a>。Ok，我还是通过代码加注释的方式为大家演示：
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是详解Spring的applicationContext.xml文件代码：<br />
            </font><span style="color: #0000ff">&lt;!-- 头文件，主要注意一下编码 --&gt;</span><br />
            &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
            &lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&gt;<br />
            &lt;beans&gt;<br />
            &nbsp;<span style="color: #0000ff">&lt;!-- 建立数据源 --&gt;<br />
            </span>&nbsp;&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
            &nbsp;&nbsp;<span style="color: #0000ff">&lt;!-- 数据库驱动，我这里使用的是Mysql数据库 --&gt;<br />
            </span>&nbsp;&nbsp;&lt;property name="driverClassName"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;value&gt;com.mysql.jdbc.Driver&lt;/value&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&nbsp;<span style="color: #0000ff">&lt;!-- 数据库地址，这里也要注意一下编码，不然乱码可是很郁闷的哦！ --&gt;</span><br />
            &nbsp;&nbsp;&lt;property name="url"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;value&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc:mysql://localhost:3306/tie?useUnicode=true&amp;amp;characterEncoding=utf-8<br />
            &nbsp;&nbsp; &lt;/value&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&nbsp;<span style="color: #0000ff">&lt;!-- 数据库的用户名 --&gt;<br />
            </span>&nbsp;&nbsp;&lt;property name="username"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;value&gt;root&lt;/value&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&nbsp;<span style="color: #0000ff">&lt;!-- 数据库的密码 --&gt;<br />
            </span>&nbsp;&nbsp;&lt;property name="password"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;value&gt;123&lt;/value&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<span style="color: #0000ff">&lt;!-- 把数据源注入给Session工厂 --&gt;</span><br />
            &nbsp;&lt;bean id="sessionFactory"<br />
            &nbsp;&nbsp;class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
            &nbsp;&nbsp;&lt;property name="dataSource"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;ref bean="dataSource" /&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&nbsp;<span style="color: #0000ff">&lt;!-- 配置映射文件 --&gt;</span><br />
            &nbsp;&nbsp;&lt;property name="mappingResources"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com/alonely/vo/User.hbm.xml&lt;/value&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;/list&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<span style="color: #0000ff">&lt;!-- 把Session工厂注入给hibernateTemplate --&gt;<br />
            &nbsp;&lt;!-- 解释一下hibernateTemplate：hibernateTemplate提供了很多方便的方法，在执行时自动建立 HibernateCallback 对象，例如：load()、get()、save、delete()等方法。 --&gt;</span><br />
            &nbsp;&lt;bean id="hibernateTemplate"<br />
            &nbsp;&nbsp;class="org.springframework.orm.hibernate3.HibernateTemplate"&gt;<br />
            &nbsp;&nbsp;&lt;constructor-arg&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;ref local="sessionFactory" /&gt;<br />
            &nbsp;&nbsp;&lt;/constructor-arg&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<span style="color: #0000ff">&lt;!-- 把DAO注入给Session工厂 --&gt;</span><br />
            &nbsp;&lt;bean id="userDAO" class="com.alonely.dao.UserDAO"&gt;<br />
            &nbsp;&nbsp;&lt;property name="sessionFactory"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;ref bean="sessionFactory" /&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<span style="color: #0000ff">&lt;!-- 把Service注入给DAO --&gt;<br />
            </span>&nbsp;&lt;bean id="userService" class="com.alonely.service.UserService"&gt;<br />
            &nbsp;&nbsp;&lt;property name="userDAO"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;ref local="userDAO" /&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &nbsp;<span style="color: #0000ff">&lt;!-- 把Action注入给Service --&gt;</span><br />
            &nbsp;&lt;bean name="/user" class="com.alonely.struts.action.UserAction"&gt;<br />
            &nbsp;&nbsp;&lt;property name="userService"&gt;<br />
            &nbsp;&nbsp;&nbsp;&lt;ref bean="userService" /&gt;<br />
            &nbsp;&nbsp;&lt;/property&gt;<br />
            &nbsp;&lt;/bean&gt;<br />
            &lt;/beans&gt;</td>
        </tr>
    </tbody>
</table>
以上Spring的applicationContext.xml文件我是用的SSH架构，如果您用Spring的<a href="http://www.3y11.com/tags_article.asp?tag_id=mvc" target="_blank">MVC</a>架构，其原理也是一样的。
<img src ="http://www.blogjava.net/xzclog/aggbug/206514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-06-07 13:48 <a href="http://www.blogjava.net/xzclog/archive/2008/06/07/206514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JdbcTemplate学习笔记</title><link>http://www.blogjava.net/xzclog/archive/2008/06/07/206512.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 07 Jun 2008 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/06/07/206512.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/206512.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/06/07/206512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/206512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/206512.html</trackback:ping><description><![CDATA[1、使用JdbcTemplate的execute()方法执行SQL语句 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>jdbcTemplate.execute(</span><span class="string">"CREATE&nbsp;TABLE&nbsp;USER&nbsp;(user_id&nbsp;integer,&nbsp;name&nbsp;varchar(100))"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");</pre>
<br />
2、如果是UPDATE或INSERT,可以用update()方法。 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>jdbcTemplate.update(</span><span class="string">"INSERT&nbsp;INTO&nbsp;USER&nbsp;VALUES('"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;user.getId()&nbsp;+&nbsp;</span><span class="string">"',&nbsp;'"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;user.getName()&nbsp;+&nbsp;</span><span class="string">"',&nbsp;'"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;user.getSex()&nbsp;+&nbsp;</span><span class="string">"',&nbsp;'"</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;user.getAge()&nbsp;+&nbsp;</span><span class="string">"')"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">jdbcTemplate.update("INSERT INTO USER VALUES('"
+ user.getId() + "', '"
+ user.getName() + "', '"
+ user.getSex() + "', '"
+ user.getAge() + "')");
</pre>
<br />
3、带参数的更新 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>jdbcTemplate.update(</span><span class="string">"UPDATE&nbsp;USER&nbsp;SET&nbsp;name&nbsp;=&nbsp;?&nbsp;WHERE&nbsp;user_id&nbsp;=&nbsp;?"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{name,&nbsp;id});&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?", new Object[] {name, id});</pre>
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>jdbcTemplate.update(</span><span class="string">"INSERT&nbsp;INTO&nbsp;USER&nbsp;VALUES(?,&nbsp;?,&nbsp;?,&nbsp;?)"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{user.getId(),&nbsp;user.getName(),&nbsp;user.getSex(),&nbsp;user.getAge()});&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)", new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});
</pre>
<br />
4、使用JdbcTemplate进行查询时，使用queryForXXX()等方法 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;jdbcTemplate.queryForInt(</span><span class="string">"SELECT&nbsp;COUNT(*)&nbsp;FROM&nbsp;USER"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>String&nbsp;name&nbsp;=&nbsp;(String)&nbsp;jdbcTemplate.queryForObject(</span><span class="string">"SELECT&nbsp;name&nbsp;FROM&nbsp;USER&nbsp;WHERE&nbsp;user_id&nbsp;=&nbsp;?"</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{id},&nbsp;java.lang.String.</span><span class="keyword">class</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?", new Object[] {id}, java.lang.String.class);</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>List&nbsp;rows&nbsp;=&nbsp;jdbcTemplate.queryForList(</span><span class="string">"SELECT&nbsp;*&nbsp;FROM&nbsp;USER"</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">List rows = jdbcTemplate.queryForList("SELECT * FROM USER");</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>List&nbsp;rows&nbsp;=&nbsp;jdbcTemplate.queryForList(</span><span class="string">"SELECT&nbsp;*&nbsp;FROM&nbsp;USER"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>Iterator&nbsp;it&nbsp;=&nbsp;rows.iterator(); &nbsp;&nbsp;</span></li>
    <li><span class="keyword">while</span><span>(it.hasNext())&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;userMap&nbsp;=&nbsp;(Map)&nbsp;it.next(); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(userMap.get(</span><span class="string">"user_id"</span><span>)&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(userMap.get(</span><span class="string">"name"</span><span>)&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(userMap.get(</span><span class="string">"sex"</span><span>)&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(userMap.get(</span><span class="string">"age"</span><span>)&nbsp;+&nbsp;</span><span class="string">"\t"</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">List rows = jdbcTemplate.queryForList("SELECT * FROM USER");
Iterator it = rows.iterator();
while(it.hasNext()) {
Map userMap = (Map) it.next();
System.out.print(userMap.get("user_id") + "\t");
System.out.print(userMap.get("name") + "\t");
System.out.print(userMap.get("sex") + "\t");
System.out.println(userMap.get("age") + "\t");
}
</pre>
<br />
<br />
JdbcTemplate将我们使用的JDBC的流程封装起来，包括了异常的捕捉、SQL的执行、查询结果的转换等等。spring大量使用Template Method模式来封装固定流程的动作，XXXTemplate等类别都是基于这种方式的实现。 <br />
除了大量使用Template Method来封装一些底层的操作细节，spring也大量使用callback方式类回调相关类别的方法以提供JDBC相关类别的功能，使传统的JDBC的使用者也能清楚了解spring所提供的相关封装类别方法的使用。 <br />
<br />
JDBC的PreparedStatement <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">final</span><span>&nbsp;String&nbsp;id&nbsp;=&nbsp;user.getId(); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">final</span><span>&nbsp;String&nbsp;name&nbsp;=&nbsp;user.getName(); &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">final</span><span>&nbsp;String&nbsp;sex&nbsp;=&nbsp;user.getSex()&nbsp;+&nbsp;</span><span class="string">""</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;age&nbsp;=&nbsp;user.getAge(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>jdbcTemplate.update(</span><span class="string">"INSERT&nbsp;INTO&nbsp;USER&nbsp;VALUES(?,&nbsp;?,&nbsp;?,&nbsp;?)"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;PreparedStatementSetter()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&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;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setValues(PreparedStatement&nbsp;ps)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&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;ps.setString(</span><span class="number">1</span><span>,&nbsp;id); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;ps.setString(</span><span class="number">2</span><span>,&nbsp;name);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&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;ps.setString(</span><span class="number">3</span><span>,&nbsp;sex); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;ps.setInt(</span><span class="number">4</span><span>,&nbsp;age); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">final String id = user.getId();
final String name = user.getName();
final String sex = user.getSex() + "";
final int age = user.getAge();
jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps) throws SQLException {
ps.setString(1, id);
ps.setString(2, name);
ps.setString(3, sex);
ps.setInt(4, age);
}
});
</pre>
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">final</span><span>&nbsp;User&nbsp;user&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;User(); &nbsp;&nbsp;</span></span></li>
    <li><span>jdbcTemplate.query(</span><span class="string">"SELECT&nbsp;*&nbsp;FROM&nbsp;USER&nbsp;WHERE&nbsp;user_id&nbsp;=&nbsp;?"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{id}, &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;RowCallbackHandler()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;processRow(ResultSet&nbsp;rs)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&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;user.setId(rs.getString(</span><span class="string">"user_id"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;user.setName(rs.getString(</span><span class="string">"name"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;user.setSex(rs.getString(</span><span class="string">"sex"</span><span>).charAt(</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;user.setAge(rs.getInt(</span><span class="string">"age"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&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;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">final User user = new User();
jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",
new Object[] {id},
new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
user.setId(rs.getString("user_id"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex").charAt(0));
user.setAge(rs.getInt("age"));
}
});
</pre>
<br />
<br />
<br />
<br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">class</span><span>&nbsp;UserRowMapper&nbsp;</span><span class="keyword">implements</span><span>&nbsp;RowMapper&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;mapRow(ResultSet&nbsp;rs,&nbsp;</span><span class="keyword">int</span><span>&nbsp;index)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;User(); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setId(rs.getString(</span><span class="string">"user_id"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setName(rs.getString(</span><span class="string">"name"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setSex(rs.getString(</span><span class="string">"sex"</span><span>).charAt(</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user.setAge(rs.getInt(</span><span class="string">"age"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;user; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">public</span><span>&nbsp;List&nbsp;findAllByRowMapperResultReader()&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"SELECT&nbsp;*&nbsp;FROM&nbsp;USER"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;jdbcTemplate.query(sql,&nbsp;</span><span class="keyword">new</span><span>&nbsp;RowMapperResultReader(</span><span class="keyword">new</span><span>&nbsp;UserRowMapper())); &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">class UserRowMapper implements RowMapper {
public Object mapRow(ResultSet rs, int index) throws SQLException {
User user = new User();
user.setId(rs.getString("user_id"));
user.setName(rs.getString("name"));
user.setSex(rs.getString("sex").charAt(0));
user.setAge(rs.getInt("age"));
return user;
}
}
public List findAllByRowMapperResultReader() {
String sql = "SELECT * FROM USER";
return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));
}
</pre>
<br />
<br />
在getUser(id)里面使用UserRowMapper <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;User&nbsp;getUser(</span><span class="keyword">final</span><span>&nbsp;String&nbsp;id)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;DataAccessException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;</span><span class="string">"SELECT&nbsp;*&nbsp;FROM&nbsp;USER&nbsp;WHERE&nbsp;user_id=?"</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">final</span><span>&nbsp;Object[]&nbsp;params&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{&nbsp;id&nbsp;}; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=&nbsp;jdbcTemplate.query(sql,&nbsp;params,&nbsp;</span><span class="keyword">new</span><span>&nbsp;RowMapperResultReader(</span><span class="keyword">new</span><span>&nbsp;UserRowMapper())); &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;(User)&nbsp;list.get(</span><span class="number">0</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code">public User getUser(final String id) throws DataAccessException {
String sql = "SELECT * FROM USER WHERE user_id=?";
final Object[] params = new Object[] { id };
List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));
return (User) list.get(0);
}
</pre>
<br />
<br />
网上收集 <br />
org.springframework.jdbc.core.PreparedStatementCreator 返回预编译SQL 不能于Object[]一起用 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;PreparedStatement&nbsp;createPreparedStatement(Connection&nbsp;con)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">return</span><span>&nbsp;con.prepareStatement(sql); &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
return con.prepareStatement(sql);
}
</pre>
<br />
1.增删改 <br />
org.springframework.jdbc.core.JdbcTemplate 类(必须指定数据源dataSource) <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>template.update(</span><span class="string">"insert&nbsp;into&nbsp;web_person&nbsp;values(?,?,?)"</span><span>,Object[]);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> template.update("insert into web_person values(?,?,?)",Object[]);
</pre>
<br />
或 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>template.update(</span><span class="string">"insert&nbsp;into&nbsp;web_person&nbsp;values(?,?,?)"</span><span>,</span><span class="keyword">new</span><span>&nbsp;PreparedStatementSetter(){&nbsp;匿名内部类&nbsp;只能访问外部最终局部变量 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setValues(PreparedStatement&nbsp;ps)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;ps.setInt(index++,</span><span class="number">3</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>});&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名内部类 只能访问外部最终局部变量
public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(index++,3);
});
</pre>
<br />
org.springframework.jdbc.core.PreparedStatementSetter 接口 处理预编译SQL <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setValues(PreparedStatement&nbsp;ps)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;ps.setInt(index++,</span><span class="number">3</span><span>); &nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> public void setValues(PreparedStatement ps) throws SQLException {
ps.setInt(index++,3);
}
</pre>
<br />
2.查询JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler) <br />
org.springframework.jdbc.core.RowMapper 记录映射接口 处理结果集 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span class="keyword">public</span><span>&nbsp;Object&nbsp;mapRow(ResultSet&nbsp;rs,&nbsp;</span><span class="keyword">int</span><span>&nbsp;arg1)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>表当前行数 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;person.setId(rs.getInt(</span><span class="string">"id"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li><span>List&nbsp;template.query(</span><span class="string">"select&nbsp;*&nbsp;from&nbsp;web_person&nbsp;where&nbsp;id=?"</span><span>,Object[],RowMapper);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<pre class="java" style="display: none" name="code"> public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表当前行数
person.setId(rs.getInt("id"));
}
List template.query("select * from web_person where id=?",Object[],RowMapper);
</pre>
<br />
org.springframework.jdbc.core.RowCallbackHandler 记录回调管理器接口 处理结果集 <br />
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="http://www.javaeye.com/topic/53526#"><img alt="复制代码" src="http://www.javaeye.com/images/icon_copy.gif" _counted="undefined" /></a></div>
</div>
<ol class="dp-j">
    <li><span><span>template.query(</span><span class="string">"select&nbsp;*&nbsp;from&nbsp;web_person&nbsp;where&nbsp;id=?"</span><span>,Object[],</span><span class="keyword">new</span><span>&nbsp;RowCallbackHandler(){ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;processRow(ResultSet&nbsp;rs)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;SQLException&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;person.setId(rs.getInt(</span><span class="string">"id"</span><span>)); &nbsp;&nbsp;</span></span></li>
    <li><span>});&nbsp;&nbsp;</span></li>
</ol>
</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/206512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-06-07 13:37 <a href="http://www.blogjava.net/xzclog/archive/2008/06/07/206512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java读取配置文件的几种方法</title><link>http://www.blogjava.net/xzclog/archive/2008/06/06/206354.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 06 Jun 2008 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2008/06/06/206354.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/206354.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2008/06/06/206354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/206354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/206354.html</trackback:ping><description><![CDATA[&nbsp;在现实工作中，我们常常需要保存一些系统配置信息，大家一般都会选择配置文件来完成，本文根据笔者工作中用到的读取配置文件的方法小小总结一下，主要叙述的是spring读取配置文件的方法。
<div><strong>一.读取xml配置文件</strong></div>
<blockquote dir="ltr" style="margin-right: 0px">
<div>(一)新建一个java bean(HelloBean.java)
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;chb.demo.vo; &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;HelloBean&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;helloWorld; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getHelloWorld()&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;helloWorld; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setHelloWorld(String&nbsp;helloWorld)&nbsp;{ &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">this</span><span>.helloWorld&nbsp;=&nbsp;helloWorld; &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span>
    <li class="alt"><span>} &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p>(二)构造一个配置文件(beanConfig.xml)</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">"1.0"</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">"UTF-8"</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span>
    <li class=""><span><!--CTYPE&#160;beans&#160;PUBLIC&#160;"-//SPRING//DTD&#160;BEAN//EN"&#160;"http://www.springframework.org/dtd/spring-beans.dtd"&#160;</sp--><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">bean</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">"helloBean"</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">"chb.demo.vo.HelloBean"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">"helloWorld"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>Hello!chb!</span><span class="tag"><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">property</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class=""><span>&nbsp;</span><span class="tag"><span class="tag-name">bean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span>
    <li class="alt"><span class="tag"><span class="tag-name">beans</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>(三)读取xml文件</p>
<div>1.利用ClassPathXmlApplicationContext
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>ApplicationContext&nbsp;context&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ClassPathXmlApplicationContext(</span><span class="string">"beanConfig.xml"</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>HelloBean&nbsp;helloBean&nbsp;=&nbsp;(HelloBean)context.getBean(</span><span class="string">"helloBean"</span><span>); &nbsp;&nbsp;</span>
    <li class="alt"><span>System.out.println(helloBean.getHelloWorld());&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div>2.利用FileSystemResource读取</div>
<div class="code_title">java 代码</div>
<div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Resource&nbsp;rs&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;FileSystemResource(</span><span class="string">"D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/beanConfig.xml"</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;XmlBeanFactory(rs); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;HelloBean&nbsp;helloBean&nbsp;=&nbsp;(HelloBean)factory.getBean(</span><span class="string">"helloBean"</span><span>);\ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;System.out.println(helloBean.getHelloWorld()); &nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div>&nbsp;值得注意的是：利用FileSystemResource，则配置文件必须放在project直接目录下，或者写明绝对路径，否则就会抛出找不到文件的异常</div>
</blockquote>
<div><strong>二.读取properties配置文件</strong></div>
<blockquote dir="ltr" style="margin-right: 0px">
<div>这里介绍两种技术：利用spring读取properties 文件和利用java.util.Properties读取</div>
<div></div>
<div></div>
<div>(一)利用spring读取properties 文件</div>
<div></div>
<div></div>
<div>我们还利用上面的HelloBean.java文件，构造如下beanConfig.properties文件:
<div class="code_title">properties&nbsp;代码</div>
<div class="dp-highlighter">
<ol class="dp-css">
    <li class="alt"><span><span>helloBean.class=chb.demo.vo.HelloBean &nbsp;&nbsp;</span></span>
    <li class=""><span>helloBean.helloWorld=Hello!chb!&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div>属性文件中的"helloBean"名称即是Bean的别名设定，.class用于指定类来源。</div>
<div>然后利用org.springframework.beans.factory.support.PropertiesBeanDefinitionReader来读取属性文件
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>BeanDefinitionRegistry&nbsp;reg&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;DefaultListableBeanFactory(); &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;PropertiesBeanDefinitionReader&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PropertiesBeanDefinitionReader(reg); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;reader.loadBeanDefinitions(</span><span class="keyword">new</span><span>&nbsp;ClassPathResource(</span><span class="string">"beanConfig.properties"</span><span>)); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;BeanFactory&nbsp;factory&nbsp;=&nbsp;(BeanFactory)reg; &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;HelloBean&nbsp;helloBean&nbsp;=&nbsp;(HelloBean)factory.getBean(</span><span class="string">"helloBean"</span><span>); &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;System.out.println(helloBean.getHelloWorld()); &nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div>&nbsp;</div>
<div>(二)利用java.util.Properties读取属性文件</div>
<div></div>
<div></div>
<div>比如，我们构造一个ipConfig.properties来保存服务器ip地址和端口，如：
<div class="code_title">properties&nbsp;代码</div>
<div class="dp-highlighter">
<ol class="dp-css">
    <li class="alt"><span><span>ip=192.168.0.1 &nbsp;&nbsp;</span></span>
    <li class=""><span>port=8080&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<div></div>
<div>则，我们可以用如下程序来获得服务器配置信息：
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>InputStream&nbsp;inputStream&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getClass().getClassLoader().getResourceAsStream(</span><span class="string">"ipConfig.properties"</span><span>); &nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;Properties&nbsp;p&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Properties(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;p.load(inputStream); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e1)&nbsp;{ &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;e1.printStackTrace(); &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span>
    <li class=""><span>System.out.println(</span><span class="string">"ip:"</span><span>+p.getProperty(</span><span class="string">"ip"</span><span>)+</span><span class="string">",port:"</span><span>+p.getProperty(</span><span class="string">"port"</span><span>));&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
</blockquote>
<div>本文只介绍了一些简单操作，不当之处希望大家多多指教</div>
<img src ="http://www.blogjava.net/xzclog/aggbug/206354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2008-06-06 15:56 <a href="http://www.blogjava.net/xzclog/archive/2008/06/06/206354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 生成Excel和PDF文件 </title><link>http://www.blogjava.net/xzclog/archive/2006/10/06/73538.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Fri, 06 Oct 2006 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/10/06/73538.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/73538.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/10/06/73538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/73538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/73538.html</trackback:ping><description><![CDATA[
		<span class="content">HTML页面并不总是向用户显示数据输出的最好方式，有时候需要生成不可改变的文件打印，PDF可能是种不错的选择。<br /><br />Spring支持从数据动态生成PDF或Excel文件<br /><br />下面这个简单实现的例子实现了spring输出PDF和Excel文件，为了使用Excel电子表格，你需要在你的classpath中加入poi-2.5.1.jar库文件，而对PDF文件，则需要iText.jar文件。它们都包含在Spring的主发布包中。<br /><br />下面是测试项目代码：<br /><br /><br />1、控制器配置代码<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" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="beanNameViewResolver"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.view.BeanNameViewResolver"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="viewController"</span><span style="COLOR: #ff0000"> class</span><span style="COLOR: #0000ff">="com.zhupan.spring.ViewController"</span><span style="COLOR: #ff0000"> </span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="urlMapping"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        class</span><span style="COLOR: #0000ff">="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="mappings"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">prop </span><span style="COLOR: #ff0000">key</span><span style="COLOR: #0000ff">="/view*.shtml"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">viewController</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">prop</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">props</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">beans</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br /> 3、用于Excel视图的视图子类化<br />为了在生成输出文档的过程中实现定制的行为，我们将继承合适的抽象类。对于Excel，这包括提供一个 org.springframework.web.servlet.view.document.AbstractExcelView的子类，并实现 buildExcelDocument方法。<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" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.zhupan.view;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Date;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFCell;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFCellStyle;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFDataFormat;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFRow;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFSheet;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.apache.poi.hssf.usermodel.HSSFWorkbook;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.view.document.AbstractExcelView;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_585_1434_Open_Image" onclick="this.style.display='none'; Codehighlighter1_585_1434_Open_Text.style.display='none'; Codehighlighter1_585_1434_Closed_Image.style.display='inline'; Codehighlighter1_585_1434_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_585_1434_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_585_1434_Closed_Text.style.display='none'; Codehighlighter1_585_1434_Open_Image.style.display='inline'; Codehighlighter1_585_1434_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ViewExcel </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractExcelView </span><span id="Codehighlighter1_585_1434_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_585_1434_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> buildExcelDocument(<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             Map model, HSSFWorkbook workbook,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             HttpServletRequest request, HttpServletResponse response)<br /><img id="Codehighlighter1_761_1429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_761_1429_Open_Text.style.display='none'; Codehighlighter1_761_1429_Closed_Image.style.display='inline'; Codehighlighter1_761_1429_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_761_1429_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_761_1429_Closed_Text.style.display='none'; Codehighlighter1_761_1429_Open_Image.style.display='inline'; Codehighlighter1_761_1429_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_761_1429_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_761_1429_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFSheet sheet </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> workbook.createSheet(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       sheet.setDefaultColumnWidth((</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">) </span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFCell cell </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getCell(sheet, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       setText(cell, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Spring Excel test</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFCellStyle dateStyle </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> workbook.createCellStyle();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       dateStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">m/d/yy</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       cell </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> getCell(sheet, </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       cell.setCellValue(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Date());<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       cell.setCellStyle(dateStyle);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       getCell(sheet, </span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">).setCellValue(</span><span style="COLOR: #000000">458</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       HSSFRow sheetRow </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> sheet.createRow(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br /><img id="Codehighlighter1_1357_1424_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1357_1424_Open_Text.style.display='none'; Codehighlighter1_1357_1424_Closed_Image.style.display='inline'; Codehighlighter1_1357_1424_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1357_1424_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1357_1424_Closed_Text.style.display='none'; Codehighlighter1_1357_1424_Open_Image.style.display='inline'; Codehighlighter1_1357_1424_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_1357_1424_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1357_1424_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             sheetRow.createCell(i).setCellValue(i </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />       }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />4、用于PDF视图的视图子类化<br />需要象下面一样继承org.springframework.web.servlet.view.document.AbstractPdfView，并实现buildPdfDocument()方法。 <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" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.zhupan.view;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.List;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.view.document.AbstractPdfView;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.lowagie.text.Document;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.lowagie.text.Paragraph;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.lowagie.text.pdf.PdfWriter;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_391_694_Open_Image" onclick="this.style.display='none'; Codehighlighter1_391_694_Open_Text.style.display='none'; Codehighlighter1_391_694_Closed_Image.style.display='inline'; Codehighlighter1_391_694_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_391_694_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_391_694_Closed_Text.style.display='none'; Codehighlighter1_391_694_Open_Image.style.display='inline'; Codehighlighter1_391_694_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ViewPDF </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> AbstractPdfView </span><span id="Codehighlighter1_391_694_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_391_694_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> buildPdfDocument(Map model, Document document,<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            PdfWriter writer, HttpServletRequest request,<br /><img id="Codehighlighter1_552_691_Open_Image" onclick="this.style.display='none'; Codehighlighter1_552_691_Open_Text.style.display='none'; Codehighlighter1_552_691_Closed_Image.style.display='inline'; Codehighlighter1_552_691_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_552_691_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_552_691_Closed_Text.style.display='none'; Codehighlighter1_552_691_Open_Image.style.display='inline'; Codehighlighter1_552_691_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_552_691_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_552_691_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (List) model.get(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> list.size(); i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            document.add(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Paragraph((String) list.get(i)));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>5、其他文件<br />1）控制器ViewController <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" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> com.zhupan.spring;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.ArrayList;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.HashMap;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.List;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.ModelAndView;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.springframework.web.servlet.mvc.multiaction.MultiActionController;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.zhupan.view.ViewExcel;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> com.zhupan.view.ViewPDF;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_479_1219_Open_Image" onclick="this.style.display='none'; Codehighlighter1_479_1219_Open_Text.style.display='none'; Codehighlighter1_479_1219_Closed_Image.style.display='inline'; Codehighlighter1_479_1219_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_479_1219_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_479_1219_Closed_Text.style.display='none'; Codehighlighter1_479_1219_Open_Image.style.display='inline'; Codehighlighter1_479_1219_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ViewController </span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"> MultiActionController</span><span id="Codehighlighter1_479_1219_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_479_1219_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     <br /><img id="Codehighlighter1_595_835_Open_Image" onclick="this.style.display='none'; Codehighlighter1_595_835_Open_Text.style.display='none'; Codehighlighter1_595_835_Closed_Image.style.display='inline'; Codehighlighter1_595_835_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_595_835_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_595_835_Closed_Text.style.display='none'; Codehighlighter1_595_835_Open_Image.style.display='inline'; Codehighlighter1_595_835_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ModelAndView viewPDF(HttpServletRequest request, HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_595_835_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_595_835_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       Map model</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       model.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,list);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       ViewPDF viewPDF</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ViewPDF();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ModelAndView(viewPDF,model);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />  }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     <br /><img id="Codehighlighter1_954_1217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_954_1217_Open_Text.style.display='none'; Codehighlighter1_954_1217_Closed_Image.style.display='inline'; Codehighlighter1_954_1217_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_954_1217_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_954_1217_Closed_Text.style.display='none'; Codehighlighter1_954_1217_Open_Image.style.display='inline'; Codehighlighter1_954_1217_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> ModelAndView viewExcel(HttpServletRequest request, HttpServletResponse response) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> Exception </span><span id="Codehighlighter1_954_1217_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_954_1217_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            List list </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Map model</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HashMap();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        list.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        model.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,list);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        ViewExcel viewExcel</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ViewExcel();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ModelAndView(viewExcel,model);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>2）web.xml 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app </span><span style="COLOR: #ff0000">version</span><span style="COLOR: #0000ff">="2.4"</span><span style="COLOR: #ff0000"> xmlns</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xmlns:xsi</span><span style="COLOR: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="COLOR: #ff0000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xsi:schemaLocation</span><span style="COLOR: #0000ff">="http://java.sun.com/xml/ns/j2ee <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springPDFTest</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springPDFTest</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            org.springframework.web.servlet.DispatcherServlet<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">springPDFTest</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">*.shtml</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">index.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">welcome-file-list</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />3)index.jsp<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 id="Codehighlighter1_2_47_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_47_Open_Text.style.display='none'; Codehighlighter1_2_47_Closed_Image.style.display='inline'; Codehighlighter1_2_47_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_47_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2_47_Closed_Text.style.display='none'; Codehighlighter1_2_47_Open_Image.style.display='inline'; Codehighlighter1_2_47_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span id="Codehighlighter1_2_47_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 src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_2_47_Open_Text"><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=gb2312</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">a </span><span style="COLOR: #ff0000">href</span><span style="COLOR: #0000ff">="viewPDF.shtml"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">PDF视图打开 </span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">a</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">br</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">a </span><span style="COLOR: #ff0000">href</span><span style="COLOR: #0000ff">="viewExcel.shtml"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Excel视图打开</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">a</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /></span></div></span>
<img src ="http://www.blogjava.net/xzclog/aggbug/73538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-10-06 15:07 <a href="http://www.blogjava.net/xzclog/archive/2006/10/06/73538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP Review </title><link>http://www.blogjava.net/xzclog/archive/2006/08/19/64494.html</link><dc:creator>xzc</dc:creator><author>xzc</author><pubDate>Sat, 19 Aug 2006 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/xzclog/archive/2006/08/19/64494.html</guid><wfw:comment>http://www.blogjava.net/xzclog/comments/64494.html</wfw:comment><comments>http://www.blogjava.net/xzclog/archive/2006/08/19/64494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xzclog/comments/commentRss/64494.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xzclog/services/trackbacks/64494.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在阅读此文之前请你熟悉一些IOC的知识，同时了解AOP的概念。						在				Spring				中所有的通知都是以				Java				类的形式编写的。				Spring				是采用运行期的方式来将切面织入到系统中的。														代理						Bean								只有在第一次被应用系统需要的时候才被创建。...&nbsp;&nbsp;<a href='http://www.blogjava.net/xzclog/archive/2006/08/19/64494.html'>阅读全文</a><img src ="http://www.blogjava.net/xzclog/aggbug/64494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xzclog/" target="_blank">xzc</a> 2006-08-19 10:23 <a href="http://www.blogjava.net/xzclog/archive/2006/08/19/64494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>