﻿<?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-紫蝶∏飛揚↗-文章分类-Spring</title><link>http://www.blogjava.net/algz/category/26972.html</link><description>Purple Butterfly Flying
QQ群:7101519
Flex,Ext,Spring,Hibernate,EOS,SpringSecurity,Struts
http://algz.googlecode.com/svn/trunk/</description><language>zh-cn</language><lastBuildDate>Fri, 01 Jul 2011 03:05:01 GMT</lastBuildDate><pubDate>Fri, 01 Jul 2011 03:05:01 GMT</pubDate><ttl>60</ttl><item><title>spring 什么情况下进行事务回滚(面试题)</title><link>http://www.blogjava.net/algz/articles/352796.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 22 Jun 2011 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/352796.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/352796.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/352796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/352796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/352796.html</trackback:ping><description><![CDATA[<span style="font-size: 12px;">spring事务回滚.默认情况,unchecked异常,即运行时异常runntimeException回滚事务;checked异常,即Exception可try{}捕获的不会回滚.当然也可配置spring参数让其回滚.</span><img src ="http://www.blogjava.net/algz/aggbug/352796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-22 11:53 <a href="http://www.blogjava.net/algz/articles/352796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 中 jdbcTemplate 快速数据库开发</title><link>http://www.blogjava.net/algz/articles/352789.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 22 Jun 2011 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/352789.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/352789.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/352789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/352789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/352789.html</trackback:ping><description><![CDATA[<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: #000000; ">&nbsp; &nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;execSQL(String&nbsp;fileName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;myFile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;File(fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">myFile.exists())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Can't&nbsp;Find&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;fileName);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DriverManagerDataSource&nbsp;dataSource</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DriverManagerDataSource();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setDriverClassName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">org.hsqldb.jdbcDriver</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setUrl(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">jdbc:hsqldb:hsql://localhost/algz</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setUsername(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">sa</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setPassword(</span><span style="color: #000000; ">""</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JdbcTemplate&nbsp;jt</span><span style="color: #000000; ">=</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JdbcTemplate();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jt.setDataSource(dataSource);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;BufferedReader(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;FileReader(myFile));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sql;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;((sql&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;in.readLine())&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jt.execute(sql);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.getStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><img src ="http://www.blogjava.net/algz/aggbug/352789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-22 10:16 <a href="http://www.blogjava.net/algz/articles/352789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在spring的bean中获取ServletContext 和 servletConfig</title><link>http://www.blogjava.net/algz/articles/352560.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Sat, 18 Jun 2011 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/352560.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/352560.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/352560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/352560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/352560.html</trackback:ping><description><![CDATA[<div><div>在spring的bean中获取ServletContext 和&nbsp;servletConfig</div><div></div><div>&nbsp;&nbsp;常规方式下获取servletContext需要继承HttpServlet类，然后获取servletConfig，通过这个获取servletContext（servletConfig.getServletContext()）。</div><div></div><div>&nbsp;&nbsp;但是spring的bean都是pojo，和我们常规的操作有些不同。</div><div></div><div>spring给我们提供了两个接口：org.springframework.web.context.ServletContextAware和org.springframework.web.context.ServletConfigAware。我们可以让我们的bean实现上边的任何一个接口就能获取到servletContext了 .</div><div></div><div>代码如下：</div><div><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; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;DicBean&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;ServletContextAware{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;ServletContext&nbsp;servletContext;<br /><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setServletContext(ServletContext&nbsp;sc)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.servletContext</span><span style="color: #000000; ">=</span><span style="color: #000000; ">sc;<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">项目应用的绝对路径为：</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">servletContext.getRealPath(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />}<br />}</span></div></div><div></div></div><img src ="http://www.blogjava.net/algz/aggbug/352560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-06-18 09:44 <a href="http://www.blogjava.net/algz/articles/352560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring aop 简单实用的学习</title><link>http://www.blogjava.net/algz/articles/317617.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 07 Apr 2010 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/317617.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/317617.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/317617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/317617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/317617.html</trackback:ping><description><![CDATA[<p>import org.aspectj.lang.annotation.AfterReturning;<br />
import org.aspectj.lang.annotation.Aspect;</p>
<p>@Aspect<br />
public class BusinessHistory {</p>
<p><span style="color: #339966">/*&nbsp;连接点(定义一个类包含以下方法):<br />
&nbsp;* public String list(String u){<br />
&nbsp;&nbsp;//this.<br />
&nbsp;&nbsp;System.out.println("list(String u)");<br />
&nbsp;&nbsp;return "return list(String u)";<br />
&nbsp;}*/<br />
&nbsp;/*切面(定义一个类):<br />
&nbsp; * <br />
&nbsp; *(1)切入点:<br />
&nbsp; *@Pointcut("execution(* com.tb.app.cf.servicex.emp.*.* (..))") public void<br />
&nbsp; * pointcutA(){ }<br />
&nbsp; *<br />
&nbsp; *切入点表达式(详见spring开发手册核心技术部分):<br />
&nbsp; a. "execution(* com.tb.app.cf.servicex.emp.*.*(..))" emp包下的所有方法<br />
&nbsp; b. "execution(* com.CfDimissionLogManager.*(..))" CfDimissionLogManager类的所有方法<br />
&nbsp; c. "execution(* com.service.save(..))" service包下方法名为save,参数个数任意<br />
&nbsp; d. "execution(* org.service.*.*())" 限定service包中任意类任意不带参数的方法名<br />
&nbsp; e. "execution(* org.service.*.*(..)) &amp;&amp; args(n,..) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 限定service包中任意类任意方法名任意参数个数,并且传入通知的第一个参数名为n,作为通知的参数名n.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注:execution(* org.service.*.*(..)) &amp;&amp; args(n,..) 报错,因为args限定有参,但execution限定无参.所以冲突.<br />
&nbsp; f.&nbsp;@AfterReturning(value="execution(* org.springside.helloworld.service.UserManager.list(..))&amp;&amp; args(u1)",<br />
&nbsp;&nbsp;&nbsp;argNames="u", //注:尽量不要使用argNames,采用args(..)<br />
&nbsp;&nbsp;&nbsp;returning="retVal")<br />
&nbsp; * <br />
&nbsp; *(2)通知:<br />
&nbsp;/*@AfterReturning(value="execution(* org.service.*.*(..))"<br />
&nbsp;&nbsp;&nbsp;returning="retVal")&nbsp;&nbsp; //限定service包中,任意类任意方法名任意参数个数,但须有返回值的方法<br />
&nbsp;//参数retVal必须与returning值retVal一致,但retVal可与连接点返回值类型一致,名字可不同<br />
&nbsp;public void adviceA(String retVal) {<br />
&nbsp;&nbsp;System.err.println(retVal);<br />
&nbsp;}*/</span><br />
<br />
&nbsp;@AfterReturning(value="execution(* org.springside.helloworld.service.UserManager.list(..))&amp;&amp; args(u1)",<br />
&nbsp;&nbsp;&nbsp;returning="retVal")<br />
&nbsp;public void adviceA(String retVal,String u1) {<br />
&nbsp;&nbsp;System.err.println("return:"+retVal);<br />
&nbsp;&nbsp;System.err.println("param:"+u1);<br />
&nbsp;}<br />
}</p>
<img src ="http://www.blogjava.net/algz/aggbug/317617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2010-04-07 10:01 <a href="http://www.blogjava.net/algz/articles/317617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring多配置文件</title><link>http://www.blogjava.net/algz/articles/317241.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 01 Apr 2010 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/317241.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/317241.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/317241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/317241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/317241.html</trackback:ping><description><![CDATA[<p><span style="font-size: 10pt">&nbsp;众所周知，Spring框架以对象的依赖注入而著名，通过applicationContext.xml配置，可以实现解耦合。如果我们把所有的对象都通过applicationContext.xml注入，那就会显得很臃肿，难于维护。对此，我们可以采用多配置文件相关联&nbsp;。比如:在struts-config.xml中如下定义<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">&lt;</span><span style="color: #000000">plug</span><span style="color: #000000">-</span><span style="color: #000000">in&nbsp;className</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.springframework.web.struts.ContextLoaderPlugIn</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">set</span><span style="color: #000000">-</span><span style="color: #000000">property&nbsp;property</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">contextConfigLocation</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;value</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/WEB-INF/action-service.xml</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">plug</span><span style="color: #000000">-</span><span style="color: #000000">in</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>在action-service.xml中<br />
<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/login</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.lq.struts.action.LoginAction</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">abstract</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">false</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;lazy</span><span style="color: #000000">-</span><span style="color: #000000">init</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;autowire</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;dependency</span><span style="color: #000000">-</span><span style="color: #000000">check</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">userService</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">userService</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p></span><span style="font-size: 10pt">在sp-service.xml中</span><br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">userService</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.lq.service.impl.UserServiceImpl</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;lazy</span><span style="color: #000000">-</span><span style="color: #000000">init</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;autowire</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;dependency</span><span style="color: #000000">-</span><span style="color: #000000">check</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">userinfoDAO</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">userinfoDAO</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p><br />
在applicationContext中<br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">userinfoDAO</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.lq.dao.UserinfoDAO</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;</p>
<p>这样也实现了一种分层的思想，易于维护，看起来多爽。最后在web.xml中将其关联<br />
</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">&lt;</span><span style="color: #000000">context</span><span style="color: #000000">-</span><span style="color: #000000">param</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">contextConfigLocation</span><span style="color: #000000">&lt;/</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">WEB</span><span style="color: #000000">-</span><span style="color: #000000">INF</span><span style="color: #000000">/</span><span style="color: #000000">sp</span><span style="color: #000000">-</span><span style="color: #000000">service.xml<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">WEB</span><span style="color: #000000">-</span><span style="color: #000000">INF</span><span style="color: #000000">/</span><span style="color: #000000">applicationContext.xml<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">param</span><span style="color: #000000">-</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">context</span><span style="color: #000000">-</span><span style="color: #000000">param</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">listener</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">listener</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.context.ContextLoaderListener&nbsp;&nbsp;&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">listener</span><span style="color: #000000">-</span><span style="color: #0000ff">class</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">listener</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>注意两点&lt;ref bean="sessionFactory" /&gt;不能写成&lt;ref local="sessionFactory" /&gt;要不然只能在本文件中找<br />
还有每个配置文件的名称空间一定要写</p>
<img src ="http://www.blogjava.net/algz/aggbug/317241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2010-04-01 23:05 <a href="http://www.blogjava.net/algz/articles/317241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 2.0 AOP标签式和注解式 声明式事务处理</title><link>http://www.blogjava.net/algz/articles/262941.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 30 Mar 2009 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/262941.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/262941.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/262941.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/262941.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/262941.html</trackback:ping><description><![CDATA[<p>一.AOP(常用)<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;beans xmlns="http://www.springframework.org/schema/beans"<br />
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
<span style="color: #008000">xmlns:aop="http://www.springframework.org/schema/aop"<br />
<em class="lineannotation"><span class="lineannotation"><span class="bold"><strong>xmlns:tx="http://www.springframework.org/schema/tx"</strong></span></span></em></span><br />
xsi:schemaLocation="<br />
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br />
<em class="lineannotation"><span class="lineannotation"><span class="bold"><strong style="color: #008000">http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd</strong></span></span></em><br />
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- 这是我们将要配置并使它具有事务性的Service对象 --&gt;<br />
</span></em><br />
&lt;bean id="fooService" class="x.y.service.DefaultFooService"/&gt;<br />
<em class="lineannotation"><span class="lineannotation"><br />
&lt;!-- the transactional advice (i.e. what 'happens'; see the <code class="literal">&lt;aop:advisor/&gt;</code> bean below) --&gt;<br />
</span></em><br />
&lt;tx:advice id="txAdvice" transaction-manager="txManager"&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- the transactional semantics... --&gt;<br />
</span></em><br />
&lt;tx:attributes&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- all methods starting with <code class="literal">'get'</code> are read-only --&gt;<br />
</span></em><br />
&lt;tx:method name="get*" read-only="true"/&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- other methods use the default transaction settings (see below) --&gt;<br />
</span></em><br />
&lt;tx:method name="*"/&gt;<br />
&lt;/tx:attributes&gt;<br />
&lt;/tx:advice&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- ensure that the above transactional advice runs for any executionof an operation defined by the <code class="interfacename">FooService</code> interface --&gt;<br />
</span></em><br />
&lt;aop:config&gt;<br />
&lt;aop:pointcut id="fooServiceOperation" expression="<span style="color: #008000">execution(*</span> x.y.service.FooService.<span style="color: #008000">*(..)</span>)"/&gt;<br />
&lt;aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceOperation"/&gt;<br />
&lt;/aop:config&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- ******************************************************************--&gt;</span></em><br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- don't forget the <code class="interfacename">DataSource</code> --&gt;<br />
</span></em><br />
&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />
&lt;property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/&gt;<br />
&lt;property name="url" value="jdbc:oracle:thin:@rj-t42:1521:elvis"/&gt;<br />
&lt;property name="username" value="scott"/&gt;<br />
&lt;property name="password" value="tiger"/&gt;<br />
&lt;/bean&gt;<br />
<em class="lineannotation"><span class="lineannotation"><br />
&lt;!-- similarly, don't forget the (particular) <code class="interfacename">PlatformTransactionManager</code> --&gt;<br />
</span></em><br />
&lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br />
&lt;property name="dataSource" ref="dataSource"/&gt;<br />
&lt;/bean&gt;<br />
<em class="lineannotation"><span class="lineannotation">&lt;!-- other <code class="literal">&lt;bean/&gt;</code> definitions here --&gt;<br />
</span></em><br />
&lt;/beans&gt;</p>
<pre class="programlisting">
<p>我们来分析一下上面的配置。我们要把一个服务对象（<code class="literal">'fooService'</code> bean）做成事务性的。我们想施加的事务语义封装在<code class="literal">&lt;tx:advice/&gt;</code>定义中。<code class="literal">&lt;tx:advice/&gt;</code> &#8220;<span class="quote"><span class="emphasis"><em>把所有以 <code class="literal">'get'</code> 开头的方法看做执行在只读事务上下文中，其余的方法执行在默认语义的事务上下文中</em></span></span>&#8221;。 其中的 <code class="literal">'transaction-manager'</code> 属性被设置为一个指向 <code class="interfacename">PlatformTransactionManager</code> bean的名字（这里指 <code class="literal">'txManager'</code>），该bean将实际上实施事务管理。</p>
<div class="tip" style="margin-left: 0.5in; margin-right: 0.5in">配置中最后一段是 <code class="literal">&lt;aop:config/&gt;</code> 的定义，它确保由 <code class="literal">'txAdvice'</code> bean定义的事务通知在应用中合适的点被执行。首先我们定义了 一个切面，它匹配 <code class="interfacename">FooService</code> 接口定义的所有操作，我们把该切面叫做 <code class="literal">'fooServiceOperation'</code>。然后我们用一个通知器（advisor）把这个切面与 <code class="literal">'txAdvice'</code> 绑定在一起，表示当 <code class="literal">'fooServiceOperation'</code> 执行时，<code class="literal">'txAdvice'</code> 定义的通知逻辑将被执行。</div>
<p>一个普遍性的需求是让整个服务层成为事务性的。满足该需求的最好方式是让切面表达式匹配服务层的所有操作方法。例如：</p>
</pre>
&lt;aop:config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;aop:pointcut id="fooServiceMethods" expression="execution(* x.y.service.*.*(..))"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/&gt;<br />
&nbsp; &lt;/aop:config&gt; 
<img src ="http://www.blogjava.net/algz/aggbug/262941.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2009-03-30 17:37 <a href="http://www.blogjava.net/algz/articles/262941.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 事务处理错误</title><link>http://www.blogjava.net/algz/articles/262893.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 30 Mar 2009 07:25:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/262893.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/262893.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/262893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/262893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/262893.html</trackback:ping><description><![CDATA[org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'BookService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; <br />
nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy0] to required type [dao.book.BookDAO] for property 'bookDAO'; <br />
nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy0] to required type [dao.book.BookDAO] for property 'bookDAO': no matching editors or conversion strategy found<br />
<br />
数据访问层没有提供接口产生的错误.<br />
解决方法: XXXDAO类都必须加上接口. 
<img src ="http://www.blogjava.net/algz/aggbug/262893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2009-03-30 15:25 <a href="http://www.blogjava.net/algz/articles/262893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]正则表达式30分钟入门教程</title><link>http://www.blogjava.net/algz/articles/229762.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 18 Sep 2008 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/229762.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/229762.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/229762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/229762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/229762.html</trackback:ping><description><![CDATA[<h1>正则表达式30分钟入门教程</h1>
<p id="meta">版本：v2.3 (2008-4-13) 作者：<a href="http://www.unibetter.com/members/deerchao.aspx">deerchao</a> 转载请注明<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm">来源</a></p>
<h2 id="contents">目录</h2>
<p class="note" id="skipContents"><a title="转到正文内容" href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission">跳过目录</a></p>
<ol>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission">本文目标</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#howtouse">如何使用本教程</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#introduction">正则表达式到底是什么东西？</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#getstarted">入门</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#testing">测试正则表达式</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#metacode">元字符</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#escape">字符转义</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#repeat">重复</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#charclass">字符类</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#alternative">分枝条件</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#negation">反义</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#grouping">分组</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#backreference">后向引用</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#lookaround">零宽断言</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#negativelookaround">负向零宽断言</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#commenting">注释</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#greedyandlazy">贪婪与懒惰</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#regexoptions">处理选项</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#balancedgroup">平衡组/递归匹配</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#more">还有些什么东西没提到</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#contact">联系作者</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#ad">最后,来点广告...</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#resources">网上的资源及本文参考文献</a>
    </li>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#updatelog">更新说明</a> </li>
</ol>
<h2 id="mission">本文目标</h2>
<p>30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。</p>
<h2 id="howtouse">如何使用本教程</h2>
<p class="important note" id="giveMe30Minutes">最重要的是&#8212;&#8212;请给我<em>30分钟</em>，如果你没有使用正则表达式的经验，请不要试图在30<em>秒</em>内入门&#8212;&#8212;除非你是超人 :)</p>
<p>别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并<span lang="zh-cn">没有</span>你想像中的那么困难。当然，如果你看完了这篇教程之后，发现自己明白了很多，却又几乎什么都记不得，那也是很正常的&#8212;&#8212;我认为，没接触过正则表达式的人在看完这篇教程后，能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理，以后你还需要多练习，多使用，才能熟练掌握正则表达式。</p>
<p>除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说，这个目标还是完成得不错的&#8212;&#8212;你看，我自己也没能把所有的东西记下来，不是吗？</p>
<p><a id="clearButton" onclick="return clearFormats();" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm">清除格式</a>&nbsp;文本格式约定：<span class="name">专业术语</span>&nbsp;<span class="code">元字符/语法格式</span>&nbsp;<span class="regex">正则表达式</span>&nbsp;<span class="part">正则表达式中的一部分(用于分析)</span>&nbsp;<span class="string">对其进行匹配的源字符串</span>&nbsp;<span class="desc">对正则表达式或其中一部分的说明</span></p>
<p><a id="hideButton" onclick="return hideNotes();" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm">隐藏边注</a>&nbsp;本文右边有一些注释，主要是用来提供一些相关信息，或者给没有程序员背景的读者解释一些基本概念，通常可以忽略。</p>
<h2 id="introduction">正则表达式到底是什么东西？</h2>
<p class="note"><span class="name">字符</span>是计算机软件处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。<span class="name">字符串</span>是0个或更多个字符的序列。<span class="name">文本</span>也就是文字，字符串。说某个字符串<span class="name">匹配</span>某个正则表达式，通常是指这个字符串里有一部分（或几部分分别）能满足表达式给出的条件。</p>
<p>在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。<span class="name">正则表达式</span>就是用于描述这些规则的工具。换句话说，正则表达式就是记录文本规则的代码。</p>
<p>很可能你使用过Windows/Dos下用于文件查找的<span class="name">通配符(wildcard)</span>，也就是<span class="code">*</span>和<span class="code">?</span>。如果你想查找某个目录下的所有的Word文档的话，你会搜索<span style="color: red;">*.doc</span>。在这里，<span class="code">*</span>会被解释成任意的字符串。和通配符类似，正则表达式也是用来进行文本匹配的工具，只不过比起通配符，它能更精确地描述你的需求&#8212;&#8212;当然，代价就是更复杂&#8212;&#8212;比如你可以编写一个正则表达式，用来查找<span class="desc">所有以0开头，后面跟着2-3个数字，然后是一个连字号&#8220;-&#8221;，最后是7或8位数字的字符串</span>(像<span class="string">010-12345678</span>或<span class="string">0376-7654321</span>)。</p>
<h2 id="getstarted">入门</h2>
<p>学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。</p>
<p>假设你在一篇英文小说里查找<span class="desc">hi</span>，你可以使用正则表达式<span class="regex">hi</span>。</p>
<p>这几乎是最简单的正则表达式了，它可以精确匹配这样的字符串：<span class="desc">由两个字符组成，前一个字符是h,后一个是i</span>。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配<span class="string">hi</span>,<span class="string">HI</span>,<span class="string">Hi</span>,<span class="string">hI</span>这四种情况中的任意一种。</p>
<p>不幸的是，很多单词里包含<span class="string">hi</span>这两个连续的字符，比如<span class="string">him</span>,<span class="string">history</span>,<span class="string">high</span>等等。用<span class="regex">hi</span>来查找的话，这里边的<span class="string">hi</span>也会被找出来。如果要<span class="desc">精确地查找hi这个单词</span>的话，我们应该使用<span class="regex">\bhi\b</span>。</p>
<p><span class="part">\b</span>是正则表达式规定的一个特殊代码（好吧，某些人叫它<span class="name">元字符，metacharacter</span>），代表着<span class="desc">单词的开头或结尾，也就是单词的分界处</span>。虽然通常英文的单词是由空格，标点符号或者换行来分隔的，但是<span class="code">\b</span>并不匹配这些单词分隔字符中的任何一个，它<strong>只匹配一个位置</strong>。</p>
<p class="note">如果需要更精确的说法，<span class="code">\b</span>匹配这样的位置：它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)<span class="code">\w</span>。</p>
<p>假如你要找的是<span class="desc">hi后面不远处跟着一个Lucy</span>，你应该用<span class="regex">\bhi\b.*\bLucy\b</span>。</p>
<p>这里，<span class="part">.</span>是另一个元字符，匹配<span class="desc">除了换行符以外的任意字符</span>。<span class="part">*</span>同样是元字符，不过它代表的不是字符，也不是位置，而是数量&#8212;&#8212;它指定*<span class="desc">前边的内容可以连续重复出现任意次以使整个表达式得到匹配</span>。因此，<span class="part">.*</span>连在一起就意味着<span class="desc">任意数量的不包含换行的字符</span>。现在<span class="regex">\bhi\b.*\bLucy\b</span>的意思就很明显了：<span class="desc">先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词</span>。</p>
<p class="note">换行符就是'\n',ASCII编码为10(十六进制0x0A)的字符。</p>
<p>如果同时使用其它元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：</p>
<p><span class="regex">0\d\d-\d\d\d\d\d\d\d\d</span>匹配这样的字符串：<span class="desc">以0开头，然后是两个数字，然后是一个连字号&#8220;-&#8221;，最后是8个数字</span>(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。</p>
<p>这里的<span class="part">\d</span>是个新的元字符，匹配<span class="desc">一位数字(0，或1，或2，或&#8230;&#8230;)</span>。<span class="part">-</span>不是元字符，只匹配它本身&#8212;&#8212;连字符或者减号。</p>
<p>为了避免那么多烦人的重复，我们也可以这样写这个表达式：<span class="regex">0\d{2}-\d{8}</span>。 这里<span class="part">\d</span>后面的<span class="part">{2}</span>(<span class="part">{8}</span>)的意思是前面<span class="part">\d</span><span class="desc">必须连续重复匹配2次(8次)</span>。</p>
<h2 id="testing">测试正则表达式</h2>
<div class="note">
<p>其它可用的测试工具:</p>
<ul>
    <li><a href="http://www.regexbuddy.com/">RegexBuddy</a>
    </li>
    <li><a href="http://regexpal.com/">Javascript正则表达式在线测试工具</a> </li>
</ul>
</div>
<p>如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以找一种工具对正则表达式进行测试是很有必要的。</p>
<p>由于在不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是微软 .Net Framework 2.0下正则表达式的行为，所以，我向你介绍一个.Net下的工具<a title="转到RegexTester的官方网站（英文）" href="http://www.dotnet2themax.com/blogs/fbalena/PermaLink,guid,13bce26d-7755-441e-92b3-1eb5f9e859f9.aspx">Regex Tester</a>。首先你确保已经安装了<a title="转到下载.Net Framework 2.0的页面" href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5">.Net Framework 2.0</a>，然后<a title="从www.unibetter.com下载Regex Tester, 75KB" href="http://www.unibetter.com/deerchao/downloads/RegexTester.zip">下载Regex Tester</a>。这是个绿色软件，下载完后打开压缩包,直接运行RegexTester.exe就可以了。</p>
<p>下面是Regex Tester运行时的截图：</p>
<p><img alt="Regex Tester运行时的截图" src="http://unibetter.com/deerchao/images/RegexTester.jpg" /></p>
<h2 id="metacode">元字符</h2>
<p>现在你已经知道几个很有用的元字符了，如<span class="code">\b</span>,<span class="code">.</span>,<span class="code">*</span>，还有<span class="code">\d</span>.正则表达式里还有更多的元字符，比如<span class="code">\s</span>匹配<span class="desc">任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等</span>。<span class="code">\w</span>匹配<span class="desc">字母或数字或下划线或汉字等</span>。</p>
<p class="note">对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的，其它环境下的具体情况请查看相关文档。</p>
<p>下面来看看更多的例子：</p>
<p><span class="regex">\ba\w*\b</span>匹配<span class="desc">以字母<span class="part">a</span>开头的单词&#8212;&#8212;先是某个单词开始处(<span class="part">\b</span>)，然后是字母<span class="part">a</span>,然后是任意数量的字母或数字(<span class="part">\w*</span>)，最后是单词结束处(<span class="part">\b</span>)</span>。</p>
<p class="note">好吧，现在我们说说正则表达式里的单词是什么意思吧：就是多于一个的连续的<span class="code">\w</span>。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大 :)</p>
<p><span class="regex">\d+</span>匹配<span class="desc">1个或更多连续的数字</span>。这里的<span class="part">+</span>是和<span class="code">*</span>类似的元字符，不同的是<span class="code">*</span>匹配<span class="desc">重复任意次(可能是0次)</span>，而<span class="code">+</span>则匹配<span class="desc">重复1次或更多次</span>。</p>
<p><span class="regex">\b\w{6}\b</span> 匹配<span class="desc">刚好6个字母/数字的单词</span>。</p>
<table cellspacing="0">
    <caption>表1.常用的元字符</caption>
    <thead>
        <tr>
            <th scope="col">代码</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">.</span></td>
            <td><span class="desc">匹配除换行符以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\w</span></td>
            <td><span class="desc">匹配字母或数字或下划线或汉字</span></td>
        </tr>
        <tr>
            <td><span class="code">\s</span></td>
            <td><span class="desc">匹配任意的空白符</span></td>
        </tr>
        <tr>
            <td><span class="code">\d</span></td>
            <td><span class="desc">匹配数字</span></td>
        </tr>
        <tr>
            <td><span class="code">\b</span></td>
            <td><span class="desc">匹配单词的开始或结束</span></td>
        </tr>
        <tr>
            <td><span class="code">^</span></td>
            <td><span class="desc">匹配字符串的开始</span></td>
        </tr>
        <tr>
            <td><span class="code">$</span></td>
            <td><span class="desc">匹配字符串的结束</span></td>
        </tr>
    </tbody>
</table>
<p>元字符<span class="code">^</span>（和数字6在同一个键位上的符号）和<span class="code">$</span>都匹配一个位置，这和<span class="code">\b</span>有点类似。<span class="code">^</span>匹配你要用来查找的字符串的开头，<span class="code">$</span>匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：<span class="regex">^\d{5,12}$</span>。</p>
<p>这里的<span class="part">{5,12}</span>和前面介绍过的<span class="part">{2}</span>是类似的，只不过<span class="part">{2}</span>匹配<span class="desc">只能不多不少重复2次</span>，<span class="part">{5,12}</span>则是<span class="desc">重复的次数不能少于5次，不能多于12次</span>，否则都不匹配。</p>
<p>因为使用了<span class="part">^</span>和<span class="part">$</span>，所以输入的整个字符串都要用来和<span class="part">\d{5,12}</span>来匹配，也就是说整个输入<span class="desc">必须是5到12个数字</span>，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。</p>
<p>和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，<span class="code">^</span>和<span class="code">$</span>的意义就变成了<span class="desc">匹配行的开始处和结束处</span>。</p>
<h2 id="escape">字符转义</h2>
<p>如果你想查找元字符本身的话，比如你查找<span class="desc">.</span>,或者<span class="desc">*</span>,就出现了问题：你没办法指定它们，因为它们会被解释成别的意思。这时你就得使用<span class="code">\</span>来取消这些字符的特殊意义。因此，你应该使用<span class="regex">\.</span>和<span class="regex">\*</span>。当然，要查找<span class="desc">\</span>本身，你也得用<span class="regex">\\</span>.</p>
<p>例如：<span class="regex">unibetter\.com</span>匹配<span class="desc">unibetter.com</span>，<span class="regex">C:\\Windows</span>匹配<span class="desc">C:\Windows</span>。</p>
<h2 id="repeat">重复</h2>
<p>你已经看过了前面的<span class="code">*</span>,<span class="code">+</span>,<span class="code">{2}</span>,<span class="code">{5,12}</span>这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码，例如*,{5,12}等)：</p>
<table cellspacing="0">
    <caption>表2.常用的限定符</caption>
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">*</span></td>
            <td><span class="desc">重复零次或更多次</span></td>
        </tr>
        <tr>
            <td><span class="code">+</span></td>
            <td><span class="desc">重复一次或更多次</span></td>
        </tr>
        <tr>
            <td><span class="code">?</span></td>
            <td><span class="desc">重复零次或一次</span></td>
        </tr>
        <tr>
            <td><span class="code">{n}</span></td>
            <td><span class="desc">重复n次</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,}</span></td>
            <td><span class="desc">重复n次或更多次</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,m}</span></td>
            <td><span class="desc">重复n到m次</span></td>
        </tr>
    </tbody>
</table>
<p>下面是一些使用重复的例子：</p>
<p><span class="regex">Windows\d+</span>匹配<span class="desc">Windows后面跟1个或更多数字</span></p>
<p><span class="regex">^\w+</span>匹配<span class="desc">一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)</span></p>
<h2 id="charclass">字符类</h2>
<p>要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集合的元字符，但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办？</p>
<p>很简单，你只需要在方括号里列出它们就行了，像<span class="regex">[aeiou]</span>就匹配<span class="desc">任何一个英文元音字母</span>，<span class="regex">[.?!]</span>匹配<span class="desc">标点符号(.或?或!)</span>。</p>
<p>我们也可以轻松地指定一个字符<span class="name">范围</span>，像<span class="regex">[0-9]</span>代表的含意与<span class="regex">\d</span>就是完全一致的：<span class="desc">一位数字</span>；同理<span class="regex">[a-z0-9A-Z_]</span>也完全等同于<span class="code">\w</span>（如果只考虑英文的话）。</p>
<p>下面是一个更复杂的表达式：<span class="regex">\(?0\d{2}[) -]?\d{8}</span>。</p>
<p class="note">&#8220;(&#8221;和&#8220;)&#8221;也是元字符，后面的<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#grouping">分组节</a>里会提到，所以在这里需要使用<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#escape">转义</a>。</p>
<p>这个表达式可以匹配<span class="desc">几种格式的电话号码</span>，像<span class="string">(010)88886666</span>，或<span class="string">022-22334455</span>，或<span class="string">02912345678</span>等。我们对它进行一些分析吧：首先是一个转义字符<span class="part">\(</span>,它能出现0次或1次(<span class="part">?</span>),然后是一个<span class="part">0</span>，后面跟着2个数字(<span class="part">\d{2}</span>)，然后是<span class="part">)</span>或<span class="part">-</span>或<span class="part">空格</span>中的一个，它出现1次或不出现(<span class="part">?</span>)，最后是8个数字(<span class="part">\d{8}</span>)。</p>
<h2 id="alternative">分枝条件</h2>
<p>不幸的是，刚才那个表达式也能匹配<span class="string">010)12345678</span>或<span class="string">(022-87654321</span>这样的&#8220;不正确&#8221;的格式。要解决这个问题，我们需要用到<span class="name">分枝条件</span>。正则表达式里的<span class="name">分枝条件</span>指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用<span class="code">|</span>把不同的规则分隔开。听不明白？没关系，看例子：</p>
<p><span class="regex">0\d{2}-\d{8}|0\d{3}-\d{7}</span>这个表达式能<span class="desc">匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)</span>。</p>
<p><span class="regex">\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}</span>这个表达式<span class="desc">匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔</span>。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。</p>
<p><span class="regex">\d{5}-\d{4}|\d{5}</span>这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：<strong>使用分枝条件时，要注意各个条件的顺序</strong>。如果你把它改成<span class="regex">\d{5}|\d{5}-\d{4}</span>的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时，将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了。</p>
<h2 id="grouping">分组</h2>
<p>我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复多个字符又该怎么办？你可以用小括号来指定<span class="name">子表达式</span>(也叫做<span class="name">分组</span>)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。</p>
<p><span class="regex">(\d{1,3}\.){3}\d{1,3}</span>是一个<span class="desc">简单的IP地址匹配</span>表达式。要理解这个表达式，请按下列顺序分析它：<span class="part">\d{1,3}</span>匹配<span class="desc">1到3位的数字</span>，<span class="part">(\d{1,3}\.){3}</span>匹配<span class="desc">三位数字加上一个英文句号(这个整体也就是这个<span class="name">分组</span>)重复3次</span>，最后再加上<span class="desc">一个一到三位的数字</span>(<span class="part">\d{1,3}</span>)。</p>
<p class="note">IP地址中每个数字都不能大于255，大家千万不要被《24》第三季的编剧给忽悠了...</p>
<p>不幸的是，它也将匹配<span class="string">256.300.888.999</span>这种不可能存在的IP地址。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：<span class="regex">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)</span>。</p>
<p>理解这个表达式的关键是理解<span class="part">2[0-4]\d|25[0-5]|[01]?\d\d?</span>，这里我就不细说了，你自己应该能分析得出来它的意义。</p>
<h2 id="negation">反义</h2>
<p>有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到<span class="name">反义</span>：</p>
<table cellspacing="0">
    <caption>表3.常用的反义代码</caption>
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">\W</span></td>
            <td><span class="desc">匹配任意不是字母，数字，下划线，汉字的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\S</span></td>
            <td><span class="desc">匹配任意不是空白符的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\D</span></td>
            <td><span class="desc">匹配任意非数字的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\B</span></td>
            <td><span class="desc">匹配不是单词开头或结束的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">[^x]</span></td>
            <td><span class="desc">匹配除了x以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span class="code">[^aeiou]</span></td>
            <td><span class="desc">匹配除了aeiou这几个字母以外的任意字符</span></td>
        </tr>
    </tbody>
</table>
<p>例子：<span class="regex">\S+</span>匹配<span class="desc">不包含空白符的字符串</span>。</p>
<p><span class="regex">&lt;a[^&gt;]+&gt;</span>匹配<span class="desc">用尖括号括起来的以a开头的字符串</span>。</p>
<h2 id="backreference">后向引用</h2>
<p>使用小括号指定一个子表达式后，<strong>匹配这个子表达式的文本</strong>(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个<span class="name">组号</span>，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。</p>
<p><span class="name">后向引用</span>用于重复搜索前面某个分组匹配的文本。例如，<span class="part">\1</span>代表<span class="desc">分组1匹配的文本</span>。难以理解？请看示例：</p>
<p><span class="regex">\b(\w+)\b\s+\1\b</span>可以用来匹配<span class="desc">重复的单词</span>，像<span class="string">go go</span>, 或者<span class="string">kitty kitty</span>。这个表达式首先是<span class="desc">一个单词</span>，也就是<span class="desc">单词开始处和结束处之间的多于一个的字母或数字</span>(<span class="part">\b(\w+)\b</span>)，这个单词会被捕获到编号为1的分组中，然后是<span class="desc">1个或几个空白符</span>(<span class="part">\s+</span>)，最后是<span class="desc">分组1中捕获的内容（也就是前面匹配的那个单词）</span>(<span class="part">\1</span>)。</p>
<p>你也可以自己指定子表达式的<span class="name">组名</span>。要指定一个子表达式的组名，请使用这样的语法：<span class="code">(?&lt;Word&gt;\w+)</span>(或者把尖括号换成<span class="code">'</span>也行：<span class="code">(?'Word'\w+)</span>),这样就把<span class="part">\w+</span>的组名指定为<span class="part">Word</span>了。要反向引用这个分组<span class="name">捕获</span>的内容，你可以使用<span class="code">\k&lt;Word&gt;</span>,所以上一个例子也可以写成这样：<span class="regex">\b(?&lt;Word&gt;\w+)\b\s+\k&lt;Word&gt;\b</span>。</p>
<p>使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：</p>
<table cellspacing="0">
    <caption>表4.常用分组语法</caption>
    <tbody>
        <tr>
            <th scope="col">分类</th>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
        <tr>
            <th rowspan="3">捕获</th>
            <td><span class="code">(exp)</span></td>
            <td><span class="desc">匹配exp,并捕获文本到自动命名的组里</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;name&gt;exp)</span></td>
            <td><span class="desc">匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</span></td>
        </tr>
        <tr>
            <td><span class="code">(?:exp)</span></td>
            <td><span class="desc">匹配exp,不捕获匹配的文本，也不给此分组分配组号</span></td>
        </tr>
        <tr>
            <th rowspan="4">零宽断言</th>
            <td><span class="code">(?=exp)</span></td>
            <td><span class="desc">匹配exp前面的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;=exp)</span></td>
            <td><span class="desc">匹配exp后面的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">(?!exp)</span></td>
            <td><span class="desc">匹配后面跟的不是exp的位置</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;!exp)</span></td>
            <td><span class="desc">匹配前面不是exp的位置</span></td>
        </tr>
        <tr>
            <th>注释</th>
            <td><span class="code">(?#comment)</span></td>
            <td><span class="desc">这种类型的分组不对正则表达式的处理产生任何影响，用于提供注释让人阅读</span></td>
        </tr>
    </tbody>
</table>
<p>我们已经讨论了前两种语法。第三个<span class="code">(?:exp)</span>不会改变正则表达式的处理方式，只是这样的组匹配的内容<span class="desc">不会像前两种那样被捕获到某个组里面，也不会拥有组号</span>。</p>
<h2 id="lookaround">零宽断言</h2>
<p class="note">地球人，是不是觉得这些术语名称太复杂，太难记了？我也和你一样。知道有这么一种东西就行了，它叫什么，随它去吧！&#8220;无名，万物之始...&#8221;</p>
<p>接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们像<span class="code">\b</span>,<span class="code">^</span>,<span class="code">$</span>那样用于指定一个位置，这个位置应该满足一定的条件(即断言)，因此它们也被称为<span class="name">零宽断言</span>。最好还是拿例子来说明吧：</p>
<p class="note">断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。</p>
<p><span class="code">(?=exp)</span>也叫<span class="name">零宽度正预测先行断言</span>，它<span class="desc">断言自身出现的位置的后面能匹配表达式exp</span>。比如<span class="regex">\b\w+(?=ing\b)</span>，匹配<span class="desc">以ing结尾的单词的前面部分(除了ing以外的部分)</span>，如查找<span class="string">I'm singing while you're dancing.</span>时，它会匹配<span class="desc">sing</span>和<span class="desc">danc</span>。</p>
<p><span class="code">(?&lt;=exp)</span>也叫<span class="name">零宽度正回顾后发断言</span>，它<span class="desc">断言自身出现的位置的前面能匹配表达式exp</span>。比如<span class="regex">(?&lt;=\bre)\w+\b</span>会匹配<span class="desc">以re开头的单词的后半部分(除了re以外的部分)</span>，例如在查找<span class="string">reading a book</span>时，它匹配<span class="desc">ading</span>。</p>
<p>假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：<span class="regex">((?&lt;=\d)\d{3})*\b</span>，用它对<span class="string">1234567890</span>进行查找时结果是<span class="desc">234567890</span>。</p>
<p>下面这个例子同时使用了这两种断言：<span class="regex">(?&lt;=\s)\d+(?=\s)</span>匹配<span class="desc">以空白符间隔的数字(再次强调，不包括这些空白符)</span>。</p>
<h2 id="negativelookaround">负向零宽断言</h2>
<p>前面我们提到过怎么查找<strong>不是某个字符或不在某个字符类里</strong>的字符的方法(反义)。但是如果我们只是想要<strong>确保某个字符没有出现，但并不想去匹配它</strong>时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：</p>
<p><span class="regex">\b\w*q[^u]\w*\b</span>匹配<span class="desc">包含<strong>后面不是字母u的字母q</strong>的单词</span>。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像<strong>Iraq</strong>,<strong>Benq</strong>，这个表达式就会出错。这是因为<span class="part">[^u]</span>总要匹配一个字符，所以如果q是单词的最后一个字符的话，后面的<span class="part">[^u]</span>将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的<span class="part">\w*\b</span>将会匹配下一个单词，于是<span class="regex">\b\w*q[^u]\w*\b</span>就能匹配整个<span class="string">Iraq fighting</span>。<span class="name">负向零宽断言</span>能解决这样的问题，因为它只匹配一个位置，并不<strong>消费</strong>任何字符。现在，我们可以这样来解决这个问题：<span class="regex">\b\w*q(?!u)\w*\b</span>。</p>
<p><span class="name">零宽度负预测先行断言</span><span class="code">(?!exp)</span>，<span class="desc">断言此位置的后面不能匹配表达式exp</span>。例如：<span class="regex">\d{3}(?!\d)</span>匹配<span class="desc">三位数字，而且这三位数字的后面不能是数字</span>；<span class="regex">\b((?!abc)\w)+\b</span>匹配<span class="desc">不包含连续字符串abc的单词</span>。</p>
<p>同理，我们可以用<span class="code">(?&lt;!exp)</span>,<span class="name">零宽度正回顾后发断言</span>来<span class="desc">断言此位置的前面不能匹配表达式exp</span>：<span class="regex">(?&lt;![a-z])\d{7}</span>匹配<span class="desc">前面不是小写字母的七位数字</span>。</p>
<p class="note">请详细分析表达式<span class="regex">(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</span>，这个表达式最能表现零宽断言的真正用途。</p>
<p>一个更复杂的例子：<span class="regex">(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</span>匹配<span class="desc">不包含属性的简单HTML标签内里的内容</span>。<span class="code">(&lt;?(\w+)&gt;)</span>指定了这样的<span class="name">前缀</span>：<span class="desc">被尖括号括起来的单词</span>(比如可能是&lt;b&gt;)，然后是<span class="part">.*</span>(任意的字符串),最后是一个<span class="name">后缀</span><span class="part">(?=&lt;\/\1&gt;)</span>。注意后缀里的<span class="part">\/</span>，它用到了前面提过的字符转义；<span class="part">\1</span>则是一个反向引用，引用的正是<span class="desc">捕获的第一组</span>，前面的<span class="part">(\w+)</span>匹配的内容，这样如果前缀实际上是&lt;b&gt;的话，后缀就是&lt;/b&gt;了。整个表达式匹配的是&lt;b&gt;和&lt;/b&gt;之间的内容(再次提醒，不包括前缀和后缀本身)。</p>
<h2 id="commenting">注释</h2>
<p>小括号的另一种用途是通过语法<span class="code">(?#comment)</span>来包含注释。例如：<span class="regex">2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)</span>。</p>
<p>要包含注释的话，最好是启用&#8220;忽略模式里的空白符&#8221;选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如，我们可以前面的一个表达式写成这样：</p>
<pre class="regex">      (?&lt;=    # 断言要匹配的文本的前缀<br />
&lt;(\w+)&gt; # 查找尖括号括起来的字母或数字(即HTML/XML标签)<br />
)       # 前缀结束<br />
.*      # 匹配任意文本<br />
(?=     # 断言要匹配的文本的后缀<br />
&lt;\/\1&gt;  # 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签<br />
)       # 后缀结束</pre>
<h2 id="greedyandlazy">贪婪与懒惰</h2>
<p>当正则表达式中包含能接受重复的限定符时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配<strong>尽可能多</strong>的字符。考虑这个表达式：<span class="regex">a.*b</span>，它将会匹配<span class="desc">最长的以a开始，以b结束的字符串</span>。如果用它来搜索<span class="string">aabab</span>的话，它会匹配整个字符串<span class="desc">aabab</span>。这被称为<span class="name">贪婪</span>匹配。</p>
<p>有时，我们更需要<span class="name">懒惰</span>匹配，也就是匹配<strong>尽可能少</strong>的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号<span class="code">?</span>。这样<span class="regex">.*?</span>就意味着<span class="desc">匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复</span>。现在看看懒惰版的例子吧：</p>
<p><span class="regex">a.*?b</span>匹配<span class="desc">最短的，以a开始，以b结束的字符串</span>。如果把它应用于<span class="string">aabab</span>的话，它会匹配<span class="desc">aab（第一到第三个字符）</span>和<span class="desc">ab（第四到第五个字符）</span>。</p>
<p class="note">为什么第一个匹配是aab（第一到第三个字符）而不是ab（第二到第三个字符）？简单地说，因为正则表达式有另一条规则，比懒惰／贪婪规则的优先级更高：最先开始的匹配拥有最高的优先权&#8212;&#8212;The match that begins earliest wins。</p>
<table cellspacing="0">
    <caption>表5.懒惰限定符</caption>
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">*?</span></td>
            <td><span class="desc">重复任意次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">+?</span></td>
            <td><span class="desc">重复1次或更多次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">??</span></td>
            <td><span class="desc">重复0次或1次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,m}?</span></td>
            <td><span class="desc">重复n到m次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class="code">{n,}?</span></td>
            <td><span class="desc">重复n次以上，但尽可能少重复</span></td>
        </tr>
    </tbody>
</table>
<h2 id="regexoptions">处理选项</h2>
<p class="note">在C#中，你可以使用<a title="MSDN 相关文档" href="http://msdn2.microsoft.com/zh-cn/library/h5845fdz.aspx">Regex(String, RegexOptions)构造函数</a>来设置正则表达式的处理选项。如：Regex regex = new Regex("\ba\w{6}\b", RegexOptions.IgnoreCase);</p>
<p>上面介绍了几个选项如忽略大小写，处理多行等，这些选项能用来改变处理正则表达式的方式。下面是.Net中常用的正则表达式选项：</p>
<table cellspacing="0">
    <caption>表6.常用的处理选项</caption>
    <thead>
        <tr>
            <th scope="col">名称</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>IgnoreCase(忽略大小写)</td>
            <td>匹配时不区分大小写。</td>
        </tr>
        <tr>
            <td>Multiline(多行模式)</td>
            <td>更改<span class="code">^</span>和<span class="code">$</span>的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,<span class="code">$</span>的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) </td>
        </tr>
        <tr>
            <td>Singleline(单行模式)</td>
            <td>更改<span class="code">.</span>的含义，使它与每一个字符匹配（包括换行符\n）。 </td>
        </tr>
        <tr>
            <td>IgnorePatternWhitespace(忽略空白)</td>
            <td>忽略表达式中的非转义空白并启用由<span class="code">#</span>标记的注释。</td>
        </tr>
        <tr>
            <td>RightToLeft(从右向左查找)</td>
            <td>匹配从右向左而不是从左向右进行。</td>
        </tr>
        <tr>
            <td>ExplicitCapture(显式捕获)</td>
            <td>仅捕获已被显式命名的组。</td>
        </tr>
        <tr>
            <td>ECMAScript(JavaScript兼容模式)</td>
            <td>使表达式的行为与它在JavaScript里的行为一致。</td>
        </tr>
    </tbody>
</table>
<p>一个经常被问到的问题是：是不是只能同时使用多行模式和单行模式中的一种？答案是：不是。这两个选项之间没有任何关系，除了它们的名字比较相似（以至于让人感到疑惑）以外。</p>
<h2 id="balancedgroup">平衡组/递归匹配</h2>
<p class="important note">这里介绍的平衡组语法是由.Net Framework支持的；其它语言／库不一定支持这种功能，或者支持此功能但需要使用不同的语法。</p>
<p>有时我们需要匹配像<span class="desc">( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构</span>，这时简单地使用<span class="code">\(.+\)</span>则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式，懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等，比如<span class="string">( 5 / ( 3 + 2 ) ) )</span>，那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的，配对的括号之间的内容呢？</p>
<p>为了避免<span class="code">(</span>和<span class="code">\(</span>把你的大脑彻底搞糊涂，我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把<span class="string">xx &lt;aa &lt;bbb&gt; &lt;bbb&gt; aa&gt; yy</span>这样的字符串里，最长的配对的尖括号内的内容捕获出来？</p>
<p>这里需要用到以下的语法构造：</p>
<ul>
    <li><span class="code">(?'group')</span> 把捕获的内容命名为group,并压入<span class="name">堆栈(Stack)</span>
    </li>
    <li><span class="code">(?'-group')</span> 从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败
    </li>
    <li><span class="code">(?(group)yes|no)</span> 如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分
    </li>
    <li><span class="code">(?!)</span> 零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败 </li>
</ul>
<p class="note">如果你不是一个程序员（或者你自称程序员但是不知道堆栈是什么东西），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个"group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配no部分。</p>
<p>我们需要做的是每碰到了左括号，就在压入一个"Open",每碰到一个右括号，就弹出一个，到了最后就看看堆栈是否为空－－如果不为空那就证明左括号比右括号多，那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符)，尽量使整个表达式得到匹配。</p>
<pre class="regex">&lt;                         #最外层的左括号<br />
[^&lt;&gt;]*                #最外层的左括号后面的不是括号的内容<br />
(<br />
(<br />
(?'Open'&lt;)    #碰到了左括号，在黑板上写一个"Open"<br />
[^&lt;&gt;]*       #匹配左括号后面的不是括号的内容<br />
)+<br />
(<br />
(?'-Open'&gt;)   #碰到了右括号，擦掉一个"Open"<br />
[^&lt;&gt;]*        #匹配右括号后面不是括号的内容<br />
)+<br />
)*<br />
(?(Open)(?!))         #在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败<br />
&gt;                         #最外层的右括号</pre>
<p>平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配<span class="desc">嵌套的&lt;div&gt;标签</span>：<span class="regex">&lt;div[^&gt;]*&gt;[^&lt;&gt;]*(((?'Open'&lt;div[^&gt;]*&gt;)[^&lt;&gt;]*)+((?'-Open'&lt;/div&gt;)[^&lt;&gt;]*)+)*(?(Open)(?!))&lt;/div&gt;</span>.</p>
<h2 id="more">还有些什么东西没提到</h2>
<p>我已经描述了构造正则表达式的大量元素，还有一些我没有提到的东西。下面是未提到的元素的列表，包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关于.net下正则表达式详细的文档。</p>
<table cellspacing="0">
    <caption>表7.尚未详细讨论的语法</caption>
    <thead>
        <tr>
            <th scope="col">代码/语法</th>
            <th scope="col">说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class="code">\a</span></td>
            <td><span class="desc">报警字符(打印它的效果是电脑嘀一声)</span></td>
        </tr>
        <tr>
            <td><span class="code">\b</span></td>
            <td><span class="desc">通常是单词分界位置，但如果在字符类里使用代表退格</span></td>
        </tr>
        <tr>
            <td><span class="code">\t</span></td>
            <td><span class="desc">制表符，Tab</span></td>
        </tr>
        <tr>
            <td><span class="code">\r</span></td>
            <td><span class="desc">回车</span></td>
        </tr>
        <tr>
            <td><span class="code">\v</span></td>
            <td><span class="desc">竖向制表符</span></td>
        </tr>
        <tr>
            <td><span class="code">\f</span></td>
            <td><span class="desc">换页符</span></td>
        </tr>
        <tr>
            <td><span class="code">\n</span></td>
            <td><span class="desc">换行符</span></td>
        </tr>
        <tr>
            <td><span class="code">\e</span></td>
            <td><span class="desc">Escape</span></td>
        </tr>
        <tr>
            <td><span class="code">\0nn</span></td>
            <td><span class="desc">ASCII代码中八进制代码为nn的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\xnn</span></td>
            <td><span class="desc">ASCII代码中十六进制代码为nn的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\unnnn</span></td>
            <td><span class="desc">Unicode代码中十六进制代码为nnnn的字符</span></td>
        </tr>
        <tr>
            <td><span class="code">\cN</span></td>
            <td><span class="desc">ASCII控制字符。比如\cC代表Ctrl+C</span></td>
        </tr>
        <tr>
            <td><span class="code">\A</span></td>
            <td><span class="desc">字符串开头(类似^，但不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class="code">\Z</span></td>
            <td><span class="desc">字符串结尾或行尾(不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class="code">\z</span></td>
            <td><span class="desc">字符串结尾(类似$，但不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class="code">\G</span></td>
            <td><span class="desc">当前搜索的开头</span></td>
        </tr>
        <tr>
            <td><span class="code">\p{name}</span></td>
            <td><span class="desc">Unicode中命名为name的字符类，例如\p{IsGreek}</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&gt;exp)</span></td>
            <td><span class="desc">贪婪子表达式</span></td>
        </tr>
        <tr>
            <td><span class="code">(?&lt;x&gt;-&lt;y&gt;exp)</span></td>
            <td><span class="desc">平衡组</span></td>
        </tr>
        <tr>
            <td><span class="code">(?im-nsx:exp)</span></td>
            <td><span class="desc">在子表达式exp中改变处理选项</span></td>
        </tr>
        <tr>
            <td><span class="code">(?im-nsx)</span></td>
            <td><span class="desc">为表达式后面的部分改变处理选项</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(exp)yes|no)</span></td>
            <td><span class="desc">把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(exp)yes)</span></td>
            <td><span class="desc">同上，只是使用空表达式作为no</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(name)yes|no)</span></td>
            <td><span class="desc">如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no</span></td>
        </tr>
        <tr>
            <td><span class="code">(?(name)yes)</span></td>
            <td><span class="desc">同上，只是使用空表达式作为no</span></td>
        </tr>
    </tbody>
</table>
<h2 id="contact">联系作者</h2>
<p>好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧？</p>
<p>要投诉我,或者觉得我其实可以做得更好,或者有任何其它问题,欢迎来<a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html">我的博客</a>让我知道.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm</p><img src ="http://www.blogjava.net/algz/aggbug/229762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-18 17:48 <a href="http://www.blogjava.net/algz/articles/229762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsf+spring+hibernate 整合出现的错误集合</title><link>http://www.blogjava.net/algz/articles/228548.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 12 Sep 2008 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/228548.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/228548.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/228548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/228548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/228548.html</trackback:ping><description><![CDATA[一.错误信息提示:<br />
<span style="color: #99cc00;">WARN [main] (Configurator.java:126) - No configuration found. Configuring ehcache from <span style="color: #339966;">ehcache-failsafe.xml </span>found in the classpath: </span>jar:file:/E:/Users/algz/workspace/.metadata/.plugins/com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/item/WEB-INF/lib/ehcache-1.1.jar!/ehcache-failsafe.xml<br />
<br />
解决方案:<br />
ehcache-1.1.jar 包下的ehcache-failsafe.xml 文件复制到 src 目录下(新建文件,复制内容). <br />
<br />
二.错误信息提示:<br />
<span style="color: #99cc00;">log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).</span><br />
<span style="color: #339966;">log4j:WARN Please initialize the log4j system properly.</span><br />
<br />
解决方案:<br />
src 目录下创建 log4j.properties 文件(具体内容,详见log4j配置文件).<br />
<br />
三.错误信息提示:<br />
<p><span style="color: #99cc00;">ERROR [main] (CGLIBLazyInitializer.java:130) - CGLIB Enhancement failed:</span> item.common.hibernate.query.partsum.Partsum<br />
<span style="color: #99cc00;">java.lang.NoSuchMethodError:</span> org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V</p>
<p><span style="color: #339966;">&nbsp;WARN [main] (PojoEntityTuplizer.java:173) - could not create proxy factory for:</span> item.common.hibernate.query.partsum.Partsum<br />
<span style="color: #339966;">org.hibernate.HibernateException: CGLIB Enhancement failed:</span> item.common.hibernate.query.partsum.Partsum</p>
<p><span style="color: #33cccc;">Caused by: java.lang.NoSuchMethodError:</span> org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V</p>
<p>///////////////////////////////////////////////////////////////////////////////////////////</p>
<p>ERROR [main] (CGLIBLazyInitializer.java:130) - CGLIB Enhancement failed: item.common.hibernate.fourm.Fourm<br />
java.lang.NoClassDefFoundError</p>
<p>&nbsp;WARN [main] (PojoEntityTuplizer.java:173) - could not create proxy factory for:item.common.hibernate.fourm.Fourm<br />
org.hibernate.HibernateException: CGLIB Enhancement failed: item.common.hibernate.fourm.Fourm</p>
<p>Caused by: java.lang.NoClassDefFoundError<br />
&nbsp;at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:116)</p>
<p>////////////////////////////////////////////////////////////////////////////////////////////</p>
<p>ERROR [main] (CGLIBLazyInitializer.java:130) - CGLIB Enhancement failed: item.common.hibernate.picture<br />
java.lang.NoClassDefFoundError</p>
<p>&nbsp;WARN [main] (PojoEntityTuplizer.java:173) - could not create proxy factory for:item.common.hibernate.picture<br />
org.hibernate.HibernateException: CGLIB Enhancement failed: item.common.hibernate.picture</p>
<p>Caused by: java.lang.NoClassDefFoundError<br />
&nbsp;at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:116)</p>
<p><br />
解决方案:<br />
Spring 和 Hibernate 共用的一些 jar 文件发生了版本冲突, 删除 WEB-INF/lib/asm-2.2.3.jar 然后重启 Tomcat.<br />
<br />
四.错误提示:<br />
<span>org.springframework.beans.factory.BeanCreationException:&nbsp;Error&nbsp;creating&nbsp;bean&nbsp;with&nbsp;name&nbsp;'SessionFactory'&nbsp;defined&nbsp;in&nbsp;<span class="keyword">class</span><span>&nbsp;path&nbsp;resource&nbsp;[applicationContext.xml]:&nbsp;Invocation&nbsp;of&nbsp;init&nbsp;method&nbsp;failed;&nbsp;nested&nbsp;exception&nbsp;is&nbsp;java.lang.NoSuchMethodError:&nbsp;org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V&nbsp;&nbsp;</span></span><br />
...<br />
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V<br />
<br />
解决方法:<br />
并不是真正的bean name错了,也不是找不到他的方法.是asm-2.2.3.jar与asm.jar冲突.<br />
<span style="color: #339966;">正确的删除asm-2.2.3.jar方法是到项目的发布文件夹\WEB-INF\lib中删除,不能用MyEclipse里删除.因为他在发布时仍没删除.</span></p>
<p><br />
</p>
<p>五。</p>
<p>严重: Exception sending context initialized event to listener instance of class <br />
<br />
org.springframework.web.context.ContextLoaderListener<br />
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in <br />
<br />
ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is <br />
<br />
org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Check<br />
&nbsp;&nbsp;&nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean<br />
<br />
(AbstractAutowireCapableBeanFactory.java:1336)<br />
<br />
&nbsp;&nbsp;&nbsp; ... 39 more<br />
2009-8-21 11:52:37 org.apache.catalina.core.StandardContext start<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="mappingResources"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;list&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;value&gt;com/dao/Check.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;value&gt;./Check.hbm.xml&lt;/value&gt;&lt;/list&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/property&gt;</p>
<p><br />
</p>
<p>六。</p>
<p>&nbsp;&lt;class catalog="page" name="com.dao.Check" table="check0908100816"&gt;<br />
&nbsp; &lt;id name="checkid" type="java.lang.Integer"&gt;<br />
&nbsp;&nbsp; &lt;column name="checkid"/&gt;<br />
&nbsp;&nbsp; &lt;generator class="native"/&gt;<br />
&nbsp; &lt;/id&gt;<br />
<br />
<br />
严重: Exception sending context initialized event to listener instance of class <br />
<br />
org.springframework.web.context.ContextLoaderListener<br />
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in <br />
<br />
ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is <br />
<br />
org.hibernate.MappingException: entity class not found: Check<br />
&nbsp;&nbsp;&nbsp; at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean<br />
&nbsp;&nbsp;&nbsp; ... 52 more<br />
2009-8-21 11:56:45 org.apache.catalina.core.StandardContext start<br />
</p>
<img src ="http://www.blogjava.net/algz/aggbug/228548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-12 11:25 <a href="http://www.blogjava.net/algz/articles/228548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String,int,Integer,char 类型转换</title><link>http://www.blogjava.net/algz/articles/227937.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 09 Sep 2008 06:18:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/227937.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/227937.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/227937.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/227937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/227937.html</trackback:ping><description><![CDATA[<p><strong>&nbsp;如何将字串 String 转换成整数 int?</strong> <br />
int i = Integer.valueOf(my_str).intValue(); </p>
<p>int i=Integer.parseInt(str); </p>
<p><strong>如何将字串 String 转换成Integer ?</strong><br />
Integer integer=Integer.valueOf(str); </p>
<p><strong>如何将整数 int 转换成字串 String ?</strong> <br />
1.) String s = String.valueOf(i);<br />
&nbsp;<br />
2.) String s = Integer.toString(i); <br />
&nbsp;<br />
3.) String s = "" + i; <br />
<br />
<strong>如何将整数 int 转换成Integer ?</strong> <br />
Integer integer=new Integer(i); </p>
<p><strong>如何将Integer 转换成字串 String ?</strong> <br />
Integer integer＝String </p>
<p><strong>如何将Integer 转换成 int ?</strong> <br />
int num=Integer.intValue(); </p>
<p><strong>如何将String转换成&nbsp; BigDecimal&nbsp; ?</strong> <br />
&nbsp;BigDecimal d_id = new BigDecimal(str); <br />
</p>
<p><br />
<strong>如何将 String 转换成 char ?</strong><br />
char[] ca="123".toCharArray();<br />
<br />
<strong>如何将char转换成String?</strong><br />
String s=ca.toString();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //任何类型都可以采用toString()转换成String类型<br />
<br />
//-----------------日期------------------------- </p>
<p>Calendar calendar=Calendar.getInstance();<br />
&nbsp; int year=calendar.get(Calendar.YEAR);<br />
&nbsp; int month=calendar.get(Calendar.MONTH)+1;<br />
&nbsp; int day=calendar.get(Calendar.DATE); </p>
<p>获取今天的日期字符串<br />
String today=java.text.DateFormat.getDateInstance().format(new java.util.Date());<br />
获取今天的日期<br />
new java.sql.Date(System.currentTimeMillis()) </p>
 <img src ="http://www.blogjava.net/algz/aggbug/227937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-09 14:18 <a href="http://www.blogjava.net/algz/articles/227937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse 手动逆向数据库表格</title><link>http://www.blogjava.net/algz/articles/223460.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 21 Aug 2008 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/223460.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/223460.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/223460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/223460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/223460.html</trackback:ping><description><![CDATA[<img alt="" src="http://www.blogjava.net/images/blogjava_net/algz/myeclipse.jpg" border="0" width="570" height="438" /><br />
(一)&nbsp; 在其中的 <span style="color: rgb(0, 128, 0);">"Spring DAO"</span> 无法选中的情况下,按上图配置,然后在完成后产生的一些文件中,只留下<span style="color: rgb(51, 102, 255);">POJO</span>,<span style="color: rgb(51, 102, 255);">DAO</span>,<span style="color: rgb(51, 102, 255);">XML</span>三个文件.<br />
如:<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/algz/myeclipse1.jpg" border="0" width="223" height="139" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;=&nbsp;转化为=&gt;&nbsp;&nbsp; <img alt="" src="http://www.blogjava.net/images/blogjava_net/algz/myeclipse2.jpg" border="0" width="205" height="79" /><br />
<br />
(二)&nbsp; 修改其中的<span style="color: rgb(0, 128, 0);">DAO文件</span>.<br />
如 <br />
"public class FourmDAO extends <span style="color: rgb(153, 204, 0);"><span style="color: rgb(128, 128, 0);">BaseHibernateDAO </span></span>{..."&nbsp;&nbsp; &lt;=转化为=&gt;&nbsp;&nbsp; "public class FourmDAO extends <span style="color: rgb(128, 128, 0);">HibernateDaoSupport </span>{..."<br />
<br />
(三)&nbsp; Spring 的 xml文件中 <span style="color: rgb(0, 128, 0);"><span style="color: rgb(0, 128, 0);">applicationContext.xml </span></span>添加如下代码<br />
&nbsp;&lt;bean id="sessionFactory"<br />
&nbsp;&nbsp;class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br />
&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="dataSource" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="hibernateProperties"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="mappingResources"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;item/common/hibernate/picture.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;item/common/hibernate/fourm/Fourm.hbm.xml&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0, 128, 128);">&lt;value&gt;item/common/hibernate/tem/Fourm.hbm.xml&lt;/value&gt;</span><br />
&nbsp; &lt;/list&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;&lt;/bean&gt;<br />
&nbsp;&nbsp;<br />
<span style="color: rgb(0, 128, 128);">&nbsp;&lt;bean id="fourmDAO" class="item.common.hibernate.tem.FourmDAO"&gt;<br />
&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;</span>
<img src ="http://www.blogjava.net/algz/aggbug/223460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-08-21 12:43 <a href="http://www.blogjava.net/algz/articles/223460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取ApplicationContext.xml文件中定义的BEAN</title><link>http://www.blogjava.net/algz/articles/222982.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 19 Aug 2008 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/222982.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/222982.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/222982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/222982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/222982.html</trackback:ping><description><![CDATA[<p>jsp文件:<br />
&lt;%@ page import="javax.servlet.ServletContext" %&gt;<br />
&lt;%@ page import="org.springframework.context.ApplicationContext" %&gt;<br />
&lt;%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %&gt;<br />
<br />
&lt;% <br />
<span style="color: #339966">//获取ApplicationContext对象</span><br />
ServletContext&nbsp;&nbsp; servletContext&nbsp;&nbsp; =&nbsp;&nbsp; request.getSession().getServletContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
ApplicationContext&nbsp;&nbsp; ac&nbsp;&nbsp; =&nbsp;&nbsp; WebApplicationContextUtils.getWebApplicationContext(servletContext); </p>
<p><span style="color: #339966">//获取ApplicationContext.xml文件中定义的BEAN</span><br />
PictureService ps=(PictureService)ac.getBean("pictureService");</p>
<img src ="http://www.blogjava.net/algz/aggbug/222982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-08-19 13:26 <a href="http://www.blogjava.net/algz/articles/222982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webapps JSF+Spring+Hibernate项目开发流程</title><link>http://www.blogjava.net/algz/articles/190077.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 01 Apr 2008 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/190077.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/190077.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/190077.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/190077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/190077.html</trackback:ping><description><![CDATA[&lt;h:outputText value="主题：#{index.appinfo.maxdocsum} value里不能加入HTML代码但可以加入EL" /&gt;<br />
<br />
序.画流程图.<br />
<span style="color: #008000">一.创建数据库.</span><br />
注:<br />
1.数据库中设计INT(java.lang.Interger),&nbsp; VARCHAR(N)(java.lang.String),&nbsp; DATE(java.lang.Date)<br />
2.1:N的情况下, 数据库中设计外键(N方)和集合(一方).<br />
2.hibernate 返向工程.<br />
<br />
<span style="color: #008000">二.添加JSF, Spring,&nbsp;Hibernate 库引用.<br />
<span style="color: #000000">Spring 添加如下：</span><br />
</span><img height="98" alt="" src="http://www.blogjava.net/images/blogjava_net/algz/addspring1.jpg" width="397" border="0" /><br />
<img height="95" alt="" src="http://www.blogjava.net/images/blogjava_net/algz/addspring2.jpg" width="394" border="0" /><br />
<br />
<span style="color: #008000">三. 为spring 配置 web.xml 和 faces-config.xml .</span><br />
(1)web.xml<br />
&nbsp;&lt;context-param&gt;<br />
&nbsp;&nbsp;&lt;param-name&gt;<span style="color: #339966">contextConfigLocation</span>&lt;/param-name&gt;<br />
&nbsp;&nbsp;&lt;param-value&gt;/WEB-INF/applicationContext.xml&lt;/param-value&gt;<br />
&nbsp;&lt;/context-param&gt;<br />
<br />
(2)web.xml<br />
&lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-class&gt;<span style="color: #339966">org.springframework.web.context.ContextLoaderListener</span>&lt;/listener-class&gt;<br />
&lt;/listener&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Servlet API 2.3以后<br />
或:<br />
&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&lt;servlet-name&gt;context&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br />
&nbsp;&lt;/servlet&gt;
<p><br />
(3)faces-config.xml<br />
&lt;application&gt;<br />
&lt;variable-resolver&gt;<span style="color: #339966">org.springframework.web.jsf.DelegatingVariableResolver</span>&lt;/variable-resolver&gt;<br />
&lt;/application&gt;<br />
<br />
(4)设置过滤器,解决乱码问题<br />
详见:<a href="http://www.blogjava.net/algz/articles/201833.html ">http://www.blogjava.net/algz/articles/201833.html </a>第二条<br />
<br />
以上配置完成后.<span style="color: #33cccc">JSF</span>就可以访问<span style="color: #33cccc">SPRING管理的BEAN</span>.<br />
<br />
<span style="color: #339966"><span style="color: #339966"><span style="color: #008000">四.spring+hiberante集成时,asm-2.2.3.jar与asm.jar冲突:</span><br />
</span></span><span>org.springframework.beans.factory.BeanCreationException:&nbsp;Error&nbsp;creating&nbsp;bean&nbsp;with&nbsp;name&nbsp;'SessionFactory'&nbsp;defined&nbsp;in&nbsp;<span class="keyword">class</span><span>&nbsp;path&nbsp;resource&nbsp;[applicationContext.xml]:&nbsp;Invocation&nbsp;of&nbsp;init&nbsp;method&nbsp;failed;&nbsp;nested&nbsp;exception&nbsp;is&nbsp;java.lang.NoSuchMethodError:&nbsp;org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V&nbsp;&nbsp;</span></span><br />
...<br />
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V<br />
<br />
正确的解决方法:<br />
<span style="color: #000000">是到项目的发布文件夹\WEB-INF\lib下删除<span style="color: #339966">asm-2.2.3.jar</span>,不能用MyEclipse里删除.因为他在发布时仍没删除.</span><br />
<br />
<span style="color: #008000">五.创建进行分类的包.<br />
</span>com.dao(数据访问层), com.service(业务层), com.web(表示层)<br />
<br />
<span style="color: #008000">六.创建类.(完成MODEL层设计).&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; <br />
<span style="color: #000000">*****************************(<u>也可以利用MyEclipse反向ORM功能自动产生,<span style="color: #339966">但应注意自动配置引起的"类完全名"的错误</span></u>)*******************</span><br />
<br />
</span>&nbsp; (一)数据访问层(<span style="color: #008000">DAO</span>)开发:&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring 配置文件（附加）&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)配置数据源&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span> ...&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Myeclipse Hibernate自动反转工具自动配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)配置会话工厂&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">" ...&gt;&nbsp; //Myeclipse Hibernate自动反转工具自动配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)<span style="color: #000000"><span style="color: #000000"><span style="color: #000000">配置事务管理器</span>&nbsp; </span>&lt;bean id="transactionManager" ...&gt;<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)配置事务代理&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/algz/articles/163236.html">www.blogjava.net/algz/articles/163236.html</a><br />
<span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000">&nbsp;<span style="color: #000000">(5)数据访问层<span style="color: #808000">Bean</span>作为属性注入业务层<span style="color: #808000">Property</span>中. </span></span>(注:不要用NEW创建数据访问层对象,否则得不到ServletContext而报错.)<br />
</span>例:<br />
/**数据访问层Bean（Myeclipse Hibernate自动反转工具配置）*/<br />
&nbsp;&lt;bean id="<span style="color: #99cc00">userDao</span>" class="com.data.dao.impl.UserDaoImpl"&gt;<br />
&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
&nbsp;/**业务层Bean（Myeclipse Spring配置文档中可以配置，但需先定义好相关类）*/<br />
&nbsp;&lt;bean id="<span style="color: #33cccc">userService</span>" class="com.model.service.impl.UserServiceImpl"&gt;<br />
&nbsp;&nbsp;&lt;property name="userDao"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="<span style="color: #99cc00">userDao</span>" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 创建&nbsp;<span style="color: #99cc00">数据访问层接口:&nbsp;&nbsp;&nbsp; </span><span style="color: #008080">必须创建</span>,详见:<a href="http://www.blogjava.net/algz/articles/262893.html">http://www.blogjava.net/algz/articles/262893.html</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public interface <span style="color: #99cc00">数据访问层接口 </span>{&nbsp;&nbsp; //在类已存在的情况下,添加其接口:Refactor(重构）-&gt;Extract Interfaces提取接口<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public String add...();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public String save...();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //update, delete, load<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 .创建<span style="color: #33cccc">数据访问层实现类</span>&nbsp;&nbsp;&nbsp; //<span style="color: #000000"><span style="color: #000000">ORM反向功能自动配置<br />
</span></span><span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">&nbsp;public class </span><span style="color: #33cccc">数据访问层实现类</span> <span style="color: #000000">extends&nbsp;<span style="color: #339966">HibernateDaoSupport</span>&nbsp;implements </span><span style="color: #99cc00">数据访问层接口 </span></span>{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //getHibernateTemplate().save(user)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在实现类的方法(throw DataAccessException)中封装 getHibernateTemplate().save(user) 等Spring已封装的持久化方法.(注:如果使用Hibernate API 要用try{...}catch{...}自行处理导常.)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.注意事项:<span style="color: #3366ff">&nbsp;could not initialize proxy - no Session&nbsp;</span>异常,&nbsp; 可能是没有联表查询.详见<a href="http://www.blogjava.net/algz/articles/191835.html"><font color="#000000">: </font>http://www.blogjava.net/algz/articles/191835.html</a><br />
<br />
<br />
<span style="color: #000000"><span style="color: #000000">*****************************(<u>也可以利用MyEclipse反向ORM功能自动产生</u>)***********************************</span></span><br />
<br />
&nbsp;&nbsp;&nbsp;(二)业务逻辑层(<span style="color: #33cccc"><span style="color: #008000">Service</span></span>)开发:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.创建<span style="color: #99cc00">业务逻辑层接口</span>.&nbsp;<br />
package com.service;<br />
import com.dao.CheckDAO;<br />
public interface <span style="color: #99cc00">ICheckService </span>{<br />
&nbsp;&nbsp;&nbsp; public abstract CheckDAO getCheckDAO();<br />
&nbsp;&nbsp;&nbsp; public abstract void setCheckDAO(CheckDAO checkDAO);<br />
&nbsp;&nbsp;&nbsp; public abstract String searchCheck();<br />
}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.创建<span style="color: #33cccc">业务逻辑层实现类</span>&nbsp;<br />
<span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public class&nbsp;<span style="color: #33cccc">业务逻辑层实现类</span>&nbsp;implements <span style="color: #99cc00">业务逻辑层接口</span></span>.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在实现类中. 引用的数据访问层对象实例采用DI的设值方式注入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在业务逻辑方法(throw DataAccessException)中,使用数据访问层对象实例来访问数据库.&nbsp;&nbsp;<br />
package com.service;<br />
import java.util.List;<br />
import org.json.simple.JSONArray;<br />
import org.json.simple.JSONObject;<br />
import com.dao.Check;<br />
import com.dao.CheckDAO;<br />
import com.dao.ICheckDAO;<br />
<br />
public class <span style="color: #33cccc">CheckService </span>implements <span style="color: #99cc00">ICheckService </span>{<br />
private CheckDAO checkDAO;</p>
<p>public CheckDAO getCheckDAO() {<br />
&nbsp;return checkDAO;<br />
}</p>
<p>public void setCheckDAO(CheckDAO checkDAO) {<br />
&nbsp;this.checkDAO = checkDAO;<br />
}<br />
<br />
public String searchCheck(){<br />
&nbsp;List&lt;Check&gt; l=checkDAO.findAll();<br />
&nbsp;JSONArray ja=new JSONArray();<br />
&nbsp;JSONObject jo=new JSONObject();<br />
for(Check c:l){<br />
//&nbsp;&nbsp;jo.put("department", c.getDepartment());<br />
//&nbsp;&nbsp;jo.put("checkid", c.getCheckid());<br />
//&nbsp;&nbsp;jo.put("nam", c.getNam());<br />
//&nbsp;&nbsp;jo.put("num", c.getNum());<br />
//&nbsp;&nbsp;jo.put("ondutytime", c.getOndutytime());<br />
//&nbsp;&nbsp;jo.put("offdutytime", c.getOffdutytime1());<br />
//&nbsp;&nbsp;jo.put("registerdate", c.getRegisterdate());<br />
//&nbsp;&nbsp;jo.put("overtime", c.getOvertime());<br />
//&nbsp;&nbsp;ja.add(jo.clone());<br />
//&nbsp;&nbsp;jo.clear();<br />
&nbsp;}<br />
&nbsp;&nbsp;return "";<br />
}</p>
<p>}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808000"><span style="color: #000000">3.数据</span><span style="color: #000000">访问层<span style="color: #808000">Bean</span>作为属性注入<span style="color: #33cccc">业务逻辑层实现类</span>的<span style="color: #808000">Property</span>中. </span></span>(注:不要用NEW创建数据访问层对象,否则得不到ServletContext而报错.)<br />
例:<br />
/**数据访问层Bean（Hibernate自动反转工具<span style="color: #008000">自动</span>配置）*/<br />
&nbsp;&lt;bean id="<span style="color: #99cc00">userDao</span>" class="com.data.dao.impl.UserDaoImpl"&gt;<br />
&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
&nbsp;/**业务逻辑层Bean（Spring配置文档中<span style="color: #008000">手动</span>配置，但需先定义好相关类）*/<br />
&nbsp;&lt;bean id="<span style="color: #33cccc">userService</span>" class="com.model.service.impl.UserServiceImpl"&gt;<br />
&nbsp;&nbsp;&lt;property name="userDao"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref bean="<span style="color: #99cc00">userDao</span>" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
<span style="color: #008000">&nbsp;&nbsp;&nbsp;(三).表示层开发<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">(1)在 faces-config.xml 中配置托管BEAN</span></span>.(实现<font color="#008000">控制层</font>层设计) <br />
<span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 业务层bean作为属性注入CONTROL层中.<br />
</p>
<p><span style="color: #000000"><br />
package com.web;</span><span style="color: #000000"><br />
import com.service.ICheckService;<br />
</span><span style="color: #000000"><br />
public class SearchAll {<br />
&nbsp;private <span style="color: #339966">ICheckService </span>searchService;<br />
&nbsp;private String searchData;</span></p>
<p><span style="color: #000000">&nbsp;public SearchAll() {<br />
&nbsp;}</span></p>
<p><span style="color: #000000">&nbsp;public <span style="color: #339966">ICheckService </span>getSearchService() {<br />
&nbsp;&nbsp;return searchService;<br />
&nbsp;}</span></p>
<p><span style="color: #000000">&nbsp;public void setSearchService(<span style="color: #339966">ICheckService </span>searchService) {<br />
&nbsp;&nbsp;this.searchService = searchService;<br />
&nbsp;}</span></p>
<p><span style="color: #000000">&nbsp;public String getSearchData() {<br />
&nbsp;&nbsp;searchData = searchService.searchCheck();<br />
&nbsp;&nbsp;return searchData;<br />
&nbsp;}</span></p>
<p><span style="color: #000000">&nbsp;public void setSearchData(String searchData) {<br />
&nbsp;&nbsp;this.searchData = searchData;<br />
&nbsp;}<br />
}</span><br />
<br />
<span style="color: #000000">&nbsp;&lt;managed-bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;<span style="color: #3366ff">userBean</span>&lt;/managed-bean-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;com.web.SearchAll&lt;/managed-bean-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;property-name&gt;searchService&lt;/property-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt; <span style="color: #33cccc">#{userService}</span>&lt;/value&gt;&nbsp;&nbsp;&nbsp;<span style="color: #3366ff"><span style="color: #008080">&nbsp;//直接引用spring定义的bean</span><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;managed-property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;searchData&lt;/property-name&gt;&nbsp;&nbsp;&nbsp; //页面中 userBean.name访问属性的数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;123&lt;/value&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//属性默认值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/managed-property&gt;<br />
&nbsp;&lt;/managed-bean&gt;</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">(2)Bean访问客户端传来的参数值<br />
</span>&nbsp;&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request=(HttpServletRequest)<span style="color: #008000">&nbsp;FacesContext</span>.<span style="color: #008000">getCurrentInstance</span>().<span style="color: #008000">getExternalContext</span>().<span style="color: #008000">getRequest</span>();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s=request.<span style="color: #008000">getParameter</span>("webnam");</span><br />
<br />
</span><span style="color: #008000">七.页面设计</span>.(实现<span style="color: #008000">VIEW</span>层设计)&nbsp;<br />
<br />
index.faces：(共二行)<br />
<span style="color: #008000"><span style="color: #99cc00">&lt;%@ page language="java" pageEncoding="UTF-8"%&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//解决EXTJS&nbsp;接收数据中有中文出现"?????"等乱码<br />
&nbsp;${searchAll.searchData}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//解决JS接收数据.Ext.store({url：index.faces，...})</span></span><br />
<br />
&nbsp;&nbsp;&nbsp; 页面中访问Bean的二种方法<br />
<span style="color: #99cc00">&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">方法一：直接在.faces页面中使用${<span style="color: #00ccff">userBean</span>.property} <strong>(推荐)&nbsp;</strong></span><strong>&nbsp;//property:get/set&nbsp;methord</strong></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注,不能使用${<span style="color: #00ccff">userBean</span>.method}<br />
<span style="color: #339966"><br />
</span>&nbsp;&nbsp;&nbsp; &lt;f:view&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //JSF标签必须放在里面<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 名稱1: ${userBean.searchData}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //正确<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339966">&nbsp; <span style="color: #008080">//#{userBean.searchData}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //报错</span><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 名稱2: &lt;h:inputText value="#{userBean.searchData}"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //正确<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008080">//&lt;h:inputText value="${userBean.searchData}"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //报错<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&lt;input value="#{userBean.searchData}"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //报错<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">名稱3:</span>&nbsp;<span style="color: #000000">&lt;input value="${userBean.searchData}"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //正确,而且仍然可以使用JSF的ManagedBean</span><br />
</span>&nbsp;&nbsp;&nbsp; &lt;/f:view&gt;<br />
JSF表达式<span style="color: #339966">#{...}</span>只能用在JSF标签里，JSP表达式<span style="color: #339966">${...}</span>也只能用JSP页面里.<br />
JSP EL的语法格式:${...} 不能放在&lt;%...%&gt;中.&nbsp;<span style="color: #008000"><span style="color: #99cc00"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #3366ff">方法二： 在.JSP页面中,直接获取业务层定义的BEAN<br />
</span></span></span>&lt;%@ page import="javax.servlet.ServletContext" %&gt;<br />
&lt;%@ page import="org.springframework.context.ApplicationContext" %&gt;<br />
&lt;%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %&gt;<br />
<br />
&lt;% <br />
<span style="color: #339966">//获取ApplicationContext对象</span><br />
ServletContext&nbsp;&nbsp; servletContext&nbsp;&nbsp; =&nbsp;&nbsp; request.getSession().getServletContext();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
ApplicationContext&nbsp;&nbsp; ac&nbsp;&nbsp; =&nbsp;&nbsp; WebApplicationContextUtils.getWebApplicationContext(servletContext); </p>
<p><span style="color: #339966">//获取ApplicationContext.xml文件中定义的BEAN</span><br />
userServiceps=(userService)ac.getBean("userService");<br />
<br />
<span style="color: #339966">八.导出war</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File-&gt;Export-&gt;J2EE-&gt;WAR file</p>
<img src ="http://www.blogjava.net/algz/aggbug/190077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-04-01 14:48 <a href="http://www.blogjava.net/algz/articles/190077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring + Hibernate 数据层+业务层开发框架</title><link>http://www.blogjava.net/algz/articles/187053.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 18 Mar 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/187053.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/187053.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/187053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/187053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/187053.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 题外话:之从有了框架后,后台的一切开发都变的不那么复杂了,应该说成是简单了.对于数据访问的开发,都是趋于接口的编程.记住,接口编程!<br />
<br />
&nbsp; (一)数据访问层开发:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1) 创建<span style="color: #99cc00">数据访问层接口</span>.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2) 创建 <span style="color: #339966">public class <span style="color: #33cccc">数据访问层实现类</span> extends&nbsp;HibernateDaoSupport&nbsp;implements <span style="color: #99cc00">数据访问层接口</span></span>.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在实现类的方法(throw DataAccessException)中封装 getHibernateTemplate().save(user) 等Spring已封装的持久化方法.(注:如果使用Hibernate API 要用try{}catch{}自行处理导常.)</p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *************************************<br />
<br />
&nbsp;&nbsp;&nbsp;(二)业务逻辑层开发:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)创建<span style="color: #99cc00">业务逻辑层接口</span>.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)创建 <span style="color: #339966">public class&nbsp;<span style="color: #33cccc">业务逻辑层实现类</span>&nbsp;implements <span style="color: #99cc00">业务逻辑层接口</span></span>.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在实现类中. 引用的数据访问层对象实例采用DI的设值方式注入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在业务逻辑方法(throw DataAccessException)中,使用数据访问层对象实例来访问数据库.&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *************************************<br />
<br />
&nbsp;&nbsp;&nbsp; (三) Spring 配置文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)配置数据源&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span> ...&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)配置会话工厂&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">" ...&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)<span style="color: #000000"><span style="color: #000000"><span style="color: #000000">配置事务管理器</span>&nbsp; </span>&lt;bean id="transactionManager" ...&gt;<br />
</span></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (4)配置事务代理&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.blogjava.net/algz/articles/163236.html">www.blogjava.net/algz/articles/163236.html</a><br />
例:<br />
&nbsp;&nbsp;&nbsp;<span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;!</span><span style="color: #000000">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">-//SPRING//DTD&nbsp;BEAN//EN</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/dtd/spring-beans.dtd</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">beans</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.apache.commons.dbcp.BasicDataSource</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;destroy</span><span style="color: #000000">-</span><span style="color: #000000">method</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">close</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">driverClassName</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">url</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><span style="color: #008000">jdbc:mysql://localhost/test</span></span><span style="color: #008000"><span style="color: #000000">&lt;/value&gt;<br />
</span></span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">username</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;<span style="color: #99cc00">用户名</span></span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- &lt;value /&gt;设置的值,自动转换为字符串,不用加引号.如:"用户名" X &nbsp;--&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">password</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;<span style="color: #99cc00">密码</span></span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000"><span style="color: #339966">&lt;!--&nbsp;配置sessionFactory&nbsp;&nbsp;--&gt;</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.springframework.orm.hibernate3.LocalSessionFactoryBean</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&nbsp;&nbsp; <span style="color: #339966">&lt;!-- 数据源 --&gt;<br />
</span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;local</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">mappingResources</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&nbsp;&nbsp;&nbsp; <span style="color: #339966">&lt;!-- ORM映射文件 --&gt;</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">list</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">com</span><span style="color: #000000">/</span><span style="color: #000000">test</span><span style="color: #000000">/</span><span style="color: #000000">Hibernate</span><span style="color: #000000">/</span><span style="color: #000000">User.hbm.xml</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">list</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hibernateProperties</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&nbsp;&nbsp;&nbsp; <span style="color: #339966">&lt;!-- Hibernate&nbsp;属性 --&gt;</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">props</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">prop&nbsp;key</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hibernate.dialect</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">org.hibernate.dialect.MySQLDialect</span><span style="color: #000000">&lt;/</span><span style="color: #000000">prop</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;</span><span style="color: #000000">prop&nbsp;key</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hibernate.show_sql</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #0000ff">true</span><span style="color: #000000">&lt;/</span><span style="color: #000000">prop</span><span style="color: #000000">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #339966">&lt;!--控制台显示--&gt;<br />
</span></span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">props</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;<br />
<br />
</span><span style="color: #000000"><span style="color: #000000"><span style="color: #339966">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp;配置事务管理器&nbsp;&nbsp;--&gt;</span></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="userDAO" class="com.test.数据访问层实现类"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #000000"><span style="color: #339966">&lt;!-- 声明式事务代理其中方法一&nbsp;&nbsp;--&gt;</span></span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="userDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionManager"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="transactionManager" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="target"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref local="userDAO" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionAttributes"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="insert*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="is*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean name="/login" class="业务层实现类" singleton="false"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="userDAO"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="userDAOProxy" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/beans&gt;<br />
</span>
<img src ="http://www.blogjava.net/algz/aggbug/187053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-03-18 17:39 <a href="http://www.blogjava.net/algz/articles/187053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 1.2声明式事务管理(三种动态事务代理区别)</title><link>http://www.blogjava.net/algz/articles/163236.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 26 Nov 2007 09:00:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/163236.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/163236.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/163236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/163236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/163236.html</trackback:ping><description><![CDATA[<p>Spring 2.0 事务处理方式<a href="http://www.blogjava.net/algz/articles/262941.html"><font color="#000000">: </font>http://www.blogjava.net/algz/articles/262941.html</a><br />
<br />
前者:&nbsp;&nbsp;&nbsp;都需创建<span style="color: #808000">HibernateTransactionManager</span>类.<br />
&lt;bean id="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />
&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;ref local="sessionFactory" /&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
(一)org.springframework.transaction.interceptor.<span style="color: #808000">TransactionProxyFactoryBean</span>:&nbsp; 创建代理事务.<br />
<br />
事务代理Bean:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #008000">userDAOProxy</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">transactionManager</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">transactionManager</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">target</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;local</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #008000">userDAO</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">transactionAttributes</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">props</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">prop&nbsp;key</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">insert*</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #000000">&lt;/</span><span style="color: #000000">prop</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">props</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span></div>
<p><br />
引用代理Bean:</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">/login</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.test.struts.action.LoginAction</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;singleton</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">false</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #008000">userDAO</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000">这里的userDAO是LoginAction的属性</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #008000">userDAOProxy</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000"><span style="color: #008080">ref&nbsp;bean=userDAO</span></span><span style="color: #000000">,&nbsp;&nbsp;调用的是<span style="color: #008080">原来的Bean</span>,&nbsp;&nbsp;则<span style="color: #008080">不是在事务中运行</span></span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span></div>
<p><br />
<br />
(二)org.springframework.aop.framework.autoproxy.<span style="color: #808000">BeanNameAutoProxyCreator</span>:&nbsp; 根据BeanName自动创建事务代理<br />
org.springframework.transaction.interceptor.<span style="color: #808000">TransactionInterceptor</span>:&nbsp; 拦截器<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&lt;!--</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;无需引用代理BEAN(bean id 可去掉),业务层(/login)可<span style="color: #008080">直接调用原来的Bean==&gt;userDAO</span>(userDAO已封装入事务)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">beanNames</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #99cc00">userDAO</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">interceptorNames</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">list</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">transactionInterceptorName</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">list</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;!--</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;拦截器,定义事务策略&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #008000">transactionInterceptorName</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.springframework.transaction.interceptor.TransactionInterceptor</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">transactionAttributes</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">props</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">prop&nbsp;key</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">*</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">PROPAGATION_REQUIRED</span><span style="color: #000000">&lt;/</span><span style="color: #000000">prop</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;!--</span><span style="color: #000000">事务策略定义</span><span style="color: #000000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">props</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">transactionManager</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">ref&nbsp;local</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">transactionManager</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span></div>
<p><br />
&nbsp;</p>
(三)<span style="color: #808000">DefaultAdvisorAutoProxyCreator</span>:&nbsp; 自动创建事务代理.(与二类似) 
<img src ="http://www.blogjava.net/algz/aggbug/163236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-26 17:00 <a href="http://www.blogjava.net/algz/articles/163236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中ref local与ref bean区别</title><link>http://www.blogjava.net/algz/articles/163072.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 26 Nov 2007 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/163072.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/163072.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/163072.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/163072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/163072.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left" align="left"><span style="font-size: 9pt; color: teal; font-family: 'courier new'">今天在做SSH框架Demo实例时,在ApplicationResources.properties文件时对&lt;ref bean&gt;与&lt;ref local&gt;感到不解,经查找资料才弄明白,如下:<br />
<br />
&nbsp;&nbsp;&nbsp;&lt;</span> <span style="font-size: 9pt; color: #3f7f7f; font-family: 'courier new'">bean </span><span style="font-size: 9pt; color: #7f007f; font-family: 'courier new'">id</span> <span style="font-size: 9pt; color: black; font-family: 'courier new'">=</span> <span style="font-size: 9pt; color: #2a00ff; font-family: 'courier new'">"userDAOProxy"</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: #2a00ff; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: #7f007f; font-family: 'courier new'">class</span> <span style="font-size: 9pt; color: black; font-family: 'courier new'">=</span> <span style="font-size: 9pt; color: #2a00ff; font-family: 'courier new'">"org.springframework.transaction.interceptor.TransactionProxyFactoryBean"</span> <span style="font-size: 9pt; color: teal; font-family: 'courier new'">&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: teal; font-family: 'courier new'">&lt;</span> <span style="font-size: 9pt; color: #3f7f7f; font-family: 'courier new'">property </span><span style="font-size: 9pt; color: #7f007f; font-family: 'courier new'">name</span> <span style="font-size: 9pt; color: black; font-family: 'courier new'">=</span> <span style="font-size: 9pt; color: #2a00ff; font-family: 'courier new'">"transactionManager"</span> <span style="font-size: 9pt; color: teal; font-family: 'courier new'">&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: teal; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">&lt;</span> </u></em><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: #3f7f7f; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">ref </span></u></em><strong><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: #7f007f; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">bean</span> </u></em></strong><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: black; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span> </u></em><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: #2a00ff; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">"transactionManager" </span></u></em><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: teal; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">/&gt;</span> </u></em></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: teal; font-family: 'courier new'">&lt;/</span> <span style="font-size: 9pt; color: #3f7f7f; font-family: 'courier new'">property</span> <span style="font-size: 9pt; color: teal; font-family: 'courier new'">&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: teal; font-family: 'courier new'">&lt;</span> <span style="font-size: 9pt; color: #3f7f7f; font-family: 'courier new'">property </span><span style="font-size: 9pt; color: #7f007f; font-family: 'courier new'">name</span> <span style="font-size: 9pt; color: black; font-family: 'courier new'">=</span> <span style="font-size: 9pt; color: #2a00ff; font-family: 'courier new'">"target"</span> <span style="font-size: 9pt; color: teal; font-family: 'courier new'">&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: teal; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">&lt;</span> </u></em><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: #3f7f7f; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">ref </span></u></em><strong><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: #7f007f; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">local</span> </u></em></strong><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: black; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">=</span> </u></em><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: #2a00ff; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">"UserDAO" </span></u></em><em><u><span style="font-size: 9pt; background: #d9d9d9 0% 50%; color: teal; font-family: 'courier new'; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial">/&gt;</span> </u></em></p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: teal; font-family: 'courier new'">&lt;/</span> <span style="font-size: 9pt; color: #3f7f7f; font-family: 'courier new'">property</span> <span style="font-size: 9pt; color: teal; font-family: 'courier new'">&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt; text-align: left" align="left"><span style="font-size: 9pt; color: black; font-family: 'courier new'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 9pt; color: teal; font-family: 'courier new'">&lt;/</span> <span style="font-size: 9pt; color: #3f7f7f; font-family: 'courier new'">bean</span> <span style="font-size: 9pt; color: teal; font-family: 'courier new'">&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt 15.75pt; text-indent: -15.75pt">1 <span style="font-family: 宋体">、用 </span>local <span style="font-family: 宋体">属性指定目标</span> bean <span style="font-family: 宋体">可以利用</span> xml <span style="font-family: 宋体">解析器的能力在同一个 XML配置文件中验证 </span>xml id <span style="font-family: 宋体">引用,</span><span style="font-family: 宋体">没有匹</span><span style="font-family: 宋体">配的元素,</span>xml <span style="font-family: 宋体">解析器就会产生一个</span> error, <span style="font-family: 宋体">所以如果引用的 </span>bean <span style="font-family: 宋体">在同一个 XML</span>配置 <span style="font-family: 宋体">文件中</span> , <span style="font-family: 宋体">那么用</span> local <span style="font-family: 宋体">形式是最好的选择</span> .</p>
<p style="margin: 0cm 0cm 0pt"><br />
2 <span style="font-family: 宋体">、可以这么说,</span>&lt;ref bean&gt; <span style="font-family: 宋体">是寻找所有 XML配置文件中的</span> bean; &lt;ref local&gt; <span style="font-family: 宋体">是寻找本</span> xml <span style="font-family: 宋体">文件中的</span> bean. <br />
</p>
<p style="margin: 0cm 0cm 0pt 15.75pt; text-indent: -15.75pt">3 <span style="font-family: 宋体">、</span>&lt;ref&gt; <span style="font-family: 宋体">提供了如下几方面的属性</span> :<br />
1)bean: <span style="color: #99cc00; font-family: 宋体">在当前</span> Spring XML <span style="font-family: 宋体">配置文件中，<span style="color: #99cc00"><span style="font-family: 宋体">或者在同一</span> BeanFactory(ApplicationContext) <span style="font-family: 宋体">中</span></span></span><span style="font-family: 宋体">的其他</span> JavaBean <span style="font-family: 宋体">中寻找引入的BEAN</span>.<br />
2)local: <span style="color: #99cc00">仅<span style="font-family: 宋体">在当前</span></span> Spring XML <span style="font-family: 宋体">配置文件中寻找引入的BEAN.</span> <br />
<span style="font-family: 宋体">如果借助于</span> Spring IDE, <span style="font-family: 宋体">则在编译期可以对其依赖的</span> JavaBean <span style="font-family: 宋体">进行验证。基于</span> local <span style="font-family: 宋体">方式，开发者能够使用到</span> XML <span style="font-family: 宋体">本身提供</span><span style="font-size: 10.5pt; font-family: 宋体"><font size="3">的优势，而进行验证。</font> </span><span style="font-size: 10.5pt; font-family: 'times new roman'"><br />
<font size="3">3)parent:</font> </span><font size="3"><span style="font-size: 10.5pt; font-family: 宋体">用于指定其依赖的父</span> <span style="font-size: 10.5pt; font-family: 'times new roman'">JavaBean</span> <span style="font-size: 10.5pt; font-family: 宋体">定义。</span></font></p>
<img src ="http://www.blogjava.net/algz/aggbug/163072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-26 09:21 <a href="http://www.blogjava.net/algz/articles/163072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]spring声明式事务管理祥述 </title><link>http://www.blogjava.net/algz/articles/162875.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Sat, 24 Nov 2007 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/162875.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/162875.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/162875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/162875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/162875.html</trackback:ping><description><![CDATA[<p>Spring也提供了声明式事务管理。这是通过Spring AOP实现的。</p>
<p>Spring 中进行事务管理的通常方式是利用AOP（面向切片编程）的方式，为普通java类封装事务控制，它是通过动态代理实现的，由于接口是延迟实例化的， spring在这段时间内通过拦截器，加载事务切片。原理就是这样，具体细节请参考jdk中有关动态代理的文档。本文主要讲解如何在spring中进行事务控制。<br />
动态代理的一个重要特征是，它是针对接口的，所以我们的dao要通过动态代理来让spring接管事务，就必须在dao前面抽象出一个接口，当然如果没有这样的接口，那么spring会使用CGLIB来解决问题，但这不是spring推荐的方式，所以不做讨论.</p>
<p><em><span class="remark">大多数Spring用户选择声明式事务管理。这是最少影响应用代码的选择， 因而这是和<span class="emphasis"><em>非侵入性</em></span>的轻量级容器的观念是一致的。 </span></em></p>
<p>从考虑EJB CMT和Spring声明式事务管理的相似以及不同之处出发是很有益的。 它们的基本方法是相似的：都可以指定事务管理到单独的方法；如果需要可以在事务上 下文调用<tt class="literal"><font face="新宋体">setRollbackOnly()</font></tt>方法。不同之处如下：</p>
<ul type="disc">
    <li>
    <p>不象EJB CMT绑定在JTA上，<span style="color: #339966">Spring声明式事务管理可以在任何环境下使用。</span> <span style="color: #339966">只需更改配置文件，</span>它就可以和JDBC、JDO、Hibernate或其他的事务机制一起工作 </p>
    <li>
    <p><span style="color: #339966">Spring 的声明式事务管理可以应用到普通Java对象</span>，不仅仅是特殊的类，如EJB</p>
    <li>
    <p>Spring提供声明式<span class="emphasis"><em>回滚规则</em></span>：EJB没有对应的特性， 我们将在下面讨论这个特性。回滚可以声明式控制，不仅仅是编程式的 </p>
    <li>
    <p>Spring允许你通过AOP定制事务行为。例如，如果需要，你可以在事务 回滚中插入定制的行为。你也可以增加任意的通知，就象事务通知一样。使用 EJB CMT，除了使用<tt class="literal"><font face="新宋体">setRollbackOnly()</font></tt>，你没有办法能 够影响容器的事务管理</p>
    <li>
    <p>Spring不提供高端应用服务器提供的跨越远程调用的事务上下文传播。如果你需要这些特性，我们推荐你使用EJB。然而，不要轻易使用这些特性。通常我们并不希望事务跨越远程调用</p>
    </li>
</ul>
<p>回滚规则的概念是很重要的：它们使得我们可以指定哪些异常应该发起自动回滚。我们在配置文件中，而不是Java代码中，以声明的方式指定。因此，虽然我们仍然可以编程调用<tt class="literal"><font face="新宋体">TransactionStatus</font></tt>对象的 <tt class="literal"><font face="新宋体">setRollbackOnly()</font></tt>方法来回滚当前事务，多数时候我们可以指定规则，如<tt class="literal"><font face="新宋体">MyApplicationException</font></tt>应该导致回滚。 这有显著的优点，业务对象不需要依赖事务基础设施。例如，它们通常不需要引入任何Spring API，事务或其他任何东西。</p>
<p>EJB的默认行为是遇到<span class="emphasis"><em>系统异常</em></span>（通常是运行时异常）， EJB容器自动回滚事务。EJB CMT遇到<span class="emphasis"><em>应用程序异常</em></span> （除了<span class="emphasis"><em>java.rmi.RemoteException</em></span>外的checked异常）时不会自动回滚事务。虽然Spring声明式事务管理沿用EJB的约定（遇到unchecked 异常自动回滚事务），但是这是可以定制的。</p>
<p>按照我们的测试，Spring声明式事务管理的性能要胜过EJB CMT。</p>
<p>通常通过TransactionProxyFactoryBean设置Spring事务代理。我们需要一个目标对象包装在事务代理中。这个目标对象一般是一个普通Java对象的bean。当我们定义TransactionProxyFactoryBean时，必须提供一个相关的 PlatformTransactionManager的引用和<span class="bold"><strong>事务属性</strong></span>。 <span class="bold"><strong>事务属性</strong></span>含有上面描述的事务定义。</p>
<pre class="programlisting">&lt;bean id="petStore" <br />
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br />
&lt;property name="transactionManager"&gt;&lt;ref bean="transactionManager"/&gt;&lt;/property&gt;<br />
&lt;property name="target"&gt;&lt;ref bean="petStoreTarget"/&gt;&lt;/property&gt;<br />
&lt;property name="transactionAttributes"&gt;<br />
&lt;props&gt;<br />
&lt;prop key="insert*"&gt;PROPAGATION_REQUIRED,-MyCheckedException&lt;/prop&gt;<br />
&lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br />
&lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;<br />
&lt;/props&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;</pre>
<p>事务代理会实现目标对象的接口：这里是id为petStoreTarget的bean。（使用 CGLIB也可以实现具体类的代理。只要设置proxyTargetClass属性为true就可以。如果目标对象没有实现任何接口，这将自动设置该属性为true。通常，我们希望面向接口而不是类编程。）使用proxyInterfaces属性来限定事务代理来代 理指定接口也是可以的（一般来说是个好想法）。也可以通过从 <tt class="literal"><font face="新宋体">org.springframework.aop.framework.ProxyConfig</font></tt>继承或所有AOP代理工厂共享 的属性来定制TransactionProxyFactoryBean的行为。 </p>
<p>这里的transactionAttributes属性定义在 <tt class="literal"><font face="新宋体">org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource</font></tt> 中的属性格式来设置。这个包括通配符的方法名称映射是很直观的。注意 insert*的映射的值包括回滚规则。添加的<tt class="literal"><font face="新宋体">-MyCheckedException</font></tt> 指定如果方法抛出<tt class="literal"><font face="新宋体">MyCheckedException</font></tt>或它的子类，事务将 会自动回滚。可以用逗号分隔定义多个回滚规则。<font color="#ff0000"><strong>-前缀强制回滚，+前缀指定提交</strong></font>（这允许即使抛出unchecked异常时也可以提交事务，当然你自己要明白自己 在做什么）。</p>
<p><tt class="literal"><font face="新宋体">TransactionProxyFactoryBean</font></tt>允许你通过 &#8220;preInterceptors&#8221;和&#8220;postInterceptors&#8221;属性设置&#8220;前&#8221;或&#8220;后&#8221;通知来提供额外的 拦截行为。可以设置任意数量的&#8220;前&#8221;和&#8220;后&#8221;通知，它们的类型可以是 <tt class="literal"><font face="新宋体">Advisor</font></tt>（可以包含一个切入点）， <tt class="literal"><font face="新宋体">MethodInterceptor</font></tt>或被当前Spring配置支持的通知类型 （例如<tt class="literal"><font face="新宋体">ThrowAdvice</font></tt>， <tt class="literal"><font face="新宋体">AfterReturningtAdvice</font></tt>或<tt class="literal"><font face="新宋体">BeforeAdvice</font></tt>， 这些都是默认支持的）。这些通知必须支持实例共享模式。如果你需要高级AOP特 性来使用事务，如有状态的maxin，那最好使用通用的 <tt class="literal"><font face="新宋体">org.springframework.aop.framework.ProxyFactoryBean</font></tt>， 而不是<tt class="literal"><font face="新宋体">TransactionProxyFactoryBean</font></tt>实用代理创建者。</p>
<p>也可以设置自动代理：配置AOP框架，不需要单独的代理定义类就可以生成类的 代理。</p>
附两个spring的事务配置例子：<br />
&lt;prop key="add"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; PROPAGATION_REQUIRES_NEW, -MyException <br />
&lt;/prop&gt;<br />
注：上面的意思是add方法将独占一个事务，当事务处理过程中产生MyException异常或者该异常的子类将回滚该事务。<br />
<br />
&lt;prop key="loadAll"&gt;<br />
&nbsp;&nbsp;&nbsp; PROPAGATION_SUPPORTS, ISOLATION_READ_COMMITED, Readonly<br />
&lt;/prop&gt;<br />
注：表示loadAll方法支持事务，而且不会读取没有提交事务的数据。它的数据为只读（这样有助于提高读取的性能）<br />
<br />
附A Spring中的所有事务策略<br />
<br />
PROPAGATION_MANDATORY<br />
PROPAGATION_NESTED <br />
PROPAGATION_NEVER <br />
PROPAGATION_NOT_SUPPORTED<br />
PROPAGATION_REQUIRED<br />
PROPAGATION_REQUIRED_NEW<br />
PROPAGATION_SUPPORTS<br />
<br />
附B Spring中所有的隔离策略：<br />
<br />
ISOLATION_DEFAULT<br />
ISOLATION_READ_UNCOMMITED<br />
ISOLATION_COMMITED<br />
ISOLATION_REPEATABLE_READ<br />
ISOLATION_SERIALIZABLE <br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ----------------------http://www.blogjava.net/DenisLing/archive/2005/12/01/22096.html 
<img src ="http://www.blogjava.net/algz/aggbug/162875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-24 17:36 <a href="http://www.blogjava.net/algz/articles/162875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 事务传播行为种类</title><link>http://www.blogjava.net/algz/articles/162784.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Sat, 24 Nov 2007 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/162784.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/162784.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/162784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/162784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/162784.html</trackback:ping><description><![CDATA[<em>/** <br />
* @author 王政 <br />
* @date 2006-11-24 <br />
* @note 转载自</em><a href="http://www.javaeye.com/topic/35907?page=1"><em><font color="#006629">http://www.javaeye.com/topic/35907?page=1</font></em></a><br />
<em>*/ </em>
<img src ="http://www.blogjava.net/algz/aggbug/162784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-24 09:56 <a href="http://www.blogjava.net/algz/articles/162784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate DAO 持久层开发, Spring 用 Hibernate 访问数据库的三种方法.推荐使用回调.</title><link>http://www.blogjava.net/algz/articles/162578.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 23 Nov 2007 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/162578.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/162578.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/162578.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/162578.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/162578.html</trackback:ping><description><![CDATA[DAO开发<br />
<br />
注:<br />
(1)以下两者都需在Spring XML配置文件中,注册Bean(实现类)来依赖注入SessionFactory. <br />
(2.1)Spring 中进行事务管理的通常方式是利用AOP（面向切片编程）的方式，为普通java类封装事务控制，它是通过动态代理实现的，由于接口是<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 延迟实例化的， spring在这段时间内通过拦截器，加载事务切片。原理就是这样，具体细节请参考jdk中有关动态代理的文档。本文主要讲解<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如何在spring中进行事务控制。<br />
(2.2)动态代理的一个重要特征是，它是针对接口的,所以我们的DAO要通过动态代理来让spring接管事务，就必须在DAO前面抽象出一个接口.&nbsp; 当然<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果没有这样的接口，那么spring会使用CGLIB来解决问题，但这不是spring推荐的方式.<br />
<br />
(一)直接使用Hibernate API <span style="color: #339966">(不推荐使用)</span><br />
public class DaoImp implate Dao{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private SessionFactory sessionFactory;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static String hql = "from User u where u.username=? ";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setSessionFactory(SessionFactory sessionFactory){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sessionFactory=sessionFactory;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean isValidUser(String username) {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (userList.size() &gt; 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (HibernateException ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw converHibernaterAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
} <br />
&nbsp; <br />
优点:与Spring框架完全分离<br />
缺点:(1)无法使用Spring框架封装所提供的额外功能.如,直接使用Hibernate API 需用try...catch()处理HibernateException异常.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)需在实现类中加入setSessionFactory(SessionFactory sessionFactory)属性,接收依赖注入的SessionFactory.<br />
<br />
(二)继承 Spring 的 HibernateDaoSupport 使用 HibernateTemplate <span style="color: #339966">(不推荐使用getSession())<br />
</span>public class DaoImp extend HibernateDaoSupport implates Dao{<br />
<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//private SessionFactory sessionFactory;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static String hql = "from User u where u.username=? ";<br />
<br />
<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //public void setSessionFactory(SessionFactory sessionFactory){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.sessionFactory=sessionFactory;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //}</span><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean isValidUser(String username) {&nbsp;<br />
<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp; List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list();&nbsp;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List userList = getHibernateTemplate().find(hql,username);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (userList.size() &gt; 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;<br />
<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;} catch (HibernateException ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw converHibernaterAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;}&nbsp;&nbsp;</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean isValidUser(String username,String password) throw DataAccessException {&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">Session session = getSession();</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不推荐使用,用完后需手动关闭<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] userlist=new String[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userlist[0]=username;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userlist[1]=password;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List userList = <span style="color: #008000">session</span>.find(hql,userlist);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000">//Hibernate语句;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (userList.size() &gt; 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;} catch (HibernateException ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw converHibernaterAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
}<br />
<br />
特点:对HibernateTemplate没有提供的功能,可以直接调用HibernateDaoSuppor对象的<span style="color: #339966">getSession()</span>方法(极其不推荐使用)得到Session对象实例用try{ Hibernate API }catch&nbsp;(HibernateException ex )操作.<br />
<br />
(三)对 HibernateTemplate 没有提供的功能, 还可以用HibernateCallback 回调的方法管理数据库. <span style="color: #339966">(极其推荐)</span><br />
<br />
<p>&nbsp;/**<br />
&nbsp; * 使用 hql 语句进行操作<br />
&nbsp; * @param hql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HSQL 查询语句<br />
&nbsp; * @param offset&nbsp;&nbsp; 开始取数据的下标<br />
&nbsp; * @param length&nbsp;&nbsp;&nbsp;读取数据记录数<br />
&nbsp; * @return List&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;结果集<br />
&nbsp; */<br />
&nbsp;public List getListForPage ( <span style="color: #99cc00">final </span>String hql , <span style="color: #99cc00">final </span>int offset , <span style="color: #99cc00">final</span> int length ) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; List list = getHibernateTemplate().executeFind ( new <span style="color: #339966">HibernateCallback</span> ( ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Object doInHibernate ( Session session ) throws HibernateException, SQLException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = session.createQuery ( hql ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setFirstResult ( offset ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setMaxResults ( length ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list ( ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }) ;<br />
&nbsp;&nbsp;&nbsp; return list ;<br />
&nbsp;}<br />
</p>
<p><br />
//---------------------------------------------------------------------------<br />
<br />
final String queryString = "from Fourm";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #99cc00">//必须定义final类型</span><br />
&nbsp;&nbsp;&nbsp;List l= getHibernateTemplate().executeFind(new HibernateCallback(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;public Object doInHibernate ( Session session ) throws HibernateException, SQLException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Query query = session.createQuery ( queryString ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setFirstResult ( 0 ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; query.setMaxResults ( 10 ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List list = query.list ( ) ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return list ;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
//------------------------------------------------------------<br />
<br />
<br />
<br />
为什么不使用getSession(),而使用回调的详细说明:</p>
<p>紫蝶&#8719;飛揚↗<br />
听个SPRING+HIBERNATE开发的问题.<br />
SPRING想调用HIBERNATE的方法有两种,一种是使用getSession();一种是:HibernateCallback回调.<br />
他们有什么不同?<br />
海绵♂宝宝<br />
前者没有事务管控，Spring把Hibernate最原始的Session给你！但是它不被声明式事务管理的服务！<br />
紫蝶&#8719;飛揚↗<br />
...声明式事务不会对他进行事务管理?<br />
海绵♂宝宝<br />
后者也是把Session返给你，但是通过闭包回调的形式给你使用，Spring会在给你之前做一下手脚，例如：添加声明式事务管理中声明的事务属性！<br />
海绵♂宝宝<br />
因为你写的方法通过匿名函数闭包，然后由Spring去负责执行闭包体内的方法！<br />
海绵♂宝宝<br />
Java里的借口回调基本都是借用匿名内部类实现的闭包！<br />
海绵♂宝宝<br />
你看一下Spring的HibernateDaoSupport的源代码就知道运行过程了！<br />
海绵♂宝宝<br />
直接使用getSession()还不享有Spring提供的模板支持，也就是说你得手动关闭连接，否则会一直挂在那儿，直到超时连接池才会回收这个连接！<br />
海绵♂宝宝<br />
这样很容器连接池连接数量溢出！你懂了啊？<br />
紫蝶&#8719;飛揚↗<br />
嗯.<br />
紫蝶&#8719;飛揚↗<br />
new HibernateCallback(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;public Object doInHibernate ( Session session ) throws HibernateException, SQLException {<br />
必须这样的方式吗?<br />
海绵♂宝宝<br />
建议补习一下编程中的闭包、回调的知识，再看看Spring的那段代码就可以彻底理解了！<br />
海绵♂宝宝<br />
恩！<br />
紫蝶&#8719;飛揚↗<br />
哦.明白了.<br />
海绵♂宝宝<br />
如果你觉得getHibernateTemplate()提供的方法不足以满足你的要求！你就得这么使用！<br />
紫蝶&#8719;飛揚↗<br />
明白.不够用的情况下用回调.<br />
海绵♂宝宝<br />
闭包JavaScript支持的比较好，因为它是以函数为单元的，Java过于强调面向对象，所以只能用匿名内部类来有限的支持闭包！标准的回调都是方法回调，也就是闭包到方法中，而不是类中！所以Java中的闭包和其他的语言有一些区别的，例如访问外部变量必须是final的！<br />
海绵♂宝宝<br />
据说JDK1.7会加入对函数闭包调用的支持！<br />
紫蝶&#8719;飛揚↗<br />
...历害.<br />
紫蝶&#8719;飛揚↗<br />
偶只知道这样用,不知道为什么这样用.<br />
海绵♂宝宝<br />
那可不行啊！呵呵！我最一开始也不大明白，后来仔细研究了闭包、回调的知识就懂了！<br />
其实这种用法在Swing编程里天天都用啊！把一个匿名的监听器实现类注册到事件源，只不过那个时候没有注意到这是闭包和回调罢了！<br />
紫蝶&#8719;飛揚↗<br />
看来有时间得好好看看了...<br />
</p>
<img src ="http://www.blogjava.net/algz/aggbug/162578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-23 11:30 <a href="http://www.blogjava.net/algz/articles/162578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载][翻译] 利用JSF+SpringFramework+Hibernate构建Web应用的实例讲述 </title><link>http://www.blogjava.net/algz/articles/158473.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 06 Nov 2007 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/158473.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/158473.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/158473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/158473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/158473.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSF是一种新的用于构架j2ee应用用户界面的技术，它尤其适合于基于MVC架构的应用中。虽已有很多文章介绍过了JSF，然而它们大多从理论高度来介绍JSF而不是面向于实际应用。目前对于实际应用，JSF仍有很多问题没有解决，例如：如何使JSF适应于MVC整体构架中？如何将JSF与其他Java 框架整合起来？是否应该将...&nbsp;&nbsp;<a href='http://www.blogjava.net/algz/articles/158473.html'>阅读全文</a><img src ="http://www.blogjava.net/algz/aggbug/158473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-06 11:00 <a href="http://www.blogjava.net/algz/articles/158473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AOP概述...</title><link>http://www.blogjava.net/algz/articles/157505.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 01 Nov 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/157505.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/157505.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/157505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/157505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/157505.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在典型的面向对象的开发方式中,可能要将日志记录语句放在所有方法和JAVA类中才能实现日志功能.&nbsp; 在AOP方式中,可以反过来将日志服务<span style="color: #339966">模块化</span>,并以声明的方式将它们应用到需要日志的组件上.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AOP的功能完全集成到了SPRING事务管理,日志和其他各种特性的上下文中. <br />
<br />
<strong>连接点（join points）:</strong>在计算机科学中，&#8220;连接点&#8221;是连接程序中&#8220;控制流程（control flow）&#8221;的点。在面向方面的编程中，一系列的连接点集合被描述为&#8220;切入点&#8221;。连接点是主程序和&#8220;方面&#8221;的相会之处。在面向对象语言中，连接点是程序执行中定义良好的点。这些点包括方法和构造函数的调用、字段访问以等等内容<br />
<strong>切入点（pointcut）</strong>：在面向方面计算机编程中，切入点是一系列连接点的集合。当程序执行到切入点所描述的其中一个连接点时，与这个切入点相关的代码片（被称为通知）就会被执行。这就使得一个程序员可以描述&#8220;何处&#8221;以及&#8220;何时&#8221;在已定义的行为之外去执行附加的代码。这样就能向已经存在的软件增加新的方面（aspects）,或者是软件的设计带有清晰的&#8220;关注分离（separation of concerns）&#8221;的特点，从而使编程者将不同的方面融入到一个完整的应用中。<br />
<strong>通知（advice）: </strong>在面向方面计算机编程中，一片&#8220;通知&#8221;描述用于应用于程序中给定连接点的一个函数（function）、方法（method）和过程(procedure) 。<br />
<h2>连接点模型（Join point models）</h2>
<br />
面向方面语言中与通知相关的组件定义了一个连接点模型（join point model-JPM），JPM定义了三件事情：<br />
<br />
<strong>何时（advice）通知可以运行。</strong>之所以叫连接点（join points）是因为它们是正在运行程序中那些附加行为可以被有效接入的点。为了使之可用，连接点需要被普通程序员所表达和理解。（为了使应用的某个方面在跨越不连贯的变化时保持稳定，连接点应当在跨越这些变化时稳定<br />
<strong>一种指定（或者量化）连接点的方法，称之为&#8220;切入点&#8221;</strong>。切入点决定一个给定的连接点是否匹配。大多数有效的切入点语言使用类似基础语言的语法（例如，AspectJ 使用java符号），并且允许通过命名和组合来实现（切入点）重用（reuse）。<br />
<strong>一种指定代码在连接点处运行的方法。</strong>在AspectJ中，被称为通知（advice）,并且能够在连接点之前、之后或者包围连接点运行。<br />
<br />
<h2>AOP编程的适用领域</h2>
<br />
Authentication 权限<br />
Caching 缓存<br />
Context passing 内容传递<br />
Error handling 错误处理<br />
Lazy loading　懒加载<br />
Debugging　　调试<br />
logging, tracing, profiling and monitoring　记录跟踪　优化　校准<br />
Performance optimization　性能优化<br />
Persistence　　持久化<br />
Resource pooling　资源池<br />
Synchronization　同步<br />
Transactions 事务
<img src ="http://www.blogjava.net/algz/aggbug/157505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-01 15:32 <a href="http://www.blogjava.net/algz/articles/157505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOC的概述...</title><link>http://www.blogjava.net/algz/articles/157484.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 01 Nov 2007 06:32:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/157484.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/157484.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/157484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/157484.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/157484.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring&nbsp; 会自动的依据配置信息来维护对象之间的依赖关系,将被依赖的对象设置给依赖对象.------IOC.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOC属于设计模式的一种概念,&nbsp; 采用Dependency Injection (依赖注入)方式实现IOC容器.&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;通俗的讲,<span style="color: #339966">ICO容器</span>就<span style="color: #339966">是</span>一个通用的<span style="color: #339966">Bean工厂</span>.
<img src ="http://www.blogjava.net/algz/aggbug/157484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-11-01 14:32 <a href="http://www.blogjava.net/algz/articles/157484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]入門 02 - 控制反轉IoC     --------理解IOC不错的文章</title><link>http://www.blogjava.net/algz/articles/156886.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 30 Oct 2007 03:12:00 GMT</pubDate><guid>http://www.blogjava.net/algz/articles/156886.html</guid><wfw:comment>http://www.blogjava.net/algz/comments/156886.html</wfw:comment><comments>http://www.blogjava.net/algz/articles/156886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/algz/comments/commentRss/156886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/algz/services/trackbacks/156886.html</trackback:ping><description><![CDATA[<p>　IoC全名Inversion of Control，如果中文硬要翻譯過來的話，就是「控制反轉」。初看IoC，從字面上不容易瞭解其意義，我覺得要瞭解IoC，要先從Dependency Inversion開始瞭解，也就是依賴關係的反轉。</p>
<p>　Dependency Inversion在下面這篇文章中有了清楚的解釋：<br />
<span class="nobr"><a title="Visit page outside Confluence" href="http://www.objectmentor.com/publications/dip.pdf" rel="nofollow">http://www.objectmentor.com/publications/dip.pdf<sup><img class="rendericon" height="7" alt="" src="http://www.javaworld.com.tw/confluence/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" /></sup></a></span></p>
<p>　簡單的說，在模組設計時，高層的抽象模組通常是與業務相關的模組，它應該具有重用性，而不依賴於低層的實作模組，例如如果低層模組原先是軟碟存取模式，而高層模組是個存檔備份的需求，如果高層模組直接叫用低層模組的函式，則就對其產生了依賴關係。</p>
<p>舉個例子，例如下面這個程式：</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeContent">
<pre class="code-java">#include &lt;floppy.h&gt;
....
void save() {
....
saveToFloppy()
}
}</pre>
</div>
</div>
<p>　由於save()程式依賴於saveToFloppy()，如果今天要更換低層的存儲模組為Usb碟，則這個程式沒有辦法重用，必須加以修改才行，低層模組的更動造成了高層模組也必須跟著更動，這不是一個好的設計方式，我們希望模組都依賴於模組的抽象，這樣才可以重用高層的業務設計。</p>
<p>　如果以物件導向的方式來設計，依賴反轉（Dependency Inversion）的解釋變為程式不應依賴實作，而是依賴於抽象，實作必須依賴於抽象。我們來看看下面這個Java程式：</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeHeader" style="border-bottom-style: solid"><strong>BusinessObject.java</strong></div>
<div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class BusinessObject {
<span class="code-keyword">private</span> FloppyWriter writer = <span class="code-keyword">new</span> FloppyWriter();
....
<span class="code-keyword">public</span> void save() {
...
writer.saveToFloppy();
}
}</pre>
</div>
</div>
<p>　在這個程式中，BusinessObject的存檔依賴於實際的FloppyWriter，如果今天我們想要將存檔改為存至Usb碟，我們必須修改或繼承BusinessObject進行擴展，而無法直接使用BusinessObject。</p>
<p>如果透過介面的宣告，可以改進此一情況，例如：</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">interface</span> IDeviceWriter {
<span class="code-keyword">public</span> void saveToDevice();
}
<span class="code-keyword">public</span> class BusinessObject {
<span class="code-keyword">private</span> IDeviceWriter writer;
<span class="code-keyword">public</span> void setDeviceWriter(IDeviceWriter writer) {
<span class="code-keyword">this</span>.writer = writer;
}
<span class="code-keyword">public</span> void save() {
....
writer.saveToDevice();
}
}</pre>
</div>
</div>
<p>　這樣一來，BusinessObject就是可重用的，如果今天我有存儲至Floppy或Usb碟的需求，我只要實作IDeviceWriter即可，而不用修改BusinessObject：</p>
<div class="code" style="border-top-style: solid; border-right-style: solid; border-left-style: solid; border-bottom-style: solid">
<div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class FloppyWriter implement IDeviceWriter {
<span class="code-keyword">public</span> void saveToDevice() {
....
<span class="code-comment">// 實際儲存至Floppy的程式碼
</span>    }
}
<span class="code-keyword">public</span> class UsbDiskWriter implement IDeviceWriter {
<span class="code-keyword">public</span> void saveToDevice() {
....
<span class="code-comment">// 實際儲存至UsbDisk的程式碼
</span>    }
}</pre>
</div>
</div>
<p>　從這個角度來看，Dependency Inversion的意思即是程式不依賴於實作，而是程式與實作都要依賴於抽象。</p>
<p>　IoC的Control是控制的意思，其實其背後的意義也是一種依賴關係的轉移，如果A依賴於B，其意義即是B擁有控制權，我們要轉移這種關係，所以依賴關係的反轉即是控制關係的反轉，藉由控制關係的轉移，我們可以獲得元件的可重用性，在上面的Java程式中，整個控制權從實際的 FloppyWriter轉移至抽象的IDeviceWriter介面上，使得BusinessObject、FloppyWriter、 UsbDiskWriter這幾個實現依賴於抽象的IDeviceWriter介面。</p>
<p>　從容器（Container）的角度，程式的業務邏輯部份應是可以重用的，不應受到所使用框架或容器的影響，因為我們可能轉移整個業務邏輯至其它的框架或容器，如果業務邏輯過於依賴容器，則轉移至其它的框架或容器時，就會發生困難。</p>
<p>　IoC在容器的角度，可以用這麼一句好萊塢名言來代表："Don't call me, I'll call you." 以程式的術語來說的話，就是「不要向容器要求您所需要的（物件）資源，容器會自動將這些物件給您！」。IoC要求的是容器不侵入應用程式本身，應用程式本身提供好介面，容器可以透過這些介面將所需的資源注至程式中，<span style="color: #339966">應用程式不向容器主動要求資源，故而不會依賴於容器的元件，應用程式本身不會意識到正被容器使用，可以隨時從容器中脫離轉移而不用作任何的修改</span>，而這個特性正是一些業務邏輯中間件最需要的。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -------------[转<a href="http://www.javaworld.com.tw">http://www.javaworld.com.tw</a> <span class="smalltext">Added by <a href="http://www.javaworld.com.tw/confluence/display/~caterpillar">良葛格</a>, last edited by <a href="http://www.javaworld.com.tw/confluence/display/~forth">Forth</a> on Aug 13, 2005 &nbsp;(<a href="http://www.javaworld.com.tw/confluence/pages/diffpages.action?pageId=1857&amp;originalId=3122">view change</a>) ]
<style type="text/css">
div.auto_complete {
width: 350px;
background: #fff;
}
div.auto_complete ul {
border: 1px solid #888;
margin: 0;
padding: 0;
width: 100%;
list-style-type: none;
}
div.auto_complete ul li {
margin: 0;
padding: 3px;
}
div.auto_complete ul li.selected {
background-color: #ffb;
}
div.auto_complete ul strong.highlight {
color: #800;
margin: 0;
padding: 0;
}
</style>
<!-- Delay the loading of the external javascript file needed for labels (as it takes too long to load and visibly holds loading of the page body) --><!-- To do this without javascript errors over undefined functions, we need to declare stubs here (that are overrided later by the proper implementations) --><script language="JavaScript" type="text/javascript">
    function doAddLabel(hideTextfieldAfterAddParam)
    {
        // stub
    }

    function onAddLabel()
    {
        // stub
    }

    function showLabelsInput()
    {
        // stub
    }
</script><!-- This is a hack to work around an apparent SiteMesh bug - http://jira.opensymphony.com/browse/SIM-198 --></span></p>
<img src ="http://www.blogjava.net/algz/aggbug/156886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/algz/" target="_blank">紫蝶∏飛揚↗</a> 2007-10-30 11:12 <a href="http://www.blogjava.net/algz/articles/156886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>