﻿<?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-semovy-文章分类-spring</title><link>http://www.blogjava.net/WshmAndLily/category/20697.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 31 Dec 2007 01:49:31 GMT</lastBuildDate><pubDate>Mon, 31 Dec 2007 01:49:31 GMT</pubDate><ttl>60</ttl><item><title>Quartz的cron表达式</title><link>http://www.blogjava.net/WshmAndLily/articles/171333.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 28 Dec 2007 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/171333.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/171333.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/171333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/171333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/171333.html</trackback:ping><description><![CDATA[一个cron表达式有至少6个（也可能7个）有空格分隔的时间元素。<br />
<font size="2"></font>
<h4 class="TextColor1" style="margin-bottom: 0px"><font size="2">按顺序依次为</font> </h4>
<h4 class="TextColor1" style="margin-bottom: 0px"><font size="2">秒（0~59）</font> </h4>
<div id="msgcns!FEB4FAFDF8FBDF68!105">
<p><font size="2">分钟（0~59）</font> </p>
<p><font size="2">小时（0~23）</font> </p>
<p><font size="2">天（月）（0~31，但是你需要考虑你月的天数）</font> </p>
<p><font size="2">月（0~11）</font> </p>
<p><font size="2">天（星期）（1~7 1=SUN 或 SUN，MON，TUE，WED，THU，FRI，SAT）</font> </p>
<p><font size="2">7.年份（1970－2099）<br />
<br />
<font color="#000000">其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?.</font></font> </p>
<p><font size="2">0 0 10,14,16 * * ? 每天上午10点，下午2点，4点<br />
0 0/30 9-17 * * ??? 朝九晚五工作时间内每半小时<br />
</font><font size="2">0 0 12 ? * WED 表示每个星期三中午12点</font> </p>
<p><font size="2">有些子表达式能包含一些范围或列表</font> </p>
<p><font size="2">例如：子表达式（<strong>天（星期）</strong>）可以为 &#8220;MON-FRI&#8221;，&#8220;MON，WED，FRI&#8221;，&#8220;MON-WED,SAT&#8221;</font> </p>
<p><font size="2">&#8220;*&#8221;字符代表所有可能的值</font> </p>
<p><font size="2">因此，&#8220;*&#8221;在子表达式（<strong>月</strong>）里表示每个月的含义，&#8220;*&#8221;在子表达式（<strong>天（星期）</strong>）表示星期的每一天</font> </p>
<p><font size="2"></font>?</p>
<p><font size="2">&#8220;/&#8221;字符用来指定数值的增量</font> </p>
<p><font size="2">例如：在子表达式（分钟）里的&#8220;0/15&#8221;表示从第0分钟开始，每15分钟</font> </p>
<p><font size="2">?????? ? 在子表达式（分钟）里的&#8220;3/20&#8221;表示从第3分钟开始，每20分钟（它和&#8220;3，23，43&#8221;）的含义一样</font> </p>
<p><font size="2"><br />
&#8220;？&#8221;字符仅被用于天（月）和天（星期）两个子表达式，表示不指定值</font> </p>
<p><font size="2">当2个子表达式其中之一被指定了值以后，为了避免冲突，需要将另一个子表达式的值设为&#8220;？&#8221;</font> </p>
<p><font size="2"></font>?</p>
<p><font size="2">&#8220;L&#8221; 字符仅被用于天（月）和天（星期）两个子表达式，它是单词&#8220;last&#8221;的缩写</font> </p>
<p><font size="2">但是它在两个子表达式里的含义是不同的。</font> </p>
<p><font size="2">在天（月）子表达式中，&#8220;L&#8221;表示一个月的最后一天</font> </p>
<p><font size="2">在天（星期）自表达式中，&#8220;L&#8221;表示一个星期的最后一天，也就是SAT</font> </p>
<p><font size="2">如果在&#8220;L&#8221;前有具体的内容，它就具有其他的含义了</font> </p>
<p><font size="2">例如：&#8220;6L&#8221;表示这个月的倒数第６天，&#8220;ＦＲＩＬ&#8221;表示这个月的最一个星期五</font> </p>
<p><font size="2">注意：在使用&#8220;L&#8221;参数时，不要指定列表或范围，因为这会导致问题</font> </p>
</div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/171333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-12-28 22:07 <a href="http://www.blogjava.net/WshmAndLily/articles/171333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz 在Spring中动态设置cronExpression</title><link>http://www.blogjava.net/WshmAndLily/articles/145634.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 16 Sep 2007 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/145634.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/145634.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/145634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/145634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/145634.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 什么是动态定时任务：是由客户制定生成的，服务端只知道该去执行什么任务，但任务的定时是不确定的（是由客户制定）。 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧，即便允许客户修改配置文件，但总需要重新启动web服务啊，研究了下Quartz在Spring中的动态定时，发现&lt;bean id="cronTrigger" class="org.springframework.sc...&nbsp;&nbsp;<a href='http://www.blogjava.net/WshmAndLily/articles/145634.html'>阅读全文</a><img src ="http://www.blogjava.net/WshmAndLily/aggbug/145634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-16 21:36 <a href="http://www.blogjava.net/WshmAndLily/articles/145634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open Session In View</title><link>http://www.blogjava.net/WshmAndLily/articles/143817.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sun, 09 Sep 2007 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143817.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143817.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143817.html</trackback:ping><description><![CDATA[<font size="2"><font color="#4b4b4b"><font face="宋体">在没有使用</font><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">Spring</span></font></font><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">提供的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">Open Session In View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">情况下，因需要在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">service(or Dao)</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">层里把</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">关闭，所以</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">lazy loading </span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">为</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">true</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">的话，要在应用层内把关系集合都初始化，如</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana"> company.getEmployees()</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">，否则</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">Hibernate</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">抛</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">session already closed Exception;</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">&nbsp;&nbsp;&nbsp; Open Session In View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">提供了一种简便的方法，较好地解决了</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">lazy loading</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">问题</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">.</span>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体"><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">&nbsp;&nbsp;&nbsp; </span>它有两种配置方式<font face="Verdana">OpenSessionInViewInterceptor</font></span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">和<span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">OpenSessionInViewFilter(具体参看<a title="SpringSide" href="http://www.springside.org.cn/" target="_blank"><font color="#999999">SpringSide</font></a>)</span></span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">，功能相同，只是一个在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">web.xml</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">配置，另一个在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">application.xml</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">配置而已。</span></p>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">&nbsp;&nbsp;&nbsp; Open Session In View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">request</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">把</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">绑定到当前</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">thread</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">期间一直保持</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">hibernate session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">open</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">状态，使</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">request</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">的整个期间都可以使用，如在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">层里</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">PO</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">也可以</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">lazy loading</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">数据，如</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana"> ${ company.employees }</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">。当</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">View </span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">层逻辑完成后，才会通过</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">Filter</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">doFilter</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">方法或</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">Interceptor</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">postHandle</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">方法自动关闭</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体">。</span>&nbsp;</p>
<p><strong>OpenSessionInViewInterceptor配置</strong></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="openSessionInViewInterceptor"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="urlMapping"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptors"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="openSessionInViewInterceptor"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="mappings"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;...<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
</div>
<p><strong>OpenSessionInViewFilter配置</strong></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;...&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">hibernateFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;singleSession默认为true,若设为false则等于没用OpenSessionInView&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">singleSession</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;...&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">hibernateFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.do</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;...&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
</div>
<p>很多人在使用OpenSessionInView过程中提及一个错误：</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">org.springframework.dao.InvalidDataAccessApiUsageException:&nbsp;Write&nbsp;operations&nbsp;are&nbsp;not&nbsp;allowed&nbsp;in&nbsp;read-only&nbsp;mode&nbsp;(FlushMode.NEVER)&nbsp;-&nbsp;turn&nbsp;your&nbsp;Session&nbsp;into&nbsp;FlushMode.AUTO&nbsp;or&nbsp;remove&nbsp;'readOnly'&nbsp;marker&nbsp;from&nbsp;transaction&nbsp;definition&nbsp;</span></div>
</div>
<strong></strong>
<p>看看OpenSessionInViewFilter里的opensession方法</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img id="_103_235_Open_Image" onclick="this.style.display='none'; document.getElementById('_103_235_Open_Text').style.display='none'; document.getElementById('_103_235_Closed_Image').style.display='inline'; document.getElementById('_103_235_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="_103_235_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('_103_235_Closed_Text').style.display='none'; document.getElementById('_103_235_Open_Image').style.display='inline'; document.getElementById('_103_235_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Session&nbsp;openSession(SessionFactory&nbsp;sessionFactory)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;DataAccessResourceFailureException&nbsp;</span><span id="_103_235_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">...</span><span id="_103_235_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SessionFactoryUtils.getSession(sessionFactory,&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;session.setFlushMode(FlushMode.NEVER);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;session;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
</div>
<p>&nbsp;&nbsp;&nbsp; 可以看到OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager，使request的整个过程都使用同一个session，在请求过后再接除该sessionFactory的绑定，最后<span class="me1">closeSessionIfNecessary</span>根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中，若HibernateTemplate 发现自当前session有不是readOnly的transaction，就会获取到FlushMode.AUTO Session，使方法拥有写权限。</p>
<p>&nbsp;&nbsp;&nbsp; 也即是，如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限，如果没有transaction，并且没有另外人为地设flush model的话，则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限，没受保护的则没有。</p>
<p><strong>采用spring的事务声明,使方法受transaction控制</strong></p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="baseTransaction"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abstract</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="proxyTargetClass"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionAttributes"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="get*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="find*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="load*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="save*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="add*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="update*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="remove*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="userService"</span><span style="color: #ff0000">&nbsp;parent</span><span style="color: #0000ff">="baseTransaction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="target"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="com.phopesoft.security.service.impl.UserServiceImpl"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
</div>
<p>对于上例，则以save,add,update,remove开头的方法拥有可写的事务，如果当前有某个方法，如命名为importExcel()，则因没有transaction而没有写权限，这时若方法内有insert,update,delete操作的话，则需要手动设置flush model为Flush.AUTO,如</p>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">session.setFlushMode(FlushMode.AUTO);&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />session.save(user);&nbsp;&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />session.flush();&nbsp;</span></div>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;尽管Open Session In View看起来还不错，其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码，这个方法实际上是被父类的doFilter调用的，因此，我们可以大约了解的OpenSessionInViewFilter调用流程: request(请求)-&gt;open session并开始transaction-&gt;controller-&gt;View(Jsp)-&gt;结束transaction并close session.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 一切看起来很正确，尤其是在本地开发测试的时候没出现问题，但试想下如果流程中的某一步被阻塞的话，那在这期间connection就一直被占用而不释放。最有可能被阻塞的就是在写Jsp这步，一方面可能是页面内容大，response.write的时间长，另一方面可能是网速慢，服务器与用户间传输时间久。当大量这样的情况出现时，就有连接池连接不足，造成页面假死现象。</p>
<p>Open Session In View是个双刃剑，放在公网上内容多流量大的网站请慎用。</p>
<p>&nbsp;</p>
<p><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/dreamstone/archive/2007/07/29/133074.html"><font color="#002c99">hibernate open session in view 抛出异常解决方法</font></a> </p>
<p>&nbsp;在使用open-session-in-view的时候，如果使用不当，有可能抛出两种异常<br />
1，NonUniqueObjectException<br />
2，在配合spring使用的时候会可能会抛出org.<span class="me1">springframework</span>.<span class="me1">dao</span>.<span class="me1">InvalidDataAccessApiUsageException<br />
<br />
先说1，这个异常的抛出原因和解决办法见这里：<br />
<font color="#002c99">javaeye</font>上有了很好的事例:<a href="http://www.javaeye.com/topic/11581"><font color="#002c99">http://www.javaeye.com/topic/11581</font><font color="#000000"> </font></a><br />
解决办法可以用merge，也可以别的办法。<br />
出现的原因，可以参考一下我前边的文章中将merge和update的区别的内容。<br />
<a href="http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html"><font color="#002c99">http://www.blogjava.net/dreamstone/archive/2007/07/29/133071.html</font></a><br />
<br />
2的解决办法：在这里<br />
springside的一篇文章做了详细说明<br />
<a href="http://calvin.blog.javascud.org/post/46.htm"><font color="#002c99">http://calvin.blog.javascud.org/post/46.htm</font></a><br />
<br />
好了，现在问题解决了，但关于open-session-in-view的使用还有一些探讨，是否应该使用，使用的好处与坏处。<br />
见这两篇jdon上的文章:<br />
<a href="http://www.jdon.com/jivejdon/thread/22374.html"><font color="#002c99">http://www.jdon.com/jivejdon/thread/22374.html</font></a><br />
<a href="http://www.jdon.com/jivejdon/thread/28955.html"><font color="#002c99">http://www.jdon.com/jivejdon/thread/28955.html</font></a><br />
</span></p>
 <img src ="http://www.blogjava.net/WshmAndLily/aggbug/143817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-09 18:15 <a href="http://www.blogjava.net/WshmAndLily/articles/143817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 与 Hibernate 的延迟加载和 Dao 模式</title><link>http://www.blogjava.net/WshmAndLily/articles/143690.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Sat, 08 Sep 2007 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143690.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143690.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143690.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Hibernate 与延迟加载： Hibernate 对象关系映射提供延迟的与非延迟的对象初始化。非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来。这有时会导致成百的（如果不是成千的话） select 语句在读取对象的时候执行。这个问题有时出现在使用双向关系的时候，经常会导致整个数据库都在初始化的阶段被读出来了。当然，你可以不厌其烦地检查每一个对象与其他对象的关系...&nbsp;&nbsp;<a href='http://www.blogjava.net/WshmAndLily/articles/143690.html'>阅读全文</a><img src ="http://www.blogjava.net/WshmAndLily/aggbug/143690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-08 22:49 <a href="http://www.blogjava.net/WshmAndLily/articles/143690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于spring中的aop的解释</title><link>http://www.blogjava.net/WshmAndLily/articles/143446.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 07 Sep 2007 07:58:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/143446.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/143446.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/143446.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/143446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/143446.html</trackback:ping><description><![CDATA[<p><font face="Arial">AOP是OOP的延续，是Aspect&nbsp;&nbsp; Oriented&nbsp;&nbsp; Programming的缩写，意思是面向方面编程。AOP实际是GoF设计模式的延续，设计模式孜孜不倦追求的是调用者和被调用者之间的解耦，AOP可以说也是这种目标的一种实现。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 　举例：假设有在一个应用系统中，有一个共享的数据必须被并发同时访问，首先，将这个数据封装在数据对象中，称为Data&nbsp;&nbsp; Class，同时，将有多个访问类，专门用于在同一时刻访问这同一个数据对象。<br />
　　为了完成上述并发访问同一资源的功能，需要引入锁Lock的概念，也就是说，某个时刻，当有一个访问类访问这个数据对象时，这个数据对象必须上锁Locked，用完后就立即解锁unLocked，再供其它访问类访问。<br />
　　使用传统的编程习惯，我们会创建一个抽象类，所有的访问类继承这个抽象父类，如下：<br />
abstract&nbsp;&nbsp; class&nbsp;&nbsp; Worker{<br />
　　abstract&nbsp;&nbsp; void&nbsp;&nbsp; locked();<br />
　　abstract&nbsp;&nbsp; void&nbsp;&nbsp; accessDataObject();<br />
　　abstract&nbsp;&nbsp; void&nbsp;&nbsp; unlocked();<br />
}<br />
<br />
　缺点：</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; accessDataObject()方法需要有&#8220;锁&#8221;状态之类的相关代码。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; Java只提供了单继承，因此具体访问类只能继承这个父类，如果具体访问类还要继承其它父类，比如另外一个如Worker的父类，将无法方便实现。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; 重用被打折扣，具体访问类因为也包含&#8220;锁&#8221;状态之类的相关代码，只能被重用在相关有&#8220;锁&#8221;的场合，重用范围很窄。</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仔细研究这个应用的&#8220;锁&#8221;，它其实有下列特性：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; &#8220;锁&#8221;功能不是具体访问类的首要或主要功能，访问类主要功能是访问数据对象，例如读取数据或更改动作。&nbsp;&nbsp;</font></p>
<p><font face="Arial">&#8220;锁&#8221;行为其实是和具体访问类的主要功能可以独立、区分开来的</font></p>
<p><font face="Arial">&#8220;锁&#8221;功能其实是这个系统的一个纵向切面，涉及许多类、许多类的方法。&nbsp;&nbsp;</font></p>
<p><font face="Arial">　因此，一个新的程序结构应该是关注系统的纵向切面，例如这个应用的&#8220;锁&#8221;功能，这个新的程序结构就是aspect（方面）<br />
　　在这个应用中，&#8220;锁&#8221;方面（aspect）应该有以下职责：<br />
　　提供一些必备的功能，对被访问对象实现加锁或解锁功能。以保证所有在修改数据对象的操作之前能够调用lock()加锁，在它使用完成后，调用unlock()解锁。<br />
AOP应用范围</font></p>
<p><font face="Arial">　　很明显，AOP非常适合开发J2EE容器服务器，目前JBoss&nbsp;&nbsp; 4.0正是使用AOP框架进行开发。<br />
　　具体功能如下：<br />
Authentication&nbsp;&nbsp; 权限<br />
Caching&nbsp;&nbsp; 缓存<br />
Context&nbsp;&nbsp; passing&nbsp;&nbsp; 内容传递<br />
Error&nbsp;&nbsp; handling&nbsp;&nbsp; 错误处理<br />
Lazy&nbsp;&nbsp; loading　懒加载<br />
Debugging　　调试<br />
logging,&nbsp;&nbsp; tracing,&nbsp;&nbsp; profiling&nbsp;&nbsp; and&nbsp;&nbsp; monitoring　记录跟踪　优化　校准</font></p>
<p><font face="Arial"><br />
Performance&nbsp;&nbsp; optimization　性能优化<br />
Persistence　　持久化<br />
Resource&nbsp;&nbsp; pooling　资源池<br />
Synchronization　同步<br />
Transactions&nbsp;&nbsp; 事务<br />
AOP有必要吗？<br />
　　当然，上述应用范例在没有使用AOP情况下，也得到了解决，例如JBoss&nbsp;&nbsp; 3.XXX也提供了上述应用功能，但是没有使用AOP。<br />
　　但是，使用AOP可以让我们从一个更高的抽象概念来理解软件系统，AOP也许提供一种有价值的工具。可以这么说：因为使用AOP结构，现在JBoss&nbsp;&nbsp; 4.0的源码要比JBoss&nbsp;&nbsp; 3.X容易理解多了，这对于一个大型复杂系统来说是非常重要的。<br />
　　从另外一个方面说，好像不是所有的人都需要关心AOP，它可能是一种架构设计的选择，如果选择J2EE系统，AOP关注的上述通用方面都已经被J2EE容器实现了，J2EE应用系统开发者可能需要更多地关注行业应用方面aspect。</font></p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/143446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-09-07 15:58 <a href="http://www.blogjava.net/WshmAndLily/articles/143446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中配置二级缓存 </title><link>http://www.blogjava.net/WshmAndLily/articles/137244.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Thu, 16 Aug 2007 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/137244.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/137244.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/137244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/137244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/137244.html</trackback:ping><description><![CDATA[<p>1.首先,在spring的hibernate配置里(我的是applicationContext-hibernate.xml)&nbsp;加上如下属性:</p>
<p>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;ref bean="dataSource"/&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="mappingResources"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;list&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;org/appfteaching/model/TArticleclass.hbm.xml&lt;/value&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/list&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernateProperties"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;props&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.show_sql"&gt;${hibernate.show_sql}&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.jdbc.fetch_size"&gt;${hibernate.jdbc.fetch_size}&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.jdbc.batch_size"&gt;${hibernate.jdbc.batch_size}&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color=#ff0000>&lt;prop key="hibernate.cache.use_query_cache"&gt;true&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="hibernate.cache.provider_class"&gt;org.hibernate.cache.EhCacheProvider&lt;/prop&gt;<br></font>&nbsp;&nbsp;&nbsp;&lt;/props&gt;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;<br>&nbsp;&lt;/bean&gt;&nbsp;</p>
<p>2.其次,在src目录下的ehcache.xml中配置如下信息(如果是默认ehcache.xml则会有&lt;cache name="sampleCache1"&gt;和&lt;cache name="sampleCache2&gt;",去掉)</p>
<p>&lt;cache name="org.hibernate.cache.StandardQueryCache"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="10000"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="300"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="4200"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;!-- Sample cache named sampleCache2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This cache contains 1000 elements. Elements will always be held in memory.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; They are not expired. --&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;cache name="org.hibernate.cache.UpdateTimestampsCache"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxElementsInMemory="5000"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="0"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="0"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt; </p>
<p>3.将你要缓存的model加进ehcache.xml里</p>
<p>&lt;cache name="org.appfteaching.model.TArticleclass" <br>&nbsp;&nbsp;&nbsp; &nbsp;maxElementsInMemory="1000"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eternal="false"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToIdleSeconds="100"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeToLiveSeconds="4200"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; overflowToDisk="true"<br>&nbsp;&nbsp;&nbsp; &nbsp;/&gt;&nbsp;&nbsp; </p>
<p>4.最后一步,在TArticleclass.hbm.xml里加上</p>
<p>&lt;cache usage="read-write"/&gt;</p>
<p>启动Tomcat,如发现如下错误</p>
<p>Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.<br>Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.</p>
<p>则是第二步没有做,加上即可.配置完毕</p>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/137244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-16 14:12 <a href="http://www.blogjava.net/WshmAndLily/articles/137244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ApplicationContext</title><link>http://www.blogjava.net/WshmAndLily/articles/136979.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Wed, 15 Aug 2007 09:15:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/136979.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/136979.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/136979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/136979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/136979.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spring为ApplicationContext提供的3种实现分别为：ClassPathXmlApplicationContext，FileSystemXmlApplicationContext和XmlWebApplicationContext，其中XmlWebApplicationContext是专为Web工程定制的。使用举例如下：<br>&nbsp;&nbsp;<strong> 1. FileSystemXmlApplicationContext</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1. ApplicationContext ctx = new FileSystemXmlApplicationContext("bean.xml"); //加载单个配置文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg2. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new FileSystemXmlApplicationContext(locations ); //加载多<font color=#333333>个配置文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="TEXT-INDENT: 31.5pt" align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx =new FileSystemXmlApplicationContext("D:/project/bean.xml");//根据具体路径加载文件<br>&nbsp;&nbsp;<strong>2. ClassPathXmlApplicationContext</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1.&nbsp;&nbsp;<span>ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg2. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new ClassPathXmlApplication(locations);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：其中FileSystemXmlApplicationContext和ClassPathXmlApplicationContext与BeanFactory的xml文件定位方式一样是基于路径的。<br><strong>3. XmlWebApplicationContext</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eg1. ServletContext servletContext = request.getSession().getServletContext();&nbsp;&nbsp;&nbsp;&nbsp;<br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = Web<span>ApplicationContextUtils.getWeb<span>ApplicationContext(servletContext);<br><br><br><br></span></span></span></span></div>
<div style="TEXT-INDENT: 31.5pt" align=left><span><span><span><span></span></span></span></span></div>
<div style="TEXT-INDENT: 31.5pt" align=left><span><span><span><span>注 : 一般是 ApplicationContext ctx = Web<span>ApplicationContextUtils.getWeb<span>ApplicationContext(this.getServletContext());</span></span></span></span></span></span></div>
<br><br>&nbsp;加载器目前有两种选择：ContextLoaderListener和ContextLoaderServlet。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两者在功能上完全等同，只是一个是基于Servlet2.3版本中新引入的Listener接口实现，而另一个基于Servlet接口实现。开发中可根据目标Web容器的实际情况进行选择。 <br><br>
<table width=672 border=0>
    <tbody>
        <tr>
            <td width=388><font color=#333333>配置非常简单，在web.xml中增加： <br>&lt;listener&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.web.context.ContextLoaderListener<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/listener-class&gt; <br>&lt;/listener&gt; <br>或： <br>&lt;servlet&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;context&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.springframework.web.context.ContextLoaderServlet <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-class&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br>&lt;/servlet&gt; </font></td>
            <td width=274></td>
        </tr>
    </tbody>
</table>
<font color=#333333>
<p><br>通过以上配置，Web容器会自动加载/WEB-INF/applicationContext.xml初始化 <br>ApplicationContext实例，如果需要指定配置文件位置，可通过context-param加以指定： <br>&lt;context-param&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/myApplicationContext.xml&lt;/param-value&gt; <br>&lt;/context-param&gt; <br><br>配置完成之后，即可通过 <br>WebApplicationContextUtils.getWebApplicationContext方法在Web应用中获取ApplicationContext引用。 <br><br>如：ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LoginAction action=(LoginAction)ctx.getBean("action");</p>
</font></font>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/136979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-08-15 17:15 <a href="http://www.blogjava.net/WshmAndLily/articles/136979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring mail发送</title><link>http://www.blogjava.net/WshmAndLily/articles/116822.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 11 May 2007 09:58:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/116822.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/116822.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/116822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/116822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/116822.html</trackback:ping><description><![CDATA[<p>package com.action;</p>
<p>import java.util.ArrayList;<br>import java.util.Date;<br>import java.util.Iterator;<br>import java.util.List;</p>
<p>import javax.activation.DataHandler;<br>import javax.activation.FileDataSource;<br>import javax.mail.Message;<br>import javax.mail.MessagingException;<br>import javax.mail.Multipart;<br>import javax.mail.internet.InternetAddress;<br>import javax.mail.internet.MimeBodyPart;<br>import javax.mail.internet.MimeMessage;<br>import javax.mail.internet.MimeMultipart;</p>
<p>import org.springframework.context.ApplicationContext;<br>import org.springframework.context.support.FileSystemXmlApplicationContext;<br>import org.springframework.mail.SimpleMailMessage;<br>import org.springframework.mail.javamail.JavaMailSender;<br>import org.springframework.mail.javamail.MimeMessagePreparator;</p>
<p>&nbsp;</p>
<p>public class SpringMail {<br>&nbsp;public static void main(String[] args) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ApplicationContext ctx = new FileSystemXmlApplicationContext(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "applicationContext.xml");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JavaMailSender sender = (JavaMailSender) ctx.getBean("mailSender");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SpringMail springMail = new SpringMail();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //测试发送只有文本信息的简单测试<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; springMail.sendTextMail(sender);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //测试发送带附件的邮件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; springMail.sendMimeMessage(sender);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /** *//**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 测试发送只有文本信息的简单测试<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param sender 邮件发送器<br>&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void sendTextMail(JavaMailSender sender) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleMailMessage mail = new SimpleMailMessage();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setTo("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#112;&#101;&#114;&#109;&#97;&#110;&#95;&#119;&#115;&#104;&#109;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">superman_wshm@126.com</a>");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setFrom("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#112;&#101;&#114;&#109;&#97;&#110;&#95;&#119;&#115;&#104;&#109;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">superman_wshm@126.com</a>");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setSubject("test by amigo");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mail.setText("spring Mail的简单测试");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.send(mail);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("成功发送文本文件！");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /** *//**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 发送带附件的邮件<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param sender 邮件发送器 <br>&nbsp;&nbsp;&nbsp;&nbsp; * @throws Exception<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void sendMimeMessage(final JavaMailSender sender) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //附件文件集合<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final List files = new ArrayList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MimeMessagePreparator mimeMail = new MimeMessagePreparator() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void prepare(MimeMessage mimeMessage) throws MessagingException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mimeMessage.setRecipient(Message.RecipientType.TO, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new InternetAddress("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#112;&#101;&#114;&#109;&#97;&#110;&#95;&#119;&#115;&#104;&#109;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">superman_wshm@126.com</a>"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mimeMessage.setFrom(new InternetAddress("<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#112;&#101;&#114;&#109;&#97;&#110;&#95;&#119;&#115;&#104;&#109;&#64;&#49;&#50;&#54;&#46;&#99;&#111;&#109;">superman_wshm@126.com</a>"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mimeMessage.setSubject("Spring发送带附件的邮件", "gb2312"); <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; Multipart mp = new MimeMultipart();<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; //向Multipart添加正文</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MimeBodyPart content = new MimeBodyPart();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; content.setText("内含spring邮件发送的例子，请查收!");<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; //向MimeMessage添加（Multipart代表正文）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mp.addBodyPart(content);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files.add("com/action/SpringMail.java");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files.add("applicationContext.xml");<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; //向Multipart添加附件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator it = files.iterator();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(it.hasNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MimeBodyPart attachFile = new MimeBodyPart();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String filename = it.next().toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileDataSource fds = new FileDataSource(filename);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachFile.setDataHandler(new DataHandler(fds));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attachFile.setFileName(fds.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mp.addBodyPart(attachFile);<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; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files.clear();<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; //向Multipart添加MimeMessage<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mimeMessage.setContent(mp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mimeMessage.setSentDate(new Date());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //发送带附件的邮件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sender.send(mimeMail);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("成功发送带附件邮件!");<br>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p><br>Spring配置文件applicationContext.xml<br><br>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</p>
<p>&lt;beans&gt;<br>&nbsp;&lt;bean id="mailSender"<br>&nbsp;&nbsp;class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt;<br>&nbsp;&nbsp;&lt;property name="host"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;smtp.126.com&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="javaMailProperties"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;props&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="mail.smtp.auth"&gt;true&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="mail.smtp.timeout"&gt;25000&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="username"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;superman_wshm&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="password"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;******&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&lt;/bean&gt;</p>
<p><br>&lt;/beans&gt;<br><br><br>&nbsp;刚才发现一bug，当附件名为中文时，会出现中文乱码问题，对sendMimeMessage方法进行了部分修改，如下：<br>&nbsp;&nbsp;&nbsp; </p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">sun.misc.BASE64Encoder&nbsp;enc&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;sun.misc.BASE64Encoder();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/SpringMail.java</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/applicationContext.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files.add(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src/谢星星.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">向Multipart添加附件</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&nbsp;it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;files.iterator();<br><img id=Codehighlighter1_342_772_Open_Image onclick="this.style.display='none'; Codehighlighter1_342_772_Open_Text.style.display='none'; Codehighlighter1_342_772_Closed_Image.style.display='inline'; Codehighlighter1_342_772_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_342_772_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_342_772_Closed_Text.style.display='none'; Codehighlighter1_342_772_Open_Image.style.display='inline'; Codehighlighter1_342_772_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while </span><span style="COLOR: #000000">(it.hasNext())&nbsp;</span><span id=Codehighlighter1_342_772_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_342_772_Open_Text><span style="COLOR: #000000">{<br><img 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;MimeBodyPart&nbsp;attachFile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MimeBodyPart();<br><img 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;String&nbsp;filename&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;it.next().toString();<br><img 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;FileDataSource&nbsp;fds&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;FileDataSource(filename);<br><img 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;attachFile.setDataHandler(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;DataHandler(fds));<br><img 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;attachFile.setFileName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">=?GBK?B?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">enc.encode(fds.getName().getBytes())</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><img 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;mp.addBodyPart(attachFile);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/116822.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-05-11 17:58 <a href="http://www.blogjava.net/WshmAndLily/articles/116822.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC</title><link>http://www.blogjava.net/WshmAndLily/articles/104190.html</link><dc:creator>semovy</dc:creator><author>semovy</author><pubDate>Fri, 16 Mar 2007 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/WshmAndLily/articles/104190.html</guid><wfw:comment>http://www.blogjava.net/WshmAndLily/comments/104190.html</wfw:comment><comments>http://www.blogjava.net/WshmAndLily/articles/104190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/WshmAndLily/comments/commentRss/104190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/WshmAndLily/services/trackbacks/104190.html</trackback:ping><description><![CDATA[
		<h2>1.总体设计</h2>
		<p>      MVC框架如Struts、Webwork，都在Servlet的基础上创建了一个自己的绝对空间，在自己的空间里定义MVC世界和规则。无论这个世界定义得是否漂亮，程序员都有一个学习世界的过程。</p>
		<p>      而Spring MVC则完全保留着Servlet概念中的request，response和session，并没有强制建立一个自己的概念模型（当然，他也有很烂的SimpleFormController，但你完全可以把它踢在一旁不管），也不强制需要FormBean和一堆XML定义。</p>
		<p>      同时，它透明完成了与Spring的集成，Multi-action的派发，提供了绑定request数据用的binder等基本API。</p>
		<p>      所以，如果想简单，使用Spring MVC的原始形态是一个很好的，类似于RoR中ActionPack的方案。</p>
		<p>      推荐使用一个Controller响应一组相关动作的MultiActionController。同时，虽然一点不喜欢FormController定义的概念模型，但还是不影响发挥拿来主义，在共性比较明显后台管理模块，定义MultiActionFormController，自动完成某些共同的Form流程。</p>
		<p>      你还是很喜欢WebWork?好在我们也提供了sample，见<a href="http://www.springside.org.cn/docs/reference/WebWork.htm">2.4 WebWork</a> 。</p>
		<h2>2.写给在用其他MVC框架程序员的快速入门</h2>
		<p>      也许，所有程序员都先放下自己框架里的概念模型，还原回一个JSP/Servlet程序员的角度，思考一个JSP/Servlet框架需要的功能。</p>
		<p>     <strong>0. 配置文件</strong></p>
		<p>
				<strong>         </strong>Spring的配置文件默认为WEB-INF/xxxx-servelet.xml。</p>
		<p>         其中xxx为web.xml中org.springframework.web.servlet.DispatcherServlet的servlet-name。</p>
		<p>     <strong>1. 与Spring集成及IOC</strong></p>
		<p>          天然兮，由DispatcherServlet完成。</p>
		<p>      <strong>2. Action及Multi-Action 分发</strong></p>
		<p>          Spring将按照配置文件定义的URL，Mapping到具体Controller类，再根据URL里的action= xxx或其他参数，利用反射调用Controller里对应的Action方法。</p>
		<p>      <strong>3. 输入数据绑定</strong></p>
		<p>          Spring提供<a href="http://www.springside.org.cn/docs/reference/BindAndValiator.htm">Binder</a> 通过名字的一一对应反射绑定Pojo，也可以直接从request.getParameter()取数据。</p>
		<p>          如果没有另外加入框架封装，需要手工调用Binder.</p>
		<p>      <strong>4. 输入数据验证</strong></p>
		<p>          Sping 提供了<a href="http://www.springside.org.cn/docs/reference/BindAndValiator.htm">Validator</a>接口，而Spring Module还整合了<a href="http://www.springside.org.cn/docs/reference/Commons-Validator.htm">Commons-Validaor</a> 。</p>
		<p>      <strong>5. 结果数据放回View</strong></p>
		<p>          有个ModelAndView的概念，代表了返回的View名及数据(Model，一个Map)。可以用modelAndView.addObject()放入数据。当然，也可以直接request.setAttribute()。</p>
		<p>      <strong>6. Interceptor</strong></p>
		<p>          AOP概念，其实Servlet里面早有Filter概念，不过Inteceptor可以更灵活的Mapping，另提供postHandle的插入点</p>
		<p>          preHandle() handler开工之前。<br />          postHandle() hander开工之后，但DispatchServlet还没有渲染页面。<br />          afterCompletion() 一切完工之后。<br />        </p>
		<p>      <strong>7. Redirect，Forward页面及Token防止重复提交。</strong></p>
		<p>          Spring提供 "redirect:index.jsp", "forward:index.jsp"这样的简写。</p>
		<p>          Spring Simple Form提供了防止重复提交的机制。</p>
		<p>      <strong>8. 如果想直接编写Response返回字符串, 而不是返回一个View</strong></p>
		<p>          将函数的返回类型设为void，使用ss封装的 rendText(response,String text)函数。</p>
		<h2>3.Spring MVC Multi-action</h2>
		<h3>3.1 基本配置</h3>
		<pre>   &lt;bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"&gt;<br />        &lt;property name="paramName"&gt;<br />            &lt;value&gt;method&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="defaultMethodName"&gt;<br />            &lt;value&gt;index&lt;/value&gt;      
      &lt;/property&gt; 
&lt;/bean&gt;</pre>
		<p>以上配置将按xxx.do?method= list 将调用controller的list()方法</p>
		<p>不过还要争取早日改为Web2.0式的写法./book/list.htm 要优于/book.do?action= list。</p>
		<p>其余配置和其他Spring MVC配置差不多，请看bookstore-servlet.xml，留意下面几个关键节点<br />&lt;bean id="exceptionResolver"&gt;<br />&lt;bean id="methodNameResolver"&gt;<br />&lt;bean id="viewResolver"&gt;<br />&lt;bean id="urlMapping"&gt;(留意最新的urlMapping简写语法.) </p>
		<h2>4.SpringSide BaseController</h2>
		<p>   继承于Spring的MultiActionController, 对其作了少量扩展--主要是对数据绑定的扩展，还加了一个SaveMessage函数。</p>
		<p>   <strong>1.对数据绑定的扩展：</strong></p>
		<p>   a.InitBinder() 初始化Binder，注册日期类并允许数字类为空。</p>
		<p>   b.对Bind and Validate函数的再包装<br />   本来Spring已有bind函数完成bind and validate, 但这个函数一来没有使用BindException作返回值而是抛出一个ServletException只好自己另外实现一个bindObject()函数。</p>
		<p>   c.另外稍稍扩展了一些函数使其更好用。</p>
		<p>
				<strong>2.SaveMessage():</strong>
		</p>
		<p>如果是redirect的关系，message信息放在request.attribute()就会丢失，SaveMessage()将其放在session。<br /> 配合messageFilter，在渲染页面前，把它从session又移回request。 <br /></p>
		<h2>5.后台管理通用的BaseManageController</h2>
		<p>  Spring MVC中的SimpleFormController中的交互机制有值得参考的部分，但其只有一个onSubmit函数不能很好的表达CRUD的语义，所以将两者结合成Multi-ActionFormController是比较好的方法。通过约定命名，在基类实现list()，create()等函数和默认流程，而在子类实现onList(),onCreate()函数。</p>
		<p>   目前只是初步结合两者，还有很大的改进空间。</p>
		<p>   参考了RoR中的命名。BaseManageController即按照此命名定义基类。</p>
		<ol>
				<li>
						<div>
								<font style="BACKGROUND-COLOR: #ffffff" color="#333333">list 显示对象列表的页面</font>
						</div>
				</li>
				<li>
						<div>create新增对象的输入界面</div>
				</li>
				<li>
						<div>edit 修改对象的输入界面</div>
				</li>
				<li>
						<div>show 只读显示对象detai的页面</div>
				</li>
				<li>
						<div>save 新增对象的保存</div>
				</li>
				<li>
						<div>update 修改对象的保存</div>
				</li>
				<li>
						<div>remove 删除单个对象</div>
				</li>
				<li>
						<div>removeAll 批量删除对象</div>
				</li>
				<li>
						<div>query 查询</div>
				</li>
		</ol>
<img src ="http://www.blogjava.net/WshmAndLily/aggbug/104190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/WshmAndLily/" target="_blank">semovy</a> 2007-03-16 11:50 <a href="http://www.blogjava.net/WshmAndLily/articles/104190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>