﻿<?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-菜园子</title><link>http://www.blogjava.net/ghostzhang/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 09 May 2026 12:06:21 GMT</lastBuildDate><pubDate>Sat, 09 May 2026 12:06:21 GMT</pubDate><ttl>60</ttl><item><title>关于Hibernate的查询从数据库映射到JavaBean</title><link>http://www.blogjava.net/ghostzhang/archive/2014/08/27/417408.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Wed, 27 Aug 2014 07:08:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2014/08/27/417408.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/417408.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2014/08/27/417408.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/417408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/417408.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于Hibernate的查询从数据库映射到JavaBean&nbsp;&nbsp;Hibernate除了HQL外，还支持SQL的查询，API为createSQLQuery(sql)，如果数据库使用的是Oracle，由于数据库表中的列都是大写，所以在从resultset到javabean的时候，需要完全匹配。一般我们会用DTO或者作为DTO的Entity，无论是采用add...&nbsp;&nbsp;<a href='http://www.blogjava.net/ghostzhang/archive/2014/08/27/417408.html'>阅读全文</a><img src ="http://www.blogjava.net/ghostzhang/aggbug/417408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2014-08-27 15:08 <a href="http://www.blogjava.net/ghostzhang/archive/2014/08/27/417408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决</title><link>http://www.blogjava.net/ghostzhang/archive/2011/12/13/366245.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Tue, 13 Dec 2011 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2011/12/13/366245.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/366245.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2011/12/13/366245.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/366245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/366245.html</trackback:ping><description><![CDATA[<div style="text-align: center; "><div><div><p style="margin-bottom: 0pt; margin-top: 0pt; "></p><div><div></div><div><div><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-weight: bold; font-size: 14pt; font-family: 新宋体; ">升级</span><span style="mso-spacerun:'yes'; font-weight:bold; font-size:14.0000pt; font-family:'新宋体'; ">Spring3.1RC2&nbsp;和Hibernate4.0.0CR7遇到的一些问题及解决</span></p><p style="margin-bottom: 0pt; margin-top: 0pt; "></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:12.0000pt; font-family:'新宋体'; ">Spring3.1RC2支持</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">1.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Quartz2</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">2.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Hibernate4，</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">3.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">New&nbsp;HandlerMethod-based&nbsp;Support&nbsp;Classes&nbsp;For&nbsp;Annotated&nbsp;Controller&nbsp;Processing</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">4.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Consumes&nbsp;and&nbsp;Produces&nbsp;@RequestMapping&nbsp;Conditions</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">5.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Working&nbsp;With&nbsp;URI&nbsp;Template&nbsp;Variables&nbsp;In&nbsp;Controller&nbsp;Methods</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">6.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Validation&nbsp;For&nbsp;@RequestBody&nbsp;Method&nbsp;Arguments&nbsp;&nbsp;//and&nbsp;so&nbsp;on....</span></p><p style="text-align: left;margin-left: 21.25pt; text-indent: -21.25pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">7.&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Spring&nbsp;MVC&nbsp;3.1&nbsp;的annotation可以参看下</span><a href="http://starscream.iteye.com/blog/1098880"><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">http://starscream.iteye.com/blog/1098880</span></a>&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Hibernate&nbsp;4可以查看</span><a href="http://community.jboss.org/wiki/HibernateCoreMigrationGuide40"><span style="color: #0000ff; font-size: 10.5pt; font-family: 'Times New Roman'; ">http://community.jboss.org/wiki/HibernateCoreMigrationGuide40</span></a>&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">下面主要说一下我在升级过程中遇到的一些问题及解决办法。</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Maven的repository始终无法升级到SpringRC2，可能服务器有问题吧，目前暂时是从官方下载的整个SpringRC2的zip包。版本号是：3.1.0.RC2</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Hibernate可以从repository中升级到</span><span style="font-size: 12pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: 'Courier New'; background-position: initial initial; background-repeat: initial initial; ">4.0.0.CR7</span><span style="font-size: 12pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: 宋体; background-position: initial initial; background-repeat: initial initial; ">，新增的依赖包有jandex-1.0.3.Final.jar</span><span style="font-size: 12pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: 宋体; background-position: initial initial; background-repeat: initial initial; ">,jboss-logging-3.1.0.CR2.jar,jboss-transaction-api_1.1_spec-1.0.0.Final.jar。</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 12pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: Wingdings; background-position: initial initial; background-repeat: initial initial; ">l&nbsp;</span><span style="font-size: 12pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #ffffff; font-family: 宋体; background-position: initial initial; background-repeat: initial initial; ">Quartz升级到2.1.1，Ehcache-core升级到2.5.0</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Spring3.1取消了HibernateTemplate，因为Hibernate4的事务管理已经很好了，不用Spring再扩展了。所以以前的Dao需要改写，直接调用Hibernate&nbsp;的Session进行持久化。</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Spring的配置：</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">sessionFactory</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">从</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBea</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">n换成org.springframework.orm.hibernate4.LocalSessionFactoryBean</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Spring的配置：</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;prop&nbsp;key="hibernate.cache.provider_class"&gt;org.hibernate.cache.EhCacheProvider&lt;/prop&gt;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">改为</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;prop&nbsp;key="hibernate.cache.provider_class"&gt;net.sf.ehcache.hibernate.EhCacheProvider&lt;/prop&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">EhCacheRegionFactory使用配置：</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;prop&nbsp;key="hibernate.cache.region.factory_class"&gt;org.hibernate.cache.ehcache.EhCacheRegionFactory&lt;/prop&gt;</span></p><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">使用Hibernate所有的openSession()改为getCurrentSession()</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Spring&nbsp;的配置：Hibernate&nbsp;transactionManager从3改为4，如下：</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;bean&nbsp;id="txManager"&nbsp;class="org.springframework.orm.hibernate4.HibernateTransactionManager"&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="sessionFactory"&nbsp;ref="sessionFactory"/&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;</span></p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">Spring&nbsp;@ResponseBody输出是乱码的问题：原来使用的是：</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;bean&nbsp;class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">改为：</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;bean&nbsp;class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;property&nbsp;name&nbsp;=&nbsp;"messageConverters"&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;list&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;bean&nbsp;class&nbsp;=&nbsp;"org.springframework.http.converter.StringHttpMessageConverter"&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;property&nbsp;name&nbsp;=&nbsp;"supportedMediaTypes"&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;list&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;value&gt;text/plain;charset=UTF-8&lt;/value&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/list&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/property&gt;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/bean&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;bean&nbsp;class&nbsp;=&nbsp;"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;property&nbsp;name&nbsp;=&nbsp;"supportedMediaTypes"&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;list&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;value&gt;text/plain;charset=UTF-8&lt;/value&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;value&gt;application/json;charset=UTF-8&lt;/value&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/list&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/property&gt;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/bean&gt;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/list&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">&lt;/property&gt;&nbsp;&nbsp;</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">这样比每个Controller都加上@RequestMapping(value&nbsp;=&nbsp;"/showLeft",&nbsp;method&nbsp;=&nbsp;RequestMethod.GET)<br />&nbsp;produces&nbsp;=&nbsp;"text/plain;&nbsp;charset=utf-8"方便的多。<br /></span></p><div><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l&nbsp;</span><span style="font-size: 10.5pt; ">Blob，以前配置：</span></p></div><div><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">@TypeDefs({@TypeDef(name="clob",typeClass=ClobStringType.class),@TypeDef(name="blob",typeClass=BlobByteArrayType.class)})</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">@Lob</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">@Type(type="blob")</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">public&nbsp;byte[]&nbsp;getPic()&nbsp;{</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">return&nbsp;pic;</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">}</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">现在改为：</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">&nbsp;&nbsp;&nbsp;&nbsp;@Lob</span><span style="font-size: 10.5pt; ">	</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">public&nbsp;byte[]&nbsp;getPic()&nbsp;{</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">return&nbsp;pic;</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">	</span><span style="font-size: 10.5pt; ">}</span></p><p style="text-align: left;margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 10.5pt; ">简单很多。</span></p></div><p>&nbsp;</p><p style="text-align: left;margin-left: 21pt; text-indent: -21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; ">l 待续。。。<br /><br /></span></p></div></div><div><span style="white-space:pre"></span></div></div><p style="margin-left:21.0000pt; text-indent:-21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Wingdings'; "></span></p></div></div></div><img src ="http://www.blogjava.net/ghostzhang/aggbug/366245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2011-12-13 15:36 <a href="http://www.blogjava.net/ghostzhang/archive/2011/12/13/366245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shiro权限框架</title><link>http://www.blogjava.net/ghostzhang/archive/2011/09/16/358837.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Fri, 16 Sep 2011 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2011/09/16/358837.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/358837.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2011/09/16/358837.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/358837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/358837.html</trackback:ping><description><![CDATA[<div><div><p style="margin-bottom:0pt; margin-top:0pt; text-align:center; "><span style="mso-spacerun:'yes'; font-size:18.0000pt; font-family:'新宋体'; ">Shiro权限框架</span></p><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">开发系统中，少不了权限，目前java里的权限框架有SpringSecurity和Shiro(以前叫做jsecurity)，对于SpringSecurity：功能太过强大以至于功能比较分散，使用起来也比较复杂，跟Spring结合的比较好。对于初学Spring&nbsp;Security者来说，曲线还是较大，需要深入学习其源码和框架，配置起来也需要费比较大的力气，扩展性也不是特别强。</span></p><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">对于新秀Shiro来说，好评还是比较多的，使用起来比较简单，功能也足够强大，扩展性也较好。听说</span><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'Times New Roman'; ">连Spring的官方都不用Spring&nbsp;Security，</span><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">用的是</span><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'Times New Roman'; ">Shiro</span><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">，足见Shiro的优秀。网上找到两篇介绍：</span><a href="http://www.infoq.com/cn/articles/apache-shiro"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">http://www.infoq.com/cn/articles/apache-shiro</span></a>&nbsp;<a href="http://www.ibm.com/developerworks/cn/opensource/os-cn-shiro/"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; ">http://www.ibm.com/developerworks/cn/opensource/os-cn-shiro/</span></a><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'新宋体'; ">，官网</span><a href="http://shiro.apache.org/download.html"><span style="color: #0000ff; font-size: 10.5pt; font-family: 'Times New Roman'; ">http://shiro.apache.org/</span></a>&nbsp;<span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">，使用和配置起来还是比较简单。下面只是简单介绍下我们是如何配置和使用Shiro的（暂时只用到了Shiro的一部分，没有配置shiro.ini文件）。</span></p><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">首先是添加过滤器，在web.xml中：</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;filter&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;filter-name&gt;shiroFilter&lt;/filter-name&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;filter-class&gt;org.springframework.web.filter.DelegatingFilterProxy&lt;/filter-class&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;init-param&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;targetFilterLifecycle&lt;/param-name&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;/init-param&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;/filter&gt;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;filter-mapping&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;filter-name&gt;shiroFilter&lt;/filter-name&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&lt;/filter-mapping&gt;</span></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">权限的认证类：</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">public</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">class</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;ShiroDbRealm&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">extends</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;AuthorizingRealm&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#646464; font-size:9.0000pt; font-family:'Courier New'; ">@Inject</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">private</span>&nbsp;<span style="font-size: 9pt; font-family: 宋体; ">User</span><span style="font-size: 9pt; font-family: 'Courier New'; ">Service&nbsp;</span><span style="mso-spacerun:'yes'; color:#0000c0; font-size:9.0000pt; font-family:'宋体'; ">user</span><span style="mso-spacerun:'yes'; color:#0000c0; font-size:9.0000pt; font-family:'Courier New'; ">Service</span>&nbsp;<span style="font-size: 9pt; font-family: 宋体; ">;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">/**</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;*&nbsp;认证回调函数,登录时调用.</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;*/</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">protected</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;AuthenticationInfo&nbsp;doGetAuthenticationInfo(AuthenticationToken&nbsp;authcToken)&nbsp;<br /></span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">throws</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;AuthenticationException&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">UsernamePasswordToken&nbsp;token&nbsp;=&nbsp;(UsernamePasswordToken)&nbsp;authcToken;</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 宋体; ">User</span>&nbsp;<span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="font-size: 9pt; font-family: 'Courier New'; ">=&nbsp;</span><span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="mso-spacerun:'yes'; color:#0000c0; font-size:9.0000pt; font-family:'Courier New'; ">Service</span><span style="font-size: 9pt; font-family: 'Courier New'; ">.get</span><span style="font-size: 9pt; font-family: 宋体; ">User</span><span style="font-size: 9pt; font-family: 'Courier New'; ">ByUserId(token.getUsername());</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">if</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;(</span><span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="font-size: 9pt; font-family: 'Courier New'; ">!=&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">null</span><span style="font-size: 9pt; font-family: 'Courier New'; ">)&nbsp;{</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span>&nbsp;</p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">return</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">new</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;SimpleAuthenticationInfo(</span><span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="font-size: 9pt; font-family: 'Courier New'; ">.getUserId(),&nbsp;</span><span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="font-size: 9pt; font-family: 'Courier New'; ">.getUserId(),&nbsp;getName());</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">}&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">else</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">return</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">null</span><span style="font-size: 9pt; font-family: 'Courier New'; ">;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">/**</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;*&nbsp;授权查询回调函数,&nbsp;进行鉴权但缓存中无用户的授权信息时调用.</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#3f5fbf; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;*/</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">protected</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;AuthorizationInfo&nbsp;doGetAuthorizationInfo(PrincipalCollection&nbsp;principals)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">String&nbsp;loginName&nbsp;=&nbsp;(String)&nbsp;principals.fromRealm(getName()).iterator().next();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 宋体; ">User&nbsp;user</span><span style="font-size: 9pt; font-family: 'Courier New'; ">=&nbsp;</span><span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="mso-spacerun:'yes'; color:#0000c0; font-size:9.0000pt; font-family:'Courier New'; ">Service</span><span style="font-size: 9pt; font-family: 'Courier New'; ">.get</span><span style="font-size: 9pt; font-family: 宋体; ">User</span><span style="font-size: 9pt; font-family: 'Courier New'; ">ByUserId(loginName);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">if</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;(</span><span style="font-size: 9pt; font-family: 宋体; ">user</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;!=&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">null</span><span style="font-size: 9pt; font-family: 'Courier New'; ">)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">SimpleAuthorizationInfo&nbsp;info&nbsp;=&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">new</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;SimpleAuthorizationInfo();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">info.addStringPermission(</span><span style="mso-spacerun:'yes'; color:#2a00ff; font-size:9.0000pt; font-family:'Courier New'; ">"common-user"</span><span style="font-size: 9pt; font-family: 'Courier New'; ">);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">return</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;info;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">}&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">else</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">return</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">null</span><span style="font-size: 9pt; font-family: 'Courier New'; ">;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">	</span><span style="font-size: 9pt; font-family: 'Courier New'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">}</span></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">Spring的配置文件：</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;beans&nbsp;&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;description&gt;Shiro&nbsp;Configuration&lt;/description&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;bean&nbsp;class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;bean&nbsp;id="securityManager"&nbsp;class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;property&nbsp;name="realm"&nbsp;ref="shiroDbRealm"&nbsp;/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;/bean&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;bean&nbsp;id="shiroDbRealm"&nbsp;class="com.company.service.common.shiro.ShiroDbRealm"&nbsp;/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;id="shiroFilter"&nbsp;class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="securityManager"&nbsp;ref="securityManager"/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="loginUrl"&nbsp;value="/common/security/login"&nbsp;/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="successUrl"&nbsp;value="/common/security/welcome"&nbsp;/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="unauthorizedUrl"&nbsp;value="/common/security/unauthorized"/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="filterChainDefinitions"&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/resources/**&nbsp;=&nbsp;anon</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/manageUsers&nbsp;=&nbsp;perms[user:manage]</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;=&nbsp;authc</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/value&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;bean&nbsp;id="lifecycleBeanPostProcessor"&nbsp;class="org.apache.shiro.spring.LifecycleBeanPostProcessor"&nbsp;/&gt;</span><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"&nbsp;depends-on="lifecycleBeanPostProcessor"/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;bean&nbsp;class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;name="securityManager"&nbsp;ref="securityManager"/&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&lt;/beans&gt;</span></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">登录的Controller:</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">@Controller</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">@RequestMapping(value&nbsp;=&nbsp;"/common/security/*")</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">public&nbsp;class&nbsp;SecurityController&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;@Inject</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;UserService&nbsp;userService;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;=&nbsp;"/login")</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;login(String&nbsp;loginName,&nbsp;String&nbsp;password,<br />HttpServletResponse&nbsp;response,&nbsp;HttpServletRequest&nbsp;request)&nbsp;throws&nbsp;Exception&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;=&nbsp;userService.getUserByLogin(loginName);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;user)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setLogin(loginInfoVO.getUserId(),&nbsp;loginInfoVO.getUserId());</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"redirect:/common/security/welcome";</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"redirect:/common/path?path=showLogin";</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;void&nbsp;setLogin(String&nbsp;userId,&nbsp;String&nbsp;password)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;currentUser&nbsp;=&nbsp;SecurityUtils.getSubject();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!currentUser.isAuthenticated())&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//collect&nbsp;user&nbsp;principals&nbsp;and&nbsp;credentials&nbsp;in&nbsp;a&nbsp;gui&nbsp;specific&nbsp;manner&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//such&nbsp;as&nbsp;username/password&nbsp;html&nbsp;form,&nbsp;X509&nbsp;certificate,&nbsp;OpenID,&nbsp;etc.</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//We'll&nbsp;use&nbsp;the&nbsp;username/password&nbsp;example&nbsp;here&nbsp;since&nbsp;it&nbsp;is&nbsp;the&nbsp;most&nbsp;common.</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//(do&nbsp;you&nbsp;know&nbsp;what&nbsp;movie&nbsp;this&nbsp;is&nbsp;from?&nbsp;;)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UsernamePasswordToken&nbsp;token&nbsp;=&nbsp;new&nbsp;UsernamePasswordToken(userId,&nbsp;password);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//this&nbsp;is&nbsp;all&nbsp;you&nbsp;have&nbsp;to&nbsp;do&nbsp;to&nbsp;support&nbsp;'remember&nbsp;me'&nbsp;(no&nbsp;config&nbsp;-&nbsp;built&nbsp;in!):</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;token.setRememberMe(true);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentUser.login(token);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value="/logout")</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;@ResponseBody</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;logout(HttpServletRequest&nbsp;request){</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;subject&nbsp;=&nbsp;SecurityUtils.getSubject();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(subject&nbsp;!=&nbsp;null)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subject.logout();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.getSession().invalidate();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'新宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'新宋体'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">注册和获取当前登录用户：</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;public&nbsp;static&nbsp;final&nbsp;void&nbsp;setCurrentUser(User&nbsp;user)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;currentUser&nbsp;=&nbsp;SecurityUtils.getSubject();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;currentUser)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;currentUser.getSession();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;session)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(Constants.CURRENT_USER,&nbsp;user);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;final&nbsp;User&nbsp;getCurrentUser()&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subject&nbsp;currentUser&nbsp;=&nbsp;SecurityUtils.getSubject();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;currentUser)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;currentUser.getSession();</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;session)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;=&nbsp;(User)&nbsp;session.getAttribute(Constants.CURRENT_USER);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(null&nbsp;!=&nbsp;user){</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;user;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'宋体'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'宋体'; ">	</span><span style="font-size:9.0000pt; font-family:'宋体'; ">}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">&nbsp;&nbsp;&nbsp;&nbsp;};</span></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">需要的jar包有3个：shiro-core.jar,shiro-spring.jar,shiro-web.jar。感觉shiro用起来比SpringSecurity简单很多。</span></p></div></div><img src ="http://www.blogjava.net/ghostzhang/aggbug/358837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2011-09-16 21:36 <a href="http://www.blogjava.net/ghostzhang/archive/2011/09/16/358837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次定时任务</title><link>http://www.blogjava.net/ghostzhang/archive/2011/09/13/358528.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Tue, 13 Sep 2011 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2011/09/13/358528.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/358528.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2011/09/13/358528.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/358528.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/358528.html</trackback:ping><description><![CDATA[<div><p style="margin-bottom:0pt; margin-top:0pt; text-align:center; "></p><div><div><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 12pt; ">在我们开发的一个系统中，有定时任务，自然就想到了Quartz，由于框架采用的Spring，Quartz跟Spring的集成也非常简单，所以就把Quartz配置到框架中，当系统启动后，定时任务也就自动启动。在开发的过程中一直没有发现问题，但是最后上线的时候，采用的是weblogic&nbsp;cluster，启动了4个节点，发现有的定时任务执行了不止一次，才恍然大悟，4个节点启动了4个应用，也就启动了4个定时任务，所以在同一个时间定时任务执行了不止一次。去网上搜索，发现Quartz也支持cluster，但是我觉得就我们的系统而言，没有必要采用cluster的定时任务，也许是比较懒吧，就想让定时任务只执行一次。在网上搜到了robbin的一篇文章(</span><a href="http://robbin.iteye.com/blog/40989"><span style="color: #0000ff; font-size: 10.5pt; font-family: 'Times New Roman'; ">http://robbin.iteye.com/blog/40989</span></a>&nbsp;<span style="font-size: 12pt; ">)，发现把quartz集中到webapp当中还是有一定的风险，同时同一个时间点执行也不止一次。Robbin的解决办法就是</span><span style="mso-spacerun:'yes'; font-size:12.0000pt; font-family:'Times New Roman'; ">自己单独启动一个Job&nbsp;Server，来quartz跑job，不要部署在web容器中。&nbsp;</span></p><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 12pt; ">我也比较同意这个办法。鉴于时间比较紧，就想有没有比较方便的方法。其实把原来的webapp当做一个quartz的容器就可以了。可以自己写一个线程来跑应用，再写一个command启动这个线程就可以了。线程类很简单，如下：</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">public</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">class</span>&nbsp;<span style="font-size: 9pt; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: #c0c0c0; font-family: 'Courier New'; background-position: initial initial; background-repeat: initial initial; ">StartServer</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">public</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">static</span>&nbsp;<span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">void</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">throws</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;Exception&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassPathXmlApplicationContext&nbsp;</span><span style="text-decoration: underline; font-size: 9pt; font-family: 'Courier New'; ">ctx</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;=&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">new</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;ClassPathXmlApplicationContext(<br /></span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">new</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;String[]&nbsp;{&nbsp;</span><span style="mso-spacerun:'yes'; color:#2a00ff; font-size:9.0000pt; font-family:'Courier New'; ">"/spring/context-annotation.xml"</span><span style="font-size: 9pt; font-family: 'Courier New'; ">,</span><span style="mso-spacerun:'yes'; color:#2a00ff; font-size:9.0000pt; font-family:'Courier New'; ">"/spring/context-transaction.xml"</span><span style="font-size: 9pt; font-family: 'Courier New'; ">,<br /></span><span style="mso-spacerun:'yes'; color:#2a00ff; font-size:9.0000pt; font-family:'Courier New'; ">"/spring/context-hibernate.xml"</span><span style="font-size: 9pt; font-family: 'Courier New'; ">,<br /></span><span style="mso-spacerun:'yes'; color:#2a00ff; font-size:9.0000pt; font-family:'Courier New'; ">"/spring/context-quartz.xml"</span><span style="font-size: 9pt; font-family: 'Courier New'; ">});</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="mso-spacerun:'yes'; color:#0000c0; font-style:italic; font-size:9.0000pt; font-family:'Courier New'; ">out</span><span style="font-size: 9pt; font-family: 'Courier New'; ">.println(</span><span style="mso-spacerun:'yes'; color:#2a00ff; font-size:9.0000pt; font-family:'Courier New'; ">"start&nbsp;server...."</span><span style="font-size: 9pt; font-family: 'Courier New'; ">);</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">while</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;(</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">true</span><span style="font-size: 9pt; font-family: 'Courier New'; ">)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">try</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="text-decoration: underline; font-size: 9pt; font-family: 'Courier New'; ">Thread.</span><span style="text-decoration: underline; font-style: italic; font-size: 9pt; font-family: 'Courier New'; ">sleep</span><span style="text-decoration: underline; font-size: 9pt; font-family: 'Courier New'; ">(900)</span><span style="font-size: 9pt; font-family: 'Courier New'; ">;</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="mso-spacerun:'yes'; color:#7f0055; font-weight:bold; font-size:9.0000pt; font-family:'Courier New'; ">catch</span><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;(InterruptedException&nbsp;ex)&nbsp;{</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">&nbsp;&nbsp;&nbsp;&nbsp;};</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 9pt; font-family: 'Courier New'; ">}</span></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 12pt; ">去掉了系统的controller配置servlet.xml，运行这个类就可以了。</span></p><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 12pt; ">在web-inf目录下写一个command来启动这个java类：</span></p><table style="border-collapse:collapse; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; "><tbody><tr><td width="568" valign="top" style="width:426.1000pt; padding:0.0000pt 5.4000pt 0.0000pt 5.4000pt ; border-left:0.5000pt solid #000000; border-right:0.5000pt solid #000000; border-top:0.5000pt solid #000000; border-bottom:0.5000pt solid #000000; "><p style="margin-bottom:0pt; margin-top:0pt; "><span style="text-decoration: underline; font-size: 9pt; font-family: 'Courier New'; ">setlocal</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;ENABLEDELAYEDEXPANSION</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">if&nbsp;defined&nbsp;CLASSPATH&nbsp;(set&nbsp;CLASSPATH=%CLASSPATH%;.)&nbsp;else&nbsp;(set&nbsp;CLASSPATH=.)</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">FOR&nbsp;/R&nbsp;.\</span><span style="text-decoration: underline; font-size: 9pt; font-family: 'Courier New'; ">lib</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;%%G&nbsp;IN&nbsp;(*.jar)&nbsp;DO&nbsp;set&nbsp;CLASSPATH=!CLASSPATH!;%%G</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">Echo&nbsp;The&nbsp;</span><span style="text-decoration: underline; font-size: 9pt; font-family: 'Courier New'; ">Classpath</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">&nbsp;definition&nbsp;is====&nbsp;%CLASSPATH%</span></p><p style="margin-bottom:0pt; margin-top:0pt; "></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">set&nbsp;CLASSPATH=./classes;%CLASSPATH%</span></p><p style="margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">java&nbsp;com.</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'宋体'; ">company</span><span style="mso-spacerun:'yes'; font-size:9.0000pt; font-family:'Courier New'; ">.job.StartServer</span></p></td></tr></tbody></table><p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 12pt; ">这个command需要把需要的jar(web-inf/lib中)包都放到classpath中。</span></p><p style="text-indent: 21pt; margin-bottom: 0pt; margin-top: 0pt; "><span style="font-size: 12pt; ">每次启动的时候执行这个command就可以了。跟原来的应用分开了，调试起定时任务也不用影响到原来的应用，还是比较方便的。部署的时候原样拷贝一份，然后执行这个command就好了，部署起来也比较方便。</span></p></div></div><p>&nbsp;</p></div><img src ="http://www.blogjava.net/ghostzhang/aggbug/358528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2011-09-13 12:53 <a href="http://www.blogjava.net/ghostzhang/archive/2011/09/13/358528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring MVC 数据绑定的扩展</title><link>http://www.blogjava.net/ghostzhang/archive/2011/09/12/358486.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Mon, 12 Sep 2011 11:12:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2011/09/12/358486.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/358486.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2011/09/12/358486.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/358486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/358486.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring&nbsp;MVC经过三个版本，功能已经改进和完善了很多。尤其是2.5以来采用的Annotation的参数绑定，极大的方便了开发，3.0对其进行更进一步的完善。对于一些特殊的前台框架，传到后台的不是普通的request中的参数，而是request流中的xml格式，这时就不能采用SpringMVC自带的参数绑定方法。这时候考虑是否能扩展一下。SpringMVC默认使用的是Annotati...&nbsp;&nbsp;<a href='http://www.blogjava.net/ghostzhang/archive/2011/09/12/358486.html'>阅读全文</a><img src ="http://www.blogjava.net/ghostzhang/aggbug/358486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2011-09-12 19:12 <a href="http://www.blogjava.net/ghostzhang/archive/2011/09/12/358486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态加载HQL</title><link>http://www.blogjava.net/ghostzhang/archive/2011/09/10/358417.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Sat, 10 Sep 2011 04:25:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2011/09/10/358417.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/358417.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2011/09/10/358417.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/358417.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/358417.html</trackback:ping><description><![CDATA[<div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">接上一篇Hibernate&nbsp;动态HQL(</span><a href="http://www.blogjava.net/ghostzhang/archive/2011/09/08/358320.html"><span style="color: #0000ff; font-size: 10.5pt; font-family: 'Times New Roman'; ">http://www.blogjava.net/ghostzhang/archive/2011/09/08/358320.html</span></a>&nbsp;<span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; ">)，开发中经常需要修改SQL或者HQL的语句，但是每次都要重启服务器才能使之起作用，就想到在使用Spring配置多语言时有一个ReloadableResourceBundleMessageSource.java类，可以配置动态加载多语言文件，为了配合动态HQL并实现修改HQL语句不用重启服务器，可以参考下这个类的实现。Java代码如下：(ReloadableDynamicHibernate.java)<br />
</span></p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp; 1&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ReloadableDynamicHibernate{<br />
&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;Map&lt;String,&nbsp;XmlHolder&gt;&nbsp;cachedXmls&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,&nbsp;XmlHolder&gt;();<br />
&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;org.springframework.beans.factory.xml.DocumentLoader&nbsp;documentLoader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;org.springframework.beans.factory.xml.DefaultDocumentLoader();<br />
&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;afterPropertiesSet()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshLoad2Cache(<span style="color: #0000FF; ">true</span>);<br />
&nbsp;&nbsp;7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;8&nbsp;<br />
&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;String&nbsp;getSqlByName(String&nbsp;queryKey)&nbsp;{<br />
&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshLoad2Cache(<span style="color: #0000FF; ">false</span>);<br />
&nbsp;11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&lt;XmlHolder&gt;&nbsp;xmlHolders&nbsp;=&nbsp;cachedXmls.values();<br />
&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(XmlHolder&nbsp;holder&nbsp;:&nbsp;xmlHolders)&nbsp;{<br />
&nbsp;13&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;qlString&nbsp;=&nbsp;holder.getQl(queryKey);<br />
&nbsp;14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(StringUtils.isNotEmpty(qlString))&nbsp;{<br />
&nbsp;15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;qlString;<br />
&nbsp;16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;17&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RuntimeException("can&nbsp;not&nbsp;find&nbsp;ql&nbsp;in&nbsp;xml.");<br />
&nbsp;19&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;20&nbsp;<br />
&nbsp;21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;refreshLoad2Cache(<span style="color: #0000FF; ">boolean</span>&nbsp;isForce)&nbsp;{<br />
&nbsp;22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;fileNames.size();&nbsp;i++)&nbsp;{<br />
&nbsp;23&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;((String)&nbsp;fileNames.get(i)).trim();<br />
&nbsp;24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(resourceLoader&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;ResourcePatternResolver)&nbsp;{<br />
&nbsp;25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource[]&nbsp;resources&nbsp;=&nbsp;((ResourcePatternResolver)&nbsp;resourceLoader).getResources(fileName);<br />
&nbsp;27&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(Resource&nbsp;resource&nbsp;:&nbsp;resources)&nbsp;{<br />
&nbsp;28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getXmls(resource,isForce);<br />
&nbsp;29&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;30&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;ex)&nbsp;{<br />
&nbsp;31&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RuntimeException("Could&nbsp;not&nbsp;resolve&nbsp;sql&nbsp;definition&nbsp;resource&nbsp;pattern&nbsp;["&nbsp;+&nbsp;fileName&nbsp;+&nbsp;"]",&nbsp;ex);<br />
&nbsp;32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;33&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;34&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource&nbsp;resource&nbsp;=&nbsp;resourceLoader.getResource(fileName);<br />
&nbsp;35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getXmls(resource,isForce);<br />
&nbsp;36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;37&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;39&nbsp;<br />
&nbsp;40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;XmlHolder&nbsp;getXmls(Resource&nbsp;resource,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isForce)&nbsp;{<br />
&nbsp;41&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">synchronized</span>&nbsp;(<span style="color: #0000FF; ">this</span>.cachedXmls)&nbsp;{<br />
&nbsp;42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filename&nbsp;=&nbsp;resource.getFilename();<br />
&nbsp;43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHolder&nbsp;cachedXmls&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.cachedXmls.get(filename);<br />
&nbsp;44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(cachedXmls&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;(cachedXmls.getRefreshTimestamp()&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;cachedXmls.getRefreshTimestamp()&nbsp;&gt;&nbsp;System.currentTimeMillis()))&nbsp;{<br />
&nbsp;45&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cachedXmls;<br />
&nbsp;46&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;47&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;refreshXmls(resource,&nbsp;cachedXmls,&nbsp;isForce);<br />
&nbsp;48&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;49&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;50&nbsp;<br />
&nbsp;51&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;XmlHolder&nbsp;refreshXmls(Resource&nbsp;resource,&nbsp;XmlHolder&nbsp;xmlHolder,&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isForce)&nbsp;{<br />
&nbsp;52&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filename&nbsp;=&nbsp;resource.getFilename();<br />
&nbsp;53&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;refreshTimestamp&nbsp;=&nbsp;System.currentTimeMillis();<br />
&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(resource.exists())&nbsp;{<br />
&nbsp;55&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;fileTimestamp&nbsp;=&nbsp;-1;<br />
&nbsp;56&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;57&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileTimestamp&nbsp;=&nbsp;resource.lastModified();<br />
&nbsp;58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!isForce&nbsp;&amp;&amp;&nbsp;xmlHolder&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;xmlHolder.getFileTimestamp()&nbsp;==&nbsp;fileTimestamp)&nbsp;{<br />
&nbsp;59&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(LOGGER.isDebugEnabled())&nbsp;{<br />
&nbsp;60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.debug("Re-caching&nbsp;properties&nbsp;for&nbsp;filename&nbsp;["&nbsp;+&nbsp;filename&nbsp;+&nbsp;"]&nbsp;-&nbsp;file&nbsp;hasn't&nbsp;been&nbsp;modified");<br />
&nbsp;61&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHolder.setRefreshTimestamp(refreshTimestamp);<br />
&nbsp;63&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;xmlHolder;<br />
&nbsp;64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;65&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;ex)&nbsp;{<br />
&nbsp;66&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(LOGGER.isDebugEnabled())&nbsp;{<br />
&nbsp;67&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.debug(resource&nbsp;+&nbsp;"&nbsp;could&nbsp;not&nbsp;be&nbsp;resolved&nbsp;in&nbsp;the&nbsp;file&nbsp;system&nbsp;-&nbsp;assuming&nbsp;that&nbsp;is&nbsp;hasn't&nbsp;changed",&nbsp;ex);<br />
&nbsp;68&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;69&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileTimestamp&nbsp;=&nbsp;-1;<br />
&nbsp;70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;71&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;72&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;qlMap&nbsp;=&nbsp;loadQlMap(resource);<br />
&nbsp;73&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHolder&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;XmlHolder(qlMap,&nbsp;fileTimestamp);<br />
&nbsp;74&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;ex)&nbsp;{<br />
&nbsp;75&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(LOGGER.isWarnEnabled())&nbsp;{<br />
&nbsp;76&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.warn("Could&nbsp;not&nbsp;parse&nbsp;properties&nbsp;file&nbsp;["&nbsp;+&nbsp;resource.getFilename()&nbsp;+&nbsp;"]",&nbsp;ex);<br />
&nbsp;77&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHolder&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;XmlHolder();<br />
&nbsp;79&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
&nbsp;81&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(LOGGER.isDebugEnabled())&nbsp;{<br />
&nbsp;82&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.debug("No&nbsp;properties&nbsp;file&nbsp;found&nbsp;for&nbsp;["&nbsp;+&nbsp;filename&nbsp;+&nbsp;"]&nbsp;-&nbsp;neither&nbsp;plain&nbsp;properties&nbsp;nor&nbsp;XML");<br />
&nbsp;83&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;84&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHolder&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;XmlHolder();<br />
&nbsp;85&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;86&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHolder.setRefreshTimestamp(refreshTimestamp);<br />
&nbsp;87&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cachedXmls.put(filename,&nbsp;xmlHolder);<br />
&nbsp;88&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;xmlHolder;<br />
&nbsp;89&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;90&nbsp;<br />
&nbsp;91&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Map&lt;String,String&gt;&nbsp;buildHQLMap(Resource&nbsp;resource)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;92&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String,&nbsp;String&gt;&nbsp;qlMap&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,&nbsp;String&gt;();<br />
&nbsp;93&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;94&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputSource&nbsp;inputSource&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;InputSource(resource.getInputStream());<br />
&nbsp;95&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Document&nbsp;doc&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.documentLoader.loadDocument(inputSource,&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;org.springframework.util.xml.XmlValidationModeDetector.VALIDATION_NONE,&nbsp;<span style="color: #0000FF; ">false</span>);<br />
&nbsp;96&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;=&nbsp;doc.getDocumentElement();<br />
&nbsp;97&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Element&gt;&nbsp;querys&nbsp;=&nbsp;DomUtils.getChildElements(root);<br />
&nbsp;98&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(Element&nbsp;query:querys){<br />
&nbsp;99&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queryName&nbsp;=&nbsp;query.getAttribute("name");<br />
100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(StringUtils.isEmpty(queryName))&nbsp;{<br />
101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Exception("DynamicHibernate&nbsp;Service&nbsp;:&nbsp;name&nbsp;is&nbsp;essential&nbsp;attribute&nbsp;in&nbsp;a&nbsp;&lt;query&gt;.");<br />
102&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
103&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(qlMap.containsKey(queryName)){<br />
104&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Exception("DynamicHibernate&nbsp;Service&nbsp;:&nbsp;duplicated&nbsp;query&nbsp;in&nbsp;a&nbsp;&lt;query&gt;.");<br />
105&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
106&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qlMap.put(queryName,&nbsp;DomUtils.getTextValue(query));<br />
107&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
108&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;ioe)&nbsp;{<br />
109&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;ioe;<br />
110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;qlMap;<br />
112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
113&nbsp;<br />
114&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;Map&nbsp;loadQlMap(Resource&nbsp;resource)&nbsp;{<br />
115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;qlMap&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,&nbsp;String&gt;();<br />
116&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />
117&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
118&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;=&nbsp;resource.getInputStream();<br />
119&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;buildHQLMap(resource);<br />
120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />
121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
122&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;{<br />
123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
124&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">null</span>&nbsp;!=&nbsp;is)&nbsp;{<br />
125&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.close();<br />
126&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />
128&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
129&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
130&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
131&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;qlMap;<br />
132&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
133&nbsp;<br />
134&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;XmlHolder&nbsp;{<br />
135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Map&lt;String,&nbsp;String&gt;&nbsp;qlMap;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">查询的映射</span><span style="color: #008000; "><br />
</span>136&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileTimestamp&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;-1;<br />
137&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshTimestamp&nbsp;=&nbsp;-1;<br />
138&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getQl(String&nbsp;key)&nbsp;{<br />
139&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">null</span>&nbsp;!=&nbsp;qlMap)&nbsp;{<br />
140&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;qlMap.get(key);<br />
141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
142&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(LOGGER.isErrorEnabled())&nbsp;{<br />
143&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.debug("error&nbsp;is&nbsp;occured&nbsp;in&nbsp;getQl.");<br />
144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
145&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"";<br />
146&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
147&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
148&nbsp;<br />
149&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;XmlHolder(Map&lt;String,&nbsp;String&gt;&nbsp;qlMap,&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;fileTimestamp)&nbsp;{<br />
150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.qlMap&nbsp;=&nbsp;qlMap;<br />
151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.fileTimestamp&nbsp;=&nbsp;fileTimestamp;<br />
152&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
153&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;XmlHolder()&nbsp;{<br />
154&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
155&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Map&lt;String,&nbsp;String&gt;&nbsp;getQlMap()&nbsp;{<br />
156&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;qlMap;<br />
157&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
158&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;getFileTimestamp()&nbsp;{<br />
159&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;fileTimestamp;<br />
160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
161&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setRefreshTimestamp(<span style="color: #0000FF; ">long</span>&nbsp;refreshTimestamp)&nbsp;{<br />
162&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.refreshTimestamp&nbsp;=&nbsp;refreshTimestamp;<br />
163&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
164&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;getRefreshTimestamp()&nbsp;{<br />
165&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;refreshTimestamp;<br />
166&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
167&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
168&nbsp;} &nbsp; &nbsp; &nbsp; &nbsp;</div>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; ">Spring&nbsp;配置如下：</span></p>
</div>
<span style="mso-spacerun:'yes'; font-size:10.0000pt; font-family:'宋体'; "><br />
</span>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<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; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="dynamicHibernate"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="com.company.ReloadableDynamicHibernate"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="sessionFactory"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="simpleTemplate"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="simpleTemplate"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="fileNames"</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;<br />
&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; ">value</span><span style="color: #0000FF; ">&gt;</span>classpath*:hibernate/dynamic/dynamic-hibernate-*.xml<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">value</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div>
<div>
<p style="margin-bottom:0pt; margin-top:0pt; "><span style="font-size: 10pt; ">这样就实现了每次修改SQL&nbsp;or&nbsp;HQL语句后不用重启服务器，立刻看到结果，加快了开发速度。</span></p>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div><img src ="http://www.blogjava.net/ghostzhang/aggbug/358417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2011-09-10 12:25 <a href="http://www.blogjava.net/ghostzhang/archive/2011/09/10/358417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 动态 HQL</title><link>http://www.blogjava.net/ghostzhang/archive/2011/09/08/358320.html</link><dc:creator>GhostZhang</dc:creator><author>GhostZhang</author><pubDate>Thu, 08 Sep 2011 11:14:00 GMT</pubDate><guid>http://www.blogjava.net/ghostzhang/archive/2011/09/08/358320.html</guid><wfw:comment>http://www.blogjava.net/ghostzhang/comments/358320.html</wfw:comment><comments>http://www.blogjava.net/ghostzhang/archive/2011/09/08/358320.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ghostzhang/comments/commentRss/358320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ghostzhang/services/trackbacks/358320.html</trackback:ping><description><![CDATA[<div><div><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">在开发的时候，很多时候都遇到过需要动态拼写SQL，有的是在配置文件中写SQL，有的是在Java代码中拼写SQL，以配置文件拼SQL的可以拿IBatis为代表，但是很多时候是使用Hibernate的，这个时候就想要是Hibernate能像IBatis那样写就好了。</span></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">这个时候就想到了模板语言和配置文件的结合。模板引擎可以选择Velocity，简单而不失强大，配置文件可以模仿Hibernate的sql-query&nbsp;的XML文件。</span></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">Sq-query的示例代码如下(SQL&nbsp;or&nbsp;HQL)：<br /><br /></span></p><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; width: 748px; word-break: break-all; ">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE&nbsp;dynamic-hibernate&nbsp;PUBLIC&nbsp;"-//ANYFRAME//DTD&nbsp;DYNAMIC-HIBERNATE//EN"<br />"http://www.anyframejava.org/dtd/anyframe-dynamic-hibernate-mapping-4.0.dtd"&gt;<br />&lt;dynamic-hibernate&gt;<br />&nbsp; &nbsp; &lt;query&nbsp;name="selectUserSQL"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;&nbsp;USER_ID,NAME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;users_table&nbsp;Where&nbsp;1=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<span style="color: #0000ff; ">if</span>($name&nbsp;&amp;&amp;&nbsp;$name.length()&nbsp;&gt;&nbsp;1)<br />&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;AND&nbsp;name&nbsp;=:name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#end<br />&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/query&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;query&nbsp;name="selectUserHQL"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;![CDATA[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;users<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Where&nbsp;1=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#<span style="color: #0000ff; ">if</span>($name&nbsp;&amp;&amp;&nbsp;$name.length()&nbsp;&gt;&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AND&nbsp;name&nbsp;=:name<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#end<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]]&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/query&gt;</div><p>&nbsp;</p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">在系统加载时，需要把配置文件加载到系统中。加载代码关键部分如下：</span></p><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; width: 748px; word-break: break-all; "><span style="color: #008080; "><div style="display: inline-block; "><div>&nbsp;1<span style="color: #000000; ">&nbsp; &nbsp;</span><span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">class</span><span style="color: #000000; ">&nbsp;DynamicHibernateImpl&nbsp;</span><span style="color: #0000ff; ">implements</span><span style="color: #000000; ">&nbsp;InitializingBean,&nbsp;ResourceLoaderAware,&nbsp;ApplicationContextAware</span></div></div>&nbsp;</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #0000ff; ">public</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;afterPropertiesSet()&nbsp;<span style="color: #0000ff; ">throws</span>&nbsp;Exception&nbsp;{<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>&nbsp;(<span style="color: #0000ff; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;fileNames.size();&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;((String)&nbsp;fileNames.get(i)).trim();<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>&nbsp;(resourceLoader&nbsp;<span style="color: #0000ff; ">instanceof</span>&nbsp;ResourcePatternResolver)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">try</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource[]&nbsp;resources=((ResourcePatternResolver)&nbsp;resourceLoader).getResources(fileName);<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buildHQLMap(resources);<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000ff; ">catch</span>&nbsp;(IOException&nbsp;ex)&nbsp;{<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">throw</span>&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;Exception("Could&nbsp;not&nbsp;resolve&nbsp;sql&nbsp;definition&nbsp;resource&nbsp;pattern&nbsp;["&nbsp;+&nbsp;fileName&nbsp;+&nbsp;"]",&nbsp;ex);<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000ff; ">else</span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource&nbsp;resource&nbsp;=&nbsp;resourceLoader.getResource(fileName);<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buildHQLMap(<span style="color: #0000ff; ">new</span>&nbsp;Resource[]&nbsp;{&nbsp;resource&nbsp;});<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;<span style="color: #0000ff; ">protected</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;buildHQLMap(Resource[]&nbsp;resources)&nbsp;<span style="color: #0000ff; ">throws</span>&nbsp;Exception&nbsp;{<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>&nbsp;(<span style="color: #0000ff; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;resources.length;&nbsp;i++)&nbsp;{<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buildHQLMap(resources[i]);<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;<span style="color: #0000ff; ">private</span>&nbsp;<span style="color: #0000ff; ">void</span>&nbsp;buildHQLMap(Resource&nbsp;resource)&nbsp;<span style="color: #0000ff; ">throws</span>&nbsp;Exception&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">try</span>&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputSource&nbsp;inputSource&nbsp;=&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;InputSource(resource.getInputStream());<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.w3c.dom.Document&nbsp;doc&nbsp;=&nbsp;<span style="color: #0000ff; ">this</span>.documentLoader.loadDocument(inputSource,&nbsp;<span style="color: #0000ff; ">null</span>,&nbsp;<span style="color: #0000ff; ">null</span>,&nbsp;org.springframework.util.xml.XmlValidationModeDetector.VALIDATION_NONE,&nbsp;<span style="color: #0000ff; ">false</span>);<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;root&nbsp;=&nbsp;doc.getDocumentElement();<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Element&gt;&nbsp;querys&nbsp;=&nbsp;DomUtils.getChildElements(root);<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">for</span>(Element&nbsp;query:querys){<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queryName&nbsp;=&nbsp;query.getAttribute("name");<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>&nbsp;(StringUtils.isEmpty(queryName))&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">throw</span>&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;Exception("DynamicHibernate&nbsp;Service&nbsp;:&nbsp;name&nbsp;is&nbsp;essential&nbsp;attribute&nbsp;in&nbsp;a&nbsp;&lt;query&gt;.");<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>(statements.containsKey(queryName)){<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">throw</span>&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;Exception("DynamicHibernate&nbsp;Service&nbsp;:&nbsp;duplicated&nbsp;query&nbsp;in&nbsp;a&nbsp;&lt;query&gt;."+queryName);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statements.put(queryName,&nbsp;DomUtils.getTextValue(query));<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000ff; ">catch</span>&nbsp;(SAXParseException&nbsp;se)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">throw</span>&nbsp;se;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000ff; ">catch</span>&nbsp;(IOException&nbsp;ioe)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">throw</span>&nbsp;ioe;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><span style="font-size: 12px; line-height: normal; "><br /></span><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">Spring的配置文件示例如下：</span></p><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; width: 748px; word-break: break-all; "><div>&lt;bean&nbsp;id="dynamicHibernate"&nbsp;<span style="color: #0000ff; ">class</span>="com.company.DynamicHibernateImpl"&gt;</div>&lt;property&nbsp;name="sessionFactory"&nbsp;ref="sessionFactory"&nbsp;/&gt;<br />&lt;property&nbsp;name="simpleTemplate"&nbsp;ref="simpleTemplate"&nbsp;/&gt;<br />&lt;property&nbsp;name="fileNames"&gt;<br />&lt;list&gt;<br />&lt;value&gt;classpath*:hibernate/dynamic/dynamic-hibernate-*.xml&lt;/value&gt;<br />&lt;/list&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;</div><span style="line-height: normal; "><br /></span><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">下一步是在使用时调用sql并调用模板方法，进行sql动态化。</span></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">还是DynamicHibernateImpl这个类</span>&nbsp;</p><div style="padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: #eeeeee; font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; width: 748px; word-break: break-all; "><span style="font-size: 14px; ">&nbsp;1 &nbsp; &nbsp;&nbsp;</span><span style="font-size: 14px; color: #0000ff; ">public</span><span style="font-size: 14px; ">&nbsp;List&nbsp;findList(String&nbsp;queryName,&nbsp;Map&nbsp;params,&nbsp;</span><span style="font-size: 14px; color: #0000ff; ">int</span><span style="font-size: 14px; ">&nbsp;pageIndex,&nbsp;</span><span style="font-size: 14px; color: #0000ff; ">int</span><span style="font-size: 14px; ">&nbsp;pageSize)&nbsp;</span><span style="font-size: 14px; color: #0000ff; ">throws</span><span style="font-size: 14px; ">&nbsp;Exception&nbsp;{</span><span style="color: #008080; ">&nbsp;<br />&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context&nbsp;=&nbsp;generateVelocityContext(params);<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;findInternal(queryName,&nbsp;context);<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>&nbsp;(pageIndex&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;pageSize&nbsp;&gt;&nbsp;0)&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setFirstResult((pageIndex&nbsp;-&nbsp;1)&nbsp;*&nbsp;pageSize);<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setMaxResults(pageSize);<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;query.list();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">private</span>&nbsp;Context&nbsp;generateVelocityContext(Map&lt;String,&nbsp;Object&gt;&nbsp;params)&nbsp;{<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VelocityContext&nbsp;context&nbsp;=&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;VelocityContext();<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>&nbsp;(<span style="color: #0000ff; ">null</span>&nbsp;==&nbsp;params)&nbsp;{<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;<span style="color: #0000ff; ">null</span>;<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Iterator&lt;String&gt;&nbsp;iterator&nbsp;=&nbsp;params.keySet().iterator();<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">while</span>&nbsp;(iterator.hasNext())&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;iterator.next();<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value&nbsp;=&nbsp;params.get(key);<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>&nbsp;(<span style="color: #0000ff; ">null</span>&nbsp;==&nbsp;value)&nbsp;{<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">continue</span>;<br /><span style="color: #008080; ">21</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;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.put(key,&nbsp;value);<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;context;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;<span style="color: #0000ff; ">private</span>&nbsp;Query&nbsp;findInternal(String&nbsp;queryName,&nbsp;Context&nbsp;context)&nbsp;<span style="color: #0000ff; ">throws</span>&nbsp;Exception&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;findSQLByVelocity(queryName,&nbsp;context);<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;=&nbsp;sessionFactory.getCurrentSession().createQuery(sql);<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;namedParams&nbsp;=&nbsp;query.getNamedParameters();<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setProperties(query,&nbsp;context,&nbsp;namedParams);<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;query;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;<span style="color: #0000ff; ">private</span>&nbsp;String&nbsp;findSQLByVelocity(String&nbsp;queryName,&nbsp;Context&nbsp;context)&nbsp;<span style="color: #0000ff; ">throws</span>&nbsp;Exception&nbsp;{<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">if</span>&nbsp;(context&nbsp;==&nbsp;<span style="color: #0000ff; ">null</span>)<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;=&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;VelocityContext();<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql&nbsp;=&nbsp;getSqlByName(queryName);<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringWriter&nbsp;writer&nbsp;=&nbsp;<span style="color: #0000ff; ">new</span>&nbsp;StringWriter();<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Velocity.evaluate(context,&nbsp;writer,&nbsp;"Hibernate",&nbsp;sql);<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sql&nbsp;=&nbsp;writer.toString();<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;sql;<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">42</span>&nbsp;<span style="color: #0000ff; ">protected</span>&nbsp;String&nbsp;getSqlByName(String&nbsp;queryKey)&nbsp;{<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; ">return</span>&nbsp;statements.get(queryKey);<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><span style="line-height: normal; "><br /></span><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">就这些。</span></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">大家也许有更好的方法，欢迎交流。</span></p><p style="margin-top: 0pt; margin-bottom: 0pt; text-indent: 21pt; "><span style="font-size: 10pt; font-family: 宋体; ">QQ:24889356</span></p></div></div><img src ="http://www.blogjava.net/ghostzhang/aggbug/358320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ghostzhang/" target="_blank">GhostZhang</a> 2011-09-08 19:14 <a href="http://www.blogjava.net/ghostzhang/archive/2011/09/08/358320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>