﻿<?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-&lt;font color="#FFFF00"&gt;金色闪电--陈彦虎（Ryan）&lt;/font&gt;-文章分类-J2EE</title><link>http://www.blogjava.net/kissyan4916/category/37694.html</link><description>哎哟 Orz，不错喔~~希望结识更多喜爱Java的朋友!&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QQ：95350863 MSN：chenyanhubusiness@gmail.com   E-mail：chenyanhu@vip.163.com</description><language>zh-cn</language><lastBuildDate>Mon, 19 Jul 2010 23:38:54 GMT</lastBuildDate><pubDate>Mon, 19 Jul 2010 23:38:54 GMT</pubDate><ttl>60</ttl><item><title>Eclipse下配置及使用Tomcat 6.0数据库连接池连接sqlserver2000 (转)</title><link>http://www.blogjava.net/kissyan4916/articles/314801.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 08 Mar 2010 05:25:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/314801.html</guid><description><![CDATA[<div class="postTitle"><span style="font-size: 10pt">前提假设Eclipse已经设置成功，Tomcat插件也设置成功。<br />
<br />
1.由于tomcat6运行web应用时是在eclipse的workspace下建立一个server工程，而不是把web工程拷贝到tomcat路径下运行，所以在eclipse运行tomcat、使用它的连接池需要更改的是eclipse的workspace下server工程里面的server.xml配置，将来发布后再更改tomcat安装路径下conf下的server.xml。<br />
在server.xml的host下加入：</span>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;Context docBase="MyStruts" path="/MyStruts" reloadable="true"&gt;<br />
&lt;</span><span style="color: #800000">Resource&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/DBUtil"</span><span style="color: #ff0000">&nbsp;auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: #0000ff">="100"</span><span style="color: #ff0000">&nbsp;maxIdle</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;maxWait</span><span style="color: #0000ff">="10000"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: #0000ff">="sa"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="1234"</span><span style="color: #ff0000">&nbsp;driverClassName</span><span style="color: #0000ff">="com.microsoft.jdbc.sqlserver.SQLServerDriver"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=JiLv"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;<br />
&lt;/Context&gt;<br />
</span></div>
<span style="font-size: 10pt">其中，DBUtil任意，将来和下一步的web.xml里名字对应即可，url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=JiLv"按情况填写。<br />
&nbsp;&nbsp;<span style="color: red"> 此步骤可以用如下方法替代</span>，在web工程的webcontent/web-inf目录下建立context.xml文件，这样避免两次去更改server.xml配置，也可使不同工程使用不同context配置，这是tomcat6提倡的方法，内容如下：<br />
</span>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">Context&nbsp;</span><span style="color: #ff0000">docBase</span><span style="color: #0000ff">="MyStruts"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/MyStruts"</span><span style="color: #ff0000">&nbsp;reloadable</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">WatchedResource</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">WEB-INF/web.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">WatchedResource</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/DBUtil"</span><span style="color: #ff0000">&nbsp;auth</span><span style="color: #0000ff">="Container"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: #0000ff">="100"</span><span style="color: #ff0000">&nbsp;maxIdle</span><span style="color: #0000ff">="30"</span><span style="color: #ff0000">&nbsp;maxWait</span><span style="color: #0000ff">="10000"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: #0000ff">="sa"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="1234"</span><span style="color: #ff0000">&nbsp;driverClassName</span><span style="color: #0000ff">="com.microsoft.jdbc.sqlserver.SQLServerDriver"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=JiLv"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Context</span><span style="color: #0000ff">&gt;</span></div>
<br />
<span style="font-size: 10pt">2.在webapps/项目名/WEB-INF中的web.xml中之前增加以下配置:<br />
</span>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">&lt;</span><span style="color: #800000">resource-ref</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">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SQL&nbsp;Server&nbsp;Datasource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</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">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc/DBUtil</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-ref-name</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">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javax.sql.DataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-type</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">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Container</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span></div>
<br />
<span style="font-size: 10pt">3.把以下几个.jar文件复制到tomcat安装目录下的lib文件夹中<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commons-collections-3.1.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commons-dbcp-1.2.1.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commons-pool-1.2.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msutil.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msbase.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mssqlserver.jar<br />
</span><br />
4.关键一步。确认sqlserver2000可以远程连接，这除了开放1433端口外还要，升级数据库到sp3或者sp4，否则连接会发出SQLNestedException: Cannot create PoolableConnectionFactory ([Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误。<br />
<br />
5.编写java类，用于返回connection对象。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<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.lyb;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.sql.Connection;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.Context;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.naming.InitialContext;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.sql.DataSource;<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;DBUtil&nbsp;{<br />
<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;Connection&nbsp;getConnection()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;initContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(initContext&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Exception(</span><span style="color: #000000">"</span><span style="color: #000000">No&nbsp;Context</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;envContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Context)&nbsp;initContext.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">java:/comp/env</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DataSource)&nbsp;envContext.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc/DBUtil</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ds&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(conn&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;conn;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
6.测试。<br />
jsp文件内容：(注意不能用main函数测试，这样就脱离了Tomcat环境，只是一个java 应用，不可能使用tomcat连接池方法)<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">@&nbsp;&nbsp;&nbsp;page&nbsp;contentType</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">text/html;charset=gb2312</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">@&nbsp;&nbsp;&nbsp;page&nbsp;import</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">java.sql.*</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">@&nbsp;&nbsp;&nbsp;page&nbsp;import</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">javax.sql.*</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">@&nbsp;&nbsp;&nbsp;page&nbsp;import</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">javax.naming.*</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">@&nbsp;&nbsp;&nbsp;page&nbsp;import</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">com.lyb.*</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">TITLE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">JSP测试页面</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">TITLE</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HEAD</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;DBUtil.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;conn.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff">String</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;sql&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">select&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;&nbsp;goods</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;st.executeQuery(sql);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: #f5f5f5; color: #0000ff">while</span><span style="background-color: #f5f5f5; color: #000000">&nbsp;(rs.next())&nbsp;{<br />
</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
第一个字段内容为：</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">rs.getString(</span><span style="background-color: #f5f5f5; color: #000000">1</span><span style="background-color: #f5f5f5; color: #000000">)</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
第二个字段内容为：</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000">=</span><span style="background-color: #f5f5f5; color: #000000">rs.getString(</span><span style="background-color: #f5f5f5; color: #000000">2</span><span style="background-color: #f5f5f5; color: #000000">)</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">br</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">使用jdbc驱动操作数据库操作成功</span><span style="background-color: #f5f5f5; color: #000000">"</span><span style="background-color: #f5f5f5; color: #000000">);<br />
</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="background-color: #ffff00; color: #000000">&lt;%</span><span style="background-color: #f5f5f5; color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;st.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;conn.close();<br />
</span><span style="background-color: #ffff00; color: #000000">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">BODY</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">HTML</span><span style="color: #0000ff">&gt;</span></div>
</div><img src ="http://www.blogjava.net/kissyan4916/aggbug/314801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-03-08 13:25 <a href="http://www.blogjava.net/kissyan4916/articles/314801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】使用命令行 Subversion 访问项目源文件</title><link>http://www.blogjava.net/kissyan4916/articles/309308.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 13 Jan 2010 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/309308.html</guid><description><![CDATA[<h3 id="svnintro">命令行 Subversion 入门</h3>
<p>如果您参与的项目正在使用 Subversion 进行版本控制，您将需要使用 Subversion 访问和更改项目源文件。您可以点击项目的左侧导航窗格上的<strong>&#8220;Subversion&#8221;</strong>链接，在线浏览源代码以查看该项目的目录结构和文件。</p>
<p><strong>&#8220;Subversion&#8221;</strong>页面显示三个子目录：branches/、tags/、trunk/ 和一个自述文件。自述文件可以使您对 Subversion 存储库有一个整体了解。您可以点击<strong>&#8220;访问选项&#8221;</strong>，查看 Subversion 客户端安装说明。您的本地计算机上必须安装有 Subversion 客户端。</p>
<p id="svnchkout"><strong>获取项目的本地工作副本</strong>：<code>svn checkout</code></p>
<p>若要获取最新源文件的&#8220;工作副本&#8221;，您必须首先签出这些源文件，这一过程会将文件从存储库复制到您的系统中。在您的外壳程序或终端客户端，请键入：</p>
<code>svn checkout https://(项目名称).(域)/svn/(项目名称)/(DIR) (项目名称) --username [在此处输入用户名]</code>
<p>当系统提示您时输入您的用户密码。此密码应与您在本站点中的用户帐号的密码相同。不指定目录将签出整个项目源代码。您可能希望签出&#8220;trunk/&#8221;目录，因为此目录具有工作&#8220;www/&#8221;文件夹。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html">基本工作周期</a>、<a href="http://svnbook.red-bean.com/svnbook/ch03s04.html">初始签出</a>、<a href="http://svnbook.red-bean.com/svnbook/ch02s03.html#svn-ch-2-sect-3.1">工作副本</a>。</p>
<p><strong>注意</strong>：如果站点未启用 SSL（安全套接字层），则在执行 Subversion 操作时，请使用 <code>http</code> 而不是 <code>https</code>。例如，若要从项目的存储库中签出最新的源代码，请使用以下命令： </p>
<p><code>svn checkout https://(项目名称).(域)/svn/(项目名称)/(DIR) (项目名称) --username [在此处输入用户名]</code></p>
<h3 id="workwithfiles">处理 Subversion 存储库中的文件</h3>
<p>从项目存储库中签出本地副本后，您可以在本地计算机上编辑现有文件、创建新文件和目录、以及删除文件。在您将所做的任何更改提交回 Subversion 存储库之前，这些更改只对项目文件的本地副本起作用。 </p>
<p id="svnadd"><strong>将工作副本中的文件/目录添加到存储库中</strong>：<code>svn add</code></p>
<p>在您第一次在工作目录中创建并编辑新文件后，可以将此文件添加到存储库中，或添加一个目录，目录中有无内容均可。</p>
<code>svn add FILENAME/DIR</code>。
<p>这样就会在您的工作副本中添加文件/目录，并安排它们以添加到存储库中。您下次提交时，会上载这些文件/目录，并将它们添加到存储库中。如果您了添加内容，但在提交前又改变了主意，则可以使用 <code>svn revert</code> 取消添加内容的安排。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--targets FILENAME, --non-recursive (-N), --quiet (-q), --config-dir arg, --auto-props, --no-auto-props</code>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/re01.html">添加文件/目录示例</a>。</p>
<p id="svnblame"><strong>查看带有修订和作者信息的特定文件的内容</strong>：<code>svn blame</code></p>
<p>若要在线查看指定文件的作者和修订信息，请键入：</p>
<code>svn blame FILENAME</code>
<p>每行文本的开始处都以上次更改该行的作者（用户名）和修订版本号作为批注。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code>
<p id="svncat"><strong>查看特定文件的内容</strong>：<code>svn cat</code></p>
<p>有时，与存储库相比较，您的工作副本可能已过时；或者您可能已修改了本地工作副本。在这些情况下，在提交更改或决定编辑您的工作副本之前，您会希望查看指定文件的内容差异。运行 <code>svn cat FILENAME</code> 将自动从存储库中取出 HEAD 修订版本。这条子命令主要用于检索具有较旧修订版本号的文件，并将其显示在屏幕上。通过在此站点上浏览项目源代码，也可以执行相同的操作。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code>
<p id="svnclean"><strong>清理工作副本</strong>：<code>svn cleanup</code></p>
<p>有时可能会出现&#8220;工作副本已锁定&#8221;错误。若要删除锁定，并递归清理工作副本，请使用 <code>svn update</code>。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--diff3-cmd CMD, --config-dir DIR</code>
<p>请参见 <a href="http://svnbook.red-bean.com/svnbook/ch03s07.html#svn-ch-3-sect-7.1"><code>svn cleanup</code></a>。</p>
<p id="svncopy"><strong>复制工作副本或存储库中的文件或目录</strong>：<code>svn copy</code></p>
<p>在项目中，您可能需要用到过去的旧文档。例如，您可能想要使用一个已存在的 HTML 文件，使用其代码作为参考以在创建新内容时保持产品外观和感觉。创建文件时，您无需从头开始，只需使用 <code>svn copy</code> 复制此文件，然后将其另存为其它名称并更改其内容。您可以从存储库将文件复制为本地工作副本，也可以将本地工作副本复制回存储库文件。您还可以在本地工作副本内部复制文件。Subversion 不支持在存储库之间进行复制。可使用 <code>svn copy SRC DST</code> 完成此操作。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR</code>
<p>请参见 <a href="http://svnbook.red-bean.com/svnbook/re07.html"><code>svn copy</code></a>。</p>
<p id="svndel"><strong>从本地工作副本中删除文件或目录</strong>：<code>svn delete</code></p>
<p>您可能希望从本地工作副本中删除不需要的文件。使用 <code>svn delete FILENAME</code> 可安排删除文件。仅当您提交时，才会在存储库中将该文件实际删除。</p>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--force, --force-log, --message (-m) TEXT, --file (-F) FILE, --quiet (-q), --targets FILENAME, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR</code> </p>
<p id="svndiff"><strong>查看文件之间的差异</strong>：<code>svn diff</code></p>
<p>可以使用 <code>svn diff</code> 显示工作副本中的指定文件相对于存储库中相应文件所做的本地修改。在命令提示符处，请键入：</p>
<code>svn diff (文件的路径) (项目存储库的 URL)</code>
<p>例如，若要将本地修改后的文件&#8220;index.html&#8221;与项目存储库中的相应文件进行比较，请键入：</p>
<code>svn diff $SRC/...../index.html https://(项目名称).(域)/svn/(项目名称)/trunk (项目名称) --username [在此处输入用户名]</code>
<p>除此之外，您也可以转到该文件所属的目录，并键入：</p>
<code>svn diff (FILENAME)</code>
<p>该命令将显示差异，并且带有修订版本号。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --old OLD-TARGET, --new NEW-TARGET, --extensions (-x) "ARGS", --non-recursive (-N), --diff-cmd CMD, --notice-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --no-diff-deleted, --config-dir DIR</code>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch03s06.html">检查历史</a>、<a href="http://svnbook.red-bean.com/svnbook/re09.html"><code>svn diff</code></a>。</p>
<p id="svnexp"><strong>在本地计算机上导出空目录树</strong>：<code>svn export</code></p>
<p>在您的本地计算机上，可以从项目存储库或本地工作副本内部提取一个无版本的副本，也称为空目录树。若要从存储库中获得较旧修订版本的空目录，请键入：</p>
<code>svn export [-r REV] [PATH]</code>
<p>该命令将从 URL 指定的存储库中的修订版本 REV 位置（如果指定，否则从 HEAD 位置）将空目录树导出到 PATH。如省略 PATH，则该 URL 的最后一部分将用作本地目录名称。除此之外，您也可以在本地计算机内部，从一个工作副本（由 PATH1 指定）向另一工作副本（由 PATH2 指定）导出空目录树。这将保留所有的本地更改，但不会复制版本控制中的文件。若要执行此操作，请键入：</p>
<code>svn export PATH1 PATH2</code>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code></p>
<p id="svnhelp"><strong>获取有关 Subversion 的帮助</strong>：<code>svn help</code></p>
<p>Subversion 可以在命令行界面为您提供帮助。若要获得有关特定子命令的帮助，请键入：</p>
<code>svn help [SUBCOMMAND...]</code>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--version, --quiet (-q)</code> </p>
<h3 id="contributing">将您的更改提供给 SVN 存储库</h3>
<p>对文件和/或目录进行本地更改后，您必须向 SVN 存储库提交这些更改。 </p>
<p id="svncommit"><strong>提交您的更改</strong>：<code>svn commit</code></p>
<p>若要向共享存储库提交您的更改，请键入：</p>
<code>svn commit -m "请在此处键入您的理由"</code>
<p>如果您不包括对该文件更改的描述，系统将提示您调用文件编辑器添加描述，然后 svn 才能完成提交操作；否则将会出现&#8220;提交失败&#8221;错误。所有的提交都会被自动记录，并发布到项目的提交讨论中。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --targets FILENAME, --force-log, --username USER, --password PASS, --no-auth-cache, --non-interactive, --encoding ENC, --config-dir DIR</code>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.5">提交您的更改</a>、<a href="http://svnbook.red-bean.com/svnbook/ch07.html#svn-ch-7-sect-1.3.2">editor-cmd</a>。</p>
<p id="svnimp"><strong>将无版本的文件或树导入到项目存储库中</strong>：<code>svn import</code></p>
<p>您可以使用 <code>svn import</code> 将无版本的文件或树递归提交到项目存储库中。将根据需要在存储库中创建父目录。使用下面的命令可以从 PATH 向 URL 递归提交副本。如果省略 PATH，将认为其为&#8220;.&#8221;。</p>
<code>svn import [PATH] URL</code>
<p>示例：若要在您的本地计算机上创建带有一个文件的无版本目录 (<strong>D</strong>)。请点击项目左侧导航窗格中的<strong>&#8220;Subversion&#8221;</strong>链接，找到 Subversion 页面。请注意，<strong>&#8220;浏览源代码&#8221;</strong>下未列出 NEWDIR。若要将 <strong>D</strong> 导入项目存储库，请键入：</p>
<code>svn import -m "请在此处键入您的信息" <strong>D</strong> http://(项目名称).(域)/svn/(项目名称)/NEWDIR</code>
<p>刷新该页面。请注意，此时<strong>&#8220;浏览源代码&#8221;</strong>下列出了 <strong>D</strong>。点击 <strong>D</strong> 查看该文件。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --non-recursive (-N), --username USER, --password PASS, --no-auth-cache, --non-interactive, --force-log, --editor-cmd EDITOR, --encoding ENC, --config-dir DIR, --auto-props, --no-auto-props</code>
<p id="svninfo"><strong>打印有关工作副本中路径的信息</strong>：<code>svn info</code></p>
<p>有时，您将需要有关工作副本中文件的具体信息，以执行某些子命令。键入 <code>svn info</code>，将打印出详尽且有用的信息，这些信息涉及工作副本中的工作副本路径中的项，其中包括：路径、名称、URL、修订版本、节点类型、上次更改、作者、上次更改修订版本、上次更改日期、上次更新的文本、上次更新的属性以及校验和。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--targets FILENAME, --recursive (-R), --config-dir DIR</code>
<p id="svnlist"><strong>查看存储库中的目录项列表</strong>：<code>svn list</code></p>
<p>在开始处理项目或取出&#8220;工作副本&#8221;之前，您可能希望查看项目存储库中的内容（即目录和文件），或查看本地工作副本中的目录项。在命令提示符处键入 <code>svn list [TARGET...]</code>，也可以查看这些内容。除此之外，您也可以找到项目中的<strong>&#8220;软件配置管理&#8221;</strong>页，查看项目存储库。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --verbose (-v), --recursive (-R), --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code>
<p id="svnlog"><strong>查看提交日志信息</strong>：<code>svn log</code></p>
<p>如果要查看&#8220;工作副本&#8221;或存储库中文件/目录的各个文件/目录历史，以跟踪修订信息，请键入：</p>
<code>svn log [PATH]</code>
<p>该命令会显示出文件/目录的修订信息，从最近所做的修订版本开始显示提交信息和作者姓名等信息。除此之外，您也可以使用该站点，查看项目存储库中各个文件的提交日志信息。请点击项目左侧导航窗格中的<strong>&#8220;Subversion&#8221;</strong>链接。将出现 <strong>Subversion</strong> 页。搜索<strong>&#8220;浏览源代码&#8221;</strong>的目录中的文件，然后点击文件名。这时将会显示一个提交日志信息页面。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --quiet (-q), --verbose (-v), --targets FILENAME, --stop-on-copy, --incremental, --xml, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code>
<p>请参见 <a href="http://svnbook.red-bean.com/svnbook/ch03s06.html#svn-ch-3-sect-5.1"><code>svn log</code></a>。</p>
<p id="svnmer"><strong>合并更改</strong>：<code>svn merge</code></p>
<p>您可以运行 <code>svn merge</code> 命令，以指示 Subversion 将存储库中最新版本的文件合并到您的工作副本中。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --non-recursive (-N), --quiet (-q), --force, --dry-run, --diff3-cmd CMD, --ignore-ancestry, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code>
<p>请参见 <a href="http://svnbook.red-bean.com/svnbook/re16.html"><code>svn merge</code></a>、<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.4">解决冲突（合并其他人的更改）</a>、<a href="http://svnbook.red-bean.com/svnbook/ch04s04.html">分支和合并：常见合并使用案例</a>、<a href="http://svnbook.red-bean.com/svnbook/ch04s03.html#svn-ch-4-sect-3.2">合并最佳实践</a>。</p>
<h3 id="workwithrep">使用存储库</h3>
<p id="svnmkdir"><strong>创建新目录</strong>：<code>svn mkdir</code></p>
<p>若要在您的工作副本中创建新目录，请键入：</p>
<code>svn mkdir PATH</code>
<p>若要在您的项目存储库中创建新目录，请键入：</p>
<code>svn mkdir URL</code>
<p>PATH 或 URL 的最后一部分决定目录名称。在立即提交时在存储库中创建目录，所以还需要一条提交信息</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--message (-m) TEXT, --file (-F) FILE, --quiet (-q), --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR </code>
<p id="svnmove"><strong>移动文件或目录</strong>：<code>svn move</code></p>
<p>您可以使用 <code>svn move SRC DST</code> 在工作副本或项目存储库内部移动文件或目录。此命令等效于在使用 <code>svn copy</code> 后，再使用 <code>svn delete</code>。在工作副本内部移动文件或目录，不仅会移动该文件或目录，而且还将安排它以便于下次提交时进行添加。在项目存储库内部移动文件或目录属于封闭单元式提交，所以需要一条提交信息。</p>
<code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--message (-m) TEXT, --file (-F) FILE, --revision (-r) REV, --quiet (-q), --force, --username USER, --password PASS, --no-auth-cache, --non-interactive, --editor-cmd EDITOR, --encoding ENC, --force-log, --config-dir DIR</code>
<p id="svnprop"><strong>使用属性</strong></p>
<p>Subversion 具有很多具体属性，这些属性影响或决定其行为。您可以修改、提交和撤消属性更改，就像对文件内容所执行的操作一样。您还可以从本地工作副本或项目存储库的文件、目录或修订版本中，删除、编辑、打印、列出以及设置属性。</p>
<p>请参见 <a href="http://svnbook.red-bean.com/svnbook/ch07s02.html">属性</a>、<a href="http://svnbook.red-bean.com/svnbook/ch05.html#svn-ch-5-sect-1.2">无版本属性</a>、<a href="http://svnbook.red-bean.com/svnbook/apas06.html">元数据属性</a>、<a href="http://svnbook.red-bean.com/svnbook/re19.html"><code>svn propdel</code></a>、<a href="http://svnbook.red-bean.com/svnbook/re20.html"><code>svn propedit</code></a>、<a href="http://svnbook.red-bean.com/svnbook/re21.html"><code>svn propget</code></a>、<a href="http://svnbook.red-bean.com/svnbook/re22.html"><code>svn proplist</code></a>、<a href="http://svnbook.red-bean.com/svnbook/re23.html"><code>svn propset</code></a>、<a href="http://svnbook.red-bean.com/svnbook/ch05s02.html#svn-ch-5-sect-2.1">Hook 脚本</a>。</p>
<p id="svnres"><strong>解决冲突</strong>：<code>svn resolved</code></p>
<p>更新本地工作副本时，可能会遇到冲突。您需要解决此冲突。解决冲突后，键入 <code>svn resolved PATH...</code>，通知工作副本该冲突已&#8220;解决&#8221;。</p>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR</code></p>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.4">解决冲突（合并其他人的更改）</a>。</p>
<p id="svnrevert"><strong>撤消您的更改</strong>：<code>svn revert</code></p>
<p>使用 Subversion 时，您会发现 <code>svn revert PATH...</code> 等效于 Windows 中的 <code>Ctrl Z</code>。您可以： </p>
<ul>
    <li>撤消本地工作副本中的任何本地更改，从而解决冲突状态。
    <li>撤消工作副本中的条目内容及属性更改。
    <li>取消任何进度安排操作，如添加文件、删除文件等。 </li>
</ul>
<p><strong>注意</strong>，如不提供目标，会导致工作副本中的更改丢失。</p>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--targets FILENAME, --recursive (-R), --quiet (-q), --config-dir DIR</code></p>
<p id="svnstatus"><strong>获取文件/目录的状态</strong>：<code>svn status</code> </p>
<p>在版本控制中，将更改提交到项目存储库之前最好对其进行审查。可以运行 <code>svn status</code> 打印工作副本中的文件和目录的状态。打印结果为八列编码输出。由于每列都有详尽的图例，若要从此输出中得出&#8220;无错误&#8221;的结论几乎不可能。若要使此任务更加简单，并同时可看到示例，请在命令提示符处键入 <code>svn help status</code>。</p>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--show-updates (-u), --verbose (-v), --non-recursive (-N), --quiet (-q), --no-ignore, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir</code></p>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.3">检查你的更改</a>。</p>
<p id="svnswitch"><strong>转换工作副本</strong>：<code>svn switch</code></p>
<p>可以使用 <code>svn switch URL [PATH]</code> 更新工作副本，以镜像新的 URL。您还可以将工作副本或部分工作副本移动到新的分支。您可以将此子命令用作分支的快捷方式。</p>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --relocate, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code></p>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch04s05.html">转换工作副本</a>、<a href="http://svnbook.red-bean.com/svnbook/ch04.html">分支和合并</a>以及 <a href="http://svnbook.red-bean.com/svnbook/re27.html"><code>svn switch</code></a>。</p>
<p id="svnupdate"><strong>更新工作副本</strong>：<code>svn update</code></p>
<p>为了进行更好的版本控制，建议您每天用项目存储库更新本地工作副本，请使用：</p>
<p><code>svn update [PATH...]</code></p>
<p>列出的已更新条目以及它们的当前状态显示如下：</p>
<ul>
    <li>A = 已将一个文件添加到您的工作副本中。
    <li>U = 已更新您的工作副本中的一个文件。
    <li>D = 已从您的工作副本中删除一个文件。
    <li>R = 已替换您的工作副本中的一个文件。
    <li>G = 已成功合并了一个文件。
    <li>C = 一个文件已合并了必须手动解决的冲突 </li>
</ul>
<p><code><a href="http://www.open.collab.net/nonav/scdocs/ddSVN_svnswitches.html">转换</a>：--revision (-r) REV, --non-recursive (-N), --quiet (-q), --diff3-cmd CMD, --username USER, --password PASS, --no-auth-cache, --non-interactive, --config-dir DIR</code></p>
<p>请参见<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.1">更新你的工作副本</a>、<a href="http://svnbook.red-bean.com/svnbook/ch03s05.html#svn-ch-3-sect-4.4.1">手动合并冲突</a>。</p>
<p id="svnbranch"><strong>分支和标记</strong></p>
<p>项目的主干通常用作开发主线，而分支通常用作主线的变更。分支是正在进行的开发线。在软件开发生命周期中，如果软件产品的发布版本已到期，经常会用到分支，使测试者可以使用候选版本，使新的开发可以继续进行，不受测试的约束。分支还用于实验性工作，以及完成代码重写。标记是将一组文件修订版本标记为整体的方式。虽然分支和标记都是使用 <code>svn copy</code> 子命令创建的，但它们是完全不同的。分支表示多个修订版本而标记只表示单个修订版本。</p>
<p>本站点上您项目的 Subversion 存储库支持对您的源文件进行分支和标记。对于 Subversion 来说，标记和分支属于简单实用的&#8220;复制&#8221;操作。</p>
<p>若要创建分支或标记项目文件，请键入：</p>
<p><code>svn copy SRC DST -m "在此处键入您的信息"</code></p><img src ="http://www.blogjava.net/kissyan4916/aggbug/309308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-01-13 13:53 <a href="http://www.blogjava.net/kissyan4916/articles/309308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】Subversion权限详解</title><link>http://www.blogjava.net/kissyan4916/articles/309118.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Tue, 12 Jan 2010 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/309118.html</guid><description><![CDATA[<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; font-family: Arial, sans-serif, Helvetica, Tahoma; text-align: left">
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id5" style="color: rgb(0,102,0); text-decoration: underline" name="id5">1&nbsp;&nbsp;&nbsp;背景假设</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">厦门央瞬公司是一家电子元器件设备供应商，其中有个ARM部门，专门负责ARM芯片的方案设计、销售，并在北京、上海各设立了一个办事处。对于工作日志，原先采用邮件方式发给经理，但是这种方式有个缺点，那就是不具备连续性，要看以前的日志必须一封一封邮件去查看，很麻烦。于是就想到利用 Subversion， 让员工在自己电脑上编辑日志，然后利用<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>传送回来，既方便员工自己编写日志，又方便对日志的归档处理，而且提交日志的时候只需要执行一下<span class="Apple-converted-space">&nbsp;</span><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span><span class="Apple-converted-space">&nbsp;</span>update 即可，比发送邮件还要简单的多。</p>
<ul style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 1.5em; padding-top: 0px">
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>服务器相关信息</p>
    <ul class="simple" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 1.5em; padding-top: 0px">
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">服务器地址： 192.168.0.1</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">服务器OS： MS Windows 2000 Server Edition 中文版</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">代码库本地目录：<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">D:\<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>\arm</span></tt></li>
    </ul>
    </li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">arm部门文档的目录结构如下:</p>
    <pre class="literal-block" style="font-size: 1em; font-family: monospace">arm                 部门名称
    ├─diary           工作日志目录
    │  ├─headquarters    总部工作日志目录
    │  ├─beijing         北京办日志目录
    │  └─shanghai        上海办日志目录
    ├─ref             公司公共文件参考目录
    └─temp            临时文件目录
    </pre>
    </li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">人员情况</p>
    <ul class="simple" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 1.5em; padding-top: 0px">
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">morson，公司总经理，其实他不必亲自看任何东西，就连部门经理们的每周总结都不一定看。但是为了表示对他的尊敬，以及满足一下他的权力欲，还是给他开放了&#8220;阅读所有文档&#8221;的权限</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">michael，arm事业部的部门经理，没事的时候喜欢弄点儿新技术，用<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>来管理日志，就是他相处来的主意</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">scofield，北京办人员，老员工，为人油滑难管</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">lincon，上海办人员，老员工，大老实人一个</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">linda，总部协调员、秘书，文笔不错，长得也不错</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">rory，单片机技术员，技术支持</li>
    </ul>
    </li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">访问权限需求分析</p>
    <ul class="simple" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 1.5em; padding-top: 0px">
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">允许总经理读取所有文件</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">除部门经理外，所有其他人员，均只能看到本办事处人员工作日志</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">不允许匿名访问</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">ref目录只允许经理和秘书写，对其他人只读</li>
        <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">temp目录人人都可以写</li>
    </ul>
    </li>
</ul>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id6" style="color: rgb(0,102,0); text-decoration: underline" name="id6">2&nbsp;&nbsp;&nbsp;建立代码库</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">在服务器<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">D:\<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span></span></tt><span class="Apple-converted-space">&nbsp;</span>目录下，建立 arm 代码库，命令如下:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">D:\<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>&gt;svnadmin create arm
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">在客户机<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">F:\temp</span></tt><span class="Apple-converted-space">&nbsp;</span>目录下，建立好上述目录结构</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">用命令<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">F:\temp&gt;<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span></span><span class="pre">import</span><span class="pre">arm</span><span class="pre"><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>://192.168.0.1/arm</span></tt><span class="Apple-converted-space">&nbsp;</span>导入结构</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">【注意点：关于导入时候的细微差别】</p>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id7" style="color: rgb(0,102,0); text-decoration: underline" name="id7">3&nbsp;&nbsp;&nbsp;编辑代码库基础配置文件</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">编辑代码库<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">arm\conf\svnserve.conf</span></tt><span class="Apple-converted-space">&nbsp;</span>文件，如下:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[general]
password-db = passwd.conf
anon-access = none
auth-access = write
authz-db = authz.conf
</pre>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id8" style="color: rgb(0,102,0); text-decoration: underline" name="id8">4&nbsp;&nbsp;&nbsp;管理用户帐号</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">新建代码库<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">arm\conf\passwd.conf</span></tt><span class="Apple-converted-space">&nbsp;</span>文件，如下:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[users]
morson = ShowMeTheMoney
michael = mysecretpassword
scofield = hellolittilekiller
lincon = asyouknows111
rory = 8809117
linda = IlikeWorldCup2006
</pre>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id9" style="color: rgb(0,102,0); text-decoration: underline" name="id9">5&nbsp;&nbsp;&nbsp;建立目录访问权限控制文件</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">新建代码库<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">arm\conf\authz.conf</span></tt><span class="Apple-converted-space">&nbsp;</span>文件，内容如下:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[groups]
g_vip = morson
g_manager = michael
g_beijing = scofield
g_shanghai = lincon
g_headquarters = rory, linda
g_docs = linda
[arm:/]
@g_manager = rw
* = r
[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
[arm:/diary/beijing]
@g_manager = rw
@g_beijing = rw
@g_vip = r
* =
[arm:/diary/shanghai]
@g_manager = rw
@g_shanghai = rw
@g_vip = r
* =
[arm:/ref]
@g_manager = rw
@g_docs = rw
* = r
[arm:/temp]
* = rw
</pre>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id10" style="color: rgb(0,102,0); text-decoration: underline" name="id10">6&nbsp;&nbsp;&nbsp;测试</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">在服务器上，打开一个 DOS Prompt 窗口，输入如下指令:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace"><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span> co <span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>://127.0.0.1/arm --no-auth-cache --username rory --password 8809117
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">我们应该得到如下目录结构:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">arm
├─diary
│  └─headquarters
├─ref
└─temp
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">然后修改ref目录下任意文件并提交，服务器将会报错&#8220;Access deni&#8221;</p>
</div>
<div class="section">
<h1 style="padding-right: 0px; padding-left: 0px; font-size: 2em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id11" style="color: rgb(0,102,0); text-decoration: underline" name="id11">深入</a></h1>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">本章将详细介绍前一章所涉及的两个配置文件， svnserve.conf 和 authz.conf，通过对配置逐行的描述，来阐明其中的一些细节含义。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">这里首先要注意一点，任何配置文件的有效配置行，都不允许存在前置空格，否则程序会无法识别。也就是说，如果你直接从本文的纯文本格式中拷贝了相关的配置行过去，需要手动将前置的4个空格全部删除。当然了，如果你觉得一下子要删除好多行的同样数目的前置空格是一件苦差使，那么也许 UltraEdit 的&#8220;Column Mode&#8221;编辑模式，可以给你很大帮助呢。</p>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="svnserve-conf" style="color: rgb(0,102,0); text-decoration: underline" name="svnserve-conf">1&nbsp;&nbsp;&nbsp;svnserve.conf</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><tt class="docutils literal"><span class="pre">arm\conf\svnserve.conf</span><span class="Apple-converted-space">&nbsp;</span></tt>文件，是 svnserve.exe 这个服务器进程的配置文件，我们逐行解释如下。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">首先，我们告诉 svnserve.exe，用户名与密码放在 passwd.conf 文件下。当然，你可以改成任意的有效文件名，比如默认的就是 passwd:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">password-db = passwd.conf
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">接下来这两行的意思，是说只允许经过验证的用户，方可访问代码库。 那么哪些是&#8220;经过验证的&#8221;用户呢？噢，当然，就是前面说那些在 passwd.conf 文件里面持有用户名密码的家伙。这两行的等号后面，目前只允许 read write none 三种值，你如果想实现一些特殊的值，比如说&#8220;read-once&#8221;之类的，建议你自己动手改源代码，反正它也是自由软件:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">anon-access = none
auth-access = write
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">接下来就是最关键的一句呢，它告诉 svnserve.exe，项目目录访问权限的相关配置是放在 authz.conf 文件里:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">authz-db = authz.conf
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">当然，<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span><span class="Apple-converted-space">&nbsp;</span>1.3.2 引入本功能的时候，系统默认使用 authz 而不是 authz.conf 作为配置文件。不过由于鄙人是处女座的，有着强烈的完美主义情结，看着 svnserve.conf 有后缀而 passwd 和 authz 没有就是不爽，硬是要改了。</p>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="authz-conf" style="color: rgb(0,102,0); text-decoration: underline" name="authz-conf">2&nbsp;&nbsp;&nbsp;authz.conf 之用户分组</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"><tt class="docutils literal"><span class="pre">arm\conf\authz.conf</span><span class="Apple-converted-space">&nbsp;</span></tt>文件的配置段，可以分为两类，``[group]`` 是一类，里面放置着所有用户分组信息。其余以<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">[arm:/]</span></tt><span class="Apple-converted-space">&nbsp;</span>开头的是另外一类，每一段就是对应着项目的一个目录，其目录相关权限，就在此段内设置。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">首先，我们将人员分组管理，以便以后由于人员变动而需要重新设置权限时候，尽量少改动东西。我们一共设置了5个用户分组，分组名称统一采用<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">g_</span></tt><span class="Apple-converted-space">&nbsp;</span>前缀，以方便识别。当然了，分组成员之间采用逗号隔开:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[groups]
# 任何想要查看所有文档的非本部门人士
g_vip = morson
# 经理
g_manager = michael
# 北京办人员
g_beijing = scofield
# 上海办人员
g_shanghai = lincon
# 总部一般员工
g_headquarters = rory, linda
# 小秘，撰写文档
g_docs = linda
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">注意到没有， linda 这个帐号同时存在&#8220;总部&#8221;和&#8220;文档员&#8221;两个分组里面，这可不是我老眼昏花写错了，是因为 svnserve.exe 允许我这样设置。它意味着，这个家伙所拥有的权限，将会比他的同事 rory 要多一些，这样的确很方便。具体多了哪些呢？请往下看！</p>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id12" style="color: rgb(0,102,0); text-decoration: underline" name="id12">3&nbsp;&nbsp;&nbsp;authz.conf 之项目根目录</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">接着，我们对项目根目录做了限制，该目录只允许arm事业部的经理才能修改，其他人都只能眼巴巴的看着:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[arm:/]
@g_manager = rw
* = r
</pre>
<ul class="simple" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 1.5em; padding-top: 0px">
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px"><tt class="docutils literal"><span class="pre">[arm:/]</span><span class="Apple-converted-space">&nbsp;</span></tt>表示这个目录结构的相对根节点，或者说是 arm 项目的根目录</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">这里的<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">@</span></tt><span class="Apple-converted-space">&nbsp;</span>表示接下来的是一个组名，不是用户名。你当然也可以将<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">@g_manager</span><span class="pre">=</span><span class="pre">rw</span></tt><span class="Apple-converted-space">&nbsp;</span>这一行替换成<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">michael</span><span class="pre">=</span><span class="pre">rw</span></tt><span class="Apple-converted-space">&nbsp;</span>，而表达的意义完全一样。</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px"><tt class="docutils literal"><span class="pre">*</span><span class="Apple-converted-space">&nbsp;</span></tt>表示&#8220;除了上面提到的那些人之外的其余所有人&#8221;，也就是&#8220;除了部门经理外的其他所有人&#8221;，当然也包括总经理那个怪老头</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px"><tt class="docutils literal"><span class="pre">*</span><span class="Apple-converted-space">&nbsp;</span><span class="pre">=</span><span class="Apple-converted-space">&nbsp;</span><span class="pre">r</span><span class="Apple-converted-space">&nbsp;</span></tt>则表示&#8220;那些人只能读，不能写&#8221;</li>
</ul>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id13" style="color: rgb(0,102,0); text-decoration: underline" name="id13">4&nbsp;&nbsp;&nbsp;authz.conf 之项目子目录</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">然后，我们要给总部人员开放日志目录的读写权限:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[arm:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =
</pre>
<ul class="simple" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 1.5em; padding-top: 0px">
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">我敢打赌，设计<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>的家伙们，大部分都是在 unix/linux 平台下工作，所以他们总喜欢使用<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">/</span></tt><span class="Apple-converted-space">&nbsp;</span>来标识子目录，而完全忽视在 MS Windows 下是用<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">\</span></tt><span class="Apple-converted-space">&nbsp;</span>来做同样的事情。所以这儿，为了表示<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">arm\diary\headquarters</span></tt><span class="Apple-converted-space">&nbsp;</span>这个目录，我们必须使用<tt class="docutils literal"><span class="pre">[arm:/diary/headquarters]</span></tt><span class="Apple-converted-space">&nbsp;</span>这样的格式。</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">这里最后一行的<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">*</span><span class="pre">=</span></tt><span class="Apple-converted-space">&nbsp;</span>表示，除了经理、总部人员、特别人士之外，任何人都被禁止访问本目录。这一行是否可以省略呢？</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">之所以这儿需要将<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">@g_vip</span><span class="pre">=</span><span class="pre">r</span></tt><span class="Apple-converted-space">&nbsp;</span>一句加上，就是因为存在上述这个解释。如果说你没有明确地给总经理授予读的权力，则他会和其他人一样，被<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">*</span></tt><span class="Apple-converted-space">&nbsp;</span>给排除在外。</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">如果众位看官中间，有谁玩过防火墙配置的话，可能会感觉上述的配置很熟悉。不过这里有一点与防火墙配置不一样，那就是各个配置行之间，没有<span class="Apple-converted-space">&nbsp;</span><strong style="font-weight: bold">先后顺序</strong><span class="Apple-converted-space">&nbsp;</span>一说。也就是说，如果我将本段配置的<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">*</span><span class="pre">=</span></tt><span class="Apple-converted-space">&nbsp;</span>这一行挪到最前面，完全不影响整个配置的最终效果。</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">请注意这儿，我们并没有给<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">arm\diary</span></tt><span class="Apple-converted-space">&nbsp;</span>目录设置权限，就直接跳到其子目录下进行设置了。我当然是故意这样的，因为我想在这儿引入&#8220;继承&#8221;的概念。</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px"><strong style="font-weight: bold">权限具备继承性</strong><span class="Apple-converted-space">&nbsp;</span>任何子目录，均可继承其父目录的所有权限，除非它自己被明确设置了其他的权限。也就是说，在 arm 目录设置权限后，<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">arm\diary</span></tt><span class="Apple-converted-space">&nbsp;</span>目录没有进行设置，就意味着它的权限与 arm 目录一样，都是只有经理才有权读写，其他人只能干瞪眼。</li>
    <li style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">【 * = 是否可以省略】【用例子引入覆盖】【单用户权限的继承问题】【父目录权限集成与全面覆盖问题】</li>
</ul>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">现在来看看</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">好了，我们现在掌握了&#8220;继承&#8221;的威力，它让我们节省了不少敲键盘的时间。可是现在又有一个问题了，</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">属性具备覆盖性质子目录若设置了属性，则完全覆盖父目录。</p>
</div>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id14" style="color: rgb(0,102,0); text-decoration: underline" name="id14">5&nbsp;&nbsp;&nbsp;authz.conf 的其他注意点</a></h2>
<ol class="arabic simple" style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 1.5em; line-height: 1.4em; padding-top: 0px">
    <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">父目录的<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">r</span></tt><span class="Apple-converted-space">&nbsp;</span>权限，对子目录<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">w</span></tt><span class="Apple-converted-space">&nbsp;</span>权限的影响</li>
</ol>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">把这个问题专门提出来，是因为在1.3.1及其以前的版本里面，有个bug，即为了子目录的写权限，项目首目录必须具备读权限。因此现在使用了1.3.2版本，就方便了那些想在一个代码库存放多个相互独立的项目的管理员，来分配权限了。比如说央舜公司建立一个大的代码库用于存放所有员工日志，叫做 diary，而arm事业部只是其中一个部门，则可以这样做:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[diary:/]
@g_chief_manager = rw
[diary:/arm]
@g_arm_manager = rw
@g_arm = r
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">这样，对于所有arm事业部的人员来说，就可以将<span class="Apple-converted-space">&nbsp;</span><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>://192.168.0.1/diary/arm 这个URL当作根目录来进行日常操作，而完全不管它其实只是一个子目录，并且当有少数好奇心比较强的人想试着 checkout 一下<span class="Apple-converted-space">&nbsp;</span><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span>://192.168.0.1/diary 的时候，马上就会得到一个警告&#8220;Access deni&#8221;，哇，太酷了。</p>
<ol class="arabic simple" style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 1.5em; line-height: 1.4em; padding-top: 0px" start="2">
    <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">默认权限</li>
</ol>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">如果说我对某个目录不设置任何权限，会怎样？马上动手做个试验，将:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[diary:/]
@g_chief_manager = rw
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">改成:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[diary:/]
# @g_chief_manager = rw
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">这样就相当于什么都没有设置。在我的<span class="Apple-converted-space">&nbsp;</span><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span><span class="Apple-converted-space">&nbsp;</span>1.3.2 版本上，此时是禁止任何访问。也就是说，如果你想要让某人访问某目录，你一定要显式指明这一点。这个策略，看起来与防火墙的策略是一致的。</p>
<ol class="arabic simple" style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 1.5em; line-height: 1.4em; padding-top: 0px" start="3">
    <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">只读权限带来的一个小副作用</li>
</ol>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">若设置了:</p>
<pre class="literal-block" style="font-size: 1em; font-family: monospace">[arm:/diary]
* = r
</pre>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">则svnserve认为，任何人，都不允许改动diary目录，包括删除和改名，和新增。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">也就是说，如果你在项目初期创建目录时候，一不小心写错目录名称，比如因拼写错误写成 dairy，以后除非你改动 authz.conf 里面的这行设置，否则无法利用<span class="Apple-converted-space">&nbsp;</span><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span><span class="Apple-converted-space">&nbsp;</span>mv 命令将错误的目录更正。</p>
</div>
</div>
<div class="section">
<h1 style="padding-right: 0px; padding-left: 0px; font-size: 2em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id15" style="color: rgb(0,102,0); text-decoration: underline" name="id15">改进</a></h1>
<div class="section">
<h2 style="padding-right: 0px; padding-left: 0px; font-size: 1.5em; padding-bottom: 0px; margin: 0px 0px 0.5em; color: black; line-height: 1.5em; padding-top: 0px"><a id="id16" style="color: rgb(0,102,0); text-decoration: underline" name="id16">1&nbsp;&nbsp;&nbsp;对中文目录的支持</a></h2>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">上午上班的时候，Morson 来到 Michael 的桌子前面，说道：&#8220;你是否可以将我们的北京办、上海办目录，改成用中文的，看着那些拼音我觉得很难受？&#8221; Michael 心想，还好这两天刚了解了一些与 unicode 编码相关的知识，于是微笑地回答：&#8220;当然可以，你明天下午就可以看到中文目录名称了。&#8221;</p>
<ol class="arabic" style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 1.5em; line-height: 1.4em; padding-top: 0px">
    <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">使用<span class="Apple-converted-space">&nbsp;</span><span class="hilite1" style="background-color: rgb(255,255,0)">svn</span><span class="Apple-converted-space">&nbsp;</span>mv 指令，将原来的一些目录改名并 commit 入代码库，改名后的目录结构如下:</p>
    <pre class="literal-block" style="font-size: 1em; font-family: monospace">arm
    ├─工作日志
    │  ├─总部人员
    │  ├─北京办
    │  └─上海办
    ├─公司公共文件参考目录
    └─临时文件存放处
    </pre>
    </li>
    <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">修改代码库的 authz.conf 文件，将相应目录逐一改名</p>
    </li>
    <li style="padding-right: 0px; padding-left: 0px; font-size: 1em; padding-bottom: 0px; margin: 0px 0px 0.25em 30px; padding-top: 0px">
    <p class="first" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">使用 UltraEdit 将 authz.conf 文件转换成不带 BOM 的 UTF-8 格式</p>
    <p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">将配置文件转换成 UTF-8 格式之后，Subversion 就能够正确识别中文字符了。但是这里需要注意一点，即必须保证 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的缩写，指 UNICODE 文件头部用于指明高低字节排列顺序的几个字符，通常是<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">FF</span><span class="pre">FE</span></tt><span class="Apple-converted-space">&nbsp;</span>，而将之用 UTF-8 编码之后，就是<span class="Apple-converted-space">&nbsp;</span><tt class="docutils literal"><span class="pre">EF</span><span class="pre">BB</span><span class="pre">BF</span></tt><span class="Apple-converted-space">&nbsp;</span>。由于 UTF-8 文件本身不存在字节序问题，所以对 UTF-16 等编码方式有重大意义的 BOM，对于 UTF-8 来说，只有一个作用——表明这个文件是 UTF-8 格式。由于 BOM 会给文本处理带来很多难题，所以现在很多软件都要求使用不带 BOM 的 UTF-8 文件，特别是一些处理文本的软件，如 PHP、 UNIX 脚本文件等，<span class="hilite1" style="background-color: rgb(255,255,0)">svn</span><span class="Apple-converted-space">&nbsp;</span>也是如此。</p>
    </li>
</ol>
<blockquote style="border-right: rgb(204,204,204) 1px solid; border-top: rgb(204,204,204) 1px solid; margin-left: 10px; border-left: rgb(204,204,204) 1px solid; border-bottom: rgb(204,204,204) 1px solid; background-color: rgb(250,250,250)">
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">目前常用的一些文本编辑工具中，MS Windows 自带的&#8220;记事本&#8221;里面，&#8220;另存为&#8221;菜单保存出来的 UTF-8 格式文件，会自动带上 BOM 。新版本 UltraEdit 提供了选项，允许用户选择是否需要 BOM，而老版本的不会添加 BOM。请各位查看一下自己常用的编辑器的说明文件，看看它是否支持这个功能。</p>
<p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">利用 UltraEdit ，我们可以将 BOM 去掉。方法是，首先利用&#8220;UTF-8 TO ASCII&#8221;菜单将文件转换成本地编码，通常是GB2312码，然后再使用&#8220;ASCII TO UTF-8(UNICODE Editing)&#8221;来转换到 UTF-8 即可。</p>
</blockquote></div>
</div>
</span></span><img src ="http://www.blogjava.net/kissyan4916/aggbug/309118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2010-01-12 11:52 <a href="http://www.blogjava.net/kissyan4916/articles/309118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring junit 测试(转)</title><link>http://www.blogjava.net/kissyan4916/articles/305563.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Fri, 11 Dec 2009 06:23:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/305563.html</guid><description><![CDATA[利用spring的mock类进行单元测试： <br />
spring框架提供了大量测试的mock类,包括与jndi,porlet,web应用相关的mock类。尤其是web应用相关的mock类，可以大大提高web组件测试的方便性。
<p>打开spring的下载包的mock文件夹(路径...mock\org\springframework\mock\web),就发觉有如下几个文件:</p>
<p><font color="#ff0000">MockHttpServletRequest</font>:是HttpServletRequest接口的mock实现，用来模拟客户端的HTTP请求，很常用的一个类。</p>
<p><font color="#ff0000">MockHttpServletResponse</font>:是HttpServletResponse接口的mock实现，用于模拟服务器对客户端的响应。</p>
<p><font color="#ff0000">MockHttpSession</font>:是对HttpSession接口的mock实现。</p>
<p><font color="#ff0000">DelegatingServletInputStream</font>:是对ServletInputStream接口的mock实现。</p>
<p><font color="#ff0000">DelegatingServletOutputStream</font>:ServletOutputStream的mock实现。需要拦截和分析服务器的输出的流的内容，可以使用该类。</p>
<p>其他的，例如MockFilterConfig,MockPageContext(可以测试预编译的JSP),MockRequestDispatcher,MockServletConfig看名称就知道大概是mock什么的。 <br />
举一个例子： <br />
&nbsp;&nbsp;&nbsp; MockHttpServletRequest request =&nbsp; new MockHttpServletRequest("POST","/index.do");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; request.addParameter("username","name");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; request.addParameter("password","word");&nbsp; </p>
<p><font color="#0000ff"><strong>利用spring来进行集成测试</strong></font>： <br />
1、<font color="#ff0000">AbstractSpringContextTests类</font><font color="#ff0000">[1],</font>该类全部方法是protected的，<font color="#0000ff">通常不使用这个类，而使用它的子类们</font>。</p>
<p>2、<font color="#ff0000">AbstractDependencyInjectionSpringContextTests类</font>[2]：<font color="#ff0000">继承于类[1]</font>：名字N长的。如果<font color="#0000ff">仅仅使用Spring依赖注入功能</font>，<font color="#0000ff">可以让测试用例继承该类</font>。</p>
<p>3、<font color="#ff0000">AbstractTransactionalSpringContextTests类[3]:继承于类[2]</font>，继承该类的测试用例在<font color="#0000ff">spring管理的事务中进行，测试完后对数据库的记录不会造成任何影响</font>。<font color="#ff00ff">你对数据库进行一些操作后，它会自动把数据库回滚，这样就保证了你的测试对于环境没有任何影响</font></p>
<p>4、<font color="#ff0000">AbstractTransactionalDataSourceSpringContextTests</font>：<font color="#ff0000">继承于类[3]</font>，功能更强大，<font color="#0000ff">用于测试持久层组件,</font>看其源代码，有一行"protected JdbcTemplate jdbcTemplate;"，<font color="#0000ff">提供了一个JdbcTemplate的变量</font>，通过该对象可以直接操作数据库。</p>
<p><a href="http://lighter.javaeye.com/blog/41733">http://lighter.javaeye.com/blog/41733</a>&nbsp;还提供了两个用spring来进行集成测试(对数据库操作进行测试)，业务测试(对业务层进行测试)的例子供下载。</p>
<p><font size="3" color="#ff0000"><strong>***如何在你的TestCase Class里取得spring context (注意路径问题)？***</strong></font></p>
<p>你的TestCase Class必须继承的是上述四个<font color="#ff0000">AbstractXXXSpringContextTests</font>中的其中一个，那么就<font color="#0000ff">必须实现下面这个方法来取得spring context</font>：</p>
<p>&nbsp;&nbsp; protected abstract String[] <font color="#ff0000">getConfigLocations</font>();</p>
<p>例如：</p>
<p>&nbsp;<font color="#ff0000">public String[] getConfigLocations() {<br />
&nbsp;&nbsp;&nbsp; String[] configLocations = { "applicationContext.xml","hibernate-context.xml" };<br />
&nbsp;&nbsp;&nbsp; return configLocations;<br />
&nbsp;}</font></p>
<p><br />
<font size="4" color="#ff00ff"><strong>请 注意要加载的context xml
file的路径问题：上述的代码是基于classpath，因此applicationContext.xml和hibernate-
context.xml必须放在classpath里（方法一是把xml
files放到WEB-INF/classes目录下，另一种方法就是在project properties里把xml
files的路径加到classpath里）</strong></font></p>
<p>那么<font size="3" color="#ff00ff"><strong>如果你一定要把context xml files放到WEB-INF目录下，也是可以的，那么应该基于file(基于file的相对路径是相对于project root folder)，代码如下：</strong></font></p>
<p><font color="#000000">&nbsp;public String[] getConfigLocations() {<br />
&nbsp;&nbsp;&nbsp; String[] configLocations = { "<font color="#ff0000">file:WebContent/WEB-INF/applicationContext.xml</font>"};<br />
&nbsp;&nbsp;&nbsp; return configLocations;<br />
&nbsp;}<br />
</font></p>
<p><font color="#ff0000">AbstractXXXSpringContextTests</font>就会根据根据<font color="#ff0000">getConfigLocations</font>方法返回的context xml位置的数组来加载<font color="#ff0000">并且对加载的Context提供缓存</font>。
这是非常重要的，因为如果你在从事一个大项目时，启动时间可能成为一个问题－－这不是Spring自身的开销，而是被Spring容器实例化的对象在实例
化自身时所需要的时间。例如，一个包括50-100个Hibernate映射文件的项目可能需要10-20秒的时间来加载上述的映射文件，如果在运行每个
测试fixture里的每个测试案例前都有这样的开销，将导致整个测试工作的延时，最终有可能（实际上很可能）降低效率。</p>
<p>在某种极偶然的情况下，某个测试可能&#8220;弄脏&#8221;了配置场所，并要求重新加载－－例如改变一个bean的定义或者一个应用对象的状态－－你可以调用 <code class="classname"><font color="#ff0000">AbstractDependencyInjectionSpringContextTests</font></code> 上的 <code class="literal"><font color="#ff0000">setDirty</font>()</code> 方法来重新加载配置并在执行下一个测试案例前重建application context</p>
<p>&nbsp;</p>
<p>当类 <font color="#ff0000">AbstractDependencyInjectionSpringContextTests</font><font color="#ff0000">（及其子类）</font>装载你的Application Context时，你<font color="#0000ff">可以通过Setter方法来注入</font>你想要的来自context的bean,而<font color="#0000ff">不需要显式的调用applicationContext.getBean(XXX)</font>。因为AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指定的配置文件中帮你自动注入</p>
<p>下面的例子就是通过setter方法来获得context里的ProductManager bean：</p>
<p>public class MyTest <font color="#ff0000">extends AbstractDependencyInjectionSpringContextTests</font> {<br />
&nbsp;&nbsp;&nbsp; ProductManager productManager;</p>
<p>&nbsp;&nbsp;&nbsp; public String[] <font color="#ff0000">getConfigLocations</font>() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return configLocations;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void testGetProduct() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals("tomson",productManager.getProductByName("tomson").getName());<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;<font color="#0000ff"> //通过setter方法自动从context里注入productManager bean，而不用显示调用applicationContext</font><font color="#0000ff">.getBean(XXX)</font><br />
&nbsp;&nbsp;&nbsp; public void <font color="#ff0000">setProductManager</font>(ProductManager productManager) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.productManager = productManager;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
</p>
<p>但是<font color="#ff0000"><strong>如
果context里有多个bean都定义为一个类型（例如有多个bean都是ProductManager
class类型的），那么对这些bean就无法通过setter方法来自动依赖注入（因为有多个bean同一个类型，不知要自动注入哪个）。在这种情况下
你需要显示的调用applicationContext.getBean(XXX)来注入</strong></font>。如：</p>
<p>public class MyTest extends AbstractDependencyInjectionSpringContextTests {<br />
&nbsp;&nbsp; ProductManager productManager;</p>
<p>&nbsp;&nbsp; public String[] getConfigLocations() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] configLocations = { "file:WebContent/WEB-INF/applicationContext.xml" };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return configLocations;<br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;public void onSetUp() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000"> productManager = (ProductManager) applicationContext.getBean("productManager");</font><br />
&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; public void testGetProduct() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertEquals("tomson",productManager.getProductByName("tomson").getName());<br />
&nbsp;&nbsp; }<br />
&nbsp;<br />
}<br />
</p>
<p>如果你的<font color="#ff0000">TestCase不使用依赖注入，只要不定义任何setters方法即可</font>。<font color="#ff0000">或者你可以继承 AbstractSpringContextTests</font> －－这个 org.springframework.test 包中的根类，而不是继承<font color="#ff0000">AbstractDependencyInjectionSpringContextTests（及其子类）</font>。这是<font color="#0000ff">因为AbstractSpringContextTests 只包括用来加载Spring Context的便利方法但没有自动依赖注入的功能。</font></p><img src ="http://www.blogjava.net/kissyan4916/aggbug/305563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-12-11 14:23 <a href="http://www.blogjava.net/kissyan4916/articles/305563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2+Spring分页</title><link>http://www.blogjava.net/kissyan4916/articles/281105.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 10 Jun 2009 04:26:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/281105.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/281105.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/281105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/281105.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/281105.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp; 今天写了一个分页程序，是使用struts2+Spring完成的，现提供完整的源代码。如果看完后，还有不明白之处大家可以给我发邮件：chenyanhubusiness@gmail.com&nbsp;&nbsp;&nbsp;&nbsp; 在这里对struts2 和 Spring的基本配置我就不多说了，在这个小程序中数据源我是使用Spring提供...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissyan4916/articles/281105.html'>阅读全文</a><img src ="http://www.blogjava.net/kissyan4916/aggbug/281105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-06-10 12:26 <a href="http://www.blogjava.net/kissyan4916/articles/281105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 文件上传类型(转)</title><link>http://www.blogjava.net/kissyan4916/articles/277851.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 25 May 2009 09:03:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/277851.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/277851.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/277851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/277851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/277851.html</trackback:ping><description><![CDATA[<div id="blog_text" class="cnt">
<li><span><span>Description of Data Content Typical Filename Extensions  &nbsp;&nbsp;</span></span></li>
<li><span>  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>MIME type/subtype  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Text and Text-Related Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>HTML text data (RFC </span><span class="number">1866</span><span>) html htm&nbsp;&nbsp;&nbsp;&nbsp; text/html  &nbsp;&nbsp;</span></li>
<li><span>Plain text: documents; program listings txt c c++ pl cc h&nbsp;&nbsp;&nbsp; text/plain&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Richtext (obsolete - replaced by text/enriched)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/richtext&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Structure enhanced text&nbsp;&nbsp; (etx?)&nbsp;&nbsp;&nbsp;&nbsp; text/x-setext  &nbsp;&nbsp;</span></li>
<li><span>Enriched text markup (RFC </span><span class="number">1896</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/enriched  &nbsp;&nbsp;</span></li>
<li><span>Tab-separated values (tabular) (tsv?)&nbsp;&nbsp;&nbsp;&nbsp; text/tab-separated-values&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>SGML documents (RFC </span><span class="number">1874</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/sgml  &nbsp;&nbsp;</span></li>
<li><span>Speech synthesis data (MVP Solutions)&nbsp;&nbsp; talk&nbsp;&nbsp;&nbsp; text/x-speech&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Document Stylesheet Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Cascading Stylesheets&nbsp;&nbsp; css&nbsp;&nbsp;&nbsp;&nbsp; text/css  &nbsp;&nbsp;</span></li>
<li><span>DSSSL-online stylesheets&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/dsssl (proposed)&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Image Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><font color="#ff0000"><span>GIF&nbsp;&nbsp; gif&nbsp;&nbsp;&nbsp; image/gif  &nbsp;&nbsp;</span> </font></li>
<li><span>X-Windows bitmap (b/w)&nbsp;&nbsp; xbm&nbsp;&nbsp;&nbsp;&nbsp; image/x-xbitmap  &nbsp;&nbsp;</span></li>
<li><span>X-Windows pixelmap (</span><span class="number">8</span><span>-bit color)&nbsp;&nbsp; xpm&nbsp;&nbsp;&nbsp;&nbsp; image/x-xpixmap  &nbsp;&nbsp;</span></li>
<li><span>Portable Network Graphics png&nbsp;&nbsp;&nbsp;&nbsp; image/x-png  &nbsp;&nbsp;</span></li>
<li><span>Image Exchange Format (RFC </span><span class="number">1314</span><span>) ief&nbsp;&nbsp;&nbsp;&nbsp; image/ief  &nbsp;&nbsp;</span></li>
<li><span>JPEG&nbsp;&nbsp; jpeg jpg jpe&nbsp;&nbsp;&nbsp;<font color="#ff0000">image/jpeg</font>  &nbsp;&nbsp;</span></li>
<li><span>TIFF&nbsp;&nbsp; tiff tif&nbsp;&nbsp;&nbsp; image/tiff  &nbsp;&nbsp;</span></li>
<li><span>RGB&nbsp;&nbsp; rgb&nbsp;&nbsp;&nbsp; image/rgb  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image/x-rgb&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Group III Fax (RFC </span><span class="number">1494</span><span>) g3f&nbsp;&nbsp;&nbsp;&nbsp; image/g3fax  &nbsp;&nbsp;</span></li>
<li><span>X Windowdump format xwd&nbsp;&nbsp;&nbsp; image/x-xwindowdump  &nbsp;&nbsp;</span></li>
<li><span>Macintosh PICT format pict&nbsp;&nbsp;&nbsp;&nbsp; image/x-pict  &nbsp;&nbsp;</span></li>
<li><span>PPM (UNIX PPM </span><span class="keyword">package</span><span>) ppm&nbsp;&nbsp;&nbsp;&nbsp; image/x-portable-pixmap  &nbsp;&nbsp;</span></li>
<li><span>PGM (UNIX PPM </span><span class="keyword">package</span><span>) pgm&nbsp;&nbsp;&nbsp;&nbsp; image/x-portable-graymap&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>PBM (UNIX PPM </span><span class="keyword">package</span><span>) pbm&nbsp;&nbsp;&nbsp;&nbsp; image/x-portable-bitmap  &nbsp;&nbsp;</span></li>
<li><span>PNM (UNIX PPM </span><span class="keyword">package</span><span>) pnm&nbsp;&nbsp;&nbsp;&nbsp; image/x-portable-anymap  &nbsp;&nbsp;</span></li>
<li><span>Microsoft Windows bitmap&nbsp;&nbsp; bmp&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">image/x-ms-bmp</font>  &nbsp;&nbsp;</span></li>
<li><span>CMU raster&nbsp;&nbsp; ras&nbsp;&nbsp;&nbsp; image/x-cmu-raster  &nbsp;&nbsp;</span></li>
<li><span>Kodak Photo-CD&nbsp;&nbsp; pcd&nbsp;&nbsp;&nbsp; image/x-photo-cd  &nbsp;&nbsp;</span></li>
<li><span>Computer Graphics Metafile&nbsp;&nbsp; cgm&nbsp;&nbsp;&nbsp;&nbsp; image/cgm  &nbsp;&nbsp;</span></li>
<li><span>North Am. Presentation Layer Protocol&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image/naplps  &nbsp;&nbsp;</span></li>
<li><span>CALS Type </span><span class="number">1</span><span> or </span><span class="number">2</span><span> mil cal&nbsp;&nbsp;&nbsp;&nbsp; image/x-cals  &nbsp;&nbsp;</span></li>
<li><span>Fractal Image Format (Iterated Systems)&nbsp;&nbsp; fif&nbsp;&nbsp;&nbsp; image/fif&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>QuickSilver active image (Micrografx)&nbsp;&nbsp; dsf&nbsp;&nbsp;&nbsp; image/x-mgx-dsf&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>CMX vector image (Corel) cmx&nbsp;&nbsp;&nbsp;&nbsp; image/x-cmx  &nbsp;&nbsp;</span></li>
<li><span>Wavelet-compressed (Summus) wi&nbsp;&nbsp;&nbsp;&nbsp; image/wavelet  &nbsp;&nbsp;</span></li>
<li><span>AutoCad Drawing (SoftSource) dwg&nbsp;&nbsp;&nbsp;&nbsp; image/vnd.dwg  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image/x-dwg&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>AutoCad DXF file (SoftSource) dxf&nbsp;&nbsp;&nbsp;&nbsp; image/vnd.dxf  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; image/x-dxf&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Simple Vector Format (SoftSource) svf&nbsp;&nbsp;&nbsp; image/vnd.svf&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; also vector/x-svf&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Audio/Voice/Music Related Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span class="string">"basic"</span><span>audio - </span><span class="number">8</span><span>-bit u-law PCM au snd&nbsp;&nbsp;&nbsp; audio/basic&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Macintosh audio format (AIpple) aif aiff aifc&nbsp;&nbsp;&nbsp;&nbsp; audio/x-aiff  &nbsp;&nbsp;</span></li>
<li><span>Microsoft audio&nbsp;&nbsp; wav&nbsp;&nbsp;&nbsp;&nbsp; audio/x-wav  &nbsp;&nbsp;</span></li>
<li><span>MPEG audio&nbsp;&nbsp; mpa abs mpega&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">audio/x-mpeg</font>  &nbsp;&nbsp;</span></li>
<li><span>MPEG-</span><span class="number">2</span><span> audio mp2a mpa2&nbsp;&nbsp;&nbsp;&nbsp; audio/x-mpeg-</span><span class="number">2</span><span>  &nbsp;&nbsp;</span></li>
<li><span>compressed speech (Echo Speech Corp.)&nbsp;&nbsp; es&nbsp;&nbsp;&nbsp; audio/echospeech&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Toolvox speech audio (Voxware) vox&nbsp;&nbsp;&nbsp;&nbsp; audio/voxware&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>RapidTransit compressed audio (Fast Man)&nbsp;&nbsp; lcc&nbsp;&nbsp;&nbsp; application/fastman&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Realaudio (Progressive Networks) ra ram&nbsp;&nbsp;&nbsp; application/x-pn-realaudio&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>NIFF music notation data format&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.music-niff&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>MIDI music data&nbsp;&nbsp; mmid&nbsp;&nbsp;&nbsp; x-music/x-midi  &nbsp;&nbsp;</span></li>
<li><span>Koan music data (SSeyo) skp&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.koan  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-koan&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Speech synthesis data (MVP Solutions)&nbsp;&nbsp; talk&nbsp;&nbsp;&nbsp; text/x-speech&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Video Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>MPEG video mpeg mpg mpe&nbsp;&nbsp;&nbsp; video/mpeg  &nbsp;&nbsp;</span></li>
<li><span>MPEG-</span><span class="number">2</span><span> video mpv2 mp2v&nbsp;&nbsp;&nbsp; video/mpeg-</span><span class="number">2</span><span>  &nbsp;&nbsp;</span></li>
<li><span>Macintosh Quicktime qt mov&nbsp;&nbsp;&nbsp;&nbsp; video/quicktime  &nbsp;&nbsp;</span></li>
<li><span>Microsoft video&nbsp;&nbsp; avi&nbsp;&nbsp;&nbsp; video/x-msvideo  &nbsp;&nbsp;</span></li>
<li><span>SGI Movie format movie&nbsp;&nbsp;&nbsp; video/x-sgi-movie  &nbsp;&nbsp;</span></li>
<li><span>VDOlive streaming video (VDOnet) vdo&nbsp;&nbsp;&nbsp; video/vdo&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Vivo streaming video (Vivo software)&nbsp;&nbsp; viv&nbsp;&nbsp;&nbsp; video/vnd.vivo&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; video/vivo&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Special HTTP/Web Application Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Proxy autoconfiguration (Netscape browsers)&nbsp;&nbsp; pac&nbsp;&nbsp;&nbsp; application/x-ns-proxy-autoconfig&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>See Chapter </span><span class="number">6</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-www-form-urlencoded  &nbsp;&nbsp;</span></li>
<li><span>See Chapter </span><span class="number">9</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-www-local-exec  &nbsp;&nbsp;</span></li>
<li><span>See Chapter </span><span class="number">9</span><span> (Netscape extension)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/x-mixed-replace&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>See Chapter </span><span class="number">9</span><span> and Appendix B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/form-data  &nbsp;&nbsp;</span></li>
<li><span>Netscape Cooltalk chat data (Netscape)&nbsp;&nbsp; ice&nbsp;&nbsp;&nbsp; x-conference/x-cooltalk&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Interactive chat (Ichat)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-chat&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span><font color="#ff00ff">Application Types</font>&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>Text-Related&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>PostScript&nbsp;&nbsp; ai eps ps&nbsp;&nbsp;&nbsp; application/postscript  &nbsp;&nbsp;</span></li>
<li><span>Microsoft Rich Text Format rtf&nbsp;&nbsp;&nbsp;&nbsp; application/rtf  &nbsp;&nbsp;</span></li>
<li><font color="#ff0000"><span>Adobe Acrobat PDF&nbsp;&nbsp; pdf&nbsp;&nbsp;&nbsp;&nbsp; application/pdf  &nbsp;&nbsp;</span> </font></li>
<li><span><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-pdf</font>&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Maker Interchange Format (FrameMaker)&nbsp;&nbsp; mif&nbsp;&nbsp;&nbsp; application/vnd.mif&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-mif&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Troff document t tr roff&nbsp;&nbsp;&nbsp; application/x-troff  &nbsp;&nbsp;</span></li>
<li><span>Troff document with MAN macros man&nbsp;&nbsp;&nbsp;&nbsp; application/x-troff-man  &nbsp;&nbsp;</span></li>
<li><span>Troff document with ME macros me&nbsp;&nbsp;&nbsp;&nbsp; application/x-troff-me  &nbsp;&nbsp;</span></li>
<li><span>Troff document with MS macros ms&nbsp;&nbsp;&nbsp;&nbsp; application/x-troff-ms  &nbsp;&nbsp;</span></li>
<li><span>LaTeX document&nbsp;&nbsp; latex&nbsp;&nbsp;&nbsp; application/x-latex  &nbsp;&nbsp;</span></li>
<li><span>Tex/LateX document tex&nbsp;&nbsp;&nbsp; application/x-tex  &nbsp;&nbsp;</span></li>
<li><span>GNU TexInfo document texinfo texi&nbsp;&nbsp;&nbsp;&nbsp; application/x-texinfo  &nbsp;&nbsp;</span></li>
<li><span>TeX dvi format&nbsp;&nbsp; dvi&nbsp;&nbsp;&nbsp; application/x-dvi  &nbsp;&nbsp;</span></li>
<li><span>MacWrite document ??&nbsp;&nbsp;&nbsp; application/macwriteii  &nbsp;&nbsp;</span></li>
<li><span>MS word document ??&nbsp;&nbsp;&nbsp; application/msword  &nbsp;&nbsp;</span></li>
<li><span>WordPerfect </span><span class="number">5.1</span><span> document ??&nbsp;&nbsp;&nbsp;&nbsp; application/wordperfect5.</span><span class="number">1</span><span>&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>SGML application (RFC </span><span class="number">1874</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/sgml  &nbsp;&nbsp;</span></li>
<li><span>Office Document Architecture oda&nbsp;&nbsp;&nbsp;&nbsp; application/oda&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Envoy Document evy&nbsp;&nbsp;&nbsp; application/envoy  &nbsp;&nbsp;</span></li>
<li><span>Wang Info. Tranfer Format (Wang)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/wita&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>DEC Document Transfer Format (DEC)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/dec-dx&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>IBM Document Content Architecture (IBM)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/dca-rft&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>CommonGround Digital Paper (No Hands Software)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/commonground&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>FrameMaker Documents (Frame) doc fm frm frame&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.framemaker&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-framemaker&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Remote printing at arbitrary printers (RFC </span><span class="number">1486</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/remote-printing&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Archive/Compressed Archives&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Gnu tar format gtar&nbsp;&nbsp;&nbsp; application/x-gtar  &nbsp;&nbsp;</span></li>
<li><span class="number">4</span><span>.3BSD tar format tar&nbsp;&nbsp;&nbsp; application/x-tar  &nbsp;&nbsp;</span></li>
<li><span>POSIX tar format ustar&nbsp;&nbsp;&nbsp; application/x-ustar  &nbsp;&nbsp;</span></li>
<li><span>Old CPIO format bcpio&nbsp;&nbsp;&nbsp; application/x-bcpio  &nbsp;&nbsp;</span></li>
<li><span>POSIX CPIO format cpio&nbsp;&nbsp;&nbsp; application/x-cpio  &nbsp;&nbsp;</span></li>
<li><span>UNIX sh shell archive shar&nbsp;&nbsp;&nbsp;&nbsp; application/x-shar  &nbsp;&nbsp;</span></li>
<li><span>DOS/PC - Pkzipped archive zip <font color="#ff0000">&nbsp;&nbsp;&nbsp; application/zip  &nbsp;&nbsp;</font></span><font color="#ff0000"> </font></li>
<li><span>Macintosh Binhexed archive&nbsp;&nbsp; hqx&nbsp;&nbsp;&nbsp;&nbsp; application/mac-binhex40&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Macintosh Stuffit Archive sit sea&nbsp;&nbsp;&nbsp;&nbsp; application/x-stuffit  &nbsp;&nbsp;</span></li>
<li><span>Fractal Image Format&nbsp;&nbsp; fif&nbsp;&nbsp;&nbsp;&nbsp; application/fractals  &nbsp;&nbsp;</span></li>
<li><span>Binary, UUencoded bin uu&nbsp;&nbsp;&nbsp; application/octet-stream  &nbsp;&nbsp;</span></li>
<li><span>PC executable exe&nbsp;&nbsp;&nbsp; application/octet-stream  &nbsp;&nbsp;</span></li>
<li><span>WAIS </span><span class="string">"sources"</span><span> src wsrc&nbsp;&nbsp;&nbsp;&nbsp; application/x-wais-source&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>NCSA HDF data format hdf&nbsp;&nbsp;&nbsp; application/hdf  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Downloadable Program/Scripts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Javascript program&nbsp;&nbsp; js ls mocha&nbsp;&nbsp;&nbsp;&nbsp; text/javascript&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-javascript&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>VBScript program&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/vbscript  &nbsp;&nbsp;</span></li>
<li><span>UNIX bourne shell program sh&nbsp;&nbsp;&nbsp;&nbsp; application/x-sh  &nbsp;&nbsp;</span></li>
<li><span>UNIX c-shell program csh&nbsp;&nbsp;&nbsp; application/x-csh  &nbsp;&nbsp;</span></li>
<li><span>Perl program pl&nbsp;&nbsp;&nbsp; application/x-perl  &nbsp;&nbsp;</span></li>
<li><span>Tcl (Tool Control Language) program tcl&nbsp;&nbsp;&nbsp;&nbsp; application/x-tcl  &nbsp;&nbsp;</span></li>
<li><span>Atomicmail program scripts (obsolete)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/atomicmail&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Slate documents - executable enclosures (BBN)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/slate&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Undefined binary data (often executable progs)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/octet-stream&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>RISC OS Executable programs (ANT Limited)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/riscos&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Animation/Multimedia&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Andrew Toolkit inset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/andrew-inset  &nbsp;&nbsp;</span></li>
<li><span>FutureSplash vector animation (FutureWave)&nbsp;&nbsp; spl&nbsp;&nbsp;&nbsp; application/futuresplash&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>mBED multimedia data (mBED) mbd&nbsp;&nbsp;&nbsp;&nbsp; application/mbedlet&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Macromedia Shockwave (Macromedia)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-director&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Sizzler real-time video/animation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-sprite&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>PowerMedia multimedia (RadMedia) rad&nbsp;&nbsp;&nbsp; application/x-rad-powermedia&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Presentation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>PowerPoint presentation (Microsoft) ppz&nbsp;&nbsp;&nbsp; application/mspowerpoint&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>PointPlus presentation data (Net Scene)&nbsp;&nbsp; css&nbsp;&nbsp;&nbsp; application/x-pointplus&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>ASAP WordPower (Software Publishing Corp.)&nbsp;&nbsp; asp&nbsp;&nbsp;&nbsp; application/x-asap&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Astound Web Player multimedia data (GoldDisk)&nbsp;&nbsp; asn&nbsp;&nbsp;&nbsp; application/astound&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Special Embedded Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>OLE script e.g. Visual Basic (Ncompass)&nbsp;&nbsp; axs&nbsp;&nbsp;&nbsp; application/x-olescript&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>OLE Object (Microsoft/NCompass) ods&nbsp;&nbsp;&nbsp; application/x-oleobject&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>OpenScape OLE/OCX objects (Business</span><span class="annotation">@Web</span><span>)&nbsp;&nbsp; opp&nbsp;&nbsp;&nbsp; x-form/x-openscape&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Visual Basic objects (Amara) wba&nbsp;&nbsp;&nbsp;&nbsp; application/x-webbasic&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Specialized data entry forms (Alpha Software)&nbsp;&nbsp; frm&nbsp;&nbsp;&nbsp; application/x-alpha-form&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>client-server objects (Wayfarer Communications)&nbsp;&nbsp; wfx&nbsp;&nbsp;&nbsp; x-script/x-wfxclient&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>General Applications&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Undefined binary data (often executable progs)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/octet-stream&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>CALS (U.S. D.O.D data format - RFC </span><span class="number">1895</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/cals-</span><span class="number">1840</span><span>&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Pointcast news data (Pointcast) pcn&nbsp;&nbsp;&nbsp; application/x-pcn&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><font color="#ff0000"><span>Excel spreadsheet (Microsoft)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.ms-excel&nbsp;&nbsp;  &nbsp;&nbsp;</span> </font></li>
<li><font color="#ff0000"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x-msexcel&nbsp;&nbsp;  &nbsp;&nbsp;</span> </font></li>
<li><font color="#ff0000"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/ms-excel  &nbsp;&nbsp;</span> </font></li>
<li><font color="#ff0000"><span>PowerPoint (Microsoft) ppt&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.ms-powerpoint&nbsp;&nbsp;  &nbsp;&nbsp;</span> </font></li>
<li><span><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/ms-powerpoint</font>&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Microsoft Project (Microsoft)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.ms-project&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Works data (Microsoft)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.ms-works&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>MAPI data (Microsoft)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.ms-tnef  &nbsp;&nbsp;</span></li>
<li><span>Artgallery data (Microsoft)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.artgalry&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>SourceView document (Dataware Electronics)&nbsp;&nbsp; svd&nbsp;&nbsp;&nbsp; application/vnd.svd&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Truedoc (Bitstream)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/vnd.truedoc  &nbsp;&nbsp;</span></li>
<li><span>Net Install - software install (</span><span class="number">20</span><span>/</span><span class="number">20</span><span> Software)&nbsp;&nbsp; ins&nbsp;&nbsp;&nbsp; application/x-net-install&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Carbon Copy - remote control/access (Microcom)&nbsp;&nbsp; ccv&nbsp;&nbsp;&nbsp; application/ccv&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Spreadsheets (Visual Components) vts&nbsp;&nbsp;&nbsp; workbook/formulaone&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Cybercash digital money (Cybercash)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/cybercash&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Format </span><span class="keyword">for</span><span> sending generic Macintosh files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/applefile&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Active message -- connect to active mail app.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/activemessage&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>X.</span><span class="number">400</span><span> mail message body part (RFC </span><span class="number">1494</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/x400-bp&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>USENET news message id (RFC </span><span class="number">1036</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/news-message-id&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>USENET news message (RFC </span><span class="number">1036</span><span>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/news-transmission&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Multipart Types (mostly email)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Messages with multiple parts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/mixed  &nbsp;&nbsp;</span></li>
<li><span>Messages with multiple, alternative parts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/alternative&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Message with multiple, related parts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/related  &nbsp;&nbsp;</span></li>
<li><span>Multiple parts are digests&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/digest  &nbsp;&nbsp;</span></li>
<li><span>For reporting of email status (admin.)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/report&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Order of parts does not matter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/parallel  &nbsp;&nbsp;</span></li>
<li><span>Macintosh file data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/appledouble  &nbsp;&nbsp;</span></li>
<li><span>Aggregate messages; descriptor as header&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/header-set&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Container </span><span class="keyword">for</span><span> voice-mail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/voice-message  &nbsp;&nbsp;</span></li>
<li><span>HTML FORM data (see Ch. </span><span class="number">9</span><span> and App. B)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/form-data  &nbsp;&nbsp;</span></li>
<li><span>Infinite multiparts - See Chapter </span><span class="number">9</span><span> (Netscape)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart/x-mixed-replace&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Message Types (mostly email)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>MIME message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message/rfc822  &nbsp;&nbsp;</span></li>
<li><span>Partial message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message/partial  &nbsp;&nbsp;</span></li>
<li><span>Message containing external references&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message/external-body&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Message containing USENET news&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message/news  &nbsp;&nbsp;</span></li>
<li><span>HTTP message&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message/http  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>2D/3D Data/Virtual Reality Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>VRML data file wrl vrml&nbsp;&nbsp;&nbsp; x-world/x-vrml  &nbsp;&nbsp;</span></li>
<li><span>(changing to model/vrml)  &nbsp;&nbsp;</span></li>
<li><span>  &nbsp;&nbsp;</span></li>
<li><span>WIRL - VRML data (VREAM) vrw&nbsp;&nbsp;&nbsp;&nbsp; x-world/x-vream  &nbsp;&nbsp;</span></li>
<li><span>Play3D 3d scene data (Play3D) p3d&nbsp;&nbsp;&nbsp;&nbsp; application/x-p3d&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Viscape Interactive 3d world data (Superscape)&nbsp;&nbsp; svr&nbsp;&nbsp;&nbsp; x-world/x-svr&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>WebActive 3d data (Plastic Thought)&nbsp;&nbsp; wvr&nbsp;&nbsp;&nbsp; x-world/x-wvr&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>QuickDraw3D scene data (Apple) 3dmf&nbsp;&nbsp;&nbsp; x-world/x-3dmf&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Scientific/Math/CAD Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Chemical types -- to communicate information about chemical models&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; chemical/* (several subtypes)&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Mathematica notebook ma&nbsp;&nbsp;&nbsp; application/mathematica  &nbsp;&nbsp;</span></li>
<li><span>Computational meshes </span><span class="keyword">for</span><span> numerical simulations&nbsp;&nbsp; msh&nbsp;&nbsp;&nbsp; x-model/x-mesh  &nbsp;&nbsp;</span></li>
<li><span>(evolving to model/mesh)  &nbsp;&nbsp;</span></li>
<li><span>  &nbsp;&nbsp;</span></li>
<li><span>Vis5D </span><span class="number">5</span><span>-dimensional data&nbsp;&nbsp; v5d&nbsp;&nbsp;&nbsp;&nbsp; application/vis5d  &nbsp;&nbsp;</span></li>
<li><span>IGES models -- CAD/CAM (CGM) data&nbsp;&nbsp; igs&nbsp;&nbsp;&nbsp;&nbsp; application/iges  &nbsp;&nbsp;</span></li>
<li><span>(evolving to model/iges?)  &nbsp;&nbsp;</span></li>
<li><span>  &nbsp;&nbsp;</span></li>
<li><span>Autocad WHIP vector drawings dwf&nbsp;&nbsp;&nbsp;&nbsp; drawing/x-dwf  &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>Largely Platform-Specific Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>&nbsp;&nbsp;</span></li>
<li><span>Silicon Graphics Specific Types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Showcase Presentations showcase slides sc sho show&nbsp;&nbsp;&nbsp;&nbsp; application/x-showcase  &nbsp;&nbsp;</span></li>
<li><span>Insight Manual pages ins insight&nbsp;&nbsp;&nbsp;&nbsp; application/x-insight  &nbsp;&nbsp;</span></li>
<li><span>Iris Annotator data ano&nbsp;&nbsp;&nbsp; application/x-annotator  &nbsp;&nbsp;</span></li>
<li><span>Directory Viewer dir&nbsp;&nbsp;&nbsp; application/x-dirview  &nbsp;&nbsp;</span></li>
<li><span>Software License&nbsp;&nbsp; lic&nbsp;&nbsp;&nbsp; application/x-enterlicense  &nbsp;&nbsp;</span></li>
<li><span>Fax manager file faxmgr&nbsp;&nbsp;&nbsp; application/x-fax-manager&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>Fax job data file faxmgrjob&nbsp;&nbsp;&nbsp;&nbsp; application/x-fax-manager-job&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>IconBook data icnbk&nbsp;&nbsp;&nbsp; application/x-iconbook  &nbsp;&nbsp;</span></li>
<li><span>? wb&nbsp;&nbsp;&nbsp; application/x-inpview  &nbsp;&nbsp;</span></li>
<li><span>Installable software in </span><span class="string">'inst'</span><span> format inst&nbsp;&nbsp;&nbsp;&nbsp; application/x-install  &nbsp;&nbsp;</span></li>
<li><span>Mail folder mail&nbsp;&nbsp;&nbsp; application/x-mailfolder  &nbsp;&nbsp;</span></li>
<li><span>? pp ppages&nbsp;&nbsp;&nbsp; application/x-ppages  &nbsp;&nbsp;</span></li>
<li><span>Data </span><span class="keyword">for</span><span> printer (via lpr) sgi-lpr&nbsp;&nbsp;&nbsp;&nbsp; application/x-sgi-lpr  &nbsp;&nbsp;</span></li>
<li><span>Software in </span><span class="string">'tardist'</span><span> format tardist&nbsp;&nbsp;&nbsp;&nbsp; application/x-tardist  &nbsp;&nbsp;</span></li>
<li><span>Software in compressed </span><span class="string">'tardist'</span><span> format ztardist&nbsp;&nbsp;&nbsp; application/x-ztardist&nbsp;&nbsp;  &nbsp;&nbsp;</span></li>
<li><span>WingZ spreadsheet wkz&nbsp;&nbsp;&nbsp; application/x-wingz  &nbsp;&nbsp;</span></li>
<li><span>Open Inventor </span><span class="number">3</span><span>-D scenes&nbsp;&nbsp; iv&nbsp;&nbsp;&nbsp;&nbsp; graphics/x-inventor </span></li>
</div><img src ="http://www.blogjava.net/kissyan4916/aggbug/277851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-05-25 17:03 <a href="http://www.blogjava.net/kissyan4916/articles/277851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sturts2的上传和下载以及中文转码问题</title><link>http://www.blogjava.net/kissyan4916/articles/277426.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Fri, 22 May 2009 15:06:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/277426.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/277426.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/277426.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/277426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/277426.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 关于如何在项目中添加struts2这里就不在多说了，struts2上传下载所需要的jar包大家可以去www.apache.org进行下载，在Jakarta下的选择<br />
&nbsp;Commons，然后下载FileUpload 和 IO这两个jar包。解压后拷贝到你的项目lib文件夹下就OK了。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong> 下面直接开始struts2的上传：</strong><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; 首先创建一个文件上传的Action，以下注释部分为批量上传时的代码，大同小异！<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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;UploadAction&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;ActionSupport&nbsp;{<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; 。。。省略了 getter 和 setter方法<br />
&nbsp;&nbsp; <br />
&nbsp; &nbsp; </span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;title;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">单个文件&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;File&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;多个文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;private&nbsp;String[]&nbsp;upload;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">保存上传文件的文件夹名字,可在配置文件中动态指定</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;savePath;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;uploadContentType;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;uploadFileName;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getSavePath()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;ServletActionContext.getRequest().getRealPath(savePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;execute()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">进入&nbsp;execute方法</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查看上传文件的大小</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">所上传的文件的大小为</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">getUpload().length());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查看上传文件的名字</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">UploadFileName:</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">getUploadFileName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">指定上传文件到哪个文件夹</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileOutputStream(savePath</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">\\</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">getUploadFileName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">取得一个将要上传的文件的一个输入流</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(getUpload());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">当图片需要存储进数据库时，可以将图片的连接存储进数据库，譬如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">path路径是需要读进数据库滴</span><span style="color: #008000;">，所以这里不能使用 getSavePath()，因为这样返回的是绝对路径。<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"> savePath</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">\\</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">getUploadFileName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;buffer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[</span><span style="color: #000000;">1024</span><span style="color: #000000;">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">((len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fis.read(buffer))</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fos.write(buffer,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;len);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">文件已上传</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">完成多个文件的上传<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;execute()&nbsp;throws&nbsp;Exception&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;"><br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">查看上传文件的名字<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("UploadFileName:"+getUploadFileName());<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">指定上传文件到哪个文件夹<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputStream&nbsp;fos&nbsp;=&nbsp;new&nbsp;FileOutputStream(savePath+"\\"<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+getUploadFileName());<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;ss&nbsp;=&nbsp;getUpload();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;ss.length;i++){<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">取得一个将要上传的文件的一个输入流<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;=&nbsp;new&nbsp;FileInputStream(ss[i]);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">当图片需要存储进数据库时，可以将图片的连接存储进数据库，譬如：<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">path路径是需要读进数据库滴<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;= savePath+"\\"+getUploadFileName();<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;buffer&nbsp;=&nbsp;new&nbsp;byte[1024];<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;0&nbsp;;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((len&nbsp;=&nbsp;fis.read(buffer))&gt;0)&nbsp;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fos.write(buffer,&nbsp;0,&nbsp;len);<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SUCCESS&nbsp;;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; </span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
文件上传的页面index.jsp<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">body</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:fielderror</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:form&nbsp;action</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">ryanUpload</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;enctype</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">multipart/form-data</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:textfield&nbsp;label</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">title</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;单个文件上传&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:file&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">upload</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;label</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">文件1</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;多个文件上传&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:file&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">upload</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;label</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">文件1</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:file&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">upload</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;label</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">文件2</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:file&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">upload</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;label</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">文件3</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">s:submit</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">s:form</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">body</span><span style="color: #000000;">&gt;</span></div>
在来看看struts.xml中的配置，<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">struts</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">constant&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">struts.i18n.encoding</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">GBK</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">ryan</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">struts-default</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">action&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">ryanUpload</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.UploadAction</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">result&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">success</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;/</span><span style="color: #000000;">succ.jsp</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">result</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">result&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">input</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;/</span><span style="color: #000000;">index.jsp</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">result</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;动态指定上传文件的目录&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">savePath</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;/</span><span style="color: #000000;">upload</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;&nbsp;&nbsp; &lt;!--&nbsp; 在此处可以动态的指定服务器上存储图片的文件夹 --&gt;&nbsp; </span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">interceptor</span><span style="color: #000000;">-</span><span style="color: #000000;">ref&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">fileUpload</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">allowedTypes</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">image</span><span style="color: #000000;">/</span><span style="color: #000000;">bmp,image</span><span style="color: #000000;">/</span><span style="color: #000000;">png,image</span><span style="color: #000000;">/</span><span style="color: #000000;">gif,image</span><span style="color: #000000;">/</span><span style="color: #000000;">jpeg</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">maximumSize</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">3000000000</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; &lt;!--&nbsp; 这里的单位为字节&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">interceptor</span><span style="color: #000000;">-</span><span style="color: #000000;">ref</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">interceptor</span><span style="color: #000000;">-</span><span style="color: #000000;">ref&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">defaultStack</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">action</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">struts</span><span style="color: #000000;">&gt;</span></div>
<br />
<strong><span style="color: red;"><span style="color: #020000;">struts2下载（参考了beansoft的文章）: <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;</span></span></strong><span style="color: red;"><span style="color: #020000;">&nbsp; 一般在项目中</span></span><span style="color: red;"><span style="color: #020000;">所用到下载都是直接根据数据库读出的地址来进行下载，譬如有下面一个链接：<br />
</span></span>&nbsp; <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"> &nbsp;&nbsp; &lt;!-- 假设有这样一条从数据库中读出的数据 ，它的存储路径为 </span><span style="color: #000000;">downLoad/ryan.jsp ，文件名字为</span><span style="color: #000000;">ryan.jsp <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很明显这是一张图片，那么我们点击下载时就会根据path来进行下载<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">--&gt;<br />
<br />
&nbsp; &nbsp; &lt;s:url action="downLoad" id="down"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name="inputPath"&gt;downLoad/ryan.jsp&lt;/s:param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name="fileName"&gt;ryan.jsp&lt;/s:param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/s:url&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;s:a href="%{down}"&gt;downLoad&lt;/s:a&gt;</span><span style="color: #000000;"><br />
</span></div>
<br />
来看看我们的struts.xml中的配置<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">struts</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">technicalInformationAction</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Action</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">-</span><span style="color: #000000;">action</span><span style="color: #000000;">-</span><span style="color: #000000;">ref&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">download</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp; </span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">action&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">downLoad</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"com.DownLoadAction</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;!--这里的返回值并不是字符串，而是一个流类型--&gt; &nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">result&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">success</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">stream</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">contentType</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">application</span><span style="color: #000000;">/</span><span style="color: #000000;">octet</span><span style="color: #000000;">-</span><span style="color: #000000;">stream;charset</span><span style="color: #000000;">=</span><span style="color: #000000;">ISO8859</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">inputName</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">inputStream</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &lt;!--这里需要将文件名进行转码，转码后将值赋予</span><span style="color: #000000;">downloadFileName， 对应文中的getDownloadFileName()</span><span style="color: #000000;">--&gt;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">contentDisposition</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">attachment;filename</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">${downloadFileName}</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">param&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">bufferSize</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">4096</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">result</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">action</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">struts</span><span style="color: #000000;">&gt;</span></div>
<br />
下载文件的DownLoadAction：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><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;DownLoadAction&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Action{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;fileName;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始的通过param指定的文件名属性</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;inputPath;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;指定要被下载的文件路径</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;username&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">chenyanhu</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;InputStream&nbsp;getInputStream()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;通过&nbsp;ServletContext，也就是application&nbsp;来读取数据</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ServletActionContext.getServletContext().getResourceAsStream(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">inputPath);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; execute中代码的含义是为了防止他人恶意的下载项目的WEB-INF/web.xml文件，譬如在浏览器中输入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; http://......./downLoad.action?inputPath=WEB-INF/web.xml&nbsp; 这样将下载下的文件后缀名改为xml就可以查看你的项目的web.xml了</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; execute中代码的意思是将文件存储的真实目录与地址栏的路径进行对比。</span>发现企图下载不在/download下的文件，就显示内容为空<br />
<span style="color: #000000;">&nbsp; &nbsp; &nbsp; */&nbsp; <br />
&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;"><br />
public</span><span style="color: #000000;">&nbsp;String&nbsp;execute()</span><span style="color: #000000;">{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;文件下载目录路径</span><span style="color: #008000;"><br />
</span><br />
<span style="color: #000000;">
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;downloadDir&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ServletActionContext.getServletContext().getRealPath(</span><span style="color: #000000;">"</span><span style="color: #000000;">/technicalInformationDirectory</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">username);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;文件下载路径</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;downloadFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ServletActionContext.getServletContext().getRealPath(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">inputPath);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.File&nbsp;file&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.io.File(downloadFile);<br />
&nbsp;&nbsp;
try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;downloadFile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;file.getCanonicalPath();</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;真实文件路径,去掉里面的..等信息</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">downloadFile.startsWith(downloadDir))&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;
}catch (IOException io) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // TODO: handle exception<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("IO异常！！路径发生错误！");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; io.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }catch (SecurityException se) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // TODO: handle exception<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("安全性异常！！");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; se.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }catch (NullPointerException&nbsp; npe ) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("空指针异常");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; npe.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("出现异常了！");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;SUCCESS;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;提供转换编码后的供下载用的文件名&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getDownloadFileName()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;downFileName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fileName;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;downFileName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String(downFileName.getBytes(),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ISO8859-1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(UnsupportedEncodingException&nbsp;e)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;downFileName;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp; </span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; <br />
</span></div>
<br />
<br />
关于中文转码的问题： <br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我在项目中遇到了一个问题，那就是下载文件的时候，不能对含有中文名字的文件进行下载，老是出现乱码，但是数据库中<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 是没有乱码的，今天花了比较长的时间去解决这个问题，不过现在我已经把这个问题解决， 就是需要修改tomcat的server.xml文件&nbsp; ：<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Connector port="8641" protocol="HTTP/1.1"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirectPort="8443" <span style="color: #ff0000;">URIEncoding="utf-8"</span>/&gt;<br />
&nbsp;&nbsp; <br />
&nbsp; &nbsp; 加上红色部分就OK了！！<br />
<br />
<br />
<img src ="http://www.blogjava.net/kissyan4916/aggbug/277426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-05-22 23:06 <a href="http://www.blogjava.net/kissyan4916/articles/277426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记之Spring-JMS</title><link>http://www.blogjava.net/kissyan4916/articles/326480.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Tue, 10 Mar 2009 16:31:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/326480.html</guid><description><![CDATA[<img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/SpringJMS.png" width="612" height="502" /><br />
<span style="font-family: SansSerif,sans-serif; color: rgb(153, 153, 0);"><br />
&nbsp;
<p><strong>
JMS简介</strong>：一种应用于异步消息传递的标准API，JMS也是应用于程序间通讯的。但是，JMS与其他机制有所不同，主要表现在系统间传递信息的方式，见PPT1-2。简介传送也是JMS的关键。当一个应用程序通过JMS向另一个应用程序发送消息时，两个程序之间并没有直接的连接。发送应用程序会将消息交给一个服务，由服务确保将消息投递给接收应用程序。在<font color="#ff0000">JMS中有两个主要的概念</font><font color="#660099">：消息中介(message broker)和消息目标(destination)。</font>当应用程序发送消息时，会将消息交给一个消息中介。消息中介实际上就是JMS版本的邮局。消息中介可以确保消息被投递到指定的消息目标，同时可以释放发送者，使其能够进行其他的业务。 在JMS中，每条消息带有一个消息目标。消息目标就好像一个邮箱，可以将消息放入这个邮箱，直到有人将它们取出。消息目标只关心消息应该从哪里获得--而不是由谁来获得。在JMS中，有两<font color="#ff0000">种消息目标类型</font><font color="#660099">：队列和主题。</font>分别应用于队列的点对点模型或应用于主题的发布--订阅模型。 </p>
</span>
<ul>
    <li><span style="font-family: SansSerif,sans-serif;">
    <p><strong>点对点消息传递模型</strong>：在点对点模型中，每个消息都有一个发送者和一个接收者，见PPT3.在JMS中如果有多个接收者监听队列，就没办法直到某条特定的消息会被哪个接收者处理。这种不确定性实际上有很多好处，因为它可以让程序之用为队列添加监听器就能增大消息处理的能力。 </p>
    </span><span style="font-family: SansSerif,sans-serif;">
    <p><strong>发布--订阅消息传递模型</strong>：在此模型中，消息会被发送给一个主题。像使用队列一样，可以让多个接收者监听一个主题。但是，与队列不同的是消息不再被只投递给一个接收者，所有主题的订阅者都会收到消息，见PPT4。 </p>
    </span></li>
</ul>
<span style="font-family: SansSerif,sans-serif;">
<p><strong>JMS的优点</strong>：<font color="#ff0000">不用等待--</font>当使用JMS发送消息时，客户端不必等待消息被处理，甚至是被投递。客户端只需要将消息发给消息中介，就可以确信消息会被投递到适当的目标。因为不必等待，客户端就可以执行其他的任务。由于这种方法可以大大地节省时间，客户端的性能能够极大地提高。<font color="#ff0000">面向消息--</font>与RFC通信面向方法调用不同，使用JMS发送消息是以数据位中心的。这意味着客户端不用固定搭配特定的方法符号。任何队列或主题订阅者都可以处理由客户端发送来的消息。客户端不必了解服务的任何规范。<font color="#ff0000">位置独立--</font>JMS客户端不必知道由谁来处理他们的消息，或者服务的位置在哪里。客户端值需要了解需要通过哪个队列或主题发送消息。因此，只要能够从队列或主题获取消息，JMS客户端就不用在意服务的位置在哪里。<font color="#ff0000">确保投送--</font><font color="#000000">当使用JMS发送消息时，客户端能够确保消息被投递。即使在消息发送时服务无法使用，消息也会被储存起来，直到服务重新可以使用为止。</font> </p>
</span><span style="font-family: SansSerif,sans-serif;">
<p><strong>在Spring中安装ActiveMQ</strong>：它是一个开源消息中介（Apache的一个子项目），也是应用JMS异步消息传递的很好选择。需要从www.activemq.org下载包。在bin目录中，可以找到一个用于启动ActiveMQ的脚本：Unix用户的activemq或者Windows用户的activemq.bat。运行这个脚本，等ActiveMq启动后，就可以使用它进行中介服务了。在所有的示例中，都需要通过JMS连接工厂通过消息中介发送消息。我们选择了ActiveMQ作为消息中介，因此必须配置JMS连接工厂，使它能够了解如何连接到ActiveMQ,ActiveMQConnectionFactory是连接ActiveMQ的JMS连接工厂，在Spring中配置如下： </p>
<p>&lt;bean id ="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory" &gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;&nbsp;name="brokerURL" value="tcp://localhost:61616"&gt; </p>
<p>&lt;/bean&gt; </p>
</span>
<ul>
    <li><span style="font-family: SansSerif,sans-serif;">
    <p><strong>声明一个ActiveMQ队列</strong>：&nbsp; </p>
    <p>&nbsp;&nbsp;&lt;bean id="rantzDestination" class="org.apache.activemq.command.ActiveMQQueue"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;constructor-arg index="0" value="rantz.marketing.queue" /&gt; </p>
    <p>&nbsp;&lt;/bean&gt; </p>
    </span><span style="font-family: SansSerif,sans-serif;">
    <p><strong>声明一个ActiveMQ主题</strong>： </p>
    <p>&nbsp;&nbsp;&lt;bean id="rantzDestination" class="org.apache.activemq.command.ActiveMQTopic"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;constructor-arg index="0" value="rantz.marketing.topic" /&gt; </p>
    <p>&nbsp;&lt;/bean&gt; </p>
    </span></li>
</ul>
<span style="font-family: SansSerif,sans-serif;">
<p><strong>协同使用JMS和Spring</strong>:JMS为Java爱好者提供了一个与消息中介进行交互，以及发送和接收消息的标准API，而且每一个消息中介的实现都会支持JMS。因此你不必由于消息中介的不同而学习不同的消息传递的API。虽然JMS为所有的消息中介提供了统一接口，但这种接口用起来不是十分便利（见PPT5-6） </p>
</span>
<ul>
    <li><span style="font-family: SansSerif,sans-serif;">
    <p><strong>使用JMS模板</strong>：JmsTemplate是Spring消除冗长和重复JMS代码的解决方案。JmsTemplate可以创建连接，获取会话，以及发送和接收消息。它使你可以专注于构建要发送的消息或者处理收到的消息。另外，JmsTemplate可以处理任何被抛出的JMSException。如果JMSException在JmsTemplate工作中被抛出，JmsTemplate将捕获这个异常，并且用一个未受查的JmsException的子类再次抛出它。见PPT7 </p>
    </span>
    <p><strong>置入JmsTemplate模板</strong>： </p>
    <p>&lt;bean id ="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory"&gt; </p>
    <p>&lt;/bean&gt; </p>
    <ul>
        <li>
        <p><strong>发送消息</strong>：在RoadRantz端，我们使用JmsTemplate向RoandRantz市场发送驾驶员信息。RantzMarketingGatewayImpl是RoadRantz与市场系统进行交互的类。见PPT8，因此，当我们在Spring中配置RantzMarKetingGatewayImpl类时，必须置入jmsTemplate和rantzDestination Bean的参考： </p>
        <p>&nbsp;&nbsp;&lt;bean id="marketingGateway"&nbsp; class="com.roadrantz.marketing.RantzMarketingGatewayImpl"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="jmsTemplate" ref ="jmsTemplate"&nbsp;&nbsp;/&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="destination" ref="rantzDestination"&nbsp;&nbsp;/&gt; </p>
        <p>&nbsp;&lt;/bean&gt; </p>
        <p><strong>设置默认目标</strong>：如果每次发送消息都指定一个目标，不如为JmsTemplate置入一个默认目标： </p>
        <p>&lt;bean id ="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="defaultDestination" ref="rantzDestination" /&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>现在，调用JmsTemplate的send()方法就可以去掉第一个参数了。这种send()方法的形式只带有一个MessageCreator。因为没有指定目标，JmsTemplate会假设你要将消息发送给默认目标。所以不必再为RantzMarketingGatewayImpl注入目标了。它的声明很简单： </p>
        <p>&nbsp;&nbsp;&lt;bean id="marketingGateway"&nbsp; class="com.roadrantz.marketing.RantzMarketingGatewayImpl"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="jmsTemplate" ref ="jmsTemplate"&nbsp;&nbsp;/&gt; </p>
        <p>&nbsp;&lt;/bean&gt; </p>
        <p><strong>消费消息</strong>：使用JmsTemplate接收消息十分简单。只需要调用JmsTemplate的receive()方法，如PPT9. 默认情况下，对receive()方法的调用会造成阻塞，直到消息到达目标--如果必要，会永远等待下去。为了避免对消息的内部等待，可以通过配置JmsTemplate时，通过设置receiveTimeout属性来指定接收时间。下面配置的接收超时时间为一分钟（60000毫秒）。 </p>
        <p>&lt;bean id ="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="defaultDestination" ref="rantzDestination" /&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="receiveTimeout" value="60000" /&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>在PPT9中，receive()方法会从默认目标接收消息。如果你希望指定一个目标，可以为其传递一个目标： </p>
        <p>MapMessage message = (MapMessage) jmsTemplate.receive(destination); </p>
        <p>此外，还可以通过名称指定目标，并且让Spring的目标解析器自动解析这个目标： </p>
        <p>&nbsp;MapMessage message = (MapMessage) jmsTemplate.receive("rantz.marketing.queue"); </p>
        <p><strong>转换消息</strong>：为了简化示例，没有在发送和接收消息的代码中添加处理消息转换的代码。但是，如果在程序中的多个位置都需要发送或接收相同的消息，可能就需要通过消息转换器来避免不必要的映射代码。尽管将消息转换代码抽象成自己的工具类并不是很困难，但是你仍然需要明确的调用工具类来进行转换。幸运的是，Spring通过MessageConverter接口提供了对消息转换的支持： </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;public interface MessageConverter { </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Message toMessage(Object&nbsp;&nbsp;object, Session session); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Object fromMessage (Message message) ; </p>
        <p>&nbsp;}&nbsp; </p>
        <p>&nbsp;&nbsp; 见PPT10，展示了一个MessageConverter接口的实现MotoristMessageConverter,可以将Motorist对象转换为消息，也可以将消息转换为SpammedMotorist对象。 </p>
        <ul>
            <li>
            <p><strong>发送和接收被转换的消息</strong>：我们可以在发送消息前不用明确的调用toMessage()方法，只需要调用JmsTemplate的convertAndSend()方法。因此，PPT8中的sendMotoristInfo()方法将变得更加简单： </p>
            <div class="O" v="#DEFAULT" shape="_x0000_s1026">
            <div><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void sendMotoristInfo (final Motorist motorist){ </font></div>
            <div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.converAndSend(motorist); &nbsp;} &nbsp; &nbsp;&nbsp;&nbsp;消息被发向JmsTemplate的默认目标(假设已经指定了一个默认目标)。不过我们也可以在调用convertAndSend()方法时指定一个特定的目标： &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.connverAndSend(destination,motorist); &nbsp;另外，我们也可以通过名称指定目标： &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.convertAndSend("rantz.marketing.queue",motorist);&nbsp; <font color="#ff3333">接收端： &nbsp;</font>&nbsp;&nbsp;<font color="#ff3333">&nbsp;</font><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;public SpammedMotorist receiveSpammedMotorist() { &nbsp;&nbsp;&nbsp;return (SpammedMotorist) jmsTemplate.receiveAndConvert();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp; 除非有特殊的指定，recieveAndConvert()会从默认目标接收消息。不过，我们也可以通过为receiveAndConvert()方法传递一个参数来选择一个目标： &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (SpammedMotorist) jmsTemplate.receiveAndConvert(destination); &nbsp;&nbsp;&nbsp;或者使用目标的名称： return (SpammedMotorist) jmsTemplate.receiveAndConvert("rantz.marketing.queue");</font> </div>
            </div>
            <p><strong>置入消息转化器</strong>：&nbsp;&nbsp;&lt;bean id="motoristConverter" class="com.roadrantz.marketing.MotoristMessageConverter" /&gt; </p>
            <p>最后，JmsTemplate需要了解这个消息转换器。为了提供消息转换器，我们会将motoristConverter Bean置入到JmsTemplate的messageConverter属性中： </p>
            <p>&lt;bean id ="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
            <p>&nbsp;&nbsp;&lt;property name="defaultDestination" ref="rantzDestination" /&gt; </p>
            <p>&nbsp;&nbsp;&lt;property name="messageConverter" ref="motoristConverter" /&gt; </p>
            <p>&lt;/bean&gt; </p>
            </li>
        </ul>
        </li>
    </ul>
    <p><strong>将Spring的网关支持类应用于JMS</strong>: Spring通过提供JdbcDaoSupport使JdbcTemplate的应用比原先变得更简单一些。与此类似，Spring也提供了一个用于JMS网关类的基类JmsGatewaySupport(见PPT11)。 那么JmsGatewaySupport从哪里得到JmsTemplate呢？你可以直接在jmsTemplate属性中注入JmsTemplate，就像处理常规的RantzMarketingGatewayImpl一样。或者，可以为connectionFactory属性置入连接工厂，来满足对JmsTemplate Bean的所有需求： </p>
    <p>&nbsp;&lt;bean id = "marketingGateway" class="com.roadrantz.marketing.RantzMarketingGatewayImple"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory " ref="connectionFactory" /&gt; </p>
    <p>&lt;/bean&gt; </p>
    <p>&nbsp; 当这种方法配置时，JmsGateSupport将基于被注入的连接工厂自动创建一个JmsTemplate对象。因此不必在Spring中声明JmsTemplate Bean。 在直接将连接工厂置入到网关之前，你应该了解这种方法有<font color="#ff0000">两个缺点</font>： </p>
    <p>1、只能在JmsTemplate上指定默认目标。如果JmsGateSupport创建了自己的JmsTemplate，就没有机会再指定默认的目标了。你必须在调用send()或receive()时明确地选择一个目标。 </p>
    <p>2、只能将消息转换器置入到JmsTemplate中。如果JmsGatewaySupport创建了自己JmsTemplate，将不能使用消息转换器。因此，必须明确地在网关代码中处理消息的转换。 </p>
    </li>
</ul>
<p><strong>创建消息驱动POJO</strong>：EJB2.0规范的其中一个重要内容是包含了消息驱动Bean(MDB)。MDB是可以异步处理消息的EJB。换句话说，MDB会将JMS目标中的消息作为事件来响应。这与同步消息接收者在消息可用前进行阻塞正好相反。MDB是EJB的一个两点。在EJB3的规范中，MDB被简化了，使其更像POJO。不再需要实现MessageDrivenBean接口，只需要实现常规的java.jms.MessageListener接口并用@MessageDriven注释MDB。Spring2.0通过自己的消息驱动Bean形式来满足消息的异步消费需求。 </p>
<ul>
    <li>
    <p><strong>创建消息监听器</strong>：MarketingMdp不必实现MessageDrivenBean接口的世界是多么简单，见PPT12。MarketingMdp本身并不做些什么。它有一个实际处理消息的onMessage()方法。不过要先在Spring中配置一下： </p>
    <p>&lt;bean id="rantzMdp" class="com.roadrantz.marketing.MarketingMdp"&nbsp;&nbsp;/&gt; </p>
    <p>EJB3.0MDB会使用@MessageDriven注释通知容器这是一个MDB。但是，在Spring中，我们会通过将其注入到一个消息监听容器来指示这个Bean是一个MDP。 </p>
    <p><strong>包含消息监听器</strong>：消息监听器容器是一个用于查看JMS目标，等待消息到达的特殊Bean。一旦消息到达，它就可以获取到消息，并通过onMessage()方法将消息传递给一个MessageListener的实现。因为MarketingMdp类实现了MessageListener接口，所以消息监听器容器就准备完毕了。见PPT13. 顾名思义，SimpleMessageListenerContainer是<font color="#ff0000">最简单的消息监听器容器</font>，可以按下面的方法在Spring中进行配置： </p>
    <p>&lt;bean class="org.springframework.jms.listener.SimpleMessageListenerContainer"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="destination" ref="rantzDestination" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="messageListener" ref="rantzMdp" /&gt; </p>
    <p>&lt;/bean&gt;&nbsp; </p>
    <p>对于messageListener属性，我们为其置入了对MDP实现的引用，这样，onMessage()方法将可以被用来接收消息。 </p>
    <p><font color="#ff0000">使用事务性的MDP</font>:如果收到的一个消息在事务中，则应该使用DefaultMessageListenerContainer： </p>
    <p>&nbsp;&lt;bean class="org.springframework.jms.listener.DefaultMessageListenerContainer"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="destination" ref="rantzDestination" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="messageListener" ref="rantzMdp" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="transactionManager" ref="jmsTransactionManager" /&gt; </p>
    <p>&lt;/bean&gt;&nbsp;&nbsp;如果事务性需求比较简单，JmsTransactionManager将按如下方法配置： </p>
    <p>&nbsp;&lt;bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
    <p>&lt;/bean&gt;&nbsp;&nbsp;需要提醒的是，tansactionManger属性是可选的。如果不注入事务管理器，MDP就不是事务性的。 </p>
    <p><strong>编写纯POJO MDP</strong>：如果消息监听器容器的messageListener属性被注入了MessageListener的实现，它就能够知道在消息到达时应该调用onMessage()方法。幸运的是，Spring提供了一个替代的MessageListenerAdapter。它是一个MessageListener，可以委派Bean和你选择的方法，见PPT14. 如果不将自己的MessageListener的实现注入到消息监听器容器中，你可以置入到MessageListenerAdapter中： </p>
    <p>&lt;bean class="org.springframework.jms.listener.SimpleMessageListenerContainer"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="destination" ref="rantzDestination" /&gt; </p>
    <p>&nbsp;<font color="#ff3333">&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="messageListener" ref ="purePojoMdp" /&gt;</font> </p>
    <p>&lt;/bean&gt; 因为配置了purePojoMdp Bean，所以它是一个MessageListenerAdapter: </p>
    <p>&nbsp;&lt;bean id="purePojoMdp" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="delegate" ref="rantzMdp" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="defaultListenerMethod"&nbsp;&nbsp;value="processMotoristInfo" /&gt; </p>
    <p>&lt;/bean&gt; 默认情况下，MessageListenerAdapter在消息到达时会调用handleMessage()方法。但是，我们希望MarketingMdp Bean可以通过 processMotoristInfo()方法处理消息，因此将defaultListenerMethod设置为processMotoristInfo. &nbsp;&nbsp;&nbsp;因为选择了一个特定的被调用方法，所以不需要实现MessageListener或onMessage()方法。因此 MarketingMdp现在将被简化为PPT15。尽管它是一个POJO，对MapMessage的依赖造成了MarketingMdp与JMS的不必要耦合，另外，MapMessage的getString方法还会抛出必须被处理的JMSException。理想情况下，MarketingMdp不应该依赖任何特定框架的类型。 当MessageListenerAdapter接收消息时，它会考虑消息的类型和defaultListenerMethod的值，并且尝试着查找用来调用的监听器方法符号。PPT16描述了MessageListenerAdapter是如何将JMS消息映射到监听器方法参数的。 </p>
    <p><strong>转换MDP消息</strong>：在最新版中，processMotoristInfo()带有的是Map，并且在处理前需要将Map转换为SpammedMotorist。如果在消息到达时，能够直接给processMotoristInfo()方法传递可以处理的SpammedMotorist对象岂不是更好么？Spring消息转换器可以执行消息和特定域Java类型之间的相互转换工作。在PPT10中，已经有一个消息转换器。我们需要做的就是让MessageListenerAdapter能够感知这个消息转换器。MessageListenerAdapter的messageConverter属性可以完成这项工作： </p>
    <p>&lt;bean id="purePojoMdp" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="delegate" ref="rantzMdp" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="defaultListenerMethod"&nbsp;&nbsp;value="processMotoristInfo" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;propert name="messageConverter" ref="motoristConverter" /&gt; </p>
    <p>&lt;/bean&gt; 现在，可以编写最终版的MarketingMdp了。 </p>
    </li>
</ul>
<p><strong>使用基于消息的RPC</strong>：RPC编程模型可以使与远程服务的交互就如同在调用本地对象的方法。是否有某种方法既具有RPC编程模型的简单性，又可以利用异步消息传递的优点呢？ </p>
<ul>
    <li>
    <p><strong>引入Lingo</strong>： 它是一种基于Spring的远程调用方法，它在RPC和异步消息传递之间架起了一座桥梁。与使用其他的Spring远程调用方法相同，Lingo提供了一个服务输出器，可以将Bean的功能输出为Lingo服务和客户端代理。 Lingo远程调用会通过JMS队列或主题来承载信息。 尽管Lingo是基于Spring远程调用的，但是它并不是Spring框架的一部分。你可以从Lingo的主页下载Lingo(http://lingo.codehaus.org/Download). </p>
    <p><strong>输出服务</strong>：在服务端，Lingo提供了一个服务输出器JmsServiceExporter。被Lingo输出的服务是通过JMS来提供服务的，而不是用于直接的RPC访问，见PPT17。下面的XML配置了一个JmsServiceExporter，能够将rantzMdp Bean输出为RPC-over-JMS服务： </p>
    <p>&lt;bean id="server" class="org.logicblaze.lingo.jms.JmsServiceExporter"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="destination" ref="destination" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;&nbsp;name="service" ref="rantzMdp" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="serviceInterface" value="com.roadrantz.marketing.MarketingService"&nbsp;&nbsp;/&gt; </p>
    <p>&lt;/bean&gt; </p>
    <p>&nbsp;&nbsp;service属性被置入了对rantzMdp Bean的引用，即MarketingMdp。最后，应该将定义了服务的接口的类名配置到serviceInterface属性中。我们声明的被输出服务带有MarketingService接口，定义如下： </p>
    <p>&nbsp;&nbsp;public interface MarketingService { </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;void processMotoristInfo (SpammedMotorist motorist ); </p>
    <p>}&nbsp;&nbsp;&nbsp; 因为我们定义的服务带有MarketingService接口，这就意味着我们应该对MarketingMdp类进行一些小的修改，以便它可以实现MarketingService接口： </p>
    <p>&nbsp;&nbsp;public class MarketingMdp implements MarketingService { </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void processMotoristInfo(SpammedMotorist motorist) { </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;... </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;} </p>
    <p>} </p>
    <p>这就是使用Lingo输出服务的全过程。一旦应用程序启动，JmsServiceExporter将会起作用，就可以开始使用它了。现在，让我们再到客户端看看RoadRantz应用程序是如何调用这个被输出的市场服务的。 </p>
    <p><strong>代理JMS</strong>：在RoadRantz应用程序中，每次用户注册并选择愿意接收特定提供商信息时都需要调用processMotoristInfo()方法，因此，我们必须以某种方法将Lingo输出服务的引用置入到RoadRantz应用程序中。 </p>
    <ul>
        <li>
        <p><strong>置入JmsProxyFactoryBean</strong>:lingo提供了JmsProxyFactoryBean，这是一个代理工厂Bean，可以生成远程Lingo输出服务的代理。如PPT18所示，通过JmsProxyFactoryBean代理的服务是通过JMS目标(队列或主题)访问的，而不是通过TCP/IP。下面声明配置了一个JmsProxyFactoryBean： </p>
        <p>&lt;bean id = "marketing" class="org.logicblaze.lingo.jms.JmsProxyFactoryBean"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="connectionFactory" ref="connectionFactory" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="destination" ref="destination" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="serviceInterface" value="com.roadrantz.marketing.MarketingService" /&gt; </p>
        <p>&lt;/bean&gt; serviceInterface属性指定了代理需要实现的Java接口。通过这个接口，RoadRantz可以调用processMotoristInfo()方法。 对于配置JmsProxyFactoryBean，最需要注意的事情是不用配置服务的位置信息。这是因为服务的位置并不重要，只需要知道服务在哪里接收"邮件"。事实上，我们还可以使用远程服务的多个实例。如果想建立一个高可靠性的市场服务，可以启动两个或多个实例，让它们都监听相同的目标。每一个实例都能够处理一个请求。其间，客户端并不知道有一个服务池在等待请求进行响应。 </p>
        <p><strong>进行调用</strong>：在JmsProxyFactoryBean被置入后，就可以开始调用远程服务了。我们需要做的是将其置入到RantServiceImpl: </p>
        <p>&lt;bean id ="rantService" class="com.roadrantz.service.RantServiceImpl"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="rantDao" ref="rantDao" /&gt; </p>
        <p>&nbsp;<font color="#ff3366">&nbsp;&nbsp;&lt;property name="marketingService" ref="marketing" /&gt;</font> </p>
        <p>&lt;/bean&gt;&nbsp; 接着，我们可以使用它在addMotorist()方法中向市场服务发送SpammedMotorist对象。PPT19展示了为了调用远程市场服务对RantServiceImpl进行的相关修改。 正如你看到的，调用Lingo输出的服务与调用RMI服务、Web服务或在同一个进程中调用其他Bean上的方法是相同的。PPT19中没有任何关于JMS的内容。唯一不同的地方在Spring的配置。通过这种方法，只需要简单的更改Spring的配置就能够在JMS和其他通信机制直接进行切换。</p>
        </li>
    </ul>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/326480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-03-11 00:31 <a href="http://www.blogjava.net/kissyan4916/articles/326480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+JPA+Struts2整合</title><link>http://www.blogjava.net/kissyan4916/articles/257051.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Fri, 27 Feb 2009 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/257051.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/257051.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/257051.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/257051.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/257051.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Person类代码Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package&nbsp;quickstart.model;import&nbsp;javax.persistence.Entity;import&nbsp...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissyan4916/articles/257051.html'>阅读全文</a><img src ="http://www.blogjava.net/kissyan4916/aggbug/257051.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-27 15:48 <a href="http://www.blogjava.net/kissyan4916/articles/257051.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记之Spring-MVC </title><link>http://www.blogjava.net/kissyan4916/articles/326481.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Fri, 20 Feb 2009 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/326481.html</guid><description><![CDATA[<p>&nbsp; <img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/SpringMVC.png" width="322" height="504" /><br />
</p>
<ul>
    <li>
    <p><strong>请求生命中的第一天</strong>：请求从离开浏览器开始知道获得一个响应，期间会有几次停留，每一次都留下一些信息并得到更多的信息。（见PPT1） </p>
    <ul>
        <li>
        <p><strong>配置DispatcherServlet</strong>:Spring MVC的核心是DispatcherServlet，这个servlet的功能是作为Spring MVC的前端控制器。和任何Servlet一样，必须在Web应用系统的web.xml文件中配置。 </p>
        <p>&lt;servlet&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;roadrantz&lt;/servlet-name&gt; </p>
        <p>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt; </p>
        <p>&lt;/servlet&gt; </p>
        <p>当DispatcherServlet载入后，它将从XML中载入Spring的应用上下文，这个XML的名字取决于Servlet的名字。在本例中，因为Servlet的名字叫做roadrantz，所以DispatcherServlet将试图从一个叫做roadrantz-servlet.xml的文件中载入应用上下文。接下来指定哪些URL需要由DispatcherServlet来处理。 </p>
        <p>&lt;servlet-mapping&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;roadrantz&lt;/servlet-name&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.htm&lt;/url-pattern&gt; </p>
        <p>&lt;/servlet-mapping&gt;&nbsp; 我们可以为DispatcherServlet选择任意URL样式。我们选择"*.htm"样式的主要原因是因为这种样式是大多数生成HTML内容的Spring MVC应用系统的惯例用法。另一个原因是生成的内容是HTML，因此URL应该反映这一点。 </p>
        <ul>
            <li>
            <p><strong>分解应用上下文</strong>：正如前面提到的，DispatcherServlet从以&lt;servlet-name&gt;命名的XML文件中载入应用上下文。但这不是说你不能将你的应用上下文切到多个XML文件中。事实上，我们建议你将应用上下文分散到应用系统的各个层中。（见PPT2）由于DispatcherServlet的配置文件是roadrantz-servlet.xml，所以在这个文件中应该包含用于控制器和其他Spring MVC组件的&lt;bean&gt;定义信息。对于业务层和数据层的Bean，我们倾向于将他们分别放到roadrantz-service.xml和roadrantz-data.xml中。 </p>
            <p><strong>配置上下文载入器</strong>：为了保证所有的配置文件都被载入，需要在web.xml中配置一个上下文载入器。上下文载入器载入除DispatcherServlet载入的配置文件之外的其他上下文配置文件。最常用的上下文载入器是一个Servlet监听器，其名称为ContextLoaderListener，你需要在web.xml文件中像下面这样配置它： </p>
            <p>&lt;listener&gt; </p>
            <p>&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt; </p>
            <p>&lt;/listener&gt;&nbsp;&nbsp;&nbsp; 使用ContextLoaderListener配置时，你需要告诉它Spring配置文件的位置。如果没有指定，上下文载入器会在/WEB-INF/applicationContext.xml中找Spring配置文件。但是这样无法将应用上下文分散到应用系统的各个层中，所以你需要取代这种默认方式。 你可以通过Servlet上下文中设置contextConfigLocation参数来为上下文载入器指定一个或多个Spring配置文件： </p>
            <p>&lt;context-param&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/WEB-INF/roadrantz-service.xml, </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/WEB-INF/roadrantz-data.xml, </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/WEB-INF/roadrantz-security.xml </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/param-value&gt; </p>
            <p>&lt;/context-param&gt; </p>
            <p><strong>Spring MVC概述</strong>：每一个Web应用程序都有一个主页。这是应用程序的一个起始点。用户可以从主页中启动应用程序，也可以在失去方向时回到主页。否则，用户会不停的点击链接，感到很困扰，甚至可能离开，进入到其他网站中。第一步是建立一个处理主页请求的控制器对象。因此让我们来编写第一个Spring MVC控制器。 </p>
            <ul>
                <li>
                <p><strong>创建控制器</strong>：在Spring MVC中，控制器是一个与应用程序功能的接口类。（见PPT3）控制器接收请求，将请求发送给服务类进行处理，最后又收集需要返回给用户Web浏览器的结果。 </p>
                <p>public class HomePageController extends AbstractController { </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;protect ModelAndView handleRequestInternal(HttpServletRequest request,HttpServletResponse response)throws Exception { </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List recentRants = rantService.getRecentRants( ); </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;return new ModelAndView("home","rants",recentRants); </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;} </p>
                <p>&nbsp;&nbsp;&nbsp;private RantService rantService; </p>
                <p>&nbsp;&nbsp;&nbsp;public void setRantService(RantService rantService) { </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.rantService = rantService; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;} </p>
                <p>&nbsp;&nbsp;} </p>
                <p>} Spring控制器和Servlet或Struts Action的不同之处在于它被配置成Spring应用上下文的一个普通JavaBean。这意味着，使用控制器和使用其他Bean一样，可以充分利用依赖注入和Spring AOP。在HomePageController中，依赖注入用在了注入一个RantService.HomePageController </p>
                <p><strong>引入ModelAndView</strong>：控制器执行方法都必须返回一个ModelAndView。因此需要理解这个重要的类是如何工作的。正如它的名字表述的，ModelAndView保存了视图以及视图显示的模型数据.在HomePageController里，ModelAndView对象应按照下面的方式构建： new ModeAndView("home","rants",recentRants); 构造器的第一个参数是视图组件(用于显示空气器的输出)的逻辑名称。这里，视图的逻辑名称是home。视图解析器会使用这个名称查找实际的View对象&nbsp; 。 后两个参数分别表示传递给视图的模型对象。这个两个参数是一个名字值对。第二个参数就是第三个参数所表示的模型对象名称。 </p>
                <p><strong>配置控制器Bean</strong>:现在HomePageController已经写好了，你必须将其配置到DispatcherServlet的上下文配置文件中(对于RaodRantz应用程序就是roadrantz-servlet.xml文件)。下面这段XML代码定义了HomePageController: </p>
                <p>&lt;bean name="/home.htm" class="com.roadrantz.mvc.HomePageController"&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&lt;property name="rantService" ref="rantService" /&gt; </p>
                <p>&lt;/bean&gt;&nbsp;&nbsp;有件事让你感到奇怪，不是为HomePageController Bean设置id属性，而是设置name属性。并且更奇怪的是设定的不是一个真实名字，而是给它设置一个URL"/home.htm"。这里name属性承担了两个责任，即定义Bean的名字也定义需要使用这个控制器处理的URL样式。由于URL样式含有XMLid属性中的非法字符--特别是斜杠(/)，所以使用name属性，而不使用id。只要进入DispatcherServlet的请求是以"/home.htm"结尾的，DispatcherServlet就会分给HomePageController来处理，注意这个Bean的name属性使用的是URL样式的唯一原因是我们还没有配置处理映射Bean。DispatcherServlet使用的默认处理器映射是BeanNameUrlHandlerMapping，它使用URL样式的名字。 </p>
                <p><strong>声明一个视图解析器</strong>：返回给ModelAndView对象的其中一个值是逻辑视图名称。然而这个逻辑视图名称并不是直接引用特定的JSP的，而是用于间接的表达使用哪一个JSP。为了帮助Spring MVC了解使用哪一个JSP，你需要在roadrantz-servlet.xml中声明另一个Bean：一个视图解析器。简单来看，视图解析器的工作就是将视图的名称返回到ModelAndView中并将其映射到一个视图上。在HomePageController中，我们需要一个视图解析器将"home"解析成一个JSP文件来呈现主页。Spring MVC带来了很多可供选择的视图解析器。对于使用JSP渲染视图来说，再也没有比InteralResourceViewResolver更简单的了: </p>
                <p>&nbsp;&nbsp;&lt;bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="prefix"&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;/WEB-INF/jsp/&lt;/value&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="suffix"&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;.jsp&lt;/value&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
                <p>&nbsp;&nbsp;&nbsp;&lt;/bean&gt;由于HomePageController返回的ModelAndView中的视图名是home,InternalResourceViewResolver将在/WEB-INF/jsp/home.jsp处查找视图。 </p>
                </li>
            </ul>
            </li>
        </ul>
        </li>
    </ul>
    <p><strong>将请求映射到控制器</strong>：当请求到达DispatcherServlet时，需要一些目录来指明请求应该如何分配。处理器映射可以帮助DispatcherServlet了解请求应该被发送给哪个控制器。我们依赖DispatcherServlet默认使用的BeanNameUrlHandMapping。BeanNameUrlHandMapping很容易上手，但是 它无法满足所有情况。所幸，Spring MVC提供了几种可以选择的处理器映射实现。Spring MVC中所有的处理器映射都实现了接口org.springframework.web.servlet.HandlerMapping&nbsp;&nbsp;（见PPT4） </p>
    <ul>
        <li>
        <p><strong>使用SimpleUrlHandlerMapping</strong>：它可能是最直接的Spring处理器映射。它允许你将URL样式直接映射到控制器，而且不需要以待定的方式命名你的Bean。例如： </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="mappings"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="/home.htm"&gt;homePageController&lt;/prop&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="/rantsForVehicle.htm"&gt;rantsForVehicleControllerRss&lt;/prop&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="/rantsForVehicle.rss"&gt;rantsForVehicleControllerRss&lt;/prop&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/props&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;/bean&gt; </p>
        <p>&lt;props&gt;元素的key属性是URL样式。和BeanNameUrlHandlerMapping一样，所有的URL样式和DispatcherServlet的&lt;servlet-mapping&gt;一一对应。&lt;prop&gt;的值是处理这个URL的控制器Bean的名字。 </p>
        <p><strong>使用ControllerClassNameHandlerMapping</strong>:很多时候，你会发现控制器映射的URL样式都与控制器类名很相似。例如，在RoadRantz应用程序中，我们将rantForVehicle.htm映射到rantForVehicleController，将rantsForDay.htm映射到RantsForDayController。在这些例子中，URL样式与控制器的类名相同，只不过去掉了Controller部分，加上了.htm部分。这种样式就好像对映射设置了特定的默认值，而不需要明确地进行映射。这大概就是ControllerClassNameHandlerMapping所做的工作： </p>
        <p>&lt;bean id="urlMapping" class="org.springframework.web.servlet.mvc.ControllerClassNameHandlerMapping" /&gt; </p>
        <p>这样就可以通知Spring的DispatcherServlet将URL样式按照简单的约定映射到控制器。Spring不必明确的为每个控制器映射URL样式，而是可以根据控制器的类名自动的将控制器映射到URL样式上。 为了简单起见，要想生成URL样式，控制器类名中的Controller部分会被去掉(如果这部分存在)，剩下的文本会变成小写字母，并且在最前面加上一个反斜杠/，在最后加上".htm"。 </p>
        <p><strong>使用CommonsPathMapHandlerMapping元数据映射控制器</strong>：它是根据控制器源代码中的元数据决定如何进行URL映射。这个元数据特定是一个org.springframework.web.servlet.handler.commonsattributes.PathMap属性，是用Jakarta Commons Attributes编译器编译到控制器中。 要使用它，只要像下面这样简单地在上下文控制文件中定义一个Bean就可以了： </p>
        <p>&lt;bean id="urlMapping" class="org.springframework.web.servlet.handler.metadata.CommonsPathMapHandlerMapping" /&gt; </p>
        <p>控制器源代码注释标签中的PathMap属性声明了这个控制处理的URL样式。例如，为了将HomePageController映射到"/home.htm"，HomePageController的标签是这样的： </p>
        <p>/** </p>
        <p>&nbsp;* @@org.springframework.web.servlet.handler.commonsattributes.PathMap("/home.htm") </p>
        <p>*/ </p>
        <p>public class HomePageController extends AbstractController { </p>
        <p>&nbsp;...... </p>
        <p>}&nbsp;&nbsp;最后，编译的时候需要将Commons Attributes编译器放进来，这样标签PathMap 才能被编译到应用代码中。要详细了解如何在Ant 或Maven中设置Commons Attributes编译器，请参考Commons Attributes 主页(http://jakarta.apache.org/commons/attributes)。 </p>
        <p><strong>使用多映射处理器</strong>：所有的处理器映射类都实现了Spring的Ordered接口。这意味着你可以在应用系统中声明多个处理器映射，并且设置哪个相对另一个有优先权。例如，假设想在一个应用系统中并排使用BeanNameUrlHandlerMapping和SimpleUrlHandlerMapping。你需要像下面这样声明处理器映射Bean: </p>
        <p>&lt;bean id="beanNameUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="order"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;1&lt;/value&gt; </p>
        <p>&nbsp;&nbsp;&lt;/property&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>&lt;bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="order"&gt;&lt;value&gt;0&lt;/value&gt; &lt;/property&gt;&nbsp; </p>
        <p>&nbsp;&nbsp;&lt;property name="mappings"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;... </p>
        <p>&nbsp;&nbsp;&lt;/property&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>注意，order属性的值越小，优先级越高。 </p>
        </li>
    </ul>
    <p><strong>用控制器处理请求</strong>：如果DispatcherServlet是Spring MVC的心脏，那么控制器就是它的大脑。Spring控制器与Struts/web work action相比有一个重要的区别。这就是，相比Struts或Web Work比较平坦的Action层次，Spring提供了丰富的控制器层（见PPT5）在控制器层次的最上面是接口Controller，任何实现这个接口的类都可以用来处理Spring MVC框架传递过来的请求。要创建自己的控制器，你必须要做的就是实现这个接口。Spring让你选择最适合自己需要的控制器（见PPT6）Spring控制器可以归为6种类型，沿着表格向下，功能越来越多，除了ThrowawayController，顺着控制器类层次向下，每个控制器都是建立在它上面的控制器基础之上的。 </p>
    <ul>
        <li>
        <p><strong>处理命令</strong>：当控制器需要根据参数执行工作时，应该继承命令控制器，如AbstractCommandController（见PPT7）这个控制器会自动将参数绑定到命令对象中，并且提供了插入验证器的钩子，确保参数合法性。下面显示了RantsForVehicleController，一个用于显示特定车辆已有投诉列表的命令控制器。 </p>
        <p>public class RantsForVehicleController&nbsp;&nbsp;extends AbstractCommandController{ </p>
        <p>public RantsForVehicleController() { </p>
        <p>setcommandClass(Vehicle.class); </p>
        <p>setCommandName("vehicle"); </p>
        <p>} </p>
        <p>protected ModelAndView handle(HttpServletRequest request,HttpServletResponse,Object command, </p>
        <p>BindException errors) throws Exception { </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Vehicle vehicle = (Vehicle) command; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List vehicleRants = rantService.getRantsForVehicle(vehicle); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map model =errors.getModel(); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.put("rants", rantService.getRantsForVehicle(vehicle)); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.put("vehicle", vehicle); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new ModelAndView("vehicleRants",model); </p>
        <p>&nbsp;} </p>
        <p>private RantService rantService; </p>
        <p>public void setRantService(RantService rantService) { </p>
        <p>this.rantService = rantService; </p>
        <p>&nbsp;} </p>
        <p>} </p>
        <p>一个命令对象是一个为了简化对请求参数访问而设计的Bean。一个Spring命令对象是一个POJO，它不需要实现任何Spring的特定类。你需要在roadrantz-servlet.xml文件中注册RantsForVehicleController </p>
        <p>&lt;bean id="rantsForVehicleController" class="com.roadrantz.mvc.RantsForVehicleController"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="rantService" ref="rantService"/&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p><strong>处理表单提交</strong>：表单控制器比命令控制器前进了一步，（见PPT8）它在接收到HTTP GET请求的时候显示一个表单，接收到一个HTTP POST请求的时候处理这个表单。另外，在处理过程中如果发生错误的话，这个控制器会知道重新显示这个表单，这样用户就可以修改错误，重新提交。为了显示表单控制器是如何工作的，考虑以下程序中的AddRantFormController。 </p>
        <p>public class AddRantFormController extends SimpleFormController { </p>
        <p>private static final String[] ALL_STATES = {"AL","AK","AZ"}; </p>
        <p>&nbsp;&nbsp;&nbsp;public AddRantFormController() { </p>
        <p>&nbsp;&nbsp;&nbsp;setCommandClass(Rant.class); </p>
        <p>&nbsp;&nbsp;&nbsp;setCommandName("rant"); </p>
        <p>&nbsp;&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;&nbsp;protected Object formBackingObject(HttpServletRequest request) throws Exception { </p>
        <p>&nbsp;&nbsp;&nbsp;Rant rantForm = (Rant)super.formBackingObject(request); </p>
        <p>&nbsp;&nbsp;&nbsp;rantForm.setVehicle(new Vehicle()); </p>
        <p>&nbsp;&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;&nbsp;protected Map referenceDate(HttpServletRequest request) throws Exception{ </p>
        <p>&nbsp;&nbsp;&nbsp;Map referenceData = new HashMap(); </p>
        <p>&nbsp;&nbsp;&nbsp;referenceDate.put("states",ALL_STATES); </p>
        <p>&nbsp;&nbsp;&nbsp;return referenceData; </p>
        <p>&nbsp;&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;&nbsp;protected ModelAndView onSumbit(Object command,BindException bindException)throws Exception{ </p>
        <p>&nbsp;&nbsp;&nbsp;Rant rant = (Rant)command; </p>
        <p>&nbsp;&nbsp;&nbsp;rantService.addRant(rant); </p>
        <p>&nbsp;&nbsp;&nbsp;return new ModelAndView(getSuccessView()); </p>
        <p>&nbsp;&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;&nbsp;private RantService rantService; </p>
        <p>public void setRantService(RantService rantService) { </p>
        <p>this.rantService = rantService; </p>
        <p>} </p>
        <p>}虽然referenceData()方法是可选的，但是如果需要为 显示表单提供其他附加的信息，则可以使用这个方法。在正常的情况下，返回表单的命令对象一般是一个简单的命令类实例。不过对于AddRantFormController,Rant实例不会完成这项工作。表单会使用内嵌的Vehicle属性作为表单返回对象的一部分。因此，需要覆盖fromBackingObject()方法，以便设置vehicle属性。否则，在控制器视图绑定state和plateNumber属性时，会抛出NullPointerException异常。 </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp; 那么控制器是如何知道显示投诉输入表单的。如果投诉输入成功，用户将到什么页面也不是很清楚。唯一的线索是对getSuccessView(）的调用结果会提交给ModelAndView。但是，提交成功的视图又从哪里来呢？SimpleFormController被设计成尽量将视图详细信息放在控制器代码之外。不是将ModelAndView对象硬编码进来，而是像下面这样在上下文配置文件中配置控制器： </p>
        <p>&lt;bean id="addRantController" class="com.roadrantz.mvc.AddRantFormController"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="formView"&nbsp;&nbsp;value="addRant" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="successView" value="rantAdded" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="rantService" ref="rantService" /&gt; </p>
        <p>&lt;/bean&gt; formView属性是控制器接收到HTTP GET请求或有任何错误发生时需要显示的视图的逻辑名。同样，successView是提交的表单成功处理后要显示的视图的逻辑名。 </p>
        <p><strong>验证表单输入</strong>：org.springframework.validation.Validator接口为Spring MVC提供了验证功能，定义如下： </p>
        <p>public interface Validator { </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;void validate(Object obj&nbsp;&nbsp;, Errors errors); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;boolean supports(Class clazz); </p>
        <p>}这个接口的实现必须验证传递给validate()方法的对象的字段，用Errors对象驳回任何非法数据。supports()方法用于帮助Spring判断该验证器是否可以用于指定类。 以下是一个用于验证Rant对象的Validator实现。 </p>
        <p>public class RantValidator implements Validator { </p>
        <p>&nbsp;&nbsp;public boolean supports(Class clazz){ </p>
        <p>&nbsp;&nbsp;return clazz.equals(Rant.class); </p>
        <p>&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;public void validate(Object command, Errors errors) { </p>
        <p>&nbsp;&nbsp;Rant rant = (Rant) command; </p>
        <p>&nbsp; ValidationUtils.rejectIfEmpty(errors,"vehicle.state","required.state","State is required"); </p>
        <p>&nbsp;&nbsp;ValidationUtils.rejectIfEmptyOrWhitespace(errors, "rantText", "required.rantText","You must enter some rant text."); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validatePlateNumber(rant.getVehicle().getPlateNumber(),errors); </p>
        <p>&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;private static final String PLATE_REGEXP = "/[a-z0-9]{2,6}/i"; </p>
        <p>&nbsp;&nbsp;private void validatePlateNumber(String plateNumber,Errors errors) { </p>
        <p>&nbsp;&nbsp;Per15Util per15Util = new Per15Util(); </p>
        <p>&nbsp;&nbsp;if(!per15Util.match(PLATE_REGEXP,plateNumber)){ </p>
        <p>&nbsp;&nbsp;errors.reject("invalid.plateNumber","Invalid license plate number."); </p>
        <p>&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;} </p>
        <p>}还有一件事情要做，就是让AddRantFormController使用RantValidator。你可以将一个RantValidator Bean装配到AddRantFormController Bean中： </p>
        <p>&lt;bean id="addRantController" class="com.roadrantz.mvc.AddRantFormController"&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="formView" value="addRant"/&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="successView" value="rantAdded"/&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="rantService"&nbsp;&nbsp;ref="rantService"/&gt; </p>
        <p>&nbsp;&nbsp;&lt;property name="validator"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="com.roadrantz.mvc.RantValidator"&gt;&lt;/bean&gt; </p>
        <p>&nbsp;&nbsp;&lt;/property&gt; </p>
        <p>&lt;/bean&gt;通过实现Validation接口，可以通过程序完全控制应用程序命令对象的验证。如果需要复杂的验证和特殊的逻辑，利用这项功能将会十分方便。对于简单的情况，例如保证填入需要的字段并按照基本格式，编写自己的Validator接口就有点麻烦了。声明性验证是一个不错的选择。 </p>
        <p><strong>利用命令验证器进行验证</strong>：在我们深入研究用于实现声明性Validator的Spring JavaDoc之前，需要知道Spring并不提供这样的验证器。Spring没有提供任何Validator接口的实现，而是将这个任务留给了程序员。 不过Spring Modules项目(http://springmodules.dev.java.net)是Spring的一个姊妹项目，提供了几个对Spring的扩展。其中一个是使用Jakarta Commons Validator(http://jakarta.apache.org/commons/validator)提供的声明性验证的验证模块。 </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;要使用验证模块，首先需要添加springmodules-validator,jar&nbsp;&nbsp;如果使用Ant建立应用程序，需要下载Spring Modules发行包，找到spring-modules-0.6.jar文件，将这个JAR添加到&lt;war&gt;任务的&lt;lib&gt;中。如果使用Maven2建立应用程序，需要在pom.xml中添加下面的&lt;dependency&gt;: </p>
        <p>&lt;dependency&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.springmodules&lt;/groupId&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;springmodules-validation&lt;/artifactId&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;version&gt;0.6&lt;/version&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;scope&gt;compile&lt;/scope&gt; </p>
        <p>&lt;/dependency&gt; </p>
        <p>&nbsp;另外，还需要将Jakarta Commons Validator JAR添加到应用程序的classpath中，在Maven中，按如下所示： </p>
        <p>&lt;dependency&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;groupId&gt;commons-validator&lt;/groupId&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;commons-validator&lt;/artifactId&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;version&gt;1.1.4&lt;/version&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;scope&gt;compile&lt;/scope&gt; </p>
        <p>&lt;/dependency&gt; </p>
        <p>Spring Module提供的Validator实现的名称为DefaultBeanValidator。DefaultBeanValidator需要按下面的方式配置在roadrantz-servlet.xml中： </p>
        <p>&lt;bean id="beanValidator" class="org.springmodules.commons.validator.DefaultBeanValidator"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="validatorFactory" ref="validatorFactory"&gt;&lt;/property&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>DefaultBeanValidator并不做任何实际的验证工作，而是委派Commons Validator来验证字段的值。validatorFactory Bean需要使用下面的XML进行声明： </p>
        <p>&nbsp;&nbsp;&lt;bean id="validatorFactory" class="org.springmodules.commons.validator.DefaultValidatorFactory"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="validationConfigLocations"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;WEB-INF/validator-rules.xml&lt;/value&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;WEB-INF/validator.xml&lt;/value&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
        <p>&lt;/bean&gt; validator-rules.xml文件包含了一组预定义的验证规则，可以应用于一般的验证需求。这个文件被包含在Commons Validator发行包中，因此，你不需要自己编写--值需要简单的将其添加到应用程序的WEB-INF目录中。（PPT9）中列出了validator-rules.xml中的所有验证规则。另一个文件validation.xml定义了应用程序制定的验证规则，可有直接应用于RoadRantz应用程序。下面展示了应用到RoadRantz的validation.xml </p>
        <p>&lt;?xml version="1.0" encoding="UTF-8"?&gt; </p>
        <p>&lt;!DOCTYPE form-validation PUBLIC"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1 </p>
        <p>&nbsp;&nbsp;&nbsp;//EN" "http://jakarta.apache.org/commons/dtds/validator_1_1.dtd" &gt; </p>
        <p>&lt;form-validation&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;formet&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="rantText" depends="required"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg0 key="required.rantText"/&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field property="vehicle.plateNumber" depends="required,mask"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;arg0 key="invalid.plateNumber"/&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-name&gt;mask&lt;/var-name&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;var-value&gt;^[0-9A-Za-z]{2,6}$&lt;/var-value&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/var&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/field&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/formet&gt; </p>
        <p>&lt;/form-validation&gt; </p>
        <p>最后一件要做的事情是改变控制器的声明，注入新的声明性Validate实现： </p>
        <p>&lt;bean id="addRantController" class="com.roadrantz.mvc.AddRantFormController"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="formView" value="addRant" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="successView" value="rantAdded" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="rantService" value="rantService" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="validator" value="beanValidator" /&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>&nbsp; <font color="#ff0000">使用SimpleFormController的一个基本的原因是表单只有一页。</font> </p>
        <p><strong>用向导处理复杂表单</strong>：AbstractWizardFormController是Spring提供的功能最强大的控制器（见PPT10）它是一种特殊类型的表单控制器，它将多个页面中的表单数据聚集到一个用于处理的命令对象中。 </p>
        <ul>
            <li>
            <p><strong>创建一个基本的向导控制器</strong>：构建一个向导控制器，它必须继承AbstractWizardFormController类，如下： </p>
            <p>public class MotoristRegistrationController extends AbstractWizardFormController { </p>
            <p>&nbsp;&nbsp;<font color="#cc0000">public MotoristRegistrationController()</font>&nbsp;{ </p>
            <p>&nbsp;&nbsp;&nbsp;setCommandClass(Motorist.class); </p>
            <p>&nbsp;&nbsp;&nbsp;setCommandName("motorist"); </p>
            <p>&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;<font color="#cc0000">protected Object formBackingObject(HttpServletRequest request) throws Exception{</font> </p>
            <p>Motorist formMotorist = new Motorist(); </p>
            <p>List&lt;Vehicle&gt; vehicles = new ArrayList&lt;Vehicle&gt;(); </p>
            <p>vehicles.add(new Vehicle()); </p>
            <p>formMotorist.setVehicles(vehicles); </p>
            <p>return formMotorist; </p>
            <p>&nbsp;&nbsp;} </p>
            <p>&nbsp;<font color="#cc0000">&nbsp;protected Map referenceData(HttpServletRequest request,Object command,Errors errors,int page) </font></p>
            <p><font color="#cc0000">&nbsp;&nbsp;&nbsp;throws Exception{</font> </p>
            <p>Motorist motorist = (motorist) command; </p>
            <p>Map refData = new HashMap(); </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;if(page==1 &amp;&amp; request.getParameter("_target1")!= null){ </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refData.put("nextVehicle", motorist.getVehicles().size()-1); </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;return refData; </p>
            <p>&nbsp;&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;<font color="#cc0000">protected void postProcessPage(HttpServletRequest request,Object command,Errors errors,int page)throws Exception {</font> </p>
            <p>Motorist motorist = (Motorist)command; </p>
            <p>if(page==1 &amp;&amp; request.getParameter("_target1")!= null){ </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;motorist.getVehicles().add(new Vehicle()); </p>
            <p>&nbsp;&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;<font color="#cc0000">protected ModelAndView&nbsp;&nbsp;processFinish(HttpServletRequest request,HttpServletResponse response, </font></p>
            <p><font color="#cc0000">&nbsp;&nbsp;Object command,BindException errors)throws Exception {</font> </p>
            <p>Motorist motorist = (motorist) command; </p>
            <p>// the last Vehicle is always blank...remove it </p>
            <p>motorist.getVehicles().remove(motorist.getVehicles().size()-1); </p>
            <p>rantService.addMotorist(motorist); </p>
            <p>return new ModelAndView(getSuccessView(),"motorist",motorist); </p>
            <p>&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;//inject </p>
            <p>&nbsp;&nbsp;private RantService rantService; </p>
            <p>&nbsp;&nbsp;public void setRantService(RantService rantService) { </p>
            <p>this.rantService = rantService; </p>
            <p>&nbsp;&nbsp;} </p>
            <p>&nbsp;&nbsp;//returns the last page as the success view </p>
            <p>&nbsp;&nbsp;<font color="#cc0000">private String getSuccessView() {</font> </p>
            <p>&nbsp;&nbsp;return getPages()[getPages().length-1]; </p>
            <p>&nbsp;&nbsp;} </p>
            <p>} </p>
            <p>AbstractWizardFormController的唯一一个必须实现的方法是processFinish()。在用户完成表单后(一般是点击完成按钮),这个方法被调用，完成整个表单。 但是AbstractWizardFormController是如何知道哪些页面构成了整个表单呢？ </p>
            <p>&lt;bean id="registerMotoristController" class="com.roadrantz.mvc.MotoristRegistrationController"&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;property name="rantService" ref="rantService" /&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;property name="pages"&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;motoristDetailForm&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;motoristVehicleForm&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;motoristConfirmation&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;redirect:home.htm&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
            <p>&lt;/bean&gt;这样向导就知道了哪些页面构成了表单，一个视图逻辑名列表设置给了pages属性。这些名字最终被视图解析器解析成了一个个视图对象。但现在，只要假设这些名字会被解析成JSP文件名就可以了。 </p>
            <p><strong>分步显示表单页面</strong>：任何向导控制器显示的第一个页面都是pages属性中列表的第一个页面。AbstractWizardFormController询问它的getTargetPage()方法。这个方法返回一个整数，它是pages属性中设置的页面列表的索引值(以0为基数)。getTargetPage()方法的默认实现是根据请求中的一个参数来决定下一步是哪个页面，这个参数以"_target"开头，以数字结尾。知道了getTargetPage()的工作原理有助于你知道如何在向导HTML页面中构造下一步和上一步按钮。例如，假设用户在"motoristVehicleForm"页面上(索引=1)。要在这个页面上创建下一步和上一步按钮，你要做就是创建提交按钮，它的名字是以"_target"开头： </p>
            <p>&lt;form&gt; </p>
            <p>... </p>
            <p>&nbsp;&nbsp;&lt;input type="submit" value="Back" name="_target0"&gt; </p>
            <p>&nbsp;&nbsp;&lt;input type="submit" value="Next" name="_target2"&gt; </p>
            <p>&lt;/form&gt;getTargetPage()方法的默认实现对于大多数项目已经够用了。然后，如果你喜欢为你的向导定义自己的工作流程的话，你可以覆写这个方法。 </p>
            <p><strong>完成向导</strong>：还有一个特殊请求的参数"_finish"，和"_targetX"参数一样，它可以被用于在页面上创建一个结束按钮： </p>
            <p>&lt;form method="POST" action="feedback.htm"&gt; </p>
            <p>... </p>
            <p>&nbsp;&nbsp;&lt;input type="submit" value="Finish" name="_finish"&gt; </p>
            <p>&lt;/form&gt; </p>
            <p>当AbstractWizardFormController看到请求中的"_finish"参数时，它会将控制权交给processFinish()方法，让它对表单做最后的处理。与其他表单控制器不同，AbstractWizardFormController不提供用于设置成功视图页面的内容。因此，我们在MotoristRegisttrationController中添加了一个getSuccessView()方法返回页面列表中的最后一个页面。所以，当表单已完成的方式提交时，processFinish()方法会返回一个带有视图的ModelAndView,这个视图就是页面列表中的最后一个视图。 </p>
            <p><strong>取消向导</strong>：如何用户完成了部分注册，决定不再继续完成，除了选择直接关闭浏览器外，还有另一种选择，你可以在表单上添加一个取消按钮。 </p>
            <p>&lt;form method="POST" action="feedback.htm"&gt; </p>
            <p>... </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;input type="submit" value="Cancel" name="_cancel"&gt; </p>
            <p>&lt;/form&gt; </p>
            <p>取消按钮以"_cancel"作为它的名字，当用户按下取消按钮，浏览器将一个叫做"_cancel"的参数放到请求中。AbstractWizardFormController接收到这个参数，将控制权交给processCancel()方法。 默认情况下此方法会抛出异常，表示取消操作是不被支持的，我们要覆写这个方法，将用户带到你想让他们点击取消时看到的页面。下面processCancel()方法的实现将用户带领到成功视图。 </p>
            <p>protected ModelAndView processCancel(HttpServletRequest&nbsp;&nbsp;&nbsp;request,&nbsp;&nbsp; HttpServletResponse&nbsp;&nbsp;&nbsp;response, Object command,&nbsp;&nbsp;BindException&nbsp; bindException)&nbsp;&nbsp;throws Exception { </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new ModelAndView(getSucessView()) ; </p>
            <p>} </p>
            <p><strong>每次验证一个向导表单</strong>：使用其他类型的命令控制器，命令对象只装载一个次。但使用向导控制器，用户每完成向导页面中的一步，都会有一个命令对象设置进来。使用向导，只做一次验证是不可行的，太早的话，找到的验证问题可能是由于用户没有完成向导而导致的。太晚的话，在完成按钮被按下后再做检查就太迟了，因为发现的问题可能越过了多个页面(用户该回到哪个页面呢？) &nbsp; 向导控制器在每个页面验证一次命令对象，不是只验证一次。这是通过每次页面跳转时调用validatePage()方法实现的。validatePage()方法的默认实现是空的（也就是没有验证），但是你可以覆写这个方法，做出自己的判断。 假设在motoristDetailForm页面，询问用户的邮件地址，这个字段是可选的，但是如果输入了值，必须输入一个合法的E-mail地址。下面的validatePage(）方法展示了用户从motoristDetailForm页面跳转出来的时候如何验证E-mail地址。 </p>
            <p>protected void validatePage(Object&nbsp;&nbsp;command,&nbsp;&nbsp;Errors&nbsp;&nbsp;errors, int page ) { </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;Motorist&nbsp;&nbsp;motorist =&nbsp;&nbsp;(Motorist)&nbsp;&nbsp;command; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;Motorist Validator&nbsp;&nbsp;validator&nbsp;&nbsp;= (MotoristValidator) getValidator(); </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;if(page == 0){ </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;validator.validateEmail(motorist.getEmail() , errors ); </p>
            <p>&nbsp;&nbsp;} </p>
            <p>}&nbsp; 这里可以直接在validatePage()方法中检查E-mail。然后，向导一般有好几项字段需要验证。如果这样的话，validatePage(）方法会变得很笨拙。我们建议你将验证任务委托给控制器的验证器对象的字段级验证方法，就像我们在这里调用MotoristValidator的validateEmail()方法一样。 &nbsp;这意味着当你配置控制器的时候，你要设置validator属性： </p>
            <p>&lt;bean id="registerMotoristController" class="com.roadrantz.mvc.MotoristRegistrationController"&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;property name="rantService" ref="rantService" /&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;property name="pages"&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;motoristDetailForm&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;motoristVehicleForm&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;motoristConfirmation&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;redirect:home.htm&lt;/value&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt; </p>
            <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
            <p>&nbsp; <font color="#cc0000">&nbsp;&lt;property name="validator"&gt; </font></p>
            <p><font color="#cc0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="com.roadrantz.mvc.MotoristValidator" /&gt; </font></p>
            <p><font color="#cc0000">&nbsp;&nbsp;&nbsp;&lt;/property&gt;</font> </p>
            <p>&lt;/bean&gt; </p>
            <p>一个需要注意的重要事项是，不像其他命令控制器，向导控制器从不调用它们的验证器对象的标准validate()方法。这是因为validate()方法验证整个命令对象，然而在向导中命令对象将在每个页面验证一次。 </p>
            </li>
        </ul>
        <p><strong>使用一次性控制器</strong>：一次性控制器比其他控制器简单很多，ThrowawayController接口可以证明： </p>
        <p>public interface&nbsp;&nbsp;ThrowawayController { </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ModelAndView execute() throws Exception ; </p>
        <p>} </p>
        <p>ThrowawayController接口和Controller接口不在同一个体系里。一次性控制器自己作为自己作为自己的命令对象，而不是通过一个HttpServletRequest或一个命令对象获得参数。与WebWork Action相似，都是以同样的方式工作。我们将RantsForController实现为ThrowawayController： </p>
        <p>public class RantsForDayController implements ThrowawayController{ </p>
        <p>&nbsp;&nbsp;&nbsp;private Day day; </p>
        <p>&nbsp;&nbsp;&nbsp;public ModelAndView execute() throws Exception { </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Rant&gt;&nbsp;&nbsp;dayRants = rantService.getRantsForDay(day); </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new ModelAndView("dayRants","rants",dayRants); </p>
        <p>&nbsp;&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;&nbsp;public void setDay(Date day){ </p>
        <p>&nbsp;&nbsp;&nbsp;this.day = day; </p>
        <p>&nbsp;&nbsp;&nbsp;} </p>
        <p>&nbsp;&nbsp;&nbsp;private RantService rantSrvice; </p>
        <p>public void setRantSrvice(RantService rantSrvice) { </p>
        <p>this.rantSrvice = rantSrvice; </p>
        <p>&nbsp;&nbsp;} </p>
        <p>} 你必须在DispatcherServlet的上下文配置文件中声明一次性控制器。只有一点很小的不同： </p>
        <p>&lt;bean id="rantsForDayController" class="com.roadrantz.mvc.RantsForDayController" scope="prototype"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="rantService" ref="rantService"&gt; </p>
        <p>&lt;/bean&gt; scope属性已经被设置为prototype。这就是一次性控制器获取它们名字的地方。默认情况下，所有的Bean都是Singleton。 但是因为ThrowawayContoller和Controller不处于同一继承层次，DispatcherServlet不知道如何通知ThrowawayController。所以你必须告诉DispathcerServlet使用一种不同的 处理适配器。确切的说，你必须像下面这样配置ThrowawayControllerHandlerAdapter: </p>
        <p>&nbsp;&nbsp;&lt;bean id="throwawayHandler" class="org.springframework.web.servlet.mvc.throwaway.ThrowawayControllerHandlerAdapter" /&gt; </p>
        <p>如果应用程序既使用了常规控制器又使用了一次性控制器，你还应该按如下方式声明SimpleControllerHandleAdapter: </p>
        <p>&nbsp;&lt;bean id="simpleHandler"&nbsp; class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /&gt; </p>
        <p>声明两处理器适配器使你可以在用一个应用程序中混合使用两种类型的控制器。 </p>
        </li>
    </ul>
    <p><strong>处理异常</strong>：当异常从控制器中跑出来时，SimpleMappingExceptionResolver负责营救。 </p>
    <p>&lt;bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="exceptionMappings"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="java.lang.Exception"&gt;friendlyError&lt;/prop&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/props&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp; </p>
    <p>&lt;/bean&gt; </p>
    <p>&nbsp;&nbsp; exceptionMappings属性取得一个java.util.Properties，它映射了异常类名和逻辑视图名。在本例中，基础异常类被映射到逻辑名为friendlyError的视图上，这样如果有任何异常抛出的话，用户不会在浏览器中看到一串晦涩的堆栈跟踪信息。 </p>
    </li>
</ul><img src ="http://www.blogjava.net/kissyan4916/aggbug/326481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-21 00:34 <a href="http://www.blogjava.net/kissyan4916/articles/326481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记之Spring-Web Service</title><link>http://www.blogjava.net/kissyan4916/articles/326482.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Wed, 18 Feb 2009 16:40:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/326482.html</guid><description><![CDATA[<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/SpringWS.png" width="630" height="497" /><br />
</p>
<li>
<p>定义服务契约：设计由Web服务处理的样本XML消息。我们将使用这些样本消息创建用于生成WSDL的XML Schema。
</p>
<ul>
    <li>
    <p>数据契约：定义了进入和流出服务的消息。使用XML模式（XSD）定义。XSD允许我们精确地定义消息的内容。我们不仅能够定义消息中的元素，还可以指定这些消息的类型以及对消息中数据的限制。 &nbsp;（小提示：尽管手工编写XSD不是很困难，但是也需要我们做更多的工作，XSD interface工具可以基于内容检查一个或多个XML文件，生成可以验证XML文件的XML模式，见PPT 1 。虽然这样为我们节省了很多工作，但我们不能完全不做工作。这个XSD并不是很好，因为它会假设XML中的数据类型。大多数时候，这些假设没有问题，但是通常情况下，我们还是需要XSD能够更精确一点 ）&nbsp;&nbsp;
    </p>
    <p>操作契约：定义了服务将要执行的操作。 </p>
    </li>
</ul>
<p>编写服务端点：创建类来接收和处理发向Web服务的消息。（消息端点是一个类，用于从客户端接收XML消息，根据消息的内容，调用内部应用程序对象执行实际的工作。Spring-WS定义了几个可以创建消息端点的抽象类。见PPT2）
</p>
<ul>
    <li>
    <p>建立基于JDOM消息的端点
    </p>
    <p>序列化消息载荷：AbstractorMarshallingPayloadEndpoint与其他Spring-WS抽象端点类不同，它并不是从XML元素中抽取信息，而是通过处理对象获取信息（PPT 3）。见Spring in action P240程序清单9.3 你会发现它比EvaluateHandJDomEndpoint短得多。这是因为EvaluateHandMarshallingEndpoint没有任何在EvaluateHandJDomEndpoint中所必须的XML解析代码。 在这里我们没有看到的是AbstractMarshallingPayloadEndpoint中有一个XML序列化器的引用。当接收到XML消息时，它会在调用invokeInternal（）前使用这个序列化器将XML消息变成对象。 &nbsp;&nbsp;&nbsp;&nbsp;Spring-WS的大部分内容是对象-XML映射（OXM）抽象。Spring -WS的OXM提供了几个OXM实现： JAXB（版本1和版本2）、Castor XML、JiBX、XMLBeans、XStream好处：因为它使用了简单对象作为参数，所以可以像其他POJO一样进行单元测试。测试用例可以传递到EvaluateHandRequest对象中，并且做出返回EvaluateHandResponse的断言。 </p>
    </li>
</ul>
<p><strong>配置端点和Spring-WS基础结构：</strong>将消息端点与可以将所有内容结合在一起的Spring-WS Bean装配起来。 </p>
<ul>
    <li>
    <p>Spring-WS是基于Spring MVC的，在Spring MVC中，所有请求都由DispatcherServlet操作，这个Servlet会将请求分配给处理请求的控制器。类似的，Spring-WS会在前台使用MessageDispatcherServlet。它是DispatcherServlet的子类，用于将SOAP请求分配给Spring-WS端点。&lt;servlet&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;spring-ws&lt;/servlet-name&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.springframework.ws.transport.http.MessageDispatcherServlet&lt;/servlet-class&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt; &nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;spring-ws&lt;/servlet-name&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt; &nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;后面会对这个配置进行修改，暂且先作为我们研究Spring-WS的起点
    </p>
    <p>将消息映射到端点：MessageDispatcherServlet也使用了端点映射来决定由哪个端点接收输入的XML消息。对于扑克评分服务，我们将使用Spring-WS的PayloadRootQNameEndpointMapping，在Spring中配置如下：&lt;bean id="payloadMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping"&gt;&lt;property name="endpointMap"&gt; &nbsp;&lt;map&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;entry key="{http://www.springinaction.com/poker/schemas}EvaluateHandRequest" &nbsp;value-ref="evaluateHandEndpoint"/&gt; &nbsp;&lt;/map&gt; &lt;/property&gt;PayloadRootQNameEndpointMapping首先会检查消息载荷的限定名（QName），接着再通过查询映射列表（通过endpointMap属性配置的）找到输入SOAP消息映射到的端点。
    </p>
    <p>配置消息序列化器：在对象和XML消息之间进行转换的关键是对象-XML 映射（OXM）。Spring-OXM是Spring-WS的一个子项目，提供对几种常见OXM解决方案的抽象，其中包括JAXB和Castor XML. &nbsp;&nbsp;Spring-OXM的核心元素是Marshaller和Unmarshaller接口。Marshaller的实现可以根据Java对象生成XML元素。与之相反，Unmarshaller的实现则被用于根据XML元素构建Java对象。 &nbsp;AbstractMarshallingPayloadEndPoint在处理消息时会使用Spring-OXM的序列化器和反序列化器。当AbstractMarshallingPayloadEndPoint接收到消息时，会将这条XML消息交给Unmarshaller，反序列化成一个对象，并传递给invokeInternal()方法。接下来，在invokeInternal（）完成处理后，返回的对象则被交给Marshaller，序列化成XML，并传递给客户端。 &nbsp;幸运的是，你不必自己创建Marshaller 和&nbsp;Unmarshaller的实现。Spring-OXM提供了几个实现。见PPT（4） 我们为扑克评分服务选择了Castor XML.所以，需要按下面的方法在Spring中配置CastorMarshaller： &nbsp;&lt;bean id="marshaller" class="org.springframework.oxm.castor.CastorMarshaller"&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property &nbsp;name="mappingLocation" &nbsp;value="classpath:mapping.xml" /&gt;&lt;/bean&gt;不需要附加的配置，Castor XML就可以进行一些基本的XML序列化工作。但是，我们的OXM进行的工作比默认Castor XML可以处理的工作要更复杂一些。因此，需要使用一个Castor XML映射文件来配置CastorMarshaller。mappingLoaction 属性指定了Castor XML映射文件的位置。这里，我们将mappingLoaction设置为在应用程序跟classpath中查找名字是mapping.xml的映射文件。 &nbsp;（见spring in action P245 程序清单9.4）
    </p>
    <p>配置端点异常：我们需要一种方法能够将Web服务或Spring-WS抛出的任何Java异常转换成SOAP错误。为了实现这个目标，Spring-WS提供了SoapFaultMappingExceptionResolver。见PPT5，SoapFaultMappingExceptionResolver可以处理发生在消息处理过程中的任何未捕捉异常，并生成一个相应的SOAP错误返回给客户端。在Spring中的配置：&lt;bean id="endpointExceptionResolver" class="org.springframework.ws.soap.serer.endpoint.SoapFaultMappingExceptionResolver"&gt; &nbsp;&nbsp;&nbsp;&lt;property name="exceptionMappings"&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="org.springframework.oxm.UnmarshallingFailureException"&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SENDER,Invalid message received &nbsp;&lt;/prop&gt; &nbsp;&lt;prop key="org.springframework.oxm.ValidationFailureException"&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SENDER,Invalid message received &nbsp;&lt;/prop&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/props&gt; &nbsp;&nbsp;&nbsp;&lt;/property&gt; &nbsp;&nbsp;&nbsp;&lt;property name="defaultFault" value="RECEIVER,Server error" /&gt; &lt;/bean&gt; &nbsp;&nbsp;可以为exceptionMapping属性配置一个或多个SOAP错误定义（被映射到Java异常的）。每个&lt;prop&gt;的Key是需要转换成SOAP错误的Java异常，&lt;prop&gt;的值是一个由两部分内容构成的值，第一部分是错误的类型，第二部分是描述错误的字符串。
    </p>
    <p><strong>提供WSDL文件：</strong>你应该注意到我为构成Web服务消息的XML元素选择的名称：EvaluateHandRequest和EvaluateHandResponse。这些名字不是任意选择的。选择他们的目的是利用Spring-WS中的配置惯例，自动为扑克评分服务创建WSDL。 &nbsp;&nbsp;为了完成这个工作，需要配置Spring-WS的DynamicWsdlllDefinition。它是一个特殊的Bean，MessageDispatcherServlet可以使用它从XML模式生成WSDL。这将非常方便，因为我们已经为契约的数据部分定义了一些XML模式。下面如何配置DynamicWsdlllDefinition： </p>
    <p>&lt;bean id="poker" class="org.springframework.ws.wsdl.wsdlll.DynamicWsdlllDefinition"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="builter"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="org.springframework.ws.wsdl.wsdlll.builder.XsdBasedSoapllWsdl4jDefinitionBuilder"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="schema" value="/PokerTypes.xsd" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="portTypeName" value="Poker" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="locationUri" value="http://localhost:8080/Poker-WS/services" /&gt; </p>
    <p>&lt;/bean&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
    <p>&lt;/bean&gt; </p>
    <p>DynamicWsdlllDefinition通过读取XML模式的定义来进行工作，在这里用schema属性指定了PokerTypes.xsd。DynamicWsdlllDefintion会遍历整个模式文件，查找所有名字以Request和Response结尾元素定义。它假设这些后缀用于指示发向或发自Web服务的消息，并且会在生成的WSDL中创建相应的&lt;wsdl:operation&gt;元素，见PPT6。最后一个DynamicWsdlllDefinition的属性是&nbsp; locationUri.这个属性告诉客户端服务可以在哪里发现。PPT8中的框图分解了locationUri属性中的URL。 谈论到&lt;servlet-mapping&gt;，我们需要在Web.xml中添加一个新的&lt;servlet-mapping&gt;,以便 MessageDispatcherServlet可以提供WSDL定义。<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;poker&lt;/servlet-name&gt;<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.wsdl&lt;/url-pattern&gt;<br />
    &nbsp; &lt;/servlet-mapping&gt;&nbsp;<font color="black" face="Calibri" size="12"></font></p>
    <ul>
        <li>
        <p>使用预定义的WSDL：DynamicWsdlllDefinition可以适用于大多数情况，但是，你也可能会遇到一些情况，必须对Web服务的WSDL定义进行更多的控制。在这种情况下，需要自己创建WSDL，接着使用SimpleWsdlllDefinition将它置入到Spring中：&nbsp;&lt;bean id="poker" class="org.springframework.ws.wsdl.wsdlll.SimpleWsdlllDefinition"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="wsdl" value="PokerService.wsdl"&gt;&nbsp;&lt;/bean&gt; 预定义WSDL的唯一一个问题（除了创建它很困难外）是它是被静态定义的。要想解决这个问题，可以让MessageDispatcherServlet为你重写WSDL。我们需要做的就是将一个名称为transformWsdlLocations的&lt;init-param&gt;设置成true，这样MessageDispatcherServlet就会从下面的位置得到它：&lt;servlet&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;spring-ws&lt;/servlet-name&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.springframework.ws.transport.http.MessageDispatcherServlet&lt;/servlet-class&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;transformWsdlLocations&lt;/param-name&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt; &nbsp;&nbsp;&lt;/init-param&gt;&lt;/servlet&gt; &nbsp;&nbsp;&nbsp; </p>
        </li>
    </ul>
    <p><strong>部署服务：</strong>现在可以打包这个Web服务应用程序并进行部署了。因为这个项目选择了使用Maven 2，所以只需要简单的输入下面的命令就可以创建可部署的WAR文件： %&nbsp;&nbsp;&nbsp;mvn&nbsp;&nbsp;&nbsp;package&nbsp;&nbsp;&nbsp;deploy&nbsp; 一旦Maven执行完毕，在目标目录中就会生成一个Poker-WS.war文件，它适合于部署到大多数Web应用服务器上。 </p>
    </li>
</ul>
<p><strong>消费Spring-WS Web服务：</strong>使用Spring-WS建立Web服务仅仅展示了它的一半功能。Spring-WS还带有一个基于相同消息规范的客户端API。 </p>
<ul>
    <li>
    <p><strong>使用Web服务模板：</strong>WebServiceTemplate是Spring-WS客户端API的核心类，见PPT9。向Web服务发送消息需要生成对每个Web服务客户端都相同的SOAP封装和通信样本代码。在Spring中配置WebServiceTemplate相当简单： </p>
    <p>&lt;bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="messageFactory"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="messageSender" ref="messageSender" /&gt; </p>
    <p>&lt;/bean&gt; </p>
    <p>WebServiceTemplate需要知道如何构建发送给服务的消息以及如何发送消息。被置入到messageFactory属性中的对象负责处理构建消息的任务。这个被置入的对象应该实现Spring-WS的WebServiceMessageFactory接口。幸运的是，不用自己去实现。Spring提供了3中选择，见PPT10。 &nbsp; messageSender属性应该被置入一个对WebServiceMessageSender实现的引用。Spring-WS提供了几种实现，Spring-WS提供了几种实现，见PPT11. &nbsp;HttpUrlConnectionMessageSender在Spring中的配置如下： </p>
    <p>&lt;bean id="messageSender" class="org.springframework.ws.transport.http.HttpUrlConnectionMessageSender"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name="uri" value="http://localhost:8080/Poker-WS/services" /&gt; </p>
    <p>&lt;/bean&gt;&nbsp;&nbsp; </p>
    <p>url属性指定了服务的位置。注意，这个URL必须与服务WSDL定义中的URL匹配。 </p>
    <ul>
        <li>
        <p><strong>发送消息：</strong>在WebServiceTemplate配置完毕后，可以向扑克评分服务发送和接收XML消息。WebServiceTemplate提供了几个用于发送和接收消息的方法。下面是一个最基本和最容易理解的方法： </p>
        <p>public boolean sendAndReceive(<strong>Source</strong>&nbsp;requestPayload, <strong>Result</strong>&nbsp; responseResult&nbsp;&nbsp;)throws Exception 。Source对象是发送给Web服务的消息载荷，Result对象则是由从服务返回的消息载荷装配而成的。程序清单见spring in action(<strong>P253</strong>)展示的TemplateBasedPokerClient是一个PokerClient接口的实现，它使用了WebServiceTemplate的sendAndReceive()方法与扑克评分服务进行通信。注意，WebServiceTemplate是通过装定器注入的。因此，TemplateBasedPokerClient必须按下面的方法在Spring中配置： </p>
        <p>&lt;bean id="templateBasedClient" class="....."&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="webServiceTemplate" ref="webServiceTemplate" /&gt; </p>
        <p>&lt;/bean&gt;&nbsp; 如果消息比较简单，手工创建和解析XML消息没有什么问题。但如果需要构建复杂的消息载荷，会需要大量的代码。幸运的是，你不必自己处理这些XML。前面你看到了端点是如何使用序列化器在对象和XML直接进行转换的。现在，我将向你展示WebServiceTemplate如何利用序列化器在客户端消除对XML处理代码的需求。 </p>
        <p><strong>在客户端使用序列化器</strong>：除了程序清单中的sendAndRecevie()方法，WebServiceTemplate还提供了marshalSendAndReceive()方法。通过这个方法发送和接收的XML消息可以被序列化/反序列化成Java对象。 使用marshalSendAndReceive()方法十分简单，只需要传入请求对象参数，并且将响应对象作为返回值。这扑克评分服务中，这些对象分别是EvaluateHandRequest和EvaluateHandResponse。见程序清单9.6 （P255）。 WebServiceTemplate并不知道任何有关序列化/反序列化这些对象的内容，不过它可以被置入一个序列化器和一个反序列化器。 </p>
        <p>&lt;bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="messageFactory"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="messageSender" ref="messageSender" /&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="marshaller" ref="marshaller"&nbsp;&nbsp;/&gt; </p>
        <p>&nbsp;&nbsp;&nbsp;&lt;property name="unmarshaller" ref="marshaller" /&gt; </p>
        <p>&lt;/bean&gt; </p>
        <p>MarshallingPokerClient 比TemplateBasedPokerClient 更加简洁。但是，我们还需要进行一些工作才能使其更加简洁。来看看如何使用Spring-WS的WebServiceGatewaySupport类来取消对WebServiceTemplate的明确注入。见PPT12 </p>
        </li>
    </ul>
    <p><strong>使用web服务的网关支持</strong>： Spring的数据访问API包含了一个很方便的支持类--这个类可以提供不需要被配置的模板。于此类似，Spring-WS也提供了一个支持类WebServiceGateWaySupport，可以为继承了它的客户端类自动提供WebServiceTemplate。 即使WebServiceTemplate不在需要在Spring中定义，你仍然需要通过WebServiceGatewaySupport的属性配置如果创建WebServiceTemplate的细节。 </p>
    <p>&lt;bean id="pokerClientGateway" class="......."&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="messageFactory"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory"&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;/property&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="messageSender" ref="messageSender" /&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="marshaller" ref="marshaller"&nbsp;&nbsp;/&gt; </p>
    <p>&nbsp;&nbsp;&nbsp;&lt;property name="unmarshaller" ref="marshaller" /&gt; </p>
    <p>&lt;/bean&gt; </p>
    <p>这些属性必须被配置为是针对WebServiceTemplate的。 </p>
    </li>
</ul>
</li><img src ="http://www.blogjava.net/kissyan4916/aggbug/326482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-19 00:40 <a href="http://www.blogjava.net/kissyan4916/articles/326482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中的后处理</title><link>http://www.blogjava.net/kissyan4916/articles/255129.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Tue, 17 Feb 2009 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/255129.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/255129.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/255129.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/255129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/255129.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt">&nbsp;&nbsp;&nbsp; <span lang="EN-US">Spring</span><span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">提供了两次机会，可以切入到</span><span lang="EN-US">Bean</span><span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">的生命周期中，</span> <span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">检查或者修改它的配置，这叫做后处理。后处理是在</span><span lang="EN-US">Bean</span><span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">实例化以及装配完成之后发生的。在</span><span lang="EN-US">Bean</span><span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">被创建以及装配之后，</span><span lang="EN-US">BeanPostProcessor</span><span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">接口为你提供了两次机会来修改这个</span><span lang="EN-US">Bean</span><span style="font-family: 宋体; mso-fareast-font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin">。<br />
</span>&nbsp;&nbsp;
<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_35_463_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_463_Open_Text.style.display='none'; Codehighlighter1_35_463_Closed_Image.style.display='inline'; Codehighlighter1_35_463_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_35_463_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_35_463_Closed_Text.style.display='none'; Codehighlighter1_35_463_Open_Image.style.display='inline'; Codehighlighter1_35_463_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;BeanPostProcessor&nbsp;</span><span id="Codehighlighter1_35_463_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_35_463_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;Object&nbsp;postProcessBeforeInitialization(Object&nbsp;bean,&nbsp;String&nbsp;beanName)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeansException;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;Object&nbsp;postProcessAfterInitialization(Object&nbsp;bean,&nbsp;String&nbsp;beanName)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeansException;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
代码示例<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_49_592_Open_Image" onclick="this.style.display='none'; Codehighlighter1_49_592_Open_Text.style.display='none'; Codehighlighter1_49_592_Closed_Image.style.display='inline'; Codehighlighter1_49_592_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_49_592_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_49_592_Closed_Text.style.display='none'; Codehighlighter1_49_592_Open_Image.style.display='inline'; Codehighlighter1_49_592_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Monkey&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;BeanPostProcessor&nbsp;</span><span id="Codehighlighter1_49_592_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_49_592_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;postProcessAfterInitialization(Object&nbsp;bean,&nbsp;String&nbsp;name)<br />
<img id="Codehighlighter1_147_392_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_392_Open_Text.style.display='none'; Codehighlighter1_147_392_Closed_Image.style.display='inline'; Codehighlighter1_147_392_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_147_392_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_147_392_Closed_Text.style.display='none'; Codehighlighter1_147_392_Open_Image.style.display='inline'; Codehighlighter1_147_392_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;BeansException&nbsp;</span><span id="Codehighlighter1_147_392_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_147_392_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">BeanPostProcessor.postProcessAfterInitialization&nbsp;正在预处理！</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_263_377_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_377_Open_Text.style.display='none'; Codehighlighter1_263_377_Closed_Image.style.display='inline'; Codehighlighter1_263_377_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_263_377_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_263_377_Closed_Text.style.display='none'; Codehighlighter1_263_377_Open_Image.style.display='inline'; Codehighlighter1_263_377_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(bean&nbsp;</span><span style="color: #0000ff">instanceof</span><span style="color: #000000">&nbsp;MonkeyFriends)</span><span id="Codehighlighter1_263_377_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_263_377_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />MonkeyFriends&nbsp;&nbsp;mf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MonkeyFriends)bean;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />mf.setName1(</span><span style="color: #000000">"</span><span style="color: #000000">唐僧</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />mf.setName2(</span><span style="color: #000000">"</span><span style="color: #000000">猪八戒</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />mf.setName3(</span><span style="color: #000000">"</span><span style="color: #000000">沙僧</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bean;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bean;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;postProcessBeforeInitialization(Object&nbsp;bean,&nbsp;String&nbsp;name)<br />
<img id="Codehighlighter1_493_591_Open_Image" onclick="this.style.display='none'; Codehighlighter1_493_591_Open_Text.style.display='none'; Codehighlighter1_493_591_Closed_Image.style.display='inline'; Codehighlighter1_493_591_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_493_591_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_493_591_Closed_Text.style.display='none'; Codehighlighter1_493_591_Open_Image.style.display='inline'; Codehighlighter1_493_591_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;BeansException&nbsp;</span><span id="Codehighlighter1_493_591_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_493_591_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">BeanPostProcessor.postProcessBeforeInitialization&nbsp;正在预处理！</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bean;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span></div>
</span></span>MonkeyFriends类代码<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_27_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_192_Open_Text.style.display='none'; Codehighlighter1_27_192_Closed_Image.style.display='inline'; Codehighlighter1_27_192_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_27_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_192_Closed_Text.style.display='none'; Codehighlighter1_27_192_Open_Image.style.display='inline'; Codehighlighter1_27_192_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MonkeyFriends&nbsp;</span><span id="Codehighlighter1_27_192_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_27_192_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String&nbsp;name1;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String&nbsp;name2;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />String&nbsp;name3;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_99_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_99_191_Open_Text.style.display='none'; Codehighlighter1_99_191_Closed_Image.style.display='inline'; Codehighlighter1_99_191_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_99_191_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_99_191_Closed_Text.style.display='none'; Codehighlighter1_99_191_Open_Image.style.display='inline'; Codehighlighter1_99_191_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getNames()&nbsp;</span><span id="Codehighlighter1_99_191_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_99_191_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Monkey's&nbsp;friends:</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">this</span><span style="color: #000000">.name1</span><span style="color: #000000">+</span><span style="color: #000000">""</span><span style="color: #000000">+</span><span style="color: #0000ff">this</span><span style="color: #000000">.name2</span><span style="color: #000000">+</span><span style="color: #000000">""</span><span style="color: #000000">+</span><span style="color: #0000ff">this</span><span style="color: #000000">.name3;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&#8230;&#8230;.省略getter、setter方法<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />}</span></span></div>
</span>applicationContext.xml中的配置：<br />
monkeyfriends中name1、name2、name3中的值可以任意写<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 alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">monkey</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.spring.IoC.Monkey</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;autowire</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">autodetect</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">constructor</span><span style="color: #000000">-</span><span style="color: #000000">arg&nbsp;&nbsp;ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">goldencudgel</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">I</span><span style="color: #000000">'</span><span style="color: #000000">m&nbsp;Sun&nbsp;WuKong!!!!&lt;/value&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">goldencudgel</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;local</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">goldencudgel</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">monkeyfriends</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.spring.IoC.MonkeyFriends</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name1</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #0000ff">null</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name2</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #0000ff">null</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name3</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #0000ff">null</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">goldencudgel</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.spring.IoC.Goldencudgel</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
代码测试：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_22_336_Open_Image" onclick="this.style.display='none'; Codehighlighter1_22_336_Open_Text.style.display='none'; Codehighlighter1_22_336_Closed_Image.style.display='inline'; Codehighlighter1_22_336_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_22_336_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_22_336_Closed_Text.style.display='none'; Codehighlighter1_22_336_Open_Image.style.display='inline'; Codehighlighter1_22_336_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MainTest&nbsp;</span><span id="Codehighlighter1_22_336_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_22_336_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_66_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_334_Open_Text.style.display='none'; Codehighlighter1_66_334_Closed_Image.style.display='inline'; Codehighlighter1_66_334_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_66_334_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_334_Closed_Text.style.display='none'; Codehighlighter1_66_334_Open_Image.style.display='inline'; Codehighlighter1_66_334_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_66_334_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_66_334_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;ApplicationContext&nbsp;ac&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext-*.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;MonkeyFriends&nbsp;&nbsp;mf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MonkeyFriends)ac.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">monkeyfriends</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;System.out.println(mf.getNames());<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;monkey.Say();<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;monkey.useGoldencudgel();</span><span style="color: #008000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />运行结果：<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BeanPostProcessor.postProcessBeforeInitialization&nbsp;正在预处理！<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />BeanPostProcessor.postProcessAfterInitialization&nbsp;正在预处理！<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Monkey</span><span style="color: #000000">'</span><span style="color: #000000">s&nbsp;friends:唐僧猪八戒沙僧</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/255129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-17 16:28 <a href="http://www.blogjava.net/kissyan4916/articles/255129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+JPA自动生成Table配置</title><link>http://www.blogjava.net/kissyan4916/articles/254976.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254976.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254976.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254976.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C14%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">在persistence.xml中加上<span>&lt;property name="hibernate.hbm2ddl.auto"
value="update" /&gt;</span>或设置在Spring配置中，在Spring 的sessionFactory中设置，当运行Spring时会自动生成Table</span></p>
<p><span>&lt;!--applicationContext.xml--&gt;<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
&nbsp;&nbsp; &nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;
&nbsp;xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"<br />
&nbsp;&nbsp;
&nbsp;xmlns:tx="http://www.springframework.org/schema/tx"&gt;<br />
<br />
<br />
&nbsp;&nbsp; &nbsp;&lt;bean id="entityManagerFactory"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property
name="persistenceUnitName" value="onlinephotoPU" /&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;bean id="transactionManager"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;class="org.springframework.orm.jpa.JpaTransactionManager"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property
name="entityManagerFactory"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;ref="entityManagerFactory" /&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/bean&gt;<br />
<br />
&nbsp;&nbsp; <span style="color: red;">&nbsp;&lt;bean id="dataSource"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property
name="driverClassName" value="com.mysql.jdbc.Driver" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="url"
value="jdbc:mysql://127.0.0.1:3306/photo" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="username"
value="root" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="password"
value="root" /&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;bean id="sessionFactory"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="dataSource"
ref="dataSource" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property name="annotatedClasses"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;list&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&lt;value&gt;com.tst.Person&lt;/value&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/list&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property
name="hibernateProperties"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;props&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&lt;prop key="hibernate.dialect"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;org.hibernate.dialect.MySQLInnoDBDialect<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&lt;/prop&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&lt;prop key="hibernate.show_sql"&gt;true&lt;/prop&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;&lt;prop
key="hibernate.hbm2ddl.auto"&gt;create-drop&lt;/prop&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp; &nbsp;</span><span style="color: black;">&lt;tx:annotation-driven
transaction-manager="transactionManager" /&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;bean id="PersonDAO"
class="com.tst.PersonDAO"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;property
name="entityManagerFactory"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&nbsp;ref="entityManagerFactory" /&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/bean&gt;</span><br />
&lt;/beans&gt;</span></p>
<p><span>&lt;!--persistence.xml--&gt;<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;persistence xmlns="http://java.sun.com/xml/ns/persistence"<br />
&nbsp;&nbsp;&nbsp;
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp;
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence<br />
&nbsp;&nbsp;&nbsp; http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0"&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;persistence-unit name="onlinephotoPU"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
transaction-type="RESOURCE_LOCAL"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
&lt;provider&gt;org.hibernate.ejb.HibernatePersistence&lt;/provider&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;class&gt;com.tst.Person&lt;/class&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property
name="hibernate.connection.driver_class"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
value="com.mysql.jdbc.Driver" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property
name="hibernate.connection.url"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
value="jdbc:mysql://127.0.0.1:3306/photo" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property
name="hibernate.connection.username" value="root" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property
name="hibernate.connection.password" value="root" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property
name="hibernate.hbm2ddl.auto" value="update" /&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/persistence-unit&gt;<br />
&lt;/persistence&gt;</span></p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 21:08 <a href="http://www.blogjava.net/kissyan4916/articles/254976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LOG4J原理以及配置的研究</title><link>http://www.blogjava.net/kissyan4916/articles/254969.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254969.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254969.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254969.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C07%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{color:#003366;
text-decoration:none;
text-underline:none;
text-decoration:none;
text-line-through:none;}
a:visited, span.MsoHyperlinkFollowed
{color:purple;
text-decoration:underline;
text-underline:single;}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{}
@list l0:level1
{
margin-left:23.25pt;
text-indent:-23.25pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="margin-left: 23.25pt; text-indent: -23.25pt;"><strong><span style="font-family: 宋体; color: blue;">Log4J </span></strong><strong><span style="font-family: 宋体; color: blue;">是如何进行工作的？</span></strong></p>
<p><span style="font-family: 宋体;">这是在 Log4J 项目中对 Log4J 的介绍中的一段话</span></p>
<p><span style="font-family: 宋体;">With log4j it is
possible to enable logging at runtime without modifying the application binary.
The log4j package is designed so that these statements can remain in shipped
code without incurring a heavy performance cost. Logging behavior can be
controlled by editing a configuration file, without touching the application
binary. </span></p>
<p><span style="font-family: 宋体;">对于 Log4J 的具体如何进行工作的原理，在 javaeye 上 buaawhl 给出了一个解释：</span></p>
<p><span style="font-family: 宋体;"><a href="http://buaawhl.javaeye.com/blog/6450">http://buaawhl.javaeye.com/blog/6450</a>
</span></p>
<p><span style="font-family: 宋体;">总结一下就是利用 JDK 提供的 new Throwable().getStackTrace() 方法返回当前运行栈的结构层次，然后对返回的调用栈的信息进行分析，找到调用该类的类的名称。（也就是Log4J自己说的Runtime期间实现Log）</span></p>
<p><span style="font-family: 宋体;">由于在 Log4J 中只存在一个根 Logger ，并且 Logger 之间存在继承的关系，并且我们可以在配置文件（ log4J.proerties 或者 XML ）中进行配置，可以初始化指定的 Logger ，并且对指定的 Logger 进行一些相关的配置，如设置如何进行输出，以及如何将输出进行布局。并且由于 Logger 之间会存在继承的关系（会找一个最近的 Logger 进行继承，如果没有就以根 Logger 作为父类，共享父类的配置信息），以及父子类之间初始化没有先后的顺序，所以我们可以在配置文件中，对各个程序以及不同的包中使用到 Log4j 的 Log 纪录方式进行配置。</span></p>
<p><span style="font-family: 宋体;">如果在同一个<span>
APPLICATION </span>对相同名称的 Logger 进行调用，那么只会返回一个 Logger 实例。</span></p>
<p style="margin-left: 23.25pt; text-indent: -23.25pt;"><strong><span style="color: blue;">Log4J </span></strong><strong><span style="font-family: 宋体; color: blue;">会不会对系统的性能造成大的影响？</span></strong></p>
<p><span style="font-family: 宋体;">这是对 Log4J 性能的一些描述，看来还是不错的，呵呵，在调整一下 Log 的等级就可以了。</span></p>
<p><span style="font-family: 宋体;">On an AMD Duron
clocked at 800Mhz running JDK 1.3.1, it costs
about 5 nanoseconds to determine if a logging statement should be logged or
not. Actual logging is also quite fast, ranging from 21 microseconds using the
SimpleLayout, 37 microseconds using the TTCCLayout. The performance of the
PatternLayout is almost as good as the dedicated layouts, except that it is
much more flexible. </span></p>
<p><span style="font-family: 宋体;">注：对于<span> Common
Logging </span>和 Log4J 的关系可以参见 （其实<span> JCL
</span>是一个规范，对一些 Log 工具进行了包装，我们常会使用到的具体实现还是 Log4j ，当然也可以使用其他的实现）</span></p>
<p><span style="font-family: 宋体;"><a href="http://hedong.3322.org/archives/000316.html">http://hedong.3322.org/archives/000316.html</a>
</span></p>
<p><span style="font-family: 宋体;">参考资料：</span></p>
<p><span style="font-family: 宋体;"><a href="http://www-128.ibm.com/developerworks/cn/java/l-log4j/index.html">http://www-128.ibm.com/developerworks/cn/java/l-log4j/index.html</a>
</span><span style="font-family: 宋体;">使用 Log4J 进行日志操作</span></p>
<p><span style="font-family: 宋体;"><a href="http://zooo.51.net/heavyz_cs/notebook/log4j.html">http://zooo.51.net/heavyz_cs/notebook/log4j.html</a>
Log4J </span><span style="font-family: 宋体;">学习笔记（推荐）</span></p>
<p><span style="font-family: 宋体;"><a href="http://www.dingl.com/view.shtml?xh=485">http://www.dingl.com/view.shtml?xh=485</a>
log4j </span><span style="font-family: 宋体;">配置</span></p>
<p><span style="font-family: 宋体;"><a href="http://hedong.3322.org/archives/000193.html">http://hedong.3322.org/archives/000193.html</a>
</span><span style="font-family: 宋体;">竹笋炒肉的 Log4J 学习笔记</span></p>
<p><a href="http://forum.springside.org.cn/redirect.php?fid=3&amp;tid=382&amp;goto=nextoldset"><span style="font-family: 宋体;">http://forum.springside.org.cn/redirect.php?fid=3&amp;tid=382&amp;goto=nextoldset</span></a>
SpringSide <span style="font-family: 宋体;">对</span> Log4j <span style="font-family: 宋体;">的使用要点</span> </p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:54 <a href="http://www.blogjava.net/kissyan4916/articles/254969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate延迟和声明式事务处理最终解决方案</title><link>http://www.blogjava.net/kissyan4916/articles/254968.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254968.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254968.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254968.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254968.html</trackback:ping><description><![CDATA[<br />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C12%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体; color: blue;">一、spring+hibernate时使用hibernate的延迟加载功能时存在的问题<strong>：</strong></span></p>
<p><span style="font-family: 宋体;">spring</span><span style="font-family: 宋体;">是一个设计层面的框架，他解决的是业务逻辑层和其他各层的松耦合问题，因此它将面向接口的编程思想贯穿整个系统应用。Spring的orm框架用来集成其他持久层框架，比如hibernate，spring-orm框架对hibernate的session进行了封装，我们可以很方便的通过继承这个封装类HibernateDAOSupport并注入hibernate的sessionFactory完成初始化，并调用其内置对象HibernateTemplate的封装方法来调用session的API而不用考虑到session的初始化和关闭以及事务处理等系统操作，这也是AOP思想的一种体现。Hibernate的延迟加载功能是指获取某个实体对象时并不从数据库中加载他的关联对象，而在实际获取关联对象的时候才从数据库中加载，这样做很好的节省了数据库资源但是前提是必须保持session处于打开状态，在所有操作完成后再关闭。Spring封装了session操作后很自然的要做到在方法调用的前后打开和关闭session，这样我们在通过HibernateTemplate的方法来获取实体对象以后session就已经关闭了，而这时候在调用获取关联对象的方法的时候就会抛出异常：</span></p>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/a.jpg" width="1245" height="403" /><br />
</p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C08%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体; color: blue;">二、如何解决</span></p>
<p><strong><span style="color: red;">&nbsp;</span>1</strong><strong><span style="font-family: 宋体;">、</span>openSessionInViewInterceptor</strong></p>
<p><span style="font-family: 宋体;">通过spring的控制层框架spring-mvc来处理控制层并通过拦截器openSessionInViewInterceptor改变spring调用session的流程。这里介绍最简单的spring-mvc的使用方法，首先和struts一样要定义一个HttpServlet来总体控制请求的处理类以及容器的初始化，struts是ActionServlet，Spring是DispatcherServlet，如图：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/b.jpg" width="502" height="274" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C10%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">如同struts的控制器都继承于Action类一样，spring的控制器都要实现controller接口</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/c.jpg" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C10%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">我们通过注入的方式传入</span>usersDAO<span style="font-family: 宋体;">进行数据操作（通常这个操作应该是放到</span>Service<span style="font-family: 宋体;">层，这里为了方便讲解没有加入</span>Service<span style="font-family: 宋体;">层），这个</span>DAO<span style="font-family: 宋体;">是</span>myeclipse<span style="font-family: 宋体;">自动生成的原封不动，这里不再贴出来了。</span></p>
<p><span style="font-family: 宋体;">几句话的意思很清楚，调用</span>findByID<span style="font-family: 宋体;">方法把</span>ID<span style="font-family: 宋体;">为</span>1000<span style="font-family: 宋体;">的用户实体查出来，这个时候按道理</span>session<span style="font-family: 宋体;">已经关闭了，下面调用</span>user.getNewses<span style="font-family: 宋体;">方法获取这个用户发布的新闻信息的一个</span>set<span style="font-family: 宋体;">集合，打印条数，系统显示：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/d.jpg" width="762" height="51" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C12%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">没有报session 已经关闭的错误，原因是spring-config中作了配置，在配置之前我们要对spring-mvc做一些初步的了解。</span></p>
<p><span style="font-family: 宋体;">配合DispatcherServlet我们也要定义相关的映射，能够将请求跳转到对应的控制器，先看看usersDAO</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/e.jpg" width="433" height="89" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C14%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">然后是我们的控制器</span>LoginSpring<span style="font-family: 宋体;">，这里没有对跳转作处理，因为我们的重点不是</span>mvc<span style="font-family: 宋体;">而是解决延迟加载。</span></p>
<p>&nbsp;</p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C12%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/f.jpg" /></span></p>
<p><span style="font-family: 宋体;">最后是我们的映射和针对这些控制器所配置的拦截器opensessioninviewinterceptor</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/g.jpg" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C16%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">这样配置了以后管理session的就不是我们的hibernatetemplate了而是我们配置的拦截器，他会保持session直到我们的控制器做完了所有的事情才关闭，也就是我们调用user.getNewses方法的时候是打开的，因此能得到满意的结果。</span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C17%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><strong>2</strong><strong><span style="font-family: 宋体;">、</span></strong><strong>openSessionInViewFilter</strong></p>
<p><span style="font-family: 宋体;">当我们的系统的控制层要使用struts的时候，我们就不能使用spring的拦截器了，因个这个拦截器是基于DispatcherServlet的，我们只有在web.xml中配置过滤器来改变session的流程。首先简要介绍一下struts+spring集成，看看struts的配置文件：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/h.jpg" width="691" height="247" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C18%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">每个Action的type都设定为org.springframework.web.struts.DelegatingActionProxy，并在最下面配置spring的配置文件的路径，当我们要使用过滤器的时候这个配置文件必须只存放Action的实际映射，下面是spring-action.xml，里面只有一个action：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/i.jpg" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C19%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">这里不需要指定id，只需要指定别名，这个别名会自动匹配struts配置文件中对应的path, DelegatingActionProxy会自动从插件所配置的spring配置文件中寻找匹配的bean并实例化，当然也会完成注入的过程。知道怎么将两个框架正和使用以后，我们来配置过滤器，见web.xml：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/j.jpg" width="745" height="329" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C20%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">这里使用过滤器的时候一定要附上所有spring配置文件并在web容器(tomcat)启动时加载和初始化。这里spring-action.xml存放的Struts的Action的映射，spring-config.xml中存放其他的bean。</span></p>
<p><span style="font-family: 宋体;">最后再看看这个Action，和上面的一样的代码。</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/k.jpg" width="590" height="353" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C21%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">这样的话当我们使用延迟加载的时候调用的就是</span>HibernateTamplate<span style="font-family: 宋体;">的代理类，能够让</span>Spring<span style="font-family: 宋体;">在请求开始的时候打开</span>Session<span style="font-family: 宋体;">，响应结束前关闭</span>Session<span style="font-family: 宋体;">，这样就不会存在</span>Session<span style="font-family: 宋体;">关闭的错误了。但是当我们增删改的时候，又会出现下面的问题：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/l.jpg" width="1218" height="307" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C22%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">为什么会有这样的问题呢，因为</span>Hibernate<span style="font-family: 宋体;">有自己的事务策略，我们在</span>Spring<span style="font-family: 宋体;">的</span>OpenSessionInView<span style="font-family: 宋体;">中打开</span>Session<span style="font-family: 宋体;">是以只读的方式来管理事务，这样进行增删改的时候就会出现错误。如何解决，先看看</span>Spring<span style="font-family: 宋体;">的事务处理。</span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C23%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><strong><span style="font-family: 宋体; color: blue;">三、声明式事务处理</span></strong></p>
<p><span style="font-family: 宋体;">声明式事务处理是</span>springAOP<span style="font-family: 宋体;">思想的一个扩展，事务处理是一个典型的系统功能，因此通过将事务处理封装在一个切面中进行处理以分离具体业务操作和系统功能的方式是最好的设计层面的选择。</span></p>
<p><span style="font-family: 宋体;">首先我们要配置一个</span>PlatformTransactionManager<span style="font-family: 宋体;">接口的一个实现用来控制事务流程（</span>commit<span style="font-family: 宋体;">和</span>rollback<span style="font-family: 宋体;">），</span><span style="font-family: 宋体;">如果我们是</span>spring+hibernate<span style="font-family: 宋体;">，框架集成的话，我们就要配置</span>hibernate<span style="font-family: 宋体;">专用的</span>PlatformTransactionManager<span style="font-family: 宋体;">实现</span>:</p>
<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/m.jpg" width="650" height="109" /></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C24%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">我们模拟一个实例就是两个银行之间的转账，</span>MsBankDAO<span style="font-family: 宋体;">民生银行</span>DAO<span style="font-family: 宋体;">；</span>ZsBankDAO<span style="font-family: 宋体;">招商银行</span>DAO<span style="font-family: 宋体;">。这两个</span>DAO<span style="font-family: 宋体;">都是用</span>myeclipse<span style="font-family: 宋体;">生成，这里不作介绍，我们的业务逻辑对象</span>BankBO<span style="font-family: 宋体;">的</span>transferMoney<span style="font-family: 宋体;">方法来完成这个转账操作：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/n.jpg" width="603" height="554" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C25%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">其中if语句中的两个操作就是一个典型的粗粒度事务，我们使用声明的方式来进行事务处理就无需在这里面加入任何关于事务的代码。</span></p>
<p><span style="font-family: 宋体;">既然是使用AOP代理BO，我们就得有一个BankBOImpl的代理类：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/o.jpg" width="704" height="327" /></span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/p.jpg" width="477" height="134" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">然后我们模拟一个事故：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/q.jpg" width="516" height="241" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">将民生银行的修改方法抛出一个错误</span></p>
<p><span style="font-family: 宋体;">我们要传入被代理类的接口以及实现，建一个主函数来测试一下：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/r.jpg" width="842" height="108" /></span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">注意这里要通过代理类boProxy来返回BankBO的一个临时实现，运行结果：</span></p>
<p><span style="font-family: 宋体;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/s.jpg" width="1145" height="151" /><br />
</span></p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C04%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">在查看数据库中的数据并没有改变。</span></p>
<p><strong><span style="font-family: 宋体; color: blue;">四、解决ReadOnly事务策略问题</span></strong></p>
<p><span style="font-family: 宋体;">继续第二节我们的问题，Hibernate的事务策略是需要配置的，Spring为了能以AOP的方式来管理事务，就必须提供Hibernate事务策略和事务操作的封装，也就是我们上面提供的PlatFormTransactionManager接口的Hibernate持久层实现HibernateTransactionManager，</span></p>
<p><span style="font-family: 宋体;">Spring</span><span style="font-family: 宋体;">在处理事务的时候会将这个底层的封装体传到TransactionTemplate进行初始化事务处理流程和参数，我们在看HibernateTeamplat是我们所熟知的Hibernate的Session的API的封装，他的父类</span><span style="font-family: 宋体; color: black;">HibernateAccessor</span><span style="font-family: 宋体;">中已经定义好了5种Hibernate的事务策略，其中就有Flush_NEVER策略和FLUSH_AUTO等策略，如果我们平时增删改的时候没有用到HibernateTamplate就会在操作的时候由Hibernate来管理事务，但这个时候由于Opensessioninview的缘故为了防止在延迟加载的时候改动持久层刷新策略已经被设定为Flush_Never，也就是说增删改的时候也会以只读的刷新模式来处理，这当然会报错，按照异常所说的要把前者换成后者就行了，但这样就没办法保证延迟加载的时候的安全性，因为很有可能这个PO对象会被传到View层被随意改动，如果能够在读的时候只读，在写的时候由能够及时刷新就能解决问题了，如果是编程式事务处理的话，我们就必须分别在查询和增删改的时候更换刷新模式，这将会很麻烦，还好Spring提供了声明式事务处理，提供了一种扩展性很高的解决方案。解决的方法很简单，让Spring来全权管理事务，在省事的同时也更好的划分了层次的关系，避免了Service层涉及事务策略这类的系统功能，将AOP思想体现的淋漓尽致。看看配置：</span></p>
<img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/t.jpg" width="685" height="519" />
<p>&nbsp;</p>
<p>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C05%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: 宋体;">Find</span><span style="font-family: 宋体;">开头的方法被设定为只读，其他方法设定为auto（默认），让所有Service结尾的类的方法都处在事务中（包括不需要事务的方法），虽然消耗了一定的系统资源，但却让我们不必再为事务的问题操心，把精力集中到业务逻辑中。</span></p>
<br />
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br />
<p>&nbsp;</p>
<p><span style="font-family: 宋体;"><br />
</span></p>
<p><span style="font-family: 宋体;"><br />
</span></p>
<p>&nbsp;</p>
<br />
<p>&nbsp;</p>
<p><span style="font-family: 宋体;"><br />
</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:52 <a href="http://www.blogjava.net/kissyan4916/articles/254968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring联合Struts和Hibernate开发</title><link>http://www.blogjava.net/kissyan4916/articles/254963.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254963.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254963.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254963.html</trackback:ping><description><![CDATA[<img alt="" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/1231231231231.jpg" /><br />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C10%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="text-indent: 5.25pt;">1<span style="font-family: 宋体;">、</span>&nbsp;<span style="font-family: 宋体;">把上面的</span><span style="color: red;">type</span><span style="font-family: 宋体; color: red;">换成</span><span style="color: red;">type=&#8221;org.springframework.web.struts.DelegatingActionProxy&#8221;</span></p>
<p>&nbsp;2<span style="font-family: 宋体;">、</span> <span style="font-family: 宋体;">并且在</span>struts-config.xml<span style="font-family: 宋体;">中加入：</span> &nbsp;</p>
<p style="text-indent: 21pt;"><span style="color: red;">&lt;plug-in</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set-property property="contextConfigLocation"</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="/WEB-INF/classes/applicationContext.xml"
/&gt;</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plug-in&gt;</span></p>
<p>&nbsp;<span style="font-family: 宋体;">作用是方便</span>spring<span style="font-family: 宋体;">来管理</span></p>
<p style="text-indent: 5.25pt;">3<span style="font-family: 宋体;">、在</span>applicationContext<span style="font-family: 宋体;">中加入：</span></p>
<p style="text-indent: 5.25pt;"><span>&nbsp;<span style="color: red;">&nbsp;&lt;bean name="/person"
class="org.lxh.struts.action.PersonAction"&gt;</span></span></p>
<p style="text-indent: 5.25pt;"><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="persondao"&gt;</span></p>
<p style="text-indent: 5.25pt;"><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref
bean="persondao"/&gt;</span></p>
<p style="text-indent: 5.25pt;"><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span></p>
<p style="text-indent: 5.25pt;"><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></p>
<p><span style="font-family: 宋体; color: blue;">第二种实现：</span></p>
<p><span style="color: blue;">&nbsp;</span><span style="font-family: 宋体;">不用改变</span>Action<span style="font-family: 宋体;">中的</span>type </p>
<p>&nbsp;<span style="font-family: 宋体;">在</span>struts-config.xml<span style="font-family: 宋体;">中加入</span></p>
<p><span style="color: red;">&lt;controller</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processorClass="org.springframework.web.struts.DelegatingRequestProcessor"&gt;</span></p>
<p><span style="color: red;">&lt;/controller&gt;</span></p>
<br />
<br />
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:09 <a href="http://www.blogjava.net/kissyan4916/articles/254963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring--JDBC模板</title><link>http://www.blogjava.net/kissyan4916/articles/254962.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:06:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254962.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254962.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254962.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254962.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C07%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: red;">applicationContext</span>:</p>
<p>&lt;beans&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean
id="dataSource"</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="driverClassName"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="url"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:mysql://localhost:3306/mldn&lt;/value&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="username"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;root&lt;/value&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="password"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;mysqladmin&lt;/value&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean
id="def" class="cn.mldn.lxh.demo11.DefaultTemplate"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="jt"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref
bean="template"/&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean
id='template'</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.jdbc.core.JdbcTemplate"&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="dataSource"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref
bean="dataSource"/&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&lt;/beans&gt;</p>
<p><span style="font-family: Wingdings; color: red;">&#224;</span><span style="color: red;"> DefaultTemplate</span></p>
<p>public class DefaultTemplate {</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private
JdbcTemplate jt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void insert(Person person) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "INSERT INTO person(name,password) VALUES (?,?)";</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
</span><span style="font-family: 宋体;">全部的值应该变为对象数组</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object
params[] = new Object[] { person.getName(), person.getPassword() };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int
type[] = new int[] { Types.VARCHAR, Types.VARCHAR };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.update(sql,
params, type);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void update(Person person) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "UPDATE person SET name=?,password=? WHERE id=?";</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object
params[] = new Object[] { person.getName(),</span></p>
<p><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; person.getPassword(),
new Integer(person.getId()) };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int
type[] = new int[] { Types.VARCHAR, Types.VARCHAR, Types.INTEGER };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.update(sql,
params, type);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
Person getPerson(int id) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final
Person per = new Person();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "SELECT id,name,password FROM person WHERE id=?";</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[]
params = new Object[] { new Integer(id) };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.query(sql,
params, new RowCallbackHandler() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void processRow(ResultSet rs) throws SQLException {</span></p>
<p>&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; per.setId(rs.getInt(1));</p>
<p>&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; per.setName(rs.getString(2));</p>
<p>&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; per.setPassword(rs.getString(3));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
per;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
int getCount() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final
Person per = new Person() ;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "SELECT COUNT(id) FROM person";</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[]
params = new Object[] {};</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.query(sql,
params, new RowCallbackHandler() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void processRow(ResultSet rs) throws SQLException {</span></p>
<p><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; per.setCount(rs.getInt(1))
;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
per.getCount();</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
List queryAll() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final
List&lt;Person&gt; all = new ArrayList&lt;Person&gt;();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "SELECT id,name,password FROM person";</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[]
params = new Object[] {};</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.query(sql,
params, new RowCallbackHandler() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void processRow(ResultSet rs) throws SQLException {</span></p>
<p><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; Person
per = new Person();</span></p>
<p>&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; per.setId(rs.getInt(1));</p>
<p>&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; per.setName(rs.getString(2));</p>
<p>&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; per.setPassword(rs.getString(3));</p>
<p>&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; all.add(per);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
all;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
List&lt;Person&gt; queryAll(int currentPage, int lineSize) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final
List&lt;Person&gt; all = new ArrayList&lt;Person&gt;();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "SELECT id,name,password FROM person LIMIT "</span></p>
<p><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; +
(currentPage - 1) * lineSize + "," + lineSize;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[]
params = new Object[] {};</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.query(sql,
params, new RowCallbackHandler() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void processRow(ResultSet rs) throws SQLException {</span></p>
<p><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; Person
per = new Person();</span></p>
<p>&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; per.setId(rs.getInt(1));</p>
<p>&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; per.setName(rs.getString(2));</p>
<p>&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; per.setPassword(rs.getString(3));</p>
<p>&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; all.add(per);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
all;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void delete(int id) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String
sql = "DELETE FROM person WHERE id=?";</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object
params[] = new Object[] { new Integer(id) };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int
type[] = new int[] { Types.INTEGER };</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jt.update(sql,
params, type);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
JdbcTemplate getJt() {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
jt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
void setJt(JdbcTemplate jt) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.jt
= jt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:06 <a href="http://www.blogjava.net/kissyan4916/articles/254962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>智囊团SSH框架集成（配置文件、MD5、CP配置）</title><link>http://www.blogjava.net/kissyan4916/articles/254961.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:04:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254961.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254961.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254961.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseMicrosoftInternetExplorer4st1":*{behavior:url(#ieooui) }/* Style Definitions */table.MsoNormalTable{mso-style-parent:"";font-size...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissyan4916/articles/254961.html'>阅读全文</a><img src ="http://www.blogjava.net/kissyan4916/aggbug/254961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:04 <a href="http://www.blogjava.net/kissyan4916/articles/254961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两个过滤器</title><link>http://www.blogjava.net/kissyan4916/articles/254960.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254960.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254960.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254960.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: red;">OpenSessionInViewFilter</span></p>
<p>* <span style="font-family: 宋体;">这是为了避免</span>Hibernate<span style="font-family: 宋体;">的懒加载异常而创建的解决方案</span></p>
<p>* <span style="font-family: 宋体;">它是一个过滤器，能够让</span>Session<span style="font-family: 宋体;">在请求解释完成之后再关闭（所以才能够避免懒加载异常）</span></p>
<p>* <span style="font-family: 宋体;">配置方式是，在</span>web.xml<span style="font-family: 宋体;">中定义过滤器即可：</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;filter&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;</span></p>
<p style="text-indent: 31.5pt;">&lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;</p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;/filter&gt;</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;filter-mapping&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt;&nbsp;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;url-pattern&gt;/*&lt;/url-pattern&gt; </span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;/filter-mapping&gt;</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: red;">CharacterEncodingFilter</span></p>
<p>* <span style="font-family: 宋体;">如何提交中文字符？</span></p>
<p>* <span style="font-family: 宋体;">配置</span>web.xml<span style="font-family: 宋体;">了，</span>Spring<span style="font-family: 宋体;">提供了专门的针对</span>Encoding<span style="font-family: 宋体;">的过滤器</span></p>
<p>* <span style="font-family: 宋体;">配置方法如下：</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;filter&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;filter-name&gt;Spring character encoding filter&lt;/filter-name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;init-param&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;param-name&gt;encoding&lt;/param-name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;param-value&gt;GBK&lt;/param-value&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/init-param&gt; </span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;/filter&gt;&nbsp;&nbsp;&nbsp; </span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;filter-mapping&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;filter-name&gt;Spring character encoding filter&lt;/filter-name&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;/filter-mapping&gt;</span></p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:02 <a href="http://www.blogjava.net/kissyan4916/articles/254960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring &amp;Hibernate集成</title><link>http://www.blogjava.net/kissyan4916/articles/254959.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 12:02:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254959.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254959.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254959.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" />
<link rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso" /><!--[if !mso]>
<style>
v":* {behavior:url(#default#VML);}
o":* {behavior:url(#default#VML);}
w":* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style>
<![endif]--><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
h3
{
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{}
@list l0:level1
{
margin-left:34.5pt;
text-indent:-18.0pt;
font-family:Wingdings;
mso-bidi-font-family:"Times New Roman";}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;">缺陷：依赖了</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">UserManager</span></p>
<img alt="" style="border-color: #fa7d94;" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/02.jpg" width="418" height="363" />
<p style="text-align: left;" align="left"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;">原理：在</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">Action</span><span style="font-size: 10pt; font-family: 宋体;">中取得</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">BeanFactory</span><span style="font-size: 10pt; font-family: 宋体;">对象，然后通过</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">BeanFactory</span><span style="font-size: 10pt; font-family: 宋体;">获取业务逻辑对象</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">1</span><span style="font-size: 10pt; font-family: 宋体;">、</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span><span style="font-size: 10pt; font-family: 宋体;">依赖库配置</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; * </span><span style="font-size: 10pt; font-family: 宋体;">配置</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">拷贝</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span><span style="font-size: 10pt; font-family: 宋体;">类库和</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">jstl</span><span style="font-size: 10pt; font-family: 宋体;">类库</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">修改</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">web.xml</span><span style="font-size: 10pt; font-family: 宋体;">文件来配置</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">ActionServlet</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">提供</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts-config.xml</span><span style="font-size: 10pt; font-family: 宋体;">文件</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">提供国际化资源文件</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; * </span><span style="font-size: 10pt; font-family: 宋体;">配置</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">拷贝</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span><span style="font-size: 10pt; font-family: 宋体;">类库</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-size: 10pt; font-family: 宋体;">提供</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span><span style="font-size: 10pt; font-family: 宋体;">配置文件</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">2</span><span style="font-size: 10pt; font-family: 宋体;">、在</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span><span style="font-size: 10pt; font-family: 宋体;">的</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">Action</span><span style="font-size: 10pt; font-family: 宋体;">中调用如下代码取得</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">BeanFatory</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">BeanFactoryfactory=WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession.getServletContext())</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">3</span><span style="font-size: 10pt; font-family: 宋体;">、通过</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">BeanFactory</span><span style="font-size: 10pt; font-family: 宋体;">取得业务对象，调用业务逻辑方法</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;</span></p>
<p><span style="font-family: 宋体;">在</span>web.xml<span style="font-family: 宋体;">中做如下配置</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">context-param</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">param-name</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">contextConfigLocation</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;/</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">param-name</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span></p>
<p style="text-align: left; text-indent: 20pt;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">param-value</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">classpath*:applicationContext-*.xml,</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #ff9900;">/WEB-INF/applicationContext-*.xml&lt;/param-value&gt; </span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: red;">&nbsp;</span><span style="font-size: 10pt; font-family: 宋体; color: red;">变色部分如果已经在</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: red;">CLASSPATH</span><span style="font-size: 10pt; font-family: 宋体; color: red;">中配置了可省略</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;/</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">context-param</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;</span></p>
<p style="margin-left: 50pt; text-align: left; text-indent: -50pt;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">listener</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;&nbsp; </span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">listener-class</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">org.springframework.web.context.ContextLoaderListener</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;/</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">listener-class</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;&nbsp;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&lt;/</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #3f7f7f;">listener</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: teal;">&gt;</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">servletConetext</span><span style="font-size: 10pt; font-family: 宋体;">的一个助手类，可以读取它</span><span style="font-size: 10pt; font-family: Wingdings;">&#224;</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">WebApplicationContextUtils</span></p>
<h3>Spring &amp;Hibernate<span style="font-family: 宋体;">集成方案2</span></h3>
<br />
<img alt="" style="border-color: #ff18f1;" src="http://www.blogjava.net/images/blogjava_net/kissyan4916/01.jpg" width="412" height="425" /><br />
<p><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p><span style="font-family: 宋体;">原理：将业务逻辑对象通过</span>spring<span style="font-family: 宋体;">注入到</span>Action<span style="font-family: 宋体;">中，从而避免了在</span>Action<span style="font-family: 宋体;">类中的直接代码查询。</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">1</span><span style="font-size: 10pt; font-family: 宋体;">、</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span><span style="font-size: 10pt; font-family: 宋体;">依赖库配置</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; * </span><span style="font-size: 10pt; font-family: 宋体;">配置</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">拷贝</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts</span><span style="font-size: 10pt; font-family: 宋体;">类库和</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">jstl</span><span style="font-size: 10pt; font-family: 宋体;">类库</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">修改</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">web.xml</span><span style="font-size: 10pt; font-family: 宋体;">文件来配置</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">ActionServlet</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;--</span><span style="font-size: 10pt; font-family: 宋体;">提供</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">struts-config.xml</span><span style="font-size: 10pt; font-family: 宋体;">文件</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">提供国际化资源文件</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; * </span><span style="font-size: 10pt; font-family: 宋体;">配置</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span></p>
<p style="text-align: left;" align="left"><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>--</span><span style="font-size: 10pt; font-family: 宋体;">拷贝</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span><span style="font-size: 10pt; font-family: 宋体;">类库</span></p>
<p><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --</span><span style="font-size: 10pt; font-family: 宋体;">提供</span><span style="font-size: 10pt; font-family: &quot;Courier New&quot;;">spring</span><span style="font-size: 10pt; font-family: 宋体;">配置文件</span></p>
<p>2<span style="font-family: 宋体;">、因为</span>Action<span style="font-family: 宋体;">需要调用业务逻辑方法，所以需要在</span>Action<span style="font-family: 宋体;">中提供</span>setter<span style="font-family: 宋体;">方法，让</span>spring<span style="font-family: 宋体;">将业务逻辑注入过来</span></p>
<p>3<span style="font-family: 宋体;">、在</span>struts-config.xml<span style="font-family: 宋体;">文件中配置</span>action</p>
<p style="text-indent: 21.75pt;"><span>*
&lt;action&gt;</span><span style="font-family: 宋体;">标签中的</span>type<span style="font-family: 宋体;">属性需要修改为</span>org.springframework.web.struts.DelegatingActionProxy<span style="font-family: 宋体;">是一个</span>Action,<span style="font-family: 宋体;">主要作用是取得</span>BeanFactory,<span style="font-family: 宋体;">然后根据</span>&lt;action&gt;<span style="font-family: 宋体;">中的</span>path<span style="font-family: 宋体;">属性值到</span>IOC<span style="font-family: 宋体;">容器中取得本次请求对应的</span>Action</p>
<p>4<span style="font-family: 宋体;">、在</span>spring<span style="font-family: 宋体;">配置文件中需要定义</span>struts<span style="font-family: 宋体;">的</span>Action<span style="font-family: 宋体;">，如：</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;bean name=&#8221;/login&#8221; class=&#8221;com.bjsxt.usermgr.actions.LoginAction&#8221;
scope=&#8221;prototype&#8221;&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;property name=&#8221;userManager&#8221; ref=&#8221;userManager&#8221;/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;/bean&gt;</span></p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">必须使用</span>name<span style="font-family: 宋体;">属性，</span>name<span style="font-family: 宋体;">属性值必须和</span>struts-config.xml<span style="font-family: 宋体;">文件中</span>&lt;action&gt;<span style="font-family: 宋体;">标签的</span>path<span style="font-family: 宋体;">属性值一致</span></p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">必须注入业务逻辑对象</span></p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span><span style="font-family: 宋体;">建议</span>scope<span style="font-family: 宋体;">设置为</span>prototype,<span style="font-family: 宋体;">这样就避免了</span>struts Action<span style="font-family: 宋体;">的线程安全问题</span></p>
<p><span style="font-family: 宋体;">在</span>struts<span style="font-family: 宋体;">中应该修改为：</span></p>
<p>&nbsp;&lt;action&nbsp;path=&#8221;/login&#8221;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Type=&#8221;org.springframework.web.struts.DelegatingActionProxy&#8221;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&nbsp;Name=&#8221;loginForm&#8221; </span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Scope=&#8221;request&#8221;</span></p>
<p>&gt;&nbsp;</p>
<p style="text-indent: 5.25pt;">&lt;/action&gt;</p>
<p><span style="font-family: 宋体;">在</span>ApplicationContext<span style="font-family: 宋体;">中需要做如下修改：</span></p>
<p>&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体;">不能有</span>id<span style="font-family: 宋体;">属性</span> <span style="font-family: 宋体;">而是改成</span>name<span style="font-family: 宋体;">属性</span>(<span style="font-family: 宋体;">路径应该和</span>struts<span style="font-family: 宋体;">中的配置的</span>action<span style="font-family: 宋体;">的</span>path<span style="font-family: 宋体;">相同</span>)</p>
<p>&lt;bean name=&#8221;/login&#8221;&nbsp;class=&#8221;com.bjsxt.usermgr.action.LoginAction&#8221; <span style="color: red;">scope=&#8221;prototype&#8221;&gt;</span></p>
<p>&nbsp;&lt;property name=&#8221;userManager&#8221; ref=&#8221;userManagr&#8221;/&gt; //<span style="font-family: 宋体;">变色部分代表从单实例变成多实例</span></p>
<p>&lt;/bean&gt;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 20:02 <a href="http://www.blogjava.net/kissyan4916/articles/254959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编程式事务&amp;声明式事务</title><link>http://www.blogjava.net/kissyan4916/articles/254958.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:53:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254958.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254958.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254958.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C21%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
h3
{
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{}
@list l0:level1
{
margin-left:18.0pt;
text-indent:-18.0pt;}
@list l1
{}
@list l1:level1
{
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->&#160;</style>
<h3><span style="font-family: 宋体; color: black;">采用编程式事务</span></h3>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="color: black;">1、&nbsp;</span><span style="color: black;">getCurrentSession()</span><span style="font-family: 宋体; color: black;">与</span><span style="color: black;">openSession()</span><span style="font-family: 宋体; color: black;">的区别？</span></p>
<p style="margin-left: 18pt;"><span style="color: black;">* </span><span style="font-family: 宋体; color: black;">采用</span><span style="color: black;">getCurrentSession()</span><span style="font-family: 宋体; color: black;">创建的</span><span style="color: black;">session</span><span style="font-family: 宋体; color: black;">会绑定到当前线程中，而采用</span><span style="color: black;">openSession()</span><span style="font-family: 宋体; color: black;">创建的</span><span style="color: black;">session</span><span style="font-family: 宋体; color: black;">则不会</span></p>
<p style="margin-left: 18pt;"><span style="color: black;">* </span><span style="font-family: 宋体; color: black;">采用</span><span style="color: black;">getCurrentSession()</span><span style="font-family: 宋体; color: black;">创建的</span><span style="color: black;">session</span><span style="font-family: 宋体; color: black;">在</span><span style="color: black;">commit</span><span style="font-family: 宋体; color: black;">或</span><span style="color: black;">rollback</span><span style="font-family: 宋体; color: black;">时会自动关闭，而采用</span><span style="color: black;">openSession</span><span style="font-family: 宋体; color: black;">创建的</span><span style="color: black;">session</span><span style="font-family: 宋体; color: black;">必须手动关闭</span></p>
<p><span style="color: black;">2</span><span style="font-family: 宋体; color: black;">、使用</span><span style="color: black;">getCurrentSession()</span><span style="font-family: 宋体; color: black;">需要在</span><span style="color: black;">hibernate.cfg.xml</span><span style="font-family: 宋体; color: black;">文件中加入如下配置：</span></p>
<p style="text-indent: 26.25pt;"><span style="color: black;">* </span><span style="font-family: 宋体; color: black;">如果使用的是本地事务</span><span style="font-family: 宋体; color: black;">（</span><span style="color: black;">jdbc</span><span style="font-family: 宋体; color: black;">事务）</span></p>
<p style="text-indent: 26.25pt;"><span style="color: black;">&lt;property name=&#8221;hibernate.current_session_context_class&#8221;&gt;thread&lt;/property&gt;</span></p>
<p style="margin-left: 16.5pt; text-indent: 10.5pt;"><span style="color: black;">* </span><span style="font-family: 宋体; color: black;">如果使用的是全局事务</span><span style="font-family: 宋体; color: black;">（</span><span style="color: black;">jta</span><span style="font-family: 宋体; color: black;">事务）</span></p>
<p style="text-indent: 26.25pt;"><span style="color: black;">&lt;property name=&#8221;hibernate.current_session_context_class&#8221;&gt;jta&lt;/property&gt;</span></p>
<h3><span style="font-family: 宋体; color: black;">采用声明式事务</span></h3>
<p style="margin-left: 18pt; text-indent: -18pt;"><span style="font-family: 宋体; color: blue;">声明式事务配置</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>* </span><span style="font-family: 宋体;">配置</span>SessionFactory</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; *
</span><span style="font-family: 宋体;">配置事务管理器</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>* </span><span style="font-family: 宋体;">事务的传播特性</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>* </span><span style="font-family: 宋体;">那些类哪些方法使用事务</span></p>
<p><span style="color: blue;">2</span><span style="font-family: 宋体; color: blue;">、编写业务逻辑方法</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>* </span><span style="font-family: 宋体;">继承</span>HibernateDaoSupport<span style="font-family: 宋体;">类，使用</span>HibernateTemplate<span style="font-family: 宋体;">类持久化，</span>HibernateTemplate</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span><span style="font-family: 宋体;">是</span><span>Hibernate
session</span><span style="font-family: 宋体;">的封装</span></p>
<p style="margin-left: 16.5pt; text-indent: 10.5pt;">* <span style="font-family: 宋体;">默认的回滚是</span>RuntimeException<span style="font-family: 宋体;">（包括继承</span>RuntimeException<span style="font-family: 宋体;">的子类），普通异常不回滚</span></p>
<p style="margin-left: 16.5pt;">&nbsp;* <span style="font-family: 宋体;">在编写业务逻辑方法时，最好将异常一直往上抛出，在呈现层处理（</span>struts<span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 16.5pt;">&nbsp;* spring<span style="font-family: 宋体;">的事务需要设置到业务方法上（事务边界定义到</span>Facade<span style="font-family: 宋体;">类上），不要添加到</span>Dao<span style="font-family: 宋体;">上</span></p>
<p><span style="color: blue;">3</span><span style="font-family: 宋体; color: blue;">、了解事务的集中传播忒性</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>1</span><span style="font-family: 宋体;">、</span>PROPAGATION_REQUIRED:<span style="font-family: 宋体;">如果存在一个事务，则支持当前事务。如果没有事务则开启。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>2</span><span style="font-family: 宋体;">、</span>PROPAGATION_SUPPORTS:<span style="font-family: 宋体;">如果存在一个事务，支持当前事务。如果没有事务，则非事务的执行。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>3</span><span style="font-family: 宋体;">、</span>PROPAGATION_MANDATORY:<span style="font-family: 宋体;">如果已经存在一个事务，支持当前事务。如果没有一个活动的事务，则抛出异常。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>4</span><span style="font-family: 宋体;">、</span>PROPAGATION_REQUIRES_NEW:<span style="font-family: 宋体;">总是开启一个新的事务。如果一个事务存在，则将这个存在的事务挂起。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>5</span><span style="font-family: 宋体;">、</span>PROPAGATION_NOT_SUPPORTED:<span style="font-family: 宋体;">总是非事务地执行，并挂起任何存在的事务。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>6</span><span style="font-family: 宋体;">、</span>PROPAGATION_NEVER:<span style="font-family: 宋体;">总是非事务地执行，如果存在一个活动事务，则抛出异常。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>7</span><span style="font-family: 宋体;">、</span><span>
PROPAGATION_NESTED:</span><span style="font-family: 宋体;">如果一个活动的事务存在，则运行在一个嵌套的事务中，如果没有活动事务，则按</span>TransactionDefinition.PROPAGATION_REQUIRED<span style="font-family: 宋体;">属性执行</span></p>
<p><span style="color: blue;">4</span><span style="font-family: 宋体; color: blue;">、</span><span style="color: blue;">Spring</span><span style="font-family: 宋体; color: blue;">事务的隔离级别</span></p>
<p><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp; </span>1<span style="font-family: 宋体;">、</span> ISOLATION_DEFAULT: <span style="font-family: 宋体;">这是一个</span>PlatfromTransactionManager<span style="font-family: 宋体;">默认的隔离级别，使用数据库默认的事务隔离级别。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>2</span><span style="font-family: 宋体;">、</span>ISOLATION_READ_UNCOMMITTED:<span style="font-family: 宋体;">这是事务最低的隔离级别，它允许另外一个事务可以看到这个事务未提交的数据。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>3</span><span style="font-family: 宋体;">、</span>ISOLATION_READ_COMMITTED<span style="font-family: 宋体;">：保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>4</span><span style="font-family: 宋体;">、</span><span>ISOLATION_REPEATALBE_READ:
</span><span style="font-family: 宋体;">这种事务隔离级别可以防止脏读，不可重复读。但是可能出现幻想读。它除了保证一个事务不能读取另外一个事务未提交的数据外，还保证了避免下面的情况产生（不可重复读）。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>5</span><span style="font-family: 宋体;">、</span><span>ISOLATION_SERIALIZABLE
</span><span style="font-family: 宋体;">这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读，不课重复读外，还避免了幻想读。</span></p>
<table style="border: medium none ; width: 428.7pt; border-collapse: collapse;" width="572" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">事务属性</span></p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p><span>T2<span>&nbsp;&nbsp;&nbsp;
            </span></span></p>
            </td>
        </tr>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p>Required</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p>T2</p>
            <p>T1</p>
            </td>
        </tr>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p>RequiredNew</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p>T2</p>
            <p>T2</p>
            </td>
        </tr>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p>Support</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
        </tr>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p>Mandatory</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p><span style="font-family: 宋体;">抛异常</span></p>
            <p>T1</p>
            </td>
        </tr>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p>NoSupport</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p><span style="font-family: 宋体;">无</span></p>
            <p><span style="font-family: 宋体;">无</span></p>
            </td>
        </tr>
        <tr style="height: 15.9pt;">
            <td style="padding: 0cm 5.4pt; width: 140.1pt; height: 15.9pt;" valign="top" width="187">
            <p>Never</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 140.15pt; height: 15.9pt;" valign="top" width="187">
            <p><span style="font-family: 宋体;">无</span></p>
            <p>T1</p>
            </td>
            <td style="padding: 0cm 5.4pt; width: 148.45pt; height: 15.9pt;" valign="top" width="198">
            <p><span style="font-family: 宋体;">无</span></p>
            <p><span style="font-family: 宋体;">抛异常</span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-family: Wingdings;">&#224;</span></p>
<p><span style="color: red;">&lt;!--&nbsp;</span><span style="font-family: 宋体; color: red;">配置</span><span style="color: red;">sessionFactory -- &gt;</span></p>
<p>&lt;bean id=&#8221;sessionFacory&#8221;class=&#8221;org.springframework.orm.hibernate3.LocalSessionFactoryBean&#8221;&gt;</p>
<p style="text-indent: 10.5pt;">&lt;property name=&#8221;configLocation&#8221;&gt;</p>
<p style="text-indent: 10.5pt;"><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;value&gt;classpath:hibernate.cfg.xml&lt;/value&gt;</span></p>
<p style="text-indent: 10.5pt;">&lt;/property&gt;</p>
<p style="text-indent: 10.5pt;">&lt;/bean&gt;</p>
<p><span style="color: red;">&lt;!--&nbsp;</span><span style="font-family: 宋体; color: red;">配置事务管理器</span><span style="color: red;">-- &gt;</span></p>
<p>&lt;beanid=&#8221;transactionManager&#8221;class=&#8221;org.springframework.orm.hibernate3.HibernateTransactionManager&#8221;&gt;</p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;property name=&#8221;sessionFactory&#8221;&gt;</span></p>
<p style="text-indent: 15.75pt;">&nbsp;&nbsp;&nbsp; &lt;ref bean=&#8221;sessionFactory&#8221;/&gt;</p>
<p style="text-indent: 15.75pt;">&lt;/property&gt;</p>
<p>&lt;/bean&gt;</p>
<p><span style="color: red;">&lt;!--&nbsp;</span><span style="font-family: 宋体; color: red;">配置事务的传播特性</span><span style="color: red;">-- &gt;</span></p>
<p>&lt;tx:advice&nbsp;id=&#8221;txAdvice&#8221; transaction-manager=&#8221;transactionManager&#8221;&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tx:attributes&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tx:method&nbsp;name=&#8221;add*&#8221;&nbsp;propagation=&#8221;REQUIRED&#8221;/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tx:method&nbsp;name=&#8221;del*&#8221;&nbsp;propagation=&#8221;REQUIRED&#8221;/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tx:method&nbsp;name=&#8221;modify*&#8221;&nbsp;propagation=&#8221;REQUIRED&#8221;/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;tx:method&nbsp;name=&#8221; *&#8221;&nbsp;read-only=&#8221;true&#8221;/&gt;&nbsp;//</span><span style="font-family: 宋体;">只读提高了性能</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="text-indent: 26.25pt;">&lt;/tx:attributes&gt;</p>
<p>&lt;/tx:advice&gt;</p>
<p><span style="color: red;">&lt;!--&nbsp;</span><span style="font-family: 宋体; color: red;">哪些类的哪些方法参与事务</span><span style="color: red;">-- &gt;</span></p>
<p>&lt;aop:config&gt;</p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;aop:pointcut id=&#8221;allManagerMethod&#8221; expression=&#8221;execution(*
com.bjsxt.usermgr.manager.*.*(..))&#8221;/&gt;</span></p>
<p><span><span>&nbsp;&nbsp;
</span>&lt;aop:advisor pointcut-ref=&#8221;allManagerMethod&#8221; advice-ref=&#8221;txAdvice&#8221;/&gt;</span></p>
<p>&lt;/aop:config&gt;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:53 <a href="http://www.blogjava.net/kissyan4916/articles/254958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Aware相关接口&amp;CGLIB</title><link>http://www.blogjava.net/kissyan4916/articles/254957.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:51:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254957.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254957.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254957.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C18%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
h3
{
margin-top:13.0pt;
margin-right:0cm;
margin-bottom:13.0pt;
margin-left:0cm;
text-align:justify;
text-justify:inter-ideograph;
line-height:173%;
page-break-after:avoid;
font-size:16.0pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{}
@list l0:level1
{
margin-left:18.0pt;
text-indent:-18.0pt;}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p>Aware<span style="font-family: 宋体;">相关接口，表示在</span>Spring<span style="font-family: 宋体;">实例化</span>Bean<span style="font-family: 宋体;">之前进行相关的调用</span></p>
<p><span style="font-family: 宋体;">例如：准备工作</span><span style="font-family: Wingdings;">--&gt;</span><span style="font-family: 宋体;">打扫工作</span></p>
<p>BeanNameAware<span style="font-family: 宋体;">表示在</span>Spring<span style="font-family: 宋体;">实例化</span>Bean<span style="font-family: 宋体;">之前进行调用</span></p>
<p>ApplicationContextAware<span style="font-family: 宋体;">：</span> <span style="font-family: 宋体;">在</span>Bean<span style="font-family: 宋体;">类被初始化之后，将会被注入</span>ApplicationContext<span style="font-family: 宋体;">实例</span></p>
<p style="text-indent: 15.75pt;"><span style="color: red;">//ApplicationContext</span><span style="font-family: 宋体; color: red;">实例由系统自动添加上去</span></p>
<p><span><span>&nbsp;&nbsp;
</span>public void setApplicationContext (<span style="color: red;">ApplicationContext</span>
arg0) throws BeansException { </span></p>
<p>} &nbsp;&nbsp;&nbsp;</p>
<p><span style="font-family: 宋体;">消息支持</span></p>
<p>ApplicationContext<span style="font-family: 宋体;">继承了</span>MessageSource<span style="font-family: 宋体;">接口，用户可以直接使用</span></p>
<p><span style="font-family: 宋体;">事件监听：</span></p>
<p style="text-indent: 21.75pt;"><span style="font-family: 宋体;">容器关闭</span></p>
<p style="text-indent: 21.75pt;"><span style="font-family: 宋体;">容器初始化</span></p>
<p style="text-indent: 21.75pt;"><span style="font-family: 宋体;">在</span>Web<span style="font-family: 宋体;">中请求处理的时候</span></p>
<h3><span style="font-family: 宋体; color: black;"><span style="color: black;">CGLIB</span></span></h3>
<p><span style="color: blue;">spring</span><span style="font-family: 宋体; color: blue;">对</span><span style="color: blue;">AOP</span><span style="font-family: 宋体; color: blue;">的支持</span></p>
<p>Asepect<span style="font-family: 宋体;">默认情况下不用实现接口，但对于目标对象（</span>UserManagerImpl.java<span style="font-family: 宋体;">）</span>,<span style="font-family: 宋体;">在默认情况下必须实现接口，如果没有实现接口必须引入</span>CGLIB<span style="font-family: 宋体;">库</span></p>
<p><span style="font-family: 宋体;">我们可以通过</span>Advice<span style="font-family: 宋体;">中添加一个</span>JoinPoint<span style="font-family: 宋体;">参数，这个值会由</span>spring<span style="font-family: 宋体;">自动传入，从</span>JoinPoint<span style="font-family: 宋体;">中可以取得参数值、方法名等等。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;">1、&nbsp;<span style="font-family: 宋体;">如果目标对象实现了接口，默认情况下会采用</span>JDK<span style="font-family: 宋体;">的动态代理实现</span>AOP</p>
<p style="margin-left: 18pt; text-indent: -18pt;">2、&nbsp;<span style="font-family: 宋体;">如果目标对象实现了接口，可以强制使用</span>CGLIB<span style="font-family: 宋体;">实现</span>AOP</p>
<p style="margin-left: 18pt; text-indent: -18pt;">3、&nbsp;<span style="font-family: 宋体;">如果目标对象没有实现接口，必须采用</span>CGLIB<span style="font-family: 宋体;">库，</span>spring<span style="font-family: 宋体;">会自动在</span>JDK<span style="font-family: 宋体;">动态代理和</span>CGLIB<span style="font-family: 宋体;">之间转换</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">如何强制使用</span>CGLIB<span style="font-family: 宋体;">实现</span>AOP<span style="font-family: 宋体;">？</span></p>
<p>&nbsp;&nbsp; *<span style="font-family: 宋体;">添加</span>CGLIB<span style="font-family: 宋体;">库，</span>SPRING_HOME/cglib/*.jar</p>
<p>&nbsp;&nbsp; *<span style="font-family: 宋体;">在</span> spring<span style="font-family: 宋体;">配置文件中加入</span><span>&lt;aop:aspect-autoproxy
proxy-target-class=&#8221;true&#8221;/&gt;</span></p>
<p>JDK<span style="font-family: 宋体;">动态代理和</span>CGLIB<span style="font-family: 宋体;">字节码生成的区别？</span></p>
<p>&nbsp;*JDK<span style="font-family: 宋体;">动态代理只能对实现了接口的类生成代理，而不能针对类</span></p>
<p>&nbsp;*CGLIB<span style="font-family: 宋体;">是针对实现代理，主要是对指定的类生成一个子类，覆盖其中的方法</span></p>
<p><span style="font-family: 宋体;">因为是继承，所以该类或方法最好不要声明成</span>final</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:51 <a href="http://www.blogjava.net/kissyan4916/articles/254957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中AOP的使用</title><link>http://www.blogjava.net/kissyan4916/articles/254955.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254955.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254955.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254955.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C15%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
/* List Definitions */
@list l0
{}
@list l0:level1
{
margin-left:18.0pt;
text-indent:-18.0pt;}
@list l1
{}
@list l1:level1
{
margin-left:34.5pt;
text-indent:-18.0pt;
font-family:Wingdings;
mso-bidi-font-family:"Times New Roman";}
ol
{margin-bottom:0cm;}
ul
{margin-bottom:0cm;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";}
</style>
<![endif]-->
<p>AOP<span style="font-family: 宋体;">：面向切面编程</span></p>
<p><span style="font-family: 宋体;">代理模式讲解</span>AOP<span style="font-family: 宋体;">技术</span></p>
<p>&nbsp;&nbsp; <span style="font-family: 宋体;">操作接口</span></p>
<p><span style="font-family: 宋体;">代理实现</span> <span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">真实实现</span></p>
<p><span style="font-family: 宋体;">因为此代理类只能为一个接口的对象进行代理</span> <span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">静态代理</span></p>
<p><span style="font-family: 宋体;">能不能有一种方法可以为所有的类进行代理</span> <span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">动态代理</span></p>
<p>Spring<span style="font-family: 宋体;">提供的一系列</span>Advices<span style="font-family: 宋体;">接口</span></p>
<p><span>&nbsp;&nbsp; |-
BeforeAdvice</span></p>
<p><span>&nbsp;&nbsp; |-
AfterAdvice</span></p>
<p><span style="font-family: 宋体;">主要操作是在配置上：</span><span>applicationContext.xml
</span><span style="font-family: 宋体;">文件上</span></p>
<p><span style="font-family: 宋体;">了解其作用：只关注于业务本身，而与其他业务无关</span></p>
<p><span style="font-family: Wingdings; color: blue;">&#224;</span><span style="font-family: 宋体; color: blue;">尚学堂代码实例（</span><span style="color: blue;">spring-avi-152-014</span><span style="font-family: 宋体; color: blue;">）：</span></p>
<p style="text-indent: 21.75pt;"><span>public class
SecurityHandler implements<span style="color: red;"> InvacationHandler </span>{</span></p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; private Object targetObject;</p>
<p style="text-indent: 21.75pt;"><span>&nbsp;&nbsp; public Object newProxy(Object
targetObject)&nbsp;{</span></p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; this.targetObject = targetObject;</p>
<p style="text-indent: 21.75pt;"><span>&nbsp;&nbsp; return
Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),</span></p>
<p style="text-indent: 174pt;">targetObject.getClass.getInterfaces(),</p>
<p style="text-indent: 174pt;">this);</p>
<p style="text-indent: 21.75pt;">}</p>
<p style="text-indent: 21.75pt;"><span>Public Object
invoke(Object proxy,Method method,Object[] args)throws Throwable {</span></p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; checkSecuity();</p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; Object ret = null;</p>
<p style="text-indent: 21.75pt;">&nbsp;Try {</p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; ret = method.invoke(this.targetObject ,&nbsp;args);</p>
<p style="text-indent: 21.75pt;"><span>}catch(Exception
e) {</span></p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; e.printStackTrace();</p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; throw new java.lang.RuntimeException(e);</p>
<p style="text-indent: 21.75pt;">}</p>
<p style="text-indent: 21.75pt;">&nbsp;return ret;</p>
<p style="text-indent: 21.75pt;">}</p>
<p style="text-indent: 21.75pt;">&nbsp;private void checkSecurtiy() {</p>
<p style="text-indent: 37.5pt;">&nbsp;&nbsp; System.out.println(&#8220;------------checkSecurity()-----------&#8221;);</p>
<p style="text-indent: 37.5pt;">}</p>
<p style="text-indent: 21.75pt;">} </p>
<p><span style="font-family: Wingdings; color: blue;">&#224;</span><span style="color: blue;">Spring</span><span style="font-family: 宋体; color: blue;">对</span><span style="color: blue;"> AOP</span><span style="font-family: 宋体; color: blue;">的支持（采用</span><span style="color: blue;">Annotation</span><span style="font-family: 宋体; color: blue;">的方式）</span></p>
<p>1<span style="font-family: 宋体;">、</span>spring<span style="font-family: 宋体;">依赖库</span></p>
<p style="text-indent: 21pt;">* SPRING_HOME/dist/spring.jar</p>
<p style="text-indent: 21pt;">* SPRING_HOME/lib/Jakarta-commons/commons-logging.jar</p>
<p style="text-indent: 21pt;">* SPRING_HOME/lib/log4j-1.2.14.jar</p>
<p style="text-indent: 21pt;">*SPRING_HOME/lib/aspectj/*.jar</p>
<p>2<span style="font-family: 宋体;">、</span>
<span style="font-family: 宋体;">采用</span>Aspect<span style="font-family: 宋体;">定义切面</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;">1、&nbsp;<span style="font-family: 宋体;">在</span>Aspect<span style="font-family: 宋体;">定义</span>Pointcut<span style="font-family: 宋体;">和</span>Advice</p>
<p style="margin-left: 18pt; text-indent: -18pt;">2、&nbsp;<span style="font-family: 宋体;">启用</span>AspectJ<span style="font-family: 宋体;">对</span>Annotation<span style="font-family: 宋体;">的支持并且将</span>Aspect<span style="font-family: 宋体;">类和目标对象配置到</span>LOC<span style="font-family: 宋体;">容器中</span></p>
<p><span style="font-family: 宋体;">注意：在这种方法定义中，切入点的方法是不是被执行的，它存在的目的仅仅是为了重用切入点即</span>Advice<span style="font-family: 宋体;">中通过方法名引用这个切入点</span></p>
<p>AOP<span style="font-family: 宋体;">：</span></p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Cross cutting concern</p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Aspect</p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Advice<span style="font-family: 宋体;">（横切关注点的具体实现）</span></p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Pointcut<span style="font-family: 宋体;">（圈定了一个范围</span> <span style="font-family: 宋体;">）</span></p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Joinpoint&nbsp;spring<span style="font-family: 宋体;">只支持方法级的</span>Joinpoint</p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Weave</p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Target Object</p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Proxy</p>
<p style="margin-left: 34.5pt; text-indent: -18pt;"><span style="font-family: Wingdings;"><span>l<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></span></span>Introduction</p>
<p><span style="font-family: Wingdings; color: blue;">&#224;</span><span style="font-family: 宋体; color: blue;">实例（</span><span style="color: blue;">spring-avi-152-016</span><span style="font-family: 宋体; color: blue;">）：</span></p>
<p><span style="color: black;">/**</span></p>
<p><span style="color: black;">*</span><span style="font-family: 宋体; color: black;">定义</span><span style="color: black;">Pointcut</span><span style="font-family: 宋体; color: black;">，</span><span style="color: black;">Pointcut</span><span style="font-family: 宋体; color: black;">的名称就是</span><span style="color: black;">allAddMethod,</span><span style="font-family: 宋体; color: black;">此方法不能有返回值和参数</span><span style="color: black;">,</span><span style="font-family: 宋体; color: black;">只是一个标</span></p>
<p><span style="color: black;">*</span><span style="font-family: 宋体; color: black;">识</span></p>
<p style="margin-left: 52.5pt; text-indent: -52.5pt;"><span style="color: black;">*</span></p>
<p><span style="color: black;">*Pointcut</span><span style="font-family: 宋体; color: black;">的内容是一个表达式，描述哪些对象的哪些方法（订阅</span><span style="color: black;">Joinpoint</span><span style="font-family: 宋体; color: black;">）</span></p>
<p><span style="color: black;">*/</span></p>
<p><span style="color: red;">@Aspect </span></p>
<p>Public class SecurityHandle {</p>
<p style="margin-left: 189pt; text-indent: -189pt;">&nbsp;&nbsp; <span style="color: red;">@Pointcut(&#8220;execution(* add*(..)) || execution(*del*(..))&#8221;)&nbsp;&nbsp;&nbsp; //</span><span style="font-family: 宋体;">第一个</span>*<span style="font-family: 宋体;">表示返回值，第二个表示以</span>add<span style="font-family: 宋体;">开头的所</span>//<span style="font-family: 宋体;">有方法</span>,&nbsp;..<span style="font-family: 宋体;">表示所有参数</span></p>
<p style="text-indent: 21.75pt;"><span>Private void
allAddMethod() {}</span><span style="font-family: 宋体;">；</span> //<span style="font-family: 宋体;">不会被调用，只是一个标识</span></p>
<p style="text-indent: 21.75pt;">/**</p>
<p style="text-indent: 21.75pt;">*<span style="font-family: 宋体;">定义</span>Advice,<span style="font-family: 宋体;">标识在哪个切入点何处织入此方法</span></p>
<p style="text-indent: 21.75pt;">*</p>
<p style="text-indent: 21.75pt;">*/</p>
<p style="text-indent: 21.75pt;">@Before(<span style="color: red;">&#8220;allAddMethod()&#8221;)</span></p>
<p style="text-indent: 21.75pt;"><span>Private void
checkSecurity() {</span></p>
<p style="text-indent: 21.75pt;">&nbsp;&nbsp; System.out.println(&#8220;---------------------------checkSecurity()----------------------------&#8221;);</p>
<p style="text-indent: 21.75pt;">}</p>
<p>}</p>
<p><span style="font-family: 宋体; color: blue;">需要在</span><span style="color: blue;">applicationContext</span><span style="font-family: 宋体; color: blue;">中加入：</span><span style="color: blue;">&lt;aop:aspectj-autoproxy/&gt;&nbsp;</span><span style="font-family: 宋体; color: blue;">启用对</span><span style="color: blue;">Annotation</span><span style="font-family: 宋体; color: blue;">的支持</span></p>
<p><span style="color: blue;">spring-avi-152-017</span></p>
<p><span style="font-family: Wingdings; color: blue;">&#224;</span><span style="font-family: 宋体; color: blue;">静态文件配置方式</span></p>
<p><span style="color: blue;">&nbsp;</span><span style="color: black;">&lt;aop:config&gt;</span></p>
<p><span style="color: black;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:aspect id=&#8221;&#8221; ref=&#8221;&#8221;&gt;</span></p>
<p><span style="color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:pointcut id=&#8221;allAddMethod&#8221;
expression=&#8221;execution(* com.bjsxt.spring.UserManager.add*(..))&#8221;/&gt;</span></p>
<p><span style="color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;aop:before&nbsp;method=&#8221;&#8221; pointcut-ref=&#8221;&#8221;/&gt;</span></p>
<p><span style="color: black;">&nbsp;&nbsp;&nbsp;&nbsp; &lt;/aop:apect&gt;</span></p>
<p><span style="color: black;">&nbsp;&lt;/aop:config&gt;</span></p>
<p><span style="font-family: Wingdings; color: black;">&#224;</span><span style="color: blue;">spring</span><span style="font-family: 宋体; color: blue;">的</span><span style="color: blue;">JoinPoint</span><span style="font-family: 宋体; color: blue;">只针对方法</span></p>
<p><span style="color: black;">public class
SecurityHandler {</span></p>
<p><span style="color: black;">&nbsp;private void args = joinPoint.getArgs();</span></p>
<p><span style="color: black;">&nbsp;&nbsp; </span><span style="color: rgb(255, 153, 0);">Object[]
args = joinPoint.getArgs(); //</span><span style="font-family: 宋体; color: rgb(255, 153, 0);">取得方法的参数</span></p>
<p><span style="color: black;">&nbsp;For (int i=0;i&lt;args.length;i++) {</span></p>
<p><span style="color: black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(args[i]);</span></p>
<p style="text-indent: 15.75pt;"><span style="color: black;">}</span></p>
<p style="text-indent: 15.75pt;"><span style="color: rgb(255, 153, 0);">System.out.println(joinPoint.getSignature().getName());&nbsp;//</span><span style="font-family: 宋体; color: rgb(255, 153, 0);">得到方法签名</span></p>
<p><span style="color: black;">}</span></p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:49 <a href="http://www.blogjava.net/kissyan4916/articles/254955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>属性编辑器  公共注入</title><link>http://www.blogjava.net/kissyan4916/articles/254954.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:46:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254954.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254954.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254954.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseMicrosoftInternetExplorer4/* Style Definitions */table.MsoNormalTable{mso-style-parent:"";font-size:10.0pt;font-family:"Times New R...&nbsp;&nbsp;<a href='http://www.blogjava.net/kissyan4916/articles/254954.html'>阅读全文</a><img src ="http://www.blogjava.net/kissyan4916/aggbug/254954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:46 <a href="http://www.blogjava.net/kissyan4916/articles/254954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate数据关联技术</title><link>http://www.blogjava.net/kissyan4916/articles/254953.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:45:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254953.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254953.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254953.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C12%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="color: red;">one-to-one </span><span style="font-family: 宋体; color: red;">主键关联</span></p>
<p><span style="font-family: 宋体; color: red;">数据库脚本</span><span style="font-family: 宋体; color: blue;">：</span></p>
<p>-- <span style="font-family: 宋体;">删除表</span></p>
<p>DROP TABLE idcard ;</p>
<p>DROP TABLE person ;</p>
<p>-- <span style="font-family: 宋体;">创建表</span></p>
<p>CREATE TABLE person</p>
<p>(</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id
VARCHAR(32) NOT NULL PRIMARY KEY ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name
VARCHAR(20) NOT NULL ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age
int</span></p>
<p>) ;</p>
<p>CREATE TABLE idcard</p>
<p>(</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id
VARCHAR(32) ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serial
VARCHAR(18) NOT NULL ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expiry
int ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FOREIGN
KEY(id) REFERENCES person(id) ON DELETE CASCADE </span></p>
<p>) ;</p>
<p><span style="color: blue;">Person</span><span style="font-family: 宋体; color: blue;">表的</span><span style="color: blue;">hbm</span><span style="font-family: 宋体; color: blue;">配置：</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo04.pojo.Person"
table="person"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="id" length="32" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="uuid.hex"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="age" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="age" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-one
name="idCard"</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.lxh.hibernate.demo04.pojo.IDCard"
cascade="all"</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outer-join="true"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/one-to-one&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="color: blue;">IDCard</span><span style="font-family: 宋体; color: blue;">表的</span><span style="color: blue;">hbm</span><span style="font-family: 宋体; color: blue;">配置</span><span style="color: blue;">:</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo04.pojo.IDCard"
table="idcard"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" column="id" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="foreign"&gt;</span></p>
<p><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; &lt;param
name="property"&gt;person&lt;/param&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/generator&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-one
name="person"</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.lxh.hibernate.demo04.pojo.Person"
constrained="true"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/one-to-one&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="serial" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="serial" length="18" not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="expiry" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="expiry" not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: red;">唯一外键关联</span></p>
<p><span style="font-family: 宋体; color: red;">此例子为</span><span style="color: red;">mang&#8211;to-one</span></p>
<p>-- <span style="font-family: 宋体;">删除表</span></p>
<p>DROP TABLE person ;</p>
<p>DROP TABLE tgroup ;</p>
<p>-- <span style="font-family: 宋体;">创建表</span></p>
<p>CREATE TABLE person</p>
<p>(</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id
VARCHAR(32) PRIMARY KEY NOT NULL ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name
VARCHAR(20) NOT NULL ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; age
INT ,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gid
VARCHAR(32)</span></p>
<p>) ;</p>
<p>CREATE TABLE TGROUP</p>
<p>(</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gid
VARCHAR(32) PRIMARY KEY NOT NULL,</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name
VARCHAR(20)</span></p>
<p>) ;</p>
<p>commit ;</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">Person.hbm.xml</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo05.pojo.Person"
table="person"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="id" length="32" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="uuid.hex"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="age" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="age" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one
name="tgroup"</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.lxh.hibernate.demo05.pojo.TGroup"
column="gid"</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unique="true"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">TGroup.hbm.xml</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo05.pojo.TGroup"
table="tgroup"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="gid" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="gid" length="32" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="uuid.hex"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-one
name="person"</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.lxh.hibernate.demo05.pojo.Person"
property-ref="tgroup"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/one-to-one&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: red;">one-to-many</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">Person.hbm.xml</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo06.pojo.Person" table="person"</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catalog="mldn"&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="pid" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="pid" length="32" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="uuid.hex"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="age" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="age" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set
name="address" table="address" cascade="all"</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inverse="true"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;</p>
<p><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; &lt;column
name="pid" length="32" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many
class="org.lxh.hibernate.demo06.pojo.Address" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">Address.hbm.xml</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;class name="org.lxh.hibernate.demo06.pojo.Address"
table="address" catalog="mldn"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;id name="aid" type="java.lang.String"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;column name="aid" length="32" /&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;generator class="uuid.hex"&gt;&lt;/generator&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/id&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;many-to-one name="person"
class="org.lxh.hibernate.demo06.pojo.Person"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;column name="pid" length="32" /&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/many-to-one&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;property name="name" type="java.lang.String"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;column name="name" length="50"
not-null="true" /&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/property&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;property name="zipcode"
type="java.lang.String"&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;column name="zipcode" length="10"
not-null="true" /&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>&lt;/property&gt;</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;/class&gt;</span></p>
<p>&lt;/hibernate-mapping&gt;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:45 <a href="http://www.blogjava.net/kissyan4916/articles/254953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate容器映射技术</title><link>http://www.blogjava.net/kissyan4916/articles/254952.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254952.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254952.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254952.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C10%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">在</span>Hibernate 3<span style="font-family: 宋体;">中实际上有一种机制叫做延迟加载</span></p>
<p>&nbsp;<span style="font-family: 宋体;">所谓的延迟加载就是指当程序用到数据的时候才进行加载</span></p>
<p>Hibernate<span style="font-family: 宋体;">中提供的</span>delete<span style="font-family: 宋体;">方法最大的缺点就是必须先把数据查询出来之后</span> <span style="font-family: 宋体;">，在进行删除，这样才能一起删除掉，最好的做法是将数据按</span>ID<span style="font-family: 宋体;">进行删除</span><span style="font-family: Wingdings;">&#224;</span>HQL </p>
<p><span style="font-family: 宋体; color: blue;">举例（各种容器的</span><span style="color: blue;">hbm</span><span style="font-family: 宋体; color: blue;">文件的写法）：</span></p>
<p><span style="color: red;">Set</span><span style="font-family: 宋体; color: red;">：</span></p>
<p>&nbsp;&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo01.pojo.Person"
table="person"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="id" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="native"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set
name="emails" table="emails" lazy="false"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key
column="id"&gt;&lt;/key&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element
type="java.lang.String"
column="address"&gt;&lt;/element&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="color: red;">List:</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo02.pojo.Person"
table="person"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="id" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="native"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;list
name="books" table="books"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key
column="id"&gt;&lt;/key&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;index
column="posit"&gt;&lt;/index&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element
type="java.lang.String" column="title"&gt;&lt;/element&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/list&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="color: red;">Map:</span></p>
<p>&lt;hibernate-mapping&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="org.lxh.hibernate.demo03.pojo.Person"
table="person"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" type="java.lang.Integer"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="id" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="native"&gt;&lt;/generator&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="name" type="java.lang.String"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column
name="name" length="20" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map
name="phone" table="phone"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key
column="id"&gt;&lt;/key&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;index
type="java.lang.String" column="name"&gt;&lt;/index&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;element
type="java.lang.String"
column="numbers"&gt;&lt;/element&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/map&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:44 <a href="http://www.blogjava.net/kissyan4916/articles/254952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate实体层映射 和 实体层设计</title><link>http://www.blogjava.net/kissyan4916/articles/254951.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254951.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254951.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254951.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C08%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">实体层映射：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp; hibernate-mapping
package="org.lxh.hibernate"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;class
name="Person" table="PERSON"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" column="ID" type="int"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="assigned" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;component
name="name" class="org.lxh.hibernate.Name"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="firstname" column="FIRSTNAME" type="string"
not-null="true" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="lastname" column="LASTNAME" type="string"
not-null="true" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;component
name="contact" class="org.lxh.hibernate.Contact"&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="address" column="ADDRESS" type="string"
not-null="true" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="zipcode" column="ZIPCODE" type="string"
not-null="true" /&gt;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="tel" column="TEL" type="string" /&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/component&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p>&lt;/hibernate-mapping&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">实体层设计：</span>2<span style="font-family: 宋体;">个</span>HBM<span style="font-family: 宋体;">文件的例子</span></p>
<p style="text-indent: 21.75pt;"><span style="color: red;">|--</span><span> &lt;hibernate-mapping
package="org.lxh.hibernate04"&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;class name="TItem"
table="TITEM"&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;id name="id"
column="ID" type="string"&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;generator class="assigned"
/&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21pt;">&lt;/id&gt;</p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;property name="name"
column="NAME" type="string" not-null="true" /&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;property
name="manufacturer" column="MANUFACTURER"
type="string" /&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;joined-subclass
name="org.lxh.hibernate04.TBook" table="TBook"&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;key
column="ID"&gt;&lt;/key&gt;</span></p>
<p style="text-indent: 31.5pt;"><span>&lt;property name="pageCount"
type="java.lang.Integer"
column="pagecount"&gt;&lt;/property&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;">&lt;/joined-subclass&gt;</p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;joined-subclass
name="org.lxh.hibernate04.TDVD" table="TDvd"&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;"><span>&lt;key
column="ID"&gt;&lt;/key&gt;</span></p>
<p style="text-indent: 31.5pt;"><span>&lt;property name="regionCode"
type="java.lang.String"
column="regioncode"&gt;&lt;/property&gt;</span></p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;">&lt;/joined-subclass&gt;</p>
<p style="margin-left: 52.5pt; text-indent: 21.75pt;">&lt;/class&gt; </p>
<p style="text-indent: 21.75pt;">&lt;/hibernate-mapping&gt;</p>
<p style="text-indent: 21.75pt;"><span style="color: red;">|-- </span>&nbsp;&lt;hibernate-mapping package="org.lxh.hibernate05"&gt;</p>
<p style="margin-left: 42pt; text-indent: 42pt;"><span>&lt;class
name="TItem" table="TITEM"&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id
name="id" column="ID" type="string"&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;generator
class="assigned" /&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/id&gt;</p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;discriminator
column="category"
type="java.lang.String"&gt;&lt;/discriminator&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 42.75pt;"><span>&lt;property
name="name" column="NAME" type="string"
not-null="true" /&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="manufacturer" column="MANUFACTURER"
type="string" not-null="true" /&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 42.75pt;"><span>&lt;subclass
name="org.lxh.hibernate05.TBook"
discriminator-value="1"&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="pageCount" column="PAGECOUNT" type="int"
/&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/subclass&gt;</p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;subclass
name="org.lxh.hibernate05.TDVD" discriminator-value="2"&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property
name="regionCode" column="REGIONCODE"
type="string" /&gt;</span></p>
<p style="margin-left: 42pt; text-indent: 21.75pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/subclass&gt;</p>
<p style="margin-left: 42pt; text-indent: 21.75pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/class&gt;</p>
<p style="text-indent: 37.5pt;">&lt;/hibernate-mapping&gt;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:43 <a href="http://www.blogjava.net/kissyan4916/articles/254951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HQL查询语句</title><link>http://www.blogjava.net/kissyan4916/articles/254950.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:42:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254950.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254950.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254950.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C06%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><!--[if !mso]>
<style>
st1":*{behavior:url(#ieooui) }
</style>
<![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">这是</span>Hibernate<span style="font-family: 宋体;">官方所推荐的查询语言，接近</span>SQL<span style="font-family: 宋体;">的语法，并提供更多的特性与封装。</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体;">从</span>Person<span style="font-family: 宋体;">表查询出年龄（</span>distinct<span style="font-family: 宋体;">去掉重复的）</span></p>
<p><span>String hql = "SELECT distinct p.sex
FROM Person AS p" ;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query
q = session.createQuery(hql) ;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List
all = q.list();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator
iter = all.iterator();</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span>String hql = "SELECT
COUNT(p.id) FROM Person AS p" ;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query
q = session.createQuery(hql) ;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List
all = q.list();</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">按字段查询</span></p>
<p style="margin-left: 21pt; text-indent: 5.25pt;"><span>String hql =
"FROM Person AS p WHERE p.name=?" ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query q =
session.createQuery(hql) ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setString(0,
"</span><span style="font-family: 宋体;">张三</span>") ;</p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List all =
q.list();</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">更新操作</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String hql =
"UPDATE Person SET sex=? WHERE id=?" ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query q =
session.createQuery(hql) ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setString(0,
"Ů") ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setInteger(1,
1) ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.executeUpdate()
;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.beginTransaction().commit()
;</span></p>
<p style="margin-left: 21pt;"><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">分页</span></p>
<p style="margin-left: 21pt;"><span>String hql = "FROM Person
AS p" ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query q =
session.createQuery(hql) ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setFirstResult(2)
;&nbsp;//</span><span style="font-family: 宋体;">从第几行取出</span></p>
<p style="margin-left: 21pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; q.setMaxResults(2);&nbsp;//<span style="font-family: 宋体;">取多少条</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List all =
q.list();</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator iter =
all.iterator();</span></p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:42 <a href="http://www.blogjava.net/kissyan4916/articles/254950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Criteria查询表达式</title><link>http://www.blogjava.net/kissyan4916/articles/254949.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:41:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254949.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254949.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254949.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C04%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span>Session session = new
Configuration().configure().buildSessionFactory().openSession();</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">简单实例说明</span><span style="color: blue;">:</span></p>
<p><span style="font-family: Wingdings; color: blue;">&#224;</span><span style="color: blue;">Equal:</span></p>
<p>public class HibernateDemo01 {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;* @param args</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;*/</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public
static void main(String[] args) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session
session = new Configuration().configure().buildSessionFactory()</span></p>
<p>&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; .openSession();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">Criteria cri = session.createCriteria(Person.class);</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cri.add(Expression.eq("name", "</span><span style="font-family: 宋体; color: red;">张三</span><span style="color: red;">"));</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List
all = cri.list();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
(all.size() &gt; 0) {</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person
per = (Person) all.get(0);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(per.getName()
+ " --&gt; " + per.getSex());</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">大于</span></p>
<p style="margin-left: 21pt; text-indent: 10.5pt;"><span>Criteria cri =
session.createCriteria(Person.class);</span></p>
<p style="margin-left: 21pt; text-indent: 10.5pt;"><span>cri.add(Expression.gt("age",
25));</span></p>
<p style="margin-left: 21pt; text-indent: 10.5pt;"><span>List all =
cri.list();</span></p>
<p style="margin-left: 21pt; text-indent: 10.5pt;"><span>Iterator iter =
all.iterator();</span></p>
<p style="margin-left: 21pt; text-indent: 10.5pt;"><span>while
(iter.hasNext()) {</span></p>
<p style="margin-left: 21pt; text-indent: 26.25pt;"><span>Person per =
(Person) iter.next() ;</span></p>
<p style="margin-left: 21pt;"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;System.out.println(per.getName() + "
--&gt; " + per.getSex() + " --&gt; "+ per.getAge());</span></p>
<p style="margin-left: 21pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">小于</span></p>
<p style="margin-left: 31.5pt;">Criteria cri = session.createCriteria(Person.class);</p>
<p style="margin-left: 31.5pt;">cri.add(Expression.lt("age", 25));</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">between</span><span style="font-family: 宋体; color: blue;">：</span></p>
<p style="margin-left: 31.5pt; text-indent: 5.25pt;"><span>Criteria cri =
session.createCriteria(Person.class);</span></p>
<p style="margin-left: 31.5pt; text-indent: 5.25pt;"><span>cri.add(Expression.between("age",
25, 35));</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="font-family: 宋体; color: blue;">模糊查询：</span></p>
<p style="text-indent: 42pt;">Criteria cri = session.createCriteria(Person.class);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cri.add(Expression.like("name","%<span style="font-family: 宋体;">三</span>%"));</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">in</span></p>
<p style="text-indent: 42pt;">Criteria cri = session.createCriteria(Person.class);</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set&lt;Integer&gt;
conds = new TreeSet&lt;Integer&gt;();</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conds.add(new
Integer(1));</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conds.add(new
Integer(2));</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cri.add(Expression.in("id",
conds));</span></p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">and</span></p>
<p><span style="color: blue;">&nbsp;</span><span>Criteria cri =
session.createCriteria(Person.class);</span></p>
<p style="text-indent: 10.5pt;">cri.add(Expression.and(Expression.eq("name", "<span style="font-family: 宋体;">张三</span><span>"),
Expression.eq("sex", "</span><span style="font-family: 宋体;">男</span>")));</p>
<p><span style="font-family: Wingdings;">&#224;</span><span style="color: blue;">Example</span><span style="font-family: 宋体; color: blue;">类</span><span style="font-family: 宋体; color: blue;">查询条件跟已知对象的条件相同</span></p>
<p><span style="color: blue;">&nbsp;</span>&nbsp;Person person = new Person() ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; person.setName("<span style="font-family: 宋体;">张三</span>") ;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; person.setSex("<span style="font-family: 宋体;">男</span>") ;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; person.setAge(20)
;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cri.add(Example.create(person));</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:41 <a href="http://www.blogjava.net/kissyan4916/articles/254949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STRUTS标签</title><link>http://www.blogjava.net/kissyan4916/articles/254948.html</link><dc:creator>金色闪电</dc:creator><author>金色闪电</author><pubDate>Mon, 16 Feb 2009 11:40:00 GMT</pubDate><guid>http://www.blogjava.net/kissyan4916/articles/254948.html</guid><wfw:comment>http://www.blogjava.net/kissyan4916/comments/254948.html</wfw:comment><comments>http://www.blogjava.net/kissyan4916/articles/254948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kissyan4916/comments/commentRss/254948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kissyan4916/services/trackbacks/254948.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C10%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p><span>&lt;html:form action="demo.do"
method="post"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">性别：</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">&lt;html:radio property="sex" value="</span><span style="font-family: 宋体; color: red;">男</span><span style="color: red;">"/&gt;</span><span style="font-family: 宋体; color: red;">男</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:radio property="sex"
value="</span><span style="font-family: 宋体; color: red;">女</span><span style="color: red;">"/&gt;</span><span style="font-family: 宋体; color: red;">女</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit
value="</span><span style="font-family: 宋体;">提交</span>"/&gt; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:reset
value="</span><span style="font-family: 宋体;">重置</span>"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span></p>
<p><span>&lt;html:form action="demo.do"
method="post"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">选择所喜欢的城市：</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">&lt;html:select property="city"&gt;</span></p>
<p><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; &lt;html:option
value="BJ"&gt;</span><span style="font-family: 宋体;">北京</span>&lt;/html:option&gt;</p>
<p><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; &lt;html:option
value="TJ"&gt;</span><span style="font-family: 宋体;">天津</span>&lt;/html:option&gt;</p>
<p><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; &lt;html:option
value="NJ"&gt;</span><span style="font-family: 宋体;">南京</span>&lt;/html:option&gt;</p>
<p><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; &lt;html:option
value="GD"&gt;</span><span style="font-family: 宋体;">广东</span>&lt;/html:option&gt;</p>
<p><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; &lt;html:option
value="DB"&gt;</span><span style="font-family: 宋体;">东北</span>&lt;/html:option&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:select&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit
value="</span><span style="font-family: 宋体;">提交</span>"/&gt; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:reset
value="</span><span style="font-family: 宋体;">重置</span>"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span></p>
<p>&nbsp;&lt;body&gt;</p>
<p>&nbsp;&lt;%</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Collection
col = new ArrayList() ;</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.add(new
org.apache.struts.util.LabelValueBean("</span><span style="font-family: 宋体;">北京</span>","BJ")) ;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.add(new
org.apache.struts.util.LabelValueBean("</span><span style="font-family: 宋体;">天津</span>","TJ")) ;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.add(new
org.apache.struts.util.LabelValueBean("</span><span style="font-family: 宋体;">南京</span>","NJ")) ;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.add(new
org.apache.struts.util.LabelValueBean("</span><span style="font-family: 宋体;">东北</span>","DB")) ;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; col.add(new
org.apache.struts.util.LabelValueBean("</span><span style="font-family: 宋体;">广东</span>","GD")) ;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //
</span><span style="font-family: 宋体;">将全部的集合放在一个属性范围之中</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pageContext.setAttribute("ht",col)
;</span></p>
<p>&nbsp;%&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;html:form action="demo.do" method="post"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">选择所喜欢的城市：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:select
property="city"&gt;</span></p>
<p>&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 style="color: red;">&lt;html:optionsCollection name="ht"/&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:select&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit
value="</span><span style="font-family: 宋体;">提交</span>"/&gt; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:reset
value="</span><span style="font-family: 宋体;">重置</span>"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;</p>
<p>&nbsp;&lt;/body&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span></p>
<p>&lt;body&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;html:form action="demo.do" method="post"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">选择所爱吃的水果：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">&lt;html:checkbox property="fruit"
value="orange"/&gt;</span></span><span style="font-family: 宋体; color: red;">橘子</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:checkbox property="fruit"
value="banana"/&gt;</span><span style="font-family: 宋体; color: red;">香蕉</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:checkbox property="fruit"
value="apple"/&gt;</span><span style="font-family: 宋体; color: red;">苹果</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:checkbox property="fruit"
value="watermelon"/&gt;</span><span style="font-family: 宋体; color: red;">西瓜</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:checkbox property="fruit"
value="cherry"/&gt;</span><span style="font-family: 宋体; color: red;">樱桃</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit
value="</span><span style="font-family: 宋体;">提交</span>"/&gt; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:reset
value="</span><span style="font-family: 宋体;">重置</span>"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;</p>
<p>&nbsp;&lt;/body&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span></p>
<p>&lt;body&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;html:form action="demo.do" method="post"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">选择所爱吃的水果：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">&lt;logic:iterate id="fru"
name="demoForm" property="fruit"&gt;</span></span></p>
<p><span style="color: red;">&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; &lt;html:multibox
property="select"&gt;${fru}&lt;/html:multibox&gt;${fru}</span></p>
<p><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/logic:iterate&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit
value="</span><span style="font-family: 宋体;">提交</span>"/&gt; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:reset
value="</span><span style="font-family: 宋体;">重置</span>"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;</p>
<p>&nbsp;&lt;/body&gt;</p>
<p><span style="font-family: Wingdings;">&#224;</span></p>
<p>&lt;body&gt;</p>
<p><span><span>&nbsp;&nbsp;&nbsp;
</span>&lt;html:form action="demo.do" method="post"&gt;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体;">个人介绍：</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:textarea
property="sex" rows="6" cols="30"/&gt;</span></span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:submit
value="</span><span style="font-family: 宋体;">提交</span>"/&gt; </p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;html:reset
value="</span><span style="font-family: 宋体;">重置</span>"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/html:form&gt;</p>
<p>&nbsp;&lt;/body&gt;</p>
<img src ="http://www.blogjava.net/kissyan4916/aggbug/254948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kissyan4916/" target="_blank">金色闪电</a> 2009-02-16 19:40 <a href="http://www.blogjava.net/kissyan4916/articles/254948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>