﻿<?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-Junky's IT Notebook-随笔分类-spring</title><link>http://www.blogjava.net/junky/category/11393.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Aug 2007 11:50:47 GMT</lastBuildDate><pubDate>Thu, 23 Aug 2007 11:50:47 GMT</pubDate><ttl>60</ttl><item><title>一步一步开发Spring Framework MVC应用程序(转)</title><link>http://www.blogjava.net/junky/archive/2007/08/22/138543.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 22 Aug 2007 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/08/22/138543.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/138543.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/08/22/138543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/138543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/138543.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是一个关于如何使用Spring Framework从无到有开发一个Web应用的逐步的指南。本文分成几个部分。你可以按顺序阅读或者根据你对他们的熟悉程度，跳过某些章节。                                                　目录                                                第1部分 - 设置...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2007/08/22/138543.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/138543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-08-22 10:50 <a href="http://www.blogjava.net/junky/archive/2007/08/22/138543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring interceptor</title><link>http://www.blogjava.net/junky/archive/2007/06/28/126716.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 28 Jun 2007 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/28/126716.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/126716.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/28/126716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/126716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/126716.html</trackback:ping><description><![CDATA[<p align=left><span>1&nbsp;Spring的通知类型</span></p>
<p align=left><span>现在让我们看看<span>Spring AOP</span>是如何处理通知的。</span></p>
<p align=left><a name=d0e2779></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.1</span></st1:chsdate><span>.&nbsp;通知的生命周期</span></p>
<p align=left><span>Spring</span><span>的通知可以跨越多个被通知对象共享，或者每个被通知对象有自己的通知。这分别对应 <em><span>per-class</span></em>或<em><span>per-instance</span></em><span> </span>通知。</span></p>
<p align=left><span>Per-class</span><span>通知使用最为广泛。它适合于通用的通知，如事务<span>adisor</span>。它们不依赖被代理 的对象的状态，也不添加新的状态。它们仅仅作用于方法和方法的参数。</span></p>
<p align=left><span>Per-instance</span><span>通知适合于导入，来支持混入（<span>mixin</span>）。在这种情况下，通知添加状态到 被代理的对象。</span></p>
<p align=left><span>可以在同一个<span>AOP</span>代理中混合使用共享和<span>per-instance</span>通知。</span></p>
<p align=left><a name=aop-introduction-advice-types></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.2</span></st1:chsdate><span>.&nbsp;Spring中通知类型</span></p>
<p align=left><span>Spring</span><span>提供几种现成的通知类型并可扩展提供任意的通知类型。让我们看看基本概念和标准的通知类型。</span></p>
<p align=left><a name=d0e2801></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.2</span></st1:chsdate><span>.1.&nbsp;Interception around advice</span></p>
<p align=left><span>Spring</span><span>中最基本的通知类型是<em><span>interception around advice </span></em><span>.</span></span></p>
<p align=left><span>Spring</span><span>使用方法拦截器的<span>around</span>通知是和<span>AOP</span>联盟接口兼容的。实现<span>around</span>通知的 类需要实现接口<span>MethodInterceptor</span>：</span></p>
<p align=left><span>public interface MethodInterceptor extends Interceptor {</span></p>
<p align=left><span>&nbsp;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>Object invoke(MethodInvocation invocation) throws Throwable;</span></p>
<p align=left><span>}</span></p>
<p align=left><em><span>invoke()</span></em><span>方法的<em><span>MethodInvocation</span></em><span> </span>参数暴露将被调用的方法、目标连接点、<span>AOP</span>代理和传递给被调用方法的参数。 <em><span>invoke()</span></em>方法应该返回调用的结果：连接点的返回值。</span></p>
<p align=left><span>一个简单的<em><span>MethodInterceptor</span></em>实现看起来如下<span>:</span></span></p>
<p align=left><span>public class DebugInterceptor implements MethodInterceptor {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public Object invoke(MethodInvocation invocation) throws Throwable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Before: invocation=[" + invocation + "]");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Object rval = invocation.proceed();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Invocation returned");</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return rval;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><span>注意<span>MethodInvocation</span>的<em><span>proceed()</span></em>方法的调用。这个调用会应用到目标连接点的拦截器链中的每一个拦截器。大部分拦截器会调用这个方法，并返回它的返回值。但是， 一个<span>MethodInterceptor</span>，和任何<span>around</span>通知一样，可以返回不同的值或者抛出一个异常，而 不调用<span>proceed</span>方法。但是，没有好的原因你要这么做。</span></p>
<p align=left><em><span>MethodInterceptor</span></em><em><span>提供了和其他<span>AOP</span>联盟的兼容实现的交互能力。这一节下面 要讨论的其他的通知类型实现了<span>AOP</span>公共的概念，但是以<span>Spring</span>特定的方式。虽然使用特定 通知类型有很多优点，但如果你可能需要在其他的<span>AOP</span>框架中使用，请坚持使用<span>MethodInterceptor around</span>通知类型。注意目前切入点不能和其它框架交互操作，并且<span>AOP</span>联盟目前也没有定义切入 点接口。</span></em></p>
<p align=left><a name=d0e2837></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.2</span></st1:chsdate><span>.2.&nbsp;Before通知</span></p>
<p align=left><span>Before通知</span><span>是一种简单的通知类型。 这个通知不需要一个<span>MethodInvocation</span>对象，因为它只在进入一个方法前被调用。</span></p>
<p align=left><span>Before</span><span>通知的主要优点是它不需要调用<span>proceed() </span>方法， 因此没有无意中忘掉继续执行拦截器链的可能性。</span></p>
<p align=left><span>MethodBeforeAdvice</span><span>接口如下所示。<span> (Spring</span>的<span>API</span>设计允许成员变量的<span>before</span>通知，虽然一般的对象都可以应用成员变量拦截，但<span>Spring </span>有可能永远不会实现它）。</span></p>
<p align=left><span>public interface MethodBeforeAdvice extends BeforeAdvice {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>&nbsp;<span>&nbsp;&nbsp; </span>void before(Method m, Object[] args, Object target) throws Throwable;</span></p>
<p align=left><span>}</span></p>
<p align=left><span>注意返回类型是<span>void</span>。<span> Before</span>通知可以在连接点执行之前 插入自定义的行为，但是不能改变返回值。如果一个<span>before</span>通知抛出一个异常，这将中断拦截器 链的进一步执行。这个异常将沿着拦截器链后退着向上传播。如果这个异常是<span>unchecked</span>的，或者 出现在被调用的方法的签名中，它将会被直接传递给客户代码；否则，它将被<span>AOP</span>代理包装到一个<span>unchecked </span>的异常里。</span></p>
<p align=left><span>下面是<span>Spring</span>中一个<span>before</span>通知的例子，这个例子计数所有正常返回的方法：</span></p>
<p align=left><span>public class CountingBeforeAdvice implements MethodBeforeAdvice {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>private int count;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void before(Method m, Object[] args, Object target) throws Throwable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>++count;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public int getCount() { </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return count; </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><em><span>Before</span></em><em><span>通知可以被用于任何类型的切入点。</span></em></p>
<p align=left><a name=d0e2869></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.2</span></st1:chsdate><span>.3.&nbsp;Throws通知</span></p>
<p align=left><span>如果连接点抛出异常，<span>Throws</span>通知 在连接点返回后被调用。<span>Spring</span>提供强类型的<span>throws</span>通知。注意这意味着<span> org.springframework.aop.ThrowsAdvice</span>接口不包含任何方法： 它是一个标记接口，标识给定的对象实现了一个或多个强类型的<span>throws</span>通知方法。这些方法形式 如下：</span></p>
<p align=left><span>afterThrowing([Method], [args], [target], subclassOfThrowable) </span></p>
<p align=left><span>只有最后一个参数是必需的。这样从一个参数到四个参数，依赖于通知是否对方法和方法 的参数感兴趣。下面是<span>throws</span>通知的例子。</span></p>
<p align=left><span>如果抛出<span>RemoteException</span>异常（包括子类）<span>, </span>这个通知会被调用</span></p>
<p align=left><span>public&nbsp;class RemoteThrowsAdvice implements ThrowsAdvice {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void afterThrowing(RemoteException ex) throws Throwable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Do something with remote exception</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><span>如果抛出<em><span>ServletException</span></em>异常， 下面的通知会被调用。和上面的通知不一样，它声明了四个参数，所以它可以访问被调用的方法，方法的参数和目标对象<span>:</span></span></p>
<p align=left><span>public static class ServletThrowsAdviceWithArguments implements ThrowsAdvice {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void afterThrowing(Method m, Object[] args, Object target, ServletException ex) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Do something will all arguments</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><span>最后一个例子演示了如何在一个类中使用两个方法来同时处理<span> RemoteException</span>和<span>ServletException </span>异常。任意个数的<span>throws</span>方法可以被组合在一个类中。</span></p>
<p align=left><span>public static class CombinedThrowsAdvice implements ThrowsAdvice {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void afterThrowing(RemoteException ex) throws Throwable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Do something with remote exception</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>&nbsp;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void afterThrowing(Method m, Object[] args, Object target, ServletException ex) {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>// Do something will all arguments</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><em><span>Throws</span></em><em><span>通知可被用于任何类型的切入点。</span></em></p>
<p align=left><a name=d0e2910></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.2</span></st1:chsdate><span>.4.&nbsp;After Returning通知</span></p>
<p align=left><span>Spring</span><span>中的<span>after returning</span>通知必须实现 <em><span>org.springframework.aop.AfterReturningAdvice</span></em><span> </span>接口，如下所示：</span></p>
<p align=left><span>public interface AfterReturningAdvice extends Advice {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>void afterReturning(Object returnValue, Method m, Object[] args, Object target) </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throws Throwable;</span></p>
<p align=left><span>}</span></p>
<p align=left><span>After returning</span><span>通知可以访问返回值（不能改变）、被调用的方法、方法的参数和目标对象。</span></p>
<p align=left><span>下面的<span>after returning</span>通知统计所有成功的没有抛出异常的方法调用：</span></p>
<p align=left><span>public class CountingAfterReturningAdvice implements AfterReturningAdvice {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>private int count;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void afterReturning(Object returnValue, Method m, Object[] args, Object target) throws Throwable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>++count;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public int getCount() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return count;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><span>这方法不改变执行路径。如果它抛出一个异常，这个异常而不是返回值将被沿着拦截器链向上抛出。</span></p>
<p align=left><em><span>After returning</span></em><em><span>通知可被用于任何类型的切入点。</span></em></p>
<p align=left><a name=d0e2930></a><st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span><span><font size=5>1</font></span>.2</span></st1:chsdate><span>.5.&nbsp;Introduction通知</span></p>
<p align=left><span>Spring</span><span>将<span>introduction</span>通知看作一种特殊类型的拦截通知。</span></p>
<p align=left><span>Introduction</span><span>需要实现<span>IntroductionAdvisor, </span>和<span>IntroductionInterceptor</span>接口：</span></p>
<p align=left><span>public interface IntroductionInterceptor extends MethodInterceptor {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>boolean implementsInterface(Class intf);</span></p>
<p align=left><span>}</span></p>
<p align=left><span>继承自<span>AOP</span>联盟<span>MethodInterceptor</span>接口的<span> invoke()</span>方法必须实现导入：也就是说，如果被调用的方法是在 导入的接口中，导入拦截器负责处理这个方法调用，它不能调用<span>proceed() </span>方法。</span></p>
<p align=left><span>Introduction</span><span>通知不能被用于任何切入点，因为它只能作用于类层次上，而不是方法。你可以只用<span>InterceptionIntroductionAdvisor</span>来实现导入通知，它有下面的方法：</span></p>
<p align=left><span>public interface InterceptionIntroductionAdvisor extends InterceptionAdvisor {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>ClassFilter getClassFilter();</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>IntroductionInterceptor getIntroductionInterceptor();</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>Class[] getInterfaces();</span></p>
<p align=left><span>}</span></p>
<p align=left><span>这里没有<span>MethodMatcher</span>，因此也没有和导入通知关联的 切入点。只有类过滤是合乎逻辑的。</span></p>
<p align=left><span>getInterfaces()</span><span>方法返回<span>advisor</span>导入的接口。</span></p>
<p align=left><span>让我们看看一个来自<span>Spring</span>测试套件中的简单例子。我们假设想要导入下面的接口到一个 或者多个对象中<span>:</span></span></p>
<p align=left><span>public interface Lockable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>void lock();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>void unlock();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>boolean locked();</span></p>
<p align=left><span>}</span></p>
<p align=left><span>这个例子演示了一个<span>mixin</span>。我们想要能够 将被通知对象类型转换为<span>Lockable</span>，不管它们的类型，并且调用<span>lock</span>和<span>unlock</span>方法。如果我们调用<span> lock()</span>方法，我们希望所有<span>setter</span>方法抛出<span>LockedException</span>异常。这样我们能添加一个方面使的对象不可变，而它们不需要知道这一点：这是一个很好的<span>AOP</span>例 子。</span></p>
<p align=left><span>首先，我们需要一个做大量转化的<span>IntroductionInterceptor</span>。 在这里，我们继承<span> org.springframework.aop.support.DelegatingIntroductionInterceptor </span>实用类。我们可以直接实现<span>IntroductionInterceptor</span>接口，但是大多数情况下<span> DelegatingIntroductionInterceptor</span>是最合适的。</span></p>
<p align=left><span>DelegatingIntroductionInterceptor</span><span>的设计是将导入 委托到真正实现导入接口的接口，隐藏完成这些工作的拦截器。委托可以使用构造方法参数 设置到任何对象中；默认的委托就是自己（当无参数的构造方法被使用时）。这样在下面的例子里，委托是<span>DelegatingIntroductionInterceptor</span>的子类<span> LockMixin</span>。给定一个委托（默认是自身）的<span> DelegatingIntroductionInterceptor</span>实例寻找被这个委托（而不 是<span>IntroductionInterceptor</span>）实现的所有接口，并支持它们中任何一个导入。子类如<span> LockMixin</span>也可能调用<span>suppressInterflace(Class intf) </span>方法隐藏不应暴露的接口。然而，不管<span>IntroductionInterceptor </span>准备支持多少接口，<span>IntroductionAdvisor</span>将控制哪个接口将被实际 暴露。一个导入的接口将隐藏目标的同一个接口的所有实现。</span></p>
<p align=left><span>这样，<span>LockMixin</span>继承<span>DelegatingIntroductionInterceptor </span>并自己实现<span>Lockable</span>。父类自动选择支持导入的<span>Lockable</span>，所以我们不需要指定它。用这种方法我们可以导入任意数量的接口。</span></p>
<p align=left><span>注意<span>locked</span>实例变量的使用。这有效地添加额外的状态到目标 对象。</span></p>
<p align=left><span>public class LockMixin extends DelegatingIntroductionInterceptor </span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>implements Lockable {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>private boolean locked;</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void lock() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.locked = true;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public void unlock() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>this.locked = false;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public boolean locked() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return this.locked;</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public Object invoke(MethodInvocation invocation) throws Throwable {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>if (locked() &amp;&amp; invocation.getMethod().getName().indexOf("set") == 0)</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>throw new LockedException();</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return super.invoke(invocation);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>}</span></p>
<p align=left><span>通常不要需要改写<span>invoke()</span>方法：实现<span> DelegatingIntroductionInterceptor</span>就足够了，如果是导入的方法，<span> DelegatingIntroductionInterceptor</span>实现会调用委托方法， 否则继续沿着连接点处理。在现在的情况下，我们需要添加一个检查：在上锁状态下不能调用<span>setter</span>方法。</span></p>
<p align=left><span>所需的导入<span>advisor</span>是很简单的。只有保存一个独立的<span> LockMixin</span>实例，并指定导入的接口，在这里就是<span> Lockable</span>。一个稍微复杂一点例子可能需要一个导入拦截器（可以 定义成<span>prototype</span>）的引用：在这种情况下，<span>LockMixin</span>没有相关配置，所以我们简单地 使用<span>new</span>来创建它。</span></p>
<p align=left><span>public class LockMixinAdvisor extends DefaultIntroductionAdvisor {</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>public LockMixinAdvisor() {</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>super(new LockMixin(), Lockable.class);</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p align=left><span>}</span></p>
<p align=left><span>我们可以非常简单地使用这个<span>advisor</span>：它不需要任何配置。（但是，有一点 <em>是</em>必要的：就是不可能在没有<em><span>IntroductionAdvisor</span></em><span> </span>的情况下使用<span>IntroductionInterceptor</span>。） 和导入一样，通常<span> advisor</span>必须是针对每个实例的，并且是有状态的。我们会有不同的的<span>LockMixinAdvisor </span>每个被通知对象，会有不同的<span>LockMixin</span>。<span> advisor</span>组成了被通知对象的状态的一部分。</span></p>
<p align=left><span>和其他<span>advisor</span>一样，我们可以使用<span> Advised.addAdvisor() </span>方法以编程地方式使用这种<span>advisor</span>，或者在<span>XML</span>中配置（推荐这种方式）。 下面将讨论所有代理创建，包括<span>&#8220;</span>自动代理创建者<span>&#8221;</span>，选择代理创建以正确地处理导入和有状态的混入。</span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<p><span><font size=3>参考资料：</font></span></p>
<p><font face="Times New Roman"><span><span><font size=3>1．</font>&nbsp;</span></span><span><a href="http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=41315"><font size=3>http://www.javaresearch.org/article/showarticle.jsp?column=23&amp;thread=41315</font></a></span></font></p>
<p><font face="Times New Roman"><span><span><font size=3>2．</font>&nbsp;</span></span><span><a href="http://tech.ccidnet.com/art/1112/20051114/371959_5.html"><font size=3>http://tech.ccidnet.com/art/1112/20051114/371959_5.html</font></a></span></font></p>
<p><font face="Times New Roman"><span><span><font size=3>3．</font>&nbsp;</span></span><span><a href="http://www.7dspace.com/doc/21/0603/20063305365394884.htm"><font size=3>http://www.7dspace.com/doc/21/0603/20063305365394884.htm</font></a></span></font></p>
<p><font face="Times New Roman"><span><span><font size=3>4．</font>&nbsp;</span></span><span><a href="http://barton131420.cnblogs.com/articles/280664.html"><font size=3>http://barton131420.cnblogs.com/articles/280664.html</font></a></span></font></p>
<p><font face="Times New Roman"><span><span><font size=3>5．</font>&nbsp;</span></span><span><a href="http://www.opentown.info/bbs/viewtopic.php?t=7"><font size=3>http://www.opentown.info/bbs/viewtopic.php?t=7</font></a></span></font></p>
<p><span><font face="Times New Roman" size=3>&nbsp;</font></span></p>
<img src ="http://www.blogjava.net/junky/aggbug/126716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-28 09:36 <a href="http://www.blogjava.net/junky/archive/2007/06/28/126716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 编程入门十大问题解答</title><link>http://www.blogjava.net/junky/archive/2007/06/07/122540.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 07 Jun 2007 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/06/07/122540.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/122540.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/06/07/122540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/122540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/122540.html</trackback:ping><description><![CDATA[1、如何学习Spring？<br><br>　　你可以通过下列途径学习spring：<br><br>　　(1) spring下载包中doc目录下的MVC-step-by-step和sample目录下的例子都是比较好的spring开发的例子。 <br><br>　　(2) AppFuse集成了目前最流行的几个开源轻量级框架或者工具 Ant,XDoclet,Spring,Hibernate(iBATIS),JUnit,Cactus,StrutsTestCase,Canoo's WebTest,Struts Menu,Display Tag Library,OSCache,JSTL,Struts 。<br><br>　　你可以通过AppFuse源代码来学习spring。<br><br>AppFuse网站：http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse<br><br>　　(3)Spring 开发指南(夏昕)（http://www.xiaxin.net/Spring_Dev_Guide.rar）<br><br>　　一本spring的入门书籍,里面介绍了反转控制和依赖注射的概念，以及spring的bean管理，spring的MVC，spring和hibernte，iBatis的结合。<br><br>　　(4) spring学习的中文论坛<br><br>　　SpringFramework中文论坛(http://spring.jactiongroup.net)<br><br>　　Java视线论坛(http://forum.javaeye.com)的spring栏目<br><br>　　2、利用Spring框架编程，console打印出log4j:WARN Please initialize the log4j system properly？<br><br>　　说明你的log4j.properties没有配置。请把log4j.properties放到工程的classpath中，eclipse的classpath为bin目录，由于编译后src目录下的文件会拷贝到bin目录下，所以你可以把log4j.properties放到src目录下。<br><br>　　这里给出一个log4j.properties的例子：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>log4j.rootLogger=DEBUG,stdout<br>log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br>log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n</td>
        </tr>
    </tbody>
</table>
<br>　　3、出现 java.lang.NoClassDefFoundError?<br><br>　　一般情况下是由于你没有把必要的jar包放到lib中。<br><br>　　比如你要采用spring和hibernate（带事务支持的话），你除了spring.jar外还需要hibernat.jar、aopalliance.jar、cglig.jar、jakarta-commons下的几个jar包。<br><br>http://www.springframework.org/download.html下载spring开发包，提供两种zip包<br>spring-framework-1.1.3-with-dependencies.zip和spring-framework-1.1.3.zip，我建议你下载spring-framework-1.1.3-with-dependencies.zip。这个zip解压缩后比后者多一个lib目录，其中有hibernate、j2ee、dom4j、aopalliance、jakarta-commons等常用包。<br><br>　　4、java.io.FileNotFoundException: Could not open class path resource [....hbm.xml],提示找不到xml文件？<br><br>　　原因一般有两个：<br><br>　　(1)该xml文件没有在classpath中。 <br><br>　　(2)applicationContext-hibernate.xml中的xml名字没有带包名。比如：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>＜bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"＞<br>＜property name="dataSource"＞＜ref bean="dataSource"/＞＜/property＞<br>＜property name="mappingResources"＞<br>　＜list＞<br>　　＜value＞User.hbm.xml＜/value＞<br>　　错，改为： <br>　　＜value＞com/yz/spring/domain/User.hbm.xml＜/value＞<br>　＜/list＞<br>＜/property＞<br>＜property name="hibernateProperties"＞<br>＜props＞ <br>　＜prop key="hibernate.dialect"＞ net.sf.hibernate.dialect.MySQLDialect ＜/prop＞ <br>　＜prop key="hibernate.show_sql"＞true＜/prop＞ <br>＜/props＞ <br>＜/property＞<br>＜/bean＞</td>
        </tr>
    </tbody>
</table>
<br>　　5、org.springframework.beans.NotWritablePropertyException: Invalid property 'postDao' of bean class？<br><br>　　出现异常的原因是在application-xxx.xml中property name的错误。<br><br>　　＜property name="...."＞ 中name的名字是与bean的set方法相关的，而且要注意大小写。<br><br>　　比如<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>public class PostManageImpl extends BaseManage implements PostManage {<br>　private PostDAO dao = null;<br>　public void setPostDAO(PostDAO postDAO){<br>　　this.dao = postDAO;<br>　}<br>}</td>
        </tr>
    </tbody>
</table>
<br>　　那么xml的定义应该是：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>＜bean id="postManage" parent="txProxyTemplate"＞<br>＜property name="target"＞<br>　＜bean class="com.yz.spring.service.implement.PostManageImpl"＞<br>　　＜property name="postDAO"＞＜ref bean="postDAO"/＞＜/property＞ 对<br>　　＜property name="dao"＞＜ref bean="postDAO"/＞＜/property＞ 错<br>　＜/bean＞<br>＜/property＞<br>＜/bean＞</td>
        </tr>
    </tbody>
</table>
<br>　　6、Spring中如何实现事务管理？<br><br>　　首先，如果使用mysql，确定mysql为InnoDB类型。<br><br>　　事务管理的控制应该放到商业逻辑层。你可以写个处理商业逻辑的JavaBean，在该JavaBean中调用DAO，然后把该Bean的方法纳入spring的事务管理。<br><br>　　比如：xml文件定义如下：<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>＜bean id="txProxyTemplate" abstract="true"<br>class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"＞<br>＜property name="transactionManager"＞＜ref bean="transactionManager"/＞＜/property＞<br>＜property name="transactionAttributes"＞<br>＜props＞<br>＜prop key="save*"＞PROPAGATION_REQUIRED＜/prop＞<br>＜prop key="remove*"＞PROPAGATION_REQUIRED＜/prop＞<br>＜prop key="*"＞PROPAGATION_REQUIRED＜/prop＞<br>＜/props＞<br>＜/property＞<br>＜/bean＞<br><br>＜bean id="userManage" parent="txProxyTemplate"＞<br>　＜property name="target"＞<br>　　＜bean class="com.yz.spring.service.implement.UserManageImpl"＞<br>　　　＜property name="userDAO"＞＜ref bean="userDAO"/＞＜/property＞<br>　　＜/bean＞<br>　＜/property＞<br>＜/bean＞</td>
        </tr>
    </tbody>
</table>
<br>　　com.yz.spring.service.implement.UserManageImpl就是我们的实现商业逻辑的JavaBean。我们通过parent元素声明其事务支持。<br><br>　　7、如何管理Spring框架下更多的JavaBean？<br><br>　　JavaBean越多，spring配置文件就越大，这样不易维护。为了使配置清晰，我们可以将JavaBean分类管理，放在不同的配置文件中。 应用启动时将所有的xml同时加载。<br><br>　　比如：<br><br>　　DAO层的JavaBean放到applicationContext-hibernate.xml中，商业逻辑层的JavaBean放到applicationContext-service.xml中。然后启动类中调用以下代码载入所有的ApplicationContext。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>String[] paths = {"com/yz/spring/dao/hibernate/applicationContext-hibernate.xml",<br>"com/yz/spring/service/applicationContext-service.xml"};<br>ctx = new ClassPathXmlApplicationContext(paths);</td>
        </tr>
    </tbody>
</table>
<br>　　8、web应用中如何加载ApplicationContext？<br><br>　　可以通过定义web.xml，由web容器自动加载。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>＜servlet＞<br>＜servlet-name＞context＜/servlet-name＞<br>＜servlet-class＞org.springframework.web.context.ContextLoaderServlet＜/servlet-class＞<br>＜load-on-startup＞1＜/load-on-startup＞<br>＜/servlet＞<br><br>＜context-param＞<br>＜param-name＞contextConfigLocation＜/param-name＞<br>＜param-value＞/WEB-INF/applicationContext-hibernate.xml＜/param-value＞<br>＜param-value＞/WEB-INF/applicationContext-service.xml＜/param-value＞<br>＜/context-param＞</td>
        </tr>
    </tbody>
</table>
<br>　　9、在spring中如何配置的log4j?<br><br>　　在web.xml中加入以下代码即可。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>＜context-param＞<br>＜param-name＞log4jConfigLocation＜/param-name＞<br>＜param-value＞/WEB-INF/log4j.properties＜/param-value＞<br>＜/context-param＞</td>
        </tr>
    </tbody>
</table>
<br>　　10、Spring框架入门的编程问题解决了，我该如何更深地领会Spring框架呢？<br><br>　　这两本书你该去看看。这两本书是由Spring的作者Rod Johnson编写的。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>Expert One on one J2EE Design and Development<br>Expert One on one J2EE Development Without EJB</td>
        </tr>
    </tbody>
</table>
<br>　　你也该看看martinfowler的Inversion of Control Containers and the Dependency Injection pattern。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>http://www.martinfowler.com/articles/injection.html</td>
        </tr>
    </tbody>
</table>
　<br>　　再好好研读一下spring的文档。<br><br>
<table borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
    <tbody>
        <tr>
            <td>http://www.jactiongroup.net/reference/html/index.html（中文版，未全部翻译）</td>
        </tr>
    </tbody>
</table>
<br>　　还有就是多实践吧。
<img src ="http://www.blogjava.net/junky/aggbug/122540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-06-07 11:10 <a href="http://www.blogjava.net/junky/archive/2007/06/07/122540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open Session In View探讨(转)</title><link>http://www.blogjava.net/junky/archive/2007/03/06/102142.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 06 Mar 2007 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/03/06/102142.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/102142.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/03/06/102142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/102142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/102142.html</trackback:ping><description><![CDATA[
		<font size="2">
				<font color="#4b4b4b">
						<font face="宋体">在没有使用</font>
						<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">Spring</span>
				</font>
		</font>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">提供的</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">Open Session In View</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">情况下，因需要在</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">service(or Dao)</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">层里把</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">session</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">关闭，所以</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">lazy loading </span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">为</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">true</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">的话，要在应用层内把关系集合都初始化，如</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana"> company.getEmployees()</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">，否则</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">Hibernate</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">抛</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">session already closed Exception;</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">    Open Session In View</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">提供了一种简便的方法，较好地解决了</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">lazy loading</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">问题</span>
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">.</span>
		<p>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">
						<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">    </span>它有两种配置方式<font face="Verdana">OpenSessionInViewInterceptor</font></span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">和<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">OpenSessionInViewFilter(具体参看<a title="SpringSide" href="http://www.springside.org.cn/" target="_blank">SpringSide</a>)</span></span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">，功能相同，只是一个在</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">web.xml</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">配置，另一个在</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">application.xml</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">配置而已。</span>
		</p>
		<p>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">
				</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">    Open Session In View</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">在</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">request</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">把</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">session</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">绑定到当前</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">thread</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">期间一直保持</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">hibernate session</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">在</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">open</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">状态，使</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">session</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">在</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">request</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">的整个期间都可以使用，如在</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">View</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">层里</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">PO</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">也可以</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">lazy loading</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">数据，如</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana"> ${ company.employees }</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">。当</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">View </span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">层逻辑完成后，才会通过</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">Filter</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">的</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">doFilter</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">方法或</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">Interceptor</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">的</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">postHandle</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">方法自动关闭</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">session</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: 宋体">。</span>
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">
				</span>
		</p>
		<br />
		<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">
				<span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; FONT-FAMILY: Verdana">
						<div class="head">
								<pre class="java">
										<div class="head">OpenSessionInViewInterceptor配置</div>
										<ol>
												<li class="li1">
														<div class="de1">&lt;beans&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;bean name=<span class="st0">"openSessionInViewInterceptor"</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">class</span>=<span class="st0">"org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"</span>&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;property name=<span class="st0">"sessionFactory"</span>&gt;</div>
												</li>
												<li class="li1">
														<div class="de1">      &lt;ref bean=<span class="st0">"sessionFactory"</span>/&gt;</div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;/property&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;/bean&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;bean id=<span class="st0">"urlMapping"</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">class</span>=<span class="st0">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</span>&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;property name=<span class="st0">"interceptors"</span>&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">      &lt;list&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">        &lt;ref bean=<span class="st0">"openSessionInViewInterceptor"</span>/&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">      &lt;/list&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;/property&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;property name=<span class="st0">"mappings"</span>&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    ... </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;/property&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;/bean&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">... </div>
												</li>
												<li class="li1">
														<div class="de1">&lt;/beans&gt; </div>
												</li>
										</ol>
								</pre>
						</div>
						<div class="head">
						</div>
						<div class="head">
								<pre class="java">
										<div class="head">OpenSessionInViewFilter配置</div>
										<ol>
												<li class="li1">
														<div class="de1">&lt;web-app&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">... </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;filter&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;filter-class&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">      org.<span class="me1">springframework</span>.<span class="me1">orm</span>.<span class="me1">hibernate3</span>.<span class="me1">support</span>.<span class="me1">OpenSessionInViewFilter</span></div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;/filter-class&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;!-- singleSession默认为true,若设为false则等于没用<span class="me1">OpenSessionInView --&gt;</span></div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;init-param&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">      &lt;param-name&gt;singleSession&lt;/param-name&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">      &lt;param-value&gt;true&lt;/param-value&gt;</div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;/init-param&gt;</div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;/filter&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">... </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;filter-mapping&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">    &lt;url-pattern&gt;*.<span class="me1">do</span>&lt;/url-pattern&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">  &lt;/filter-mapping&gt; </div>
												</li>
												<li class="li1">
														<div class="de1">... </div>
												</li>
												<li class="li1">
														<div class="de1">&lt;/web-app&gt; </div>
												</li>
										</ol>
								</pre>
								<p>很多人在使用OpenSessionInView过程中提及一个错误：</p>
								<pre class="java">
										<ol>
												<li class="li1">
														<div class="de1">org.<span class="me1">springframework</span>.<span class="me1">dao</span>.<span class="me1">InvalidDataAccessApiUsageException</span>: Write operations </div>
												</li>
												<li class="li1">
														<div class="de1">are not allowed in read-only mode <span class="br0">(</span>FlushMode.<span class="me1">NEVER</span><span class="br0">)</span> - turn your Session into </div>
												</li>
												<li class="li1">
														<div class="de1">FlushMode.<span class="me1">AUTO</span> or remove <span class="st0">'readOnly'</span> marker from transaction definition </div>
												</li>
										</ol>
								</pre>
								<p>看看OpenSessionInViewFilter里的几个方法</p>
								<pre class="java">
										<ol>
												<li class="li1">
														<div class="de1">
																<span class="kw2">protected</span>
																<span class="kw4">void</span> doFilterInternal<span class="br0">(</span>HttpServletRequest request, <br />HttpServletResponse response,FilterChain filterChain<span class="br0">)</span><br /><span class="kw2">throws</span> ServletException, <span class="kw3">IOException</span><span class="br0">{<br /></span>　SessionFactory sessionFactory = lookupSessionFactory<span class="br0">(</span><span class="br0">)</span>;<br />　logger.<span class="me1">debug</span><span class="br0">(</span><span class="st0">"Opening Hibernate Session in OpenSessionInViewFilter"</span><span class="br0">)</span>;<br />　Session session = getSession<span class="br0">(</span>sessionFactory<span class="br0">)</span>;<br />　TransactionSynchronizationManager.<span class="me1">bindResource</span><span class="br0">(<br /></span>　　sessionFactory, <span class="kw2">new</span> SessionHolder<span class="br0">(</span>session<span class="br0">)</span><span class="br0">)</span>;<br />　<span class="kw2">try</span><span class="br0">{<br /></span>　　filterChain.<span class="me1">doFilter</span><span class="br0">(</span>request, response<span class="br0">)</span>;<br />　<span class="br0">}<br /></span><span class="kw2">　finally</span><span class="br0">{<br /></span>　TransactionSynchronizationManager.<span class="me1">unbindResource</span><span class="br0">(</span>sessionFactory<span class="br0">)</span>;<br />　logger.<span class="me1">debug</span><span class="br0">(</span><span class="st0">"Closing Hibernate Session in OpenSessionInViewFilter"</span><span class="br0">)</span>;<br />　closeSession<span class="br0">(</span>session, sessionFactory<span class="br0">)</span>;<br />　<span class="br0">}<br /></span><span class="br0">}</span><span class="br0"><br /><br /><br /><br /><br /></span> </div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">protected</span> Session getSession<span class="br0">(</span>SessionFactory sessionFactory<span class="br0">)<br /></span><span class="kw2">throws</span> DataAccessResourceFailureException <span class="br0">{<br /></span>　Session session = SessionFactoryUtils.<span class="me1">getSession</span><span class="br0">(</span>sessionFactory, <span class="kw2">true</span><span class="br0">)</span>;<br />　session.<span class="me1">setFlushMode</span><span class="br0">(</span>FlushMode.<span class="me1">NEVER</span><span class="br0">)</span>;<br />　<span class="kw2">return</span> session;<br /><span class="br0">}</span></div>
												</li>
												<li class="li1">
														<span class="kw2">
																<br />protected</span>
														<span class="kw4">void</span> closeSession<span class="br0">(</span>Session session, SessionFactory sessionFactory<span class="br0">)<br /></span><span class="kw2">throws</span> CleanupFailureDataAccessException <span class="br0">{<br /></span>　SessionFactoryUtils.<span class="me1">closeSessionIfNecessary</span><span class="br0">(</span>session, sessionFactory<span class="br0">)</span>;<br /><span class="br0">}</span></li>
										</ol>
								</pre>
								<p>     可以看到OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager，使request的整个过程都使用同一个session，在请求过后再接除该sessionFactory的绑定，最后<span class="me1">closeSessionIfNecessary</span>根据该session是否已和transaction绑定来决定是否关闭session。在这个过程中，若HibernateTemplate 发现自当前session有不是readOnly的transaction，就会获取到FlushMode.AUTO Session，使方法拥有写权限。</p>
								<pre class="java">
										<ol>
												<li class="li1">
														<div class="de1">
																<span class="kw2">public</span>
																<span class="kw2">static</span>
																<span class="kw4">void</span> closeSessionIfNecessary<span class="br0">(</span>Session session, SessionFactory sessionFactory<span class="br0">)</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">throws</span> CleanupFailureDataAccessException <span class="br0">{</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw1">if</span>
																<span class="br0">(</span>session == <span class="kw2">null</span> || <br />TransactionSynchronizationManager.<span class="me1">hasResource</span><span class="br0">(</span>sessionFactory<span class="br0">)</span><span class="br0">)</span><span class="br0">{</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">return</span>;</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="br0">}</span>
														</div>
												</li>
												<li class="li1">
														<div class="de1">    logger.<span class="me1">debug</span><span class="br0">(</span><span class="st0">"Closing Hibernate session"</span><span class="br0">)</span>;</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">try</span>
																<span class="br0">{</span>
														</div>
												</li>
												<li class="li1">
														<div class="de1">      session.<span class="me1">close</span><span class="br0">(</span><span class="br0">)</span>;</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="br0">}</span>
														</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">catch</span>
																<span class="br0">(</span>JDBCException ex<span class="br0">)</span><span class="br0">{</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="co1">// SQLException underneath</span>
														</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">throw</span>
																<span class="kw2">new</span> CleanupFailureDataAccessException<span class="br0">(</span><span class="st0">"Could not close Hibernate session"</span>, ex.<span class="me1">getSQLException</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span>;</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="br0">}</span>
														</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">catch</span>
																<span class="br0">(</span>HibernateException ex<span class="br0">)</span><span class="br0">{</span></div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="kw2">throw</span>
																<span class="kw2">new</span> CleanupFailureDataAccessException<span class="br0">(</span><span class="st0">"Could not close Hibernate session"</span>, ex<span class="br0">)</span>;</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="br0">}</span>
														</div>
												</li>
												<li class="li1">
														<div class="de1">
																<span class="br0">}</span>
														</div>
												</li>
										</ol>
								</pre>
								<p>    也即是，如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,update,delete操作权限，如果没有transaction，并且没有另外人为地设flush model的话，则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限，没受保护的则没有。</p>
								<pre class="xml">
										<div class="head">采用spring的事务声明,使方法受transaction控制</div>
										<ol>
												<li class="li1">
														<div class="de1">
																<span class="sc3">
																		<span class="re1">  &lt;bean id="baseTransaction" <br />class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" <br />          abstract="true"&gt; <br />        &lt;property name="transactionManager" ref="transactionManager"/&gt; <br />        &lt;property name="proxyTargetClass" value="true"/&gt; <br />        &lt;property name="transactionAttributes"&gt; <br />            &lt;props&gt; <br />                &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; <br />                &lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; <br />                &lt;prop key="load*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; <br />                &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />                &lt;prop key="add*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />                &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />                &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />            &lt;/props&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; </span>
																</span>
																<span class="sc3">
																		<span class="re1">
																				<br />
																		</span>
																</span>
														</div>
														<span class="sc3">
																<li class="li1">    &lt;bean id="userService" parent="baseTransaction"&gt; <br />        &lt;property name="target"&gt; <br />            &lt;bean class="com.phopesoft.security.service.impl.UserServiceImpl"/&gt; <br />        &lt;/property&gt; <br />    &lt;/bean&gt; </li>
														</span>
												</li>
										</ol>
								</pre>
						</div>
						<ol>
						</ol>
						<p>对于上例，则以save,add,update,remove开头的方法拥有可写的事务，如果当前有某个方法，如命名为importExcel()，则因没有transaction而没有写权限，这时若方法内有insert,update,delete操作的话，则需要手动设置flush model为Flush.AUTO,如</p>
						<pre class="java">
								<ol>
										<li class="li1">
												<div class="de1"> session.<span class="me1">setFlushMode</span><span class="br0">(</span>FlushMode.<span class="me1">AUTO</span><span class="br0">)</span>; </div>
										</li>
										<li class="li1">
												<div class="de1"> session.<span class="me1">save</span><span class="br0">(</span>user<span class="br0">)</span>; </div>
										</li>
										<li class="li1">
												<div class="de1"> session.<span class="me1">flush</span><span class="br0">(</span><span class="br0">)</span>; </div>
										</li>
								</ol>
						</pre>
						<p>     尽管Open Session In View看起来还不错，其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码，这个方法实际上是被父类的doFilter调用的，因此，我们可以大约了解的OpenSessionInViewFilter调用流程: request(请求)-&gt;open session并开始transaction-&gt;controller-&gt;View(Jsp)-&gt;结束transaction并close session.</p>
						<p>     一切看起来很正确，尤其是在本地开发测试的时候没出现问题，但试想下如果流程中的某一步被阻塞的话，那在这期间connection就一直被占用而不释放。最有可能被阻塞的就是在写Jsp这步，一方面可能是页面内容大，response.write的时间长，另一方面可能是网速慢，服务器与用户间传输时间久。当大量这样的情况出现时，就有连接池连接不足，造成页面假死现象。</p>
						<p>Open Session In View是个双刃剑，放在公网上内容多流量大的网站请慎用。</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/junky/aggbug/102142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-03-06 14:01 <a href="http://www.blogjava.net/junky/archive/2007/03/06/102142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring + Quartz 轻松搞定web任务定时调度(转)</title><link>http://www.blogjava.net/junky/archive/2007/02/25/100617.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Sun, 25 Feb 2007 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/02/25/100617.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/100617.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/02/25/100617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/100617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/100617.html</trackback:ping><description><![CDATA[
		<p>web任务定时调度具体的实现方法很多.</p>
		<p>这里就只分享自己的唯一经验了. spring + quartz.</p>
		<p>其实spring对quartz封装的完美无暇.哈哈 </p>
		<p>小试牛刀开始了...</p>
		<p>java代码呢就是区区几行.</p>
		<p>
				<br />import org.quartz.JobExecutionContext;<br />import org.quartz.JobExecutionException;<br />import org.springframework.scheduling.quartz.QuartzJobBean;<br />import org.apache.log4j.*;</p>
		<p>public class ContentArbitrateServiceJob extends QuartzJobBean {<br /> public static Logger log = Logger.getLogger(ContentArbitrateServiceJob.class);<br /> private int timeout;<br /> public void setTimeout(int timeout){<br />  this.timeout = timeout;<br /> }<br /> protected void executeInternal(JobExecutionContext arg0)<br />   throws JobExecutionException {<br />  // TODO Auto-generated method stub<br />  try{<br />   log.info("系统监督仲裁处理任务开始&gt;........");<br />   //业务逻辑代码调用<br />   log.info("系统监督仲裁处理任务结束!");<br />  }catch(Exception e){<br />   log.error("系统监督仲裁处理任务出现异常",e);<br />  }<br /> }</p>
		<p>} </p>
		<p> </p>
		<p>下面就是看配置文件里面的道道了.其实也不难.</p>
		<p>&lt;bean name="contentarbitrateservicejob"  class="org.springframework.scheduling.quartz.JobDetailBean"&gt;<br />    &lt;property name="jobClass"&gt;<br />     &lt;value&gt;com.xuedu.ContentArbitrateServiceJob&lt;/value&gt;<br />    &lt;/property&gt;<br />    &lt;property name="jobDataAsMap"&gt;<br />     &lt;map&gt;<br />      &lt;entry key="timeout"&gt;<br />       &lt;value&gt;5&lt;/value&gt;<br />      &lt;/entry&gt;<br />     &lt;/map&gt;<br />    &lt;/property&gt;<br />   &lt;/bean&gt;<br /> <br />  &lt;!-- 配置触发器 --&gt;<br />       &lt;bean id="cronTriggerCA" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;</p>
		<p>  &lt;property name="jobDetail"&gt;<br />   &lt;ref bean="contentarbitrateservicejob"/&gt;<br />  &lt;/property&gt;<br />  &lt;!-- 每天的8点到21点 每50分钟触发，具体说明见附录 --&gt;<br />  &lt;property name="cronExpression"&gt;<br />   &lt;value&gt;0 50 08-21 * * ?&lt;/value&gt;<br />  &lt;/property&gt;</p>
		<p>    &lt;/bean&gt;<br />    <br />    &lt;bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt;</p>
		<p>  &lt;!-- 添加触发器 --&gt;<br />   &lt;property name="triggers"&gt;<br />    &lt;list&gt;<br />   &lt;ref local="cronTriggerCA"/&gt;<br />    &lt;/list&gt;<br />   &lt;/property&gt;<br />    &lt;/bean&gt;</p>
		<p>也很简单吧.</p>
		<p>至于cronExpresession的设定格式呢,小弟附下:</p>
		<p>字段 允许值 允许的特殊字符 <br />秒 0-59 , - * / <br />分 0-59 , - * / <br />小时 0-23 , - * / <br />日期 1-31 , - * ? / L W C <br />月份 1-12 或者 JAN-DEC , - * / <br />星期 1-7 或者 SUN-SAT , - * ? / L C # <br />年（可选） 留空, 1970-2099 , - * / </p>
		<p>
				<br />表达式 意义 <br />"0 0 12 * * ?" 每天中午12点触发 <br />"0 15 10 ? * *" 每天上午10:15触发 <br />"0 15 10 * * ?" 每天上午10:15触发 <br />"0 15 10 * * ? *" 每天上午10:15触发 <br />"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 <br />"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 <br />"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 <br />"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 <br />"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 <br />"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 <br />"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 <br />"0 15 10 15 * ?" 每月15日上午10:15触发 <br />"0 15 10 L * ?" 每月最后一日的上午10:15触发 <br />"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br />"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 <br />"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 <br /></p>
		<p>至于每个符号 看看例子就好了.很简单了.</p>
<img src ="http://www.blogjava.net/junky/aggbug/100617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-02-25 17:46 <a href="http://www.blogjava.net/junky/archive/2007/02/25/100617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi安全系统的配置(转)</title><link>http://www.blogjava.net/junky/archive/2007/01/30/96724.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 30 Jan 2007 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2007/01/30/96724.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/96724.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2007/01/30/96724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/96724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/96724.html</trackback:ping><description><![CDATA[
		<div class="con_sample">
				<p>
						<font color="#000000">Acegi 的配置看起来非常复杂,但事实上在实际项目的安全应用中我们并不需要那么多功能,清楚的了解Acegi配置中各项的功能，有助于我们灵活的运用Acegi于实践中。 </font>
				</p>
		</div>
		<div class="con_all">
				<p>
						<font color="#000000">
						</font> </p>
				<p>
						<font color="#000000">            Acegi 的配置看起来非常复杂,但事实上在实际项目的安全应用中我们并不需要那么多功能,清楚的了解Acegi配置中各项的功能，有助于我们灵活的运用Acegi于实践中。</font>
				</p>
				<p>
						<font color="#000000">2.1 在Web.xml中的配置</font>
				</p>
				<p>
						<font color="#000000">1)  <strong>FilterToBeanProxy</strong><br />　　Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式，它委托Spring中的Bean -- FilterChainProxy来完成过滤功能，这好处是简化了web.xml的配置，并且充分利用了Spring IOC的优势。FilterChainProxy包含了处理认证过程的filter列表，每个filter都有各自的功能。</font>
				</p>
				<pre>
						<font color="#000000">    &lt;filter&gt;<br />        &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />        &lt;filter-class&gt;org.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />        &lt;init-param&gt;<br />            &lt;param-name&gt;targetClass&lt;/param-name&gt;<br />            &lt;param-value&gt;org.acegisecurity.util.FilterChainProxy&lt;/param-value&gt;<br />        &lt;/init-param&gt;<br />    &lt;/filter&gt;</font>
				</pre>
				<p>
						<font color="#000000">2) <strong>filter-mapping</strong><br />　　&lt;filter-mapping&gt;限定了FilterToBeanProxy的URL匹配模式,只有*.do和*.jsp和/j_acegi_security_check 的请求才会受到权限控制，对javascript,css等不限制。</font>
				</p>
				<pre>
						<font color="#000000">   &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />      &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br />    <br />    &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />      &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;<br />    <br />    &lt;filter-mapping&gt;<br />      &lt;filter-name&gt;Acegi Filter Chain Proxy&lt;/filter-name&gt;<br />      &lt;url-pattern&gt;/j_acegi_security_check&lt;/url-pattern&gt;<br />    &lt;/filter-mapping&gt;</font>
				</pre>
				<p>
						<font color="#000000">3) <strong>HttpSessionEventPublisher</strong><br />　　&lt;listener&gt;的HttpSessionEventPublisher用于发布HttpSessionApplicationEvents和HttpSessionDestroyedEvent事件给spring的applicationcontext。</font>
				</p>
				<pre>
						<font color="#000000">    &lt;listener&gt;<br />        &lt;listener-class&gt;org.acegisecurity.ui.session.HttpSessionEventPublisher&lt;/listener-class&gt;<br />    &lt;/listener&gt;<br /></font>
				</pre>
				<h2>
						<br />
						<font color="#000000">2.2 在applicationContext-acegi-security.xml中</font>
				</h2>
				<h3>
						<font color="#000000">2.2.1 FILTER CHAIN</font>
				</h3>
				<p>
						<font color="#000000">　　FilterChainProxy会按顺序来调用这些filter,使这些filter能享用Spring ioc的功能, CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON定义了url比较前先转为小写， PATTERN_TYPE_APACHE_ANT定义了使用Apache ant的匹配模式 </font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy"&gt;<br />        &lt;property name="filterInvocationDefinitionSource"&gt;<br />            &lt;value&gt;<br />                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />                PATTERN_TYPE_APACHE_ANT<br />               /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,<br />basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,<br /> exceptionTranslationFilter,filterInvocationInterceptor<br />            &lt;/value&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<h3>
						<font color="#000000">2.2.2 基础认证</font>
				</h3>
				<p>
						<font color="#000000">1) <strong>authenticationManager</strong><br />　　起到认证管理的作用，它将验证的功能委托给多个Provider，并通过遍历Providers, 以保证获取不同来源的身份认证，若某个Provider能成功确认当前用户的身份，authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象，否则会抛出一个AuthenticationException。<br />Acegi提供了不同的AuthenticationProvider的实现,如：<br />        DaoAuthenticationProvider 从数据库中读取用户信息验证身份<br />        AnonymousAuthenticationProvider 匿名用户身份认证<br />        RememberMeAuthenticationProvider 已存cookie中的用户信息身份认证<br />        AuthByAdapterProvider 使用容器的适配器验证身份<br />        CasAuthenticationProvider 根据Yale中心认证服务验证身份, 用于实现单点登陆<br />        JaasAuthenticationProvider 从JASS登陆配置中获取用户信息验证身份<br />        RemoteAuthenticationProvider 根据远程服务验证用户身份<br />        RunAsImplAuthenticationProvider 对身份已被管理器替换的用户进行验证<br />        X509AuthenticationProvider 从X509认证中获取用户信息验证身份<br />        TestingAuthenticationProvider 单元测试时使用</font>
				</p>
				<p>
						<font color="#000000">        每个认证者会对自己指定的证明信息进行认证，如DaoAuthenticationProvider仅对UsernamePasswordAuthenticationToken这个证明信息进行认证。</font>
				</p>
				<pre>
						<font color="#000000">&lt;bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager"&gt;<br />        &lt;property name="providers"&gt;<br />            &lt;list&gt;<br />                &lt;ref local="daoAuthenticationProvider"/&gt;<br />                &lt;ref local="anonymousAuthenticationProvider"/&gt;<br />                &lt;ref local="rememberMeAuthenticationProvider"/&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />&lt;/bean&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">2) <strong>daoAuthenticationProvider</strong><br />　　进行简单的基于数据库的身份验证。DaoAuthenticationProvider获取数据库中的账号密码并进行匹配，若成功则在通过用户身份的同时返回一个包含授权信息的Authentication对象，否则身份验证失败，抛出一个AuthenticatiionException。</font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;<br />        &lt;property name="userDetailsService" ref="jdbcDaoImpl"/&gt;<br />        &lt;property name="userCache" ref="userCache"/&gt;<br />        &lt;property name="passwordEncoder" ref="passwordEncoder"/&gt;<br />   &lt;/bean&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">3) <strong>passwordEncoder</strong> <br />　　使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:<br />PlaintextPasswordEncoder—默认，不加密，返回明文.<br />ShaPasswordEncoder—哈希算法(SHA)加密<br />Md5PasswordEncoder—消息摘要(MD5)加密</font>
				</p>
				<pre>
						<font color="#000000">&lt;bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">4) <strong>jdbcDaoImpl</strong> <br />　　用于在数据中获取用户信息。 acegi提供了用户及授权的表结构，但是您也可以自己来实现。通过usersByUsernameQuery这个SQL得到你的(用户ID,密码,状态信息);通过authoritiesByUsernameQuery这个SQL得到你的(用户ID,授权信息)</font>
				</p>
				<pre>
						<font color="#000000"> 
&lt;bean id="jdbcDaoImpl" 
class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"&gt;<br />        
&lt;property name="dataSource" 
ref="dataSource"/&gt;<br />        &lt;property 
name="usersByUsernameQuery"&gt;<br />            
&lt;value&gt;select loginid,passwd,1 from users where loginid = 
?&lt;/value&gt;<br />        
&lt;/property&gt;<br />        &lt;property 
name="authoritiesByUsernameQuery"&gt;<br />            
&lt;value&gt;select u.loginid,p.name from users u,roles r,permissions 
p,user_role ur,role_permis rp where u.id=ur.user_id and r.id=ur.role_id and 
p.id=rp.permis_id 
and<br />                
r.id=rp.role_id and p.status='1' and 
u.loginid=?&lt;/value&gt;<br />        
&lt;/property&gt;<br />&lt;/bean&gt;</font>
				</pre>
				<p>
						<font color="#000000">5) <strong>userCache　&amp;  resourceCache</strong> <br />　　缓存用户和资源相对应的权限信息。每当请求一个受保护资源时，daoAuthenticationProvider就会被调用以获取用户授权信息。如果每次都从数据库获取的话，那代价很高，对于不常改变的用户和资源信息来说，最好是把相关授权信息缓存起来。(详见 </font>
						<a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">
								<font color="#000000">2.6.3 资源权限定义扩展</font>
						</a>
						<font color="#000000"> )<br />userCache提供了两种实现: NullUserCache和EhCacheBasedUserCache, NullUserCache实际上就是不进行任何缓存，EhCacheBasedUserCache是使用Ehcache来实现缓功能。</font>
				</p>
				<pre>
						<font color="#000000">&lt;bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;<br />        
&lt;property name="cacheManager" ref="cacheManager"/&gt;<br />        
&lt;property name="cacheName" value="userCache"/&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache" autowire="byName"&gt;<br />        &lt;property name="cache" ref="userCacheBackend"/&gt;      
    &lt;/bean&gt;<br />    &lt;bean id="resourceCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"&gt;        
 &lt;property name="cacheManager" ref="cacheManager"/&gt;        
        &lt;property name="cacheName" value="resourceCache"/&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="resourceCache" class="org.springside.modules.security.service.acegi.cache.ResourceCache" autowire="byName"&gt;<br />        &lt;property name="cache" ref="resourceCacheBackend"/&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">6) <strong>basicProcessingFilter</strong> <br />　　用于处理HTTP头的认证信息，如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE,Navigator的HTTP头中获取用户信息，将他们转交给通过authenticationManager属性装配的认证管理器。如果认证成功，会将一个Authentication对象放到会话中，否则，如果认证失败，会将控制转交给认证入口点(通过authenticationEntryPoint属性装配)</font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<p>
						<font color="#000000">7) <strong>basicProcessingFilterEntryPoint</strong> <br />　　通过向浏览器发送一个HTTP401(未授权)消息，提示用户登录。<br />处理基于HTTP的授权过程， 在当验证过程出现异常后的"去向"，通常实现转向、在response里加入error信息等功能。</font>
				</p>
				<pre>
						<font color="#000000">&lt;bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint"&gt;        
 &lt;property name="realmName" value="SpringSide Realm"/&gt;<br />&lt;/bean&gt;</font>
				</pre>
				<p>
						<font color="#000000">8) <strong>authenticationProcessingFilterEntryPoint</strong> <br />　　当抛出AccessDeniedException时，将用户重定向到登录界面。属性loginFormUrl配置了一个登录表单的URL,当需要用户登录时，authenticationProcessingFilterEntryPoint会将用户重定向到该URL</font>
				</p>
				<pre>
						<font color="#000000"> 
&lt;bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt;<br />&lt;property name="loginFormUrl"&gt;<br />&lt;value&gt;/security/login.jsp&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;property name="forceHttps" value="false"/&gt;<br />&lt;/bean&gt;</font>
				</pre>
				<h2>
						<font color="#000000">2.2.3 HTTP安全请求</font>
				</h2>
				<p>
						<font color="#000000">1) <strong>httpSessionContextIntegrationFilter</strong><br />　　每次request前 HttpSessionContextIntegrationFilter从Session中获取Authentication对象，在request完后, 又把Authentication对象保存到Session中供下次request使用,此filter必须其他Acegi filter前使用，使之能跨越多个请求。</font>
				</p>
				<pre>
						<font color="#000000">&lt;bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"&gt;&lt;/bean&gt;<br />    &lt;bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"&gt;<br />        &lt;property name="allowIfAllAbstainDecisions" value="false"/&gt;<br />        &lt;property name="decisionVoters"&gt;<br />            &lt;list&gt;<br />                &lt;ref bean="roleVoter"/&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />&lt;/bean&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">2) <strong>httpRequestAccessDecisionManager</strong><br />　　经过投票机制来决定是否可以访问某一资源(URL或方法)。allowIfAllAbstainDecisions为false时如果有一个或以上的decisionVoters投票通过,则授权通过。可选的决策机制有ConsensusBased和UnanimousBased</font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased"&gt;<br />        &lt;property name="allowIfAllAbstainDecisions" value="false"/&gt;<br />        &lt;property name="decisionVoters"&gt;<br />            &lt;list&gt;<br />                &lt;ref bean="roleVoter"/&gt;<br />            &lt;/list&gt;<br />        &lt;/property&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">3) <strong>roleVoter</strong><br /> 　　必须是以rolePrefix设定的value开头的权限才能进行投票,如AUTH_ , ROLE_</font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter"&gt;<br />        &lt;property name="rolePrefix" value="AUTH_"/&gt;<br />   &lt;/bean&gt;</font>
				</pre>
				<p>
						<font color="#000000">4）<strong>exceptionTranslationFilter</strong><br />　　异常转换过滤器，主要是处理AccessDeniedException和AuthenticationException，将给每个异常找到合适的"去向" </font>
				</p>
				<pre>
						<font color="#000000">   &lt;bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter"&gt;<br />        &lt;property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"/&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<p>
						<font color="#000000">5) <strong>authenticationProcessingFilter</strong><br />　　和servlet spec差不多,处理登陆请求.当身份验证成功时，AuthenticationProcessingFilter会在会话中放置一个Authentication对象，并且重定向到登录成功页面<br />         authenticationFailureUrl定义登陆失败时转向的页面<br />         defaultTargetUrl定义登陆成功时转向的页面<br />         filterProcessesUrl定义登陆请求的页面<br />         rememberMeServices用于在验证成功后添加cookie信息</font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="authenticationFailureUrl"&gt;<br />            &lt;value&gt;/security/login.jsp?login_error=1&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="defaultTargetUrl"&gt;<br />            &lt;value&gt;/admin/index.jsp&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="filterProcessesUrl"&gt;<br />            &lt;value&gt;/j_acegi_security_check&lt;/value&gt;<br />        &lt;/property&gt;<br />        &lt;property name="rememberMeServices" ref="rememberMeServices"/&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<p>
						<font color="#000000">6) <strong>filterInvocationInterceptor</strong><br />　　在执行转向url前检查objectDefinitionSource中设定的用户权限信息。首先，objectDefinitionSource中定义了访问URL需要的属性信息(这里的属性信息仅仅是标志，告诉accessDecisionManager要用哪些voter来投票)。然后，authenticationManager掉用自己的provider来对用户的认证信息进行校验。最后，有投票者根据用户持有认证和访问url需要的属性，调用自己的voter来投票，决定是否允许访问。</font>
				</p>
				<pre>
						<font color="#000000">    &lt;bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/&gt;<br />        &lt;property name="objectDefinitionSource" ref="filterDefinitionSource"/&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<p>
						<br />
						<font color="#000000">7) <strong>filterDefinitionSource </strong>(详见 </font>
						<a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">
								<font color="#000000">2.6.3 资源权限定义扩展</font>
						</a>
						<font color="#000000">)<br />　　自定义DBFilterInvocationDefinitionSource从数据库和cache中读取保护资源及其需要的访问权限信息 </font>
				</p>
				<pre>
						<font color="#000000">&lt;bean id="filterDefinitionSource" class="org.springside.modules.security.service.acegi.DBFilterInvocationDefinitionSource"&gt;<br />        &lt;property name="convertUrlToLowercaseBeforeComparison" value="true"/&gt;<br />        &lt;property name="useAntPath" value="true"/&gt;<br />        &lt;property name="acegiCacheManager" ref="acegiCacheManager"/&gt;<br />&lt;/bean&gt;</font>
				</pre>
				<h2>
						<font color="#000000">2.2.4 方法调用安全控制</font>
				</h2>
				<p>
						<font color="#000000">(详见 </font>
						<a href="http://www.springside.org.cn/docs/reference/Acegi4.htm">
								<font color="#000000">2.6.3 资源权限定义扩展</font>
						</a>
						<font color="#000000">)</font>
				</p>
				<p>
						<font color="#000000">1) methodSecurityInterceptor<br />　　在执行方法前进行拦截，检查用户权限信息<br />2) methodDefinitionSource<br />　　自定义MethodDefinitionSource从cache中读取权限</font>
				</p>
				<pre>
						<font color="#000000">   &lt;bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor"&gt;<br />        &lt;property name="authenticationManager" ref="authenticationManager"/&gt;<br />        &lt;property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/&gt;<br />        &lt;property name="objectDefinitionSource" ref="methodDefinitionSource"/&gt;<br />    &lt;/bean&gt;<br />    &lt;bean id="methodDefinitionSource" class="org.springside.modules.security.service.acegi.DBMethodDefinitionSource"&gt;<br />        &lt;property name="acegiCacheManager" ref="acegiCacheManager"/&gt;<br />    &lt;/bean&gt;</font>
				</pre>
				<h2>
						<font color="#000000">2.3 Jcaptcha验证码</font>
				</h2>
				<p>
						<font color="#000000">采用 </font>
						<a href="http://jcaptcha.sourceforge.net/">
								<font color="#000000">http://jcaptcha.sourceforge.net</font>
						</a>
						<font color="#000000"> 作为通用的验证码方案，请参考SpringSide中的例子，或网上的：<br /></font>
						<a href="http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse">
								<font color="#000000">http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse</font>
						</a>
						<font color="#000000">。</font>
				</p>
				<p>
						<font color="#000000">差沙在此过程中又发现acegi logout filter的错误，进行了修正。</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/junky/aggbug/96724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2007-01-30 14:14 <a href="http://www.blogjava.net/junky/archive/2007/01/30/96724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring的Acegi security的配置，和JDK1.5的一些问题(转)</title><link>http://www.blogjava.net/junky/archive/2006/12/22/89560.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Fri, 22 Dec 2006 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/12/22/89560.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/89560.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/12/22/89560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/89560.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/89560.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 新的项目没有开始于是抽空做一个通用一些的								Security,										后来又考虑到								CAS										和								SSL										的认证问题俺还没有弄懂，就选择直接使用								Spring										的子项目								acegi 		...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2006/12/22/89560.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/89560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-12-22 16:36 <a href="http://www.blogjava.net/junky/archive/2006/12/22/89560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP with Hibernate</title><link>http://www.blogjava.net/junky/archive/2006/10/17/75602.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 17 Oct 2006 06:08:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/10/17/75602.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/75602.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/10/17/75602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/75602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/75602.html</trackback:ping><description><![CDATA[
		<div class="diaryContent" id="diary313190" style="DISPLAY: block">
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">One of the sweetiest things the Spring framework gives is Hibernate support is built-in by the time it's born.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in">
						<span style="FONT-FAMILY: verdana">Following is a quick guide to configure Hibernate's SessionFactory in Spring. For a detailed version about Spring's Hibernate support, read </span>
						<a href="http://www.springframework.org/docs/data_access.html">
								<span style="FONT-WEIGHT: bold; FONT-FAMILY: " trebuchet="" ms?;?="">
										<font color="#002c99">http://www.springframework.org/docs/data_access.html</font>
								</span>
						</a>
						<span style="FONT-FAMILY: verdana">.</span>
				</p>
				<br />
				<br />
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">With Spring, Hibernate's SessionFactory no longer needs to bind itself to JNDI; nor use Hibernate's own hibernate.cfg.xml method, which is a little bit tricky to code in Hibernate 2.x (as Hibernate2 doesn't use the once-and-only-once configure() anymore).</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in">
						<span style="FONT-FAMILY: verdana">Instead, we use </span>
						<span style="FONT-FAMILY: " courier="" new?;?="">org.springframework.orm.hibernate.LocalSessionFactoryBean</span>
						<span style="FONT-FAMILY: verdana">.</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: black">&lt;bean id=</span>
						<span style="COLOR: rgb(153,0,0)">"MySessionFactory" </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">class</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">"org.springframework.orm.hibernate.LocalSessionFactoryBean"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"mappingResources"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;list&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;value&gt;mappings/Book.hbm.xml&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;value&gt;mappings/Patron.hbm.xml&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;value&gt;mappings/BorrowRecord.hbm.xml&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;/list&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"hibernateProperties"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;props&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;prop key=</span>
						<span style="COLOR: rgb(153,0,0)">"hibernate.dialect"</span>
						<span style="COLOR: black">&gt;net.sf.hibernate.dialect.MySQLDialect&lt;/prop&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;prop key=</span>
						<span style="COLOR: rgb(153,0,0)">"hibernate.query.substitutions"</span>
						<span style="COLOR: black">&gt;</span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">true</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">1 </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">false</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">0</span>
						<span style="COLOR: black">&lt;/prop&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;prop key=</span>
						<span style="COLOR: rgb(153,0,0)">"hibernate.show_sql"</span>
						<span style="COLOR: black">&gt;</span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">false</span>
						<span style="COLOR: black">&lt;/prop&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">        </span>
						<span style="COLOR: black">&lt;prop key=</span>
						<span style="COLOR: rgb(153,0,0)">"hibernate.use_outer_join"</span>
						<span style="COLOR: black">&gt;</span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">false</span>
						<span style="COLOR: black">&lt;/prop&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;/props&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"dataSource"</span>
						<span style="COLOR: black">&gt;&lt;ref bean=</span>
						<span style="COLOR: rgb(153,0,0)">"MyDataSource"</span>
						<span style="COLOR: black">/&gt;&lt;/property&gt;</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">&lt;/bean&gt;</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">The above parameters are simple and verbose: </p>
				<ul style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed">
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-FAMILY: " courier="" new?;="" font-size:="" 10pt;?="">mappingResources</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">: specifies a list of Hibernate's mapping XML files. The files' search path in JARs are identical to what Hibernate do. </span>
						</li>
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-FAMILY: " courier="" new?;="" font-size:="" 10pt;?="">hibernateProperties</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">: specify the properties to be set for Hibernate's SessionFactory. They are identical to these: </span>
								<a href="http://www.hibernate.org/hib_docs/reference/html/session-configuration.html#session-configuration-s5">
										<span style="FONT-WEIGHT: bold; FONT-FAMILY: " trebuchet="" font-size:="" 10pt;?="" ms?;="">
												<font color="#002c99">http://www.hibernate.org/hib_docs/reference/html/session-configuration.html#session-configuration-s5</font>
										</span>
								</a>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">
								</span>
						</li>
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-FAMILY: " courier="" new?;="" font-size:="" 10pt;?="">dataSource</span>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">: the DataSource used by the SessionFactory.</span>
								<span style="FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								</span>
						</li>
				</ul>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">However, <span style="FONT-WEIGHT: bold">we don't need to configure a transaction manager inside the SessionFactory</span>, as we will see below.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">After configuring this, we need to provide a setter method in our business objects that need to use Hibernate's SessionFactory:</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">import </span>
						<span style="COLOR: black">net.sf.hibernate.SessionFactory;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" color:="" black;?="" 8pt;="">....</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">public class </span>
						<span style="COLOR: black">MyBusinessObjectImpl </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">implements </span>
						<span style="COLOR: black">MyBusinessObject</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" color:="" black;?="" 8pt;="">{</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">private </span>
						<span style="COLOR: black">SessionFactory sessionFactory;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" color:="" 8pt;="" white;?="">  </p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">public </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(192,0,0)">void </span>
						<span style="COLOR: black">setSessionFactory(SessionFactory sessionFactory)</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">{</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">this</span>
						<span style="COLOR: black">.sessionFactory = sessionFactory;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">}</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">public </span>
						<span style="COLOR: black">SessionFactory getSessionFactory()</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">{</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">return this</span>
						<span style="COLOR: black">.sessionFactory;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">}</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">....</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">and hook it up to Spring.</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: black">&lt;bean id=</span>
						<span style="COLOR: rgb(153,0,0)">"MyBusinessObject" </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">class</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">"library.MyBusinessObjectImpl"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"sessionFactory"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;ref bean=</span>
						<span style="COLOR: rgb(153,0,0)">"MySessionFactory"</span>
						<span style="COLOR: black">/&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">&lt;/bean&gt;</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p>
				<p style="FONT-WEIGHT: bold; FONT-SIZE: 13.5pt; MARGIN: 0in; FONT-FAMILY: verdana">How about transactions support? And how do I get Hibernate's Session inside my business objects?</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">That's Spring framework's another power - HibernateInterceptor and TransactionInterceptor. With them, together with configurations made in Spring, methods inside business objects don't need to write a single line of code for that; instead, a Session will be bound to the business object's current thread, opened and closed automatically; and a transaction will also begin and end automatically.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">The sequence is like this: </p>
				<ol style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed">
						<li style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle; FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">Transaction begins </span>
						</li>
						<li style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle; FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">Hibernate session opened and bound to the current thread </span>
						</li>
						<li style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle; FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">Actual method execution </span>
						</li>
						<li style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle; FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">Hibernate session bound to the current thread closed </span>
						</li>
						<li style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle; FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">Transaction ended</span>
								<span style="FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								</span>
						</li>
				</ol>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">This is done with the help of Spring's AOP capability.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">However, we need to configure a transaction manager first.</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">&lt;bean id=</span>
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" rgb(153,="" 0,="" 0);?="">"MyTransactionManager" </span>
						<span style="FONT-WEIGHT: bold; FONT-FAMILY: " courier="" new?;="" color:="" 0,="" rgb(0,="" 192);?="">class</span>
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">=</span>
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" rgb(153,="" 0,="" 0);?="">"org.springframework.transaction.jta.JtaTransactionManager"</span>
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">/&gt;</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">The above configures a transaction manager that will access an UserTransaction inside the environment, usually in a J2EE container, or a servlet container with transaction support.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in">
						<span style="FONT-FAMILY: verdana">Alternately you may want to have a look at </span>
						<span style="FONT-WEIGHT: bold; FONT-FAMILY: " trebuchet="" ms?;?="">org.springframework.orm.hibernate.HibernateTransactionManager</span>
						<span style="FONT-FAMILY: verdana">.</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in">
						<span style="FONT-FAMILY: verdana">Next, we need to define the transaction attribute for our business methods. This is done in </span>
						<span style="FONT-FAMILY: " courier="" new?;?="">org.springframework.transaction.interceptor.TransactionInterceptor</span>
						<span style="FONT-WEIGHT: bold; FONT-FAMILY: " trebuchet="" ms?;?="">?</span>
						<span style="FONT-FAMILY: verdana">.</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: black">&lt;bean id=</span>
						<span style="COLOR: rgb(153,0,0)">"MyTransactionInterceptor" </span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">class</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">"org.springframework.transaction.interceptor.TransactionInterceptor"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"transactionManager"</span>
						<span style="COLOR: black">&gt;&lt;ref bean=</span>
						<span style="COLOR: rgb(153,0,0)">"MyTransactionManager"</span>
						<span style="COLOR: black">/&gt;&lt;/property&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"transactionAttributeSource"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">  </span>
						<span style="COLOR: black">&lt;value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">         </span>
						<span style="COLOR: black">library.MyBusinessImpl.borrowBook=PROPAGATION_REQUIRED</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">         </span>
						<span style="COLOR: black">library.MyBusinessImpl.returnBook=PROPAGATION_REQUIRED</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">         </span>
						<span style="COLOR: black">library.BookSearchImpl.*=PROPAGATION_SUPPORTS</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">  </span>
						<span style="COLOR: black">&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">&lt;/bean&gt;</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<ul style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed">
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">transactionManager: refer to the transaction manager you choose. </span>
						</li>
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">transactionAttributeSource: tell TransactionInterceptor each method's transaction requirement. Read </span>
								<a href="http://www.springframework.org/docs/api_1.0m1/org/springframework/transaction/TransactionDefinition.html">
										<span style="FONT-WEIGHT: bold; FONT-FAMILY: " trebuchet="" font-size:="" 10pt;?="" ms?;="">
												<font color="#002c99">http://www.springframework.org/docs/api_1.0m1/org/springframework/transaction/TransactionDefinition.html</font>
										</span>
								</a>
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana"> for the values allowed.</span>
								<span style="FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								</span>
						</li>
				</ul>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">You can use a wildcard to tell every method in that business object uses the same transaction attribute. However it is not recommended, as the private methods used inside the business object will have transactions too, which you may not need to.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">By the way, the TransactionInterceptor's default behaviour is to commit an transaction anyway, and rollback whenever a RuntimeException is caught - much the same as EJB's behaviour. If you want to control TransactionInterceptor's behaviour when exception is caught, you may tell it with a plus (+) or minus (-) sign, followed by the name of the exception, to commit or rollback a transaction even if an exception mentioned is caught.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">An example:</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">library.MyBusinessImpl.addBook=PROPAGATION_REQUIRED,-SeriesNotFoundException,+CategoryNotFoundException</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">This means that when SeriesNotFoundException is thrown inside the addBook() method, the transaction will roll back; on the other hand when CategoryNotFoundException is thrown the transaction will be commited anyway.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">In most cases you don't need to specify the exception's name with the package it belongs; you just need to specify simply the exception's name.</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">Then our business objects will need to define as an AOP "target". This is just a change in a name; make sure your code will not call these business objects directly. So change the above business object declaration to</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: black">&lt;bean id=</span>
						<span style="COLOR: rgb(153,0,0)">"MyBusinessObjectTarget" </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">class</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">"library.MyBusinessObjectImpl"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"sessionFactory"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;ref bean=</span>
						<span style="COLOR: rgb(153,0,0)">"MySessionFactory"</span>
						<span style="COLOR: black">/&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">&lt;/bean&gt;</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">Final step is to expose the business object on Spring's ApplicationContext, but not the business object itself; instead we use a ProxyFactoryBean, provided by Spring.</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: black">&lt;bean id=</span>
						<span style="COLOR: rgb(153,0,0)">"MyBusinessObject" </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">class</span>
						<span style="COLOR: black">=</span>
						<span style="COLOR: rgb(153,0,0)">"org.springframework.aop.framework.ProxyFactoryBean"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"proxyInterfaces"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;value&gt;library.MyBusinessObject&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;property name=</span>
						<span style="COLOR: rgb(153,0,0)">"interceptorNames"</span>
						<span style="COLOR: black">&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;list&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">         </span>
						<span style="COLOR: black">&lt;value&gt;MyTransactionInterceptor&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">         </span>
						<span style="COLOR: black">&lt;value&gt;MyHibernateInterceptor&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">         </span>
						<span style="COLOR: black">&lt;value&gt;MyBusinessObjectTarget&lt;/value&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">&lt;/list&gt;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">&lt;/property&gt;</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">&lt;/bean&gt;</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<ul style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed">
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">proxyInterfaces: the interface implemented by your business object. </span>
						</li>
						<li style="MARGIN-TOP: 0pt; FONT-SIZE: 12pt; MARGIN-BOTTOM: 0pt; VERTICAL-ALIGN: middle">
								<span style="FONT-SIZE: 10pt; FONT-FAMILY: verdana">interceptorNames: the interceptors to be applied when methods on the business interface is called. Be careful, they have to be placed in order.</span>
								<span style="FONT-FAMILY: " font-size:="" times="" new="" roman?;="" 12pt;?="">
								</span>
						</li>
				</ul>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: verdana">Then in our business method we just need to obtain the Session instance, and ignore everything else - everything is done behind the scene.</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">import </span>
						<span style="COLOR: black">net.sf.hibernate.*;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">import </span>
						<span style="COLOR: black">org.springframework.orm.hibernate.SessionFactoryUtils;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" color:="" black;?="" 8pt;="">....</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">public </span>
						<span style="COLOR: black">Book findBook(</span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(192,0,0)">int </span>
						<span style="COLOR: black">bookID) </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">throws </span>
						<span style="COLOR: black">BookNotFoundException, DataAccessException</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" color:="" black;?="" 8pt;="">{</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: green">//get the Session instance already bound to current thread and opened</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">Session session = SessionFactoryUtils.getSession(getSessionFactory(), </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">false</span>
						<span style="COLOR: black">);</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">try</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">{</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="COLOR: black">Book book = (Book)session.load(Book.class, bookID);</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">return </span>
						<span style="COLOR: black">book;</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">}</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">catch</span>
						<span style="COLOR: black">(ObjectNotFoundException e)</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">{</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">throw new </span>
						<span style="COLOR: black">BookNotFoundException();</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">}</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">catch</span>
						<span style="COLOR: black">(HibernateException e)</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">{</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">      </span>
						<span style="FONT-WEIGHT: bold; COLOR: rgb(0,0,192)">throw </span>
						<span style="COLOR: black">SessionFactoryUtils.convertHibernateAccessException(e);</span>
				</p>
				<p style="MARGIN: 0in; FONT-FAMILY: " courier="" new?;="" font-size:="" 8pt;?="">
						<span style="COLOR: white">   </span>
						<span style="COLOR: black">}</span>
				</p>
				<p style="FONT-SIZE: 8pt; MARGIN: 0in">
						<span style="FONT-FAMILY: " courier="" new?;="" color:="" black;?="">}</span>
						<span style="FONT-FAMILY: " trebuchet="" ms?;?="">
						</span>
				</p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p>
				<p style="FONT-SIZE: 10pt; MARGIN: 0in">
						<span style="FONT-FAMILY: verdana">Alternately you may also use HibernateTemplate and TransactionTemplate, though the above method is simpler. Read </span>
						<a href="http://www.hibernate.org/110.html">
								<span style="FONT-WEIGHT: bold; FONT-FAMILY: " trebuchet="" ms?;?="">
										<font color="#002c99">http://www.hibernate.org/110.html</font>
								</span>
						</a>
						<span style="FONT-FAMILY: verdana"> for details (this page seems more updated than the one in Spring?).</span>
				</p>
		</div>
<img src ="http://www.blogjava.net/junky/aggbug/75602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-10-17 14:08 <a href="http://www.blogjava.net/junky/archive/2006/10/17/75602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring的几个常用的Bean声明</title><link>http://www.blogjava.net/junky/archive/2006/10/17/75600.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 17 Oct 2006 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/10/17/75600.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/75600.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/10/17/75600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/75600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/75600.html</trackback:ping><description><![CDATA[
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: 宋体">在做</span>
				<span style="FONT-FAMILY: tahoma">Spring</span>
				<span style="FONT-FAMILY: 宋体">相关开发时，时常要用到一些相关的</span>
				<span style="FONT-FAMILY: tahoma">Bean</span>
				<span style="FONT-FAMILY: 宋体">的声明，如数据库连接池，</span>
				<span style="FONT-FAMILY: tahoma">hibernate</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span style="FONT-FAMILY: tahoma">SessionFactory</span>
				<span style="FONT-FAMILY: 宋体">声明等。一下是一些常用到的</span>
				<span style="FONT-FAMILY: tahoma">Bean</span>
				<span style="FONT-FAMILY: 宋体">声明。</span>
		</p>
		<br />
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: 宋体">
						<br />
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">1 Message source</span>
				<span style="FONT-FAMILY: 宋体">的声明，重要用于系统的信息提示。</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="basename"&gt;&lt;value&gt;messages&lt;/value&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">2 </span>
				<span style="FONT-FAMILY: 宋体">属性值的声明，主要为</span>
				<span style="FONT-FAMILY: tahoma">Bean</span>
				<span style="FONT-FAMILY: 宋体">声明文件中使用：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="locations"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;list&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;value&gt;WEB-INF/mail.properties&lt;/value&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;value&gt;WEB-INF/jdbc.properties&lt;/value&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/list&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">3 Custom Editor</span>
				<span style="FONT-FAMILY: 宋体">的注册，以下是日期的注册：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="customEditors"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;map&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;entry key="java.util.Date"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean class="org.springframework.beans.propertyeditors.CustomDateEditor"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;constructor-arg index="0"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean class="java.text.SimpleDateFormat"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;constructor-arg&gt;&lt;value&gt;yyyy-MM-dd&lt;/value&gt;&lt;/constructor-arg&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/constructor-arg&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;constructor-arg index="1"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/constructor-arg&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/entry&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/map&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">4 </span>
				<span style="FONT-FAMILY: 宋体">数据库连接池的设置：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="driverClassName"&gt;&lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="url"&gt;&lt;value&gt;${jdbc.url}&lt;/value&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="username"&gt;&lt;value&gt;${jdbc.username}&lt;/value&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="password"&gt;&lt;value&gt;${jdbc.password}&lt;/value&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">5 hibernate</span>
				<span style="FONT-FAMILY: 宋体">的设置：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="dataSource"&gt;&lt;ref local="dataSource"/&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="mappingResources"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;value&gt;mapping.xml&lt;/value&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="hibernateProperties"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;props&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/props&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">6 Jotm</span>
				<span style="FONT-FAMILY: 宋体">的事务设置：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="userTransaction"&gt;&lt;ref local="jotm"/&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">7 Hibernate</span>
				<span style="FONT-FAMILY: 宋体">的事务设置：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="sessionFactory"&gt;&lt;ref local="sessionFactory"/&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">8 Bean</span>
				<span style="FONT-FAMILY: 宋体">的事务声明：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="clinic" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="transactionManager"&gt;&lt;ref local="hibernateTransactionManager"/&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="target"&gt;&lt;ref local="clinicTarget"/&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="transactionAttributes"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;props&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="load*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="store*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/props&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">9 Email</span>
				<span style="FONT-FAMILY: 宋体">的发送者声明：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="host"&gt;&lt;value&gt;${mail.host}&lt;/value&gt;&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: tahoma">10 </span>
				<span style="FONT-FAMILY: 宋体">基本</span>
				<span style="FONT-FAMILY: tahoma">Url Mapping</span>
				<span style="FONT-FAMILY: 宋体">的设置：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="DemoController" class="cn.edu.bit82.DemoController"/&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;property name="mappings"&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;props&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="/hello.html"&gt;DemoController&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;prop key="*"&gt;SecondController&lt;/prop&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/props&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/property&gt; </p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/bean&gt;</p>
		<p style="FONT-SIZE: 10pt; MARGIN: 0in">
				<span style="FONT-FAMILY: 宋体">总结：</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
				<span style="FONT-FAMILY: 宋体">以上是一些常用的</span>
				<span style="FONT-FAMILY: tahoma">Bean</span>
				<span style="FONT-FAMILY: 宋体">的声明，你一般会用到的，你可以使用</span>
				<span style="FONT-FAMILY: tahoma">IntelliJ</span>
				<span style="FONT-FAMILY: 宋体">的</span>
				<span style="FONT-FAMILY: tahoma">Live Template</span>
				<span style="FONT-FAMILY: 宋体">功能，可以设置某些参数，很快就完成了</span>
				<span style="FONT-FAMILY: tahoma">Bean</span>
				<span style="FONT-FAMILY: 宋体">的声明。</span>
				<span style="FONT-FAMILY: tahoma">
				</span>
		</p>
<img src ="http://www.blogjava.net/junky/aggbug/75600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-10-17 14:06 <a href="http://www.blogjava.net/junky/archive/2006/10/17/75600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ServiceLocator的实现</title><link>http://www.blogjava.net/junky/archive/2006/10/17/75601.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 17 Oct 2006 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/10/17/75601.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/75601.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/10/17/75601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/75601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/75601.html</trackback:ping><description><![CDATA[ServiceLocator的实现<br /><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">/*</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">* Created on 2004-8-25 by simba.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">*</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">package com.simba.blog.util;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import javax.servlet.ServletContext;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import org.apache.commons.logging.Log;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import org.apache.commons.logging.LogFactory;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import org.springframework.context.ApplicationContext;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import org.springframework.web.context.support.WebApplicationContextUtils;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import com.opensymphony.webwork.ServletActionContext;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">import com.simba.blog.service.BlogService;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">/**</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">* @author simba</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">* </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">* email: simbasun@msn.com</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">public class ServiceLocator</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//the catalog service bean name</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">private static final String BLOG_SERVICE_BEAN_NAME = "blogService";</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//the user service bean name</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">private static final String USER_SERVICE_BEAN_NAME = "userService";</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//the logger for this class</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">private Log logger = LogFactory.getLog(this.getClass());</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//the Spring application context</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">private ApplicationContext appContext;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//the cached catalog service</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">private BlogService blogService;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//the cached user service</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">//private UserService userService;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">/**</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* Constructor.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* &lt;p&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* The following steps being done:</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* &lt;ul&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* &lt;li&gt;retrieve Spring application context from servlet context.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* &lt;li&gt;look up &lt;code&gt;CatalogService&lt;/code&gt; from Spring application</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* context.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* &lt;li&gt;look up &lt;code&gt;UserService&lt;/code&gt; from Spring applicatino context.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* &lt;/ul&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">public ServiceLocator()</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">/*InputStream is = getClass().getResourceAsStream("springapp-servlet.xml"); </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">XmlBeanFactory bf = new XmlBeanFactory(is); </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">blogService = (BlogService) bf.getBean("blogService");*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma"> </p><p style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">ServletContext context = ServletActionContext.getServletContext();</p><p style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">this.appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);</p><p style="FONT-WEIGHT: bold; FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">this.blogService = (BlogService)this.lookupService(BLOG_SERVICE_BEAN_NAME);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">/*</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">* this.userService = (UserService)this.lookupService(USER_SERVICE_BEAN_NAME);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">this.logger.info("Service locator bean is initialized");</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">/**</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* Lookup service based on service bean name.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* @param serviceBeanName the service bean name</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* @return the service bean</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">public Object lookupService(String serviceBeanName)</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">return appContext.getBean(serviceBeanName);</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">/**</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">* @return Returns the blogService.</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">*/</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">public BlogService getBlogService()</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">{</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 1in; FONT-FAMILY: tahoma">return blogService;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: tahoma">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">}</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">[in web.xml]</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;context-param&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;param-value&gt;/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml&lt;/param-value&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/context-param&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;listener&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/listener&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;!-- OR USE THE CONTEXTLOADERSERVLET INSTEAD OF THE LISTENER</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;servlet&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;servlet-name&gt;context&lt;/servlet-name&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">&lt;/servlet&gt;</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: tahoma">--&gt;</p><img src ="http://www.blogjava.net/junky/aggbug/75601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-10-17 14:06 <a href="http://www.blogjava.net/junky/archive/2006/10/17/75601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax资源 or Ajax Resources</title><link>http://www.blogjava.net/junky/archive/2006/06/04/50368.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Sun, 04 Jun 2006 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/06/04/50368.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/50368.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/06/04/50368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/50368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/50368.html</trackback:ping><description><![CDATA[这些是完全的搜集。但是很遗憾的是这些在国内的站点上还是寥寥无几。<br /><br />资源－－－－中文<br />1 Ajax中国<br />    http://www.okajax.com/<br />2 Java 开源大全<br />    http://www.open-open.com/<br /><br />3 安全矩阵（Security Matrix）官方网站<br />    http://www.smatrix.org/<br />4 TechTarget IT专家网－－Ajax_IT专家网_Web服务<br />    http://searchwebservices.techtarget.com.cn/wsdev/ajax/<br />5 网易学院<br />    http://tech.163.com/special/c/0009159F/codeother.html<br />6 Java 视线论坛<br />    http://forum.javaeye.com/<br /><br /><br />Resources－－－－English<br /><br />1 AJAX开发人员的编译模式:<br />    http://www.ajaxpatterns.org<br />2  XMLHttpRequest教程：“动态网页接口”:<br />    http://www.xml.com/pub/a/2005/02/09/xml-http-request.html<br />3 JavaScript性能基准:<br />    http://blogs.ebusiness-apps.com/dave/?p=14<br />4 AJAX资源:<br />    http://www.ajaxmatters.com<br />5 JavaScript规范:<br />    http://www.ecma-international.org/publications/standards/Ecma-262.htm<br />6 介绍JavaScript对象标识:<br />    http://www.crockford.com/JSON/index.html<br />7  Mozilla 的Venkman JavaScript调试器:<br />    http://www.mozilla.org/projects/venkman/<br />8  XML DOM参考:<br />      http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/e9da2722-7879-4e48-869c-7f16714e2824.asp<br />9 Microsoft Dynamic HTML reference: <br />    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/dhtml_reference_entry.asp<br />10 Gecko DOM Reference: <br />      http://www.mozilla.org/docs/dom/domref/<br />11 "“移植IE应用到Mozilla”<br />    http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/<br />12 Mozilla XUL reference:<br />    http://www.xulplanet.com/<br />13 Microsoft XAML reference:<br />    http://windowssdk.msdn.microsoft.com/library/default.asp?url=/library/en-us/wcp_conceptual/html/0ff5f36e-dd84-44d1-aa3e-            <br /><br />5bb4f147b169.asp?frame=true<br />14 James Jesses Garret introduced the term AJAX in his article "AJAX: A New Approach to Web Applications," (Adaptive Path, February 2005): <br /><br />“AJAX：新的网页应用开发方式”<br />    http://www.adaptivepath.com/publications/essays/archives/000385.php<br />15 JetBrains IntelliJ IDEA:<br />    http://www.jetbrains.com/<br />16 Microsoft Visual Studio:<br />    http://msdn.microsoft.com/vstudio/<br />17 JSEditor:<br />    http://jseditor.sourceforge.net/<br />18 JSEclipse:<br />    http://www.interaktonline.com/Products/Eclipse/JSEclipse/Overview/<br />19 ActiveState Komodo:<br />    http://www.activestate.com/Products/Komodo/<br />20 XHTML:<br />    http://www.w3.org/TR/xhtml1/<br />21 Document Object Model:<br />    http://www.w3.org/DOM/<br />22 Cascading Style Sheets:<br />    http://www.w3.org/Style/CSS/<br />23 Extensible Stylesheet Language:<br />    http://www.w3.org/Style/XSL/<br />24 XForms:<br />    http://www.w3.org/MarkUp/Forms/<br />25 Scaling Vector Graphics:<br />    http://www.w3.org/Graphics/SVG/<br />26 XPath:<br />    http://www.w3.org/TR/xpath<br />27 AJAX.Net:<br />    http://ajax.schwarz-interactive.de/csharpsample/default.aspx<br />28 Backbase:<br />    http://www.backbase.com<br />29 Bitkraft:<br />    http://www.tiggrbitz.com/<br />30 Django:<br />    http://www.djangoproject.com/<br />31 Dojo:<br />    http://www.dojotoolkit.org/<br />32 DWR (Direct Web Reporting):<br />    http://getahead.ltd.uk/dwr/<br />33 MochiKit:<br />    http://mochikit.com/<br />34 Prototype:<br />    http://prototype.conio.net/<br />35 Rico:<br />    http://openrico.org/rico/home.page<br />36 Sajax:<br />    http://www.modernmethod.com/sajax/<br />37 Sarissa:<br />    http://sarissa.sourceforge.net/doc/<br />38 Script.aculo.us:<br />    http://script.aculo.us/<br />39 Ruby on Rails:<br />    http://www.rubyonrails.org/<br />40 For more on AJAX and DWR, read "AJAX Made Simple with DWR," Cloves Carneiro Jr. (JavaWorld, June 2005): 关于AJAX和DWR，请阅读“AJAX使用DWR更<br /><br />简单”<br />    http://www.javaworld.com/javaworld/jw-06-2005/jw-0620-dwr.html<br />41 For more articles on Java development tools, browse the Development Tools section of JavaWorld’s Topical Index: 更多Java开发工具的文章，请<br /><br />浏览JavaWorld的开发工具部分索引页<br />    http://www.javaworld.com/channel_content/jw-tools-index.shtml<br />42 For more articles on XML, browse the Java and XML section of JavaWorld’s Topical Index: 更多XML的文章，请浏览JavaWorld的Java和XML部分索引页<br />    http://www.javaworld.com/channel_content/jw-xml-index.shtml<br />43 For more articles on UI design, browse the User Interface Design section of JavaWorld’s Topical Index: 更多UI设计的文章，请浏览JavaWorld的<br /><br />UI设计部分索引页<br />    http://www.javaworld.com/channel_content/jw-ui-index.shtml <br /><img src ="http://www.blogjava.net/junky/aggbug/50368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-06-04 23:23 <a href="http://www.blogjava.net/junky/archive/2006/06/04/50368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 笔记V -- 使用Spring来发邮件和执行定时任务 </title><link>http://www.blogjava.net/junky/archive/2006/05/31/49357.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Wed, 31 May 2006 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/31/49357.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/49357.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/31/49357.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/49357.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/49357.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这次来看看Spring提高的一些有用过的JEE中使用到的功能,如 发送Email, 执行定时任务...		先来看看发送Email吧, 在Spring中发送Email是很简单的,使用Spring提高的MailSender和MailMessage就可以了,配置代码如下:						&lt;?				xml 		version		=		"1.0" 		encoding...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2006/05/31/49357.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/49357.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-31 23:04 <a href="http://www.blogjava.net/junky/archive/2006/05/31/49357.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 笔记(III) -- 在Spring下的Hibernate操作数据库</title><link>http://www.blogjava.net/junky/archive/2006/05/29/48849.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 29 May 2006 15:20:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/29/48849.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/48849.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/29/48849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/48849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/48849.html</trackback:ping><description><![CDATA[
		<p align="center">
				<strong>Spring in Action 笔记(III)</strong>
		</p>
		<p>By: icess blog: <a href="http://blog.matrix.org.cn/page/icess"><font color="#002c99">http://blog.matrix.org.cn/page/icess</font></a></p>
		<p>这次来看看使用Spring的Hibernate模板来操作数据, Spring提供了Hibernate的一层包装,使Hibernate使用起来更加方便,尤其是结合Hibernate Annotation时, 配置文件更少,维护更加简单. 下面来看看吧.</p>
		<p>下面是一个测试数据实体类<font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestData.java 和前一篇提到的实体类一样,只不过用了Annotation注释. </code></font></p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.orm.hibernate.model;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.persistence.Basic;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.persistence.Entity;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.persistence.Id;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.persistence.Table;</font>
						<br />
						<br />
						<br />
						<font color="#000000">@Entity</font>
						<br />
						<font color="#000000">@Table(name = </font>
						<font color="#2a00ff">"test"</font>
						<font color="#000000">,schema = </font>
						<font color="#2a00ff">"APP"</font>
						<font color="#000000">)</font>
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestData {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private int </b>
						</font>
						<font color="#000000">id;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestData(</font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">id, String name) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.id = id;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.name = name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestData() {}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Id</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public int </b>
						</font>
						<font color="#000000">getId() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">id;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setId(</font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">id) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.id = id;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Basic</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getName() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setName(String name) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.name = name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>下面是测试Hibernate模板的类, <font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestHibernateTemplate.java</code></font></p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.orm.hibernate;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.SQLException;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.HibernateException;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.Session;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.orm.hibernate3.HibernateCallback;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.orm.hibernate3.HibernateTemplate;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">test.orm.hibernate.model.TestData;</font>
						<br />
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestHibernateTemplate {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">HibernateTemplate hibernateTemplate;</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestHibernateTemplate() {}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">HibernateTemplate getHibernateTemplate() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">hibernateTemplate;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setHibernateTemplate(HibernateTemplate hibernateTemplate) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.hibernateTemplate = hibernateTemplate;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f7f5f">//测试使用HibernateTemplate来操作数据</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestData getTestData(</font>
						<font color="#7f0055">
								<b>final int </b>
						</font>
						<font color="#000000">id) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">(TestData) hibernateTemplate.execute(</font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">HibernateCallback() {</font>
						<br />
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">Object doInHibernate(Session s) </font>
						<font color="#7f0055">
								<b>throws </b>
						</font>
						<font color="#000000">HibernateException, SQLException {</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#3f7f5f">// TODO Auto-generated method stub</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">s.get(TestData.class, id);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">      </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">});</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#3f7f5f">//  上面查询数据的方法 使用了HibernateCallBack接口,对于这样简单的查询,可以使用下面由HibernateTemplate 提供的更简单的方法</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestData getTestData2(</font>
						<font color="#7f0055">
								<b>final int </b>
						</font>
						<font color="#000000">id) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">(TestData) hibernateTemplate.get(TestData.class, id);</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f7f5f">/* 如果上面的两处方法使用Load 方法的时, 抛出延迟加载属性异常, Spring管理Session的问题, 应该是Spring用完Session 然后就关闭了,</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f7f5f">* 所以不可以延迟加载, 也就不可以使用load 方法了,,????? 为什么????*/</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f7f5f">// 其他操作数据方法 如: 插入,修改.... 和使用Hibernate session 差不多, HibernateTemplate只是Session的包装</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>可以看到使用Hibernate模板来操作数据,是多么简单, </p>
		<p>注意: 上面注释中,提到了在使用Load方法时候,会有问题, Session in view 时候使用load是不会出问题的, 这里Spring提供的方法应该是按照Hibernate的语义写的吧.</p>
		<p>下面就是用来测试上面的类是否正常工作的测试类了.<font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestApp.java</code></font></p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.orm.hibernate;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.context.ApplicationContext;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.context.support.ClassPathXmlApplicationContext;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">test.jdbc.DatabaseUtils;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">test.orm.hibernate.model.TestData;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestApp {</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f5fbf">/**</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">* </font>
						<font color="#7f9fbf">@param </font>
						<font color="#3f5fbf">args</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">*/</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public static void </b>
						</font>
						<font color="#000000">main(String[] args) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// TODO Auto-generated method stub</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">DatabaseUtils dataUtils = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">DatabaseUtils();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dataUtils.connect();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"Open database:!"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">ApplicationContext context = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">ClassPathXmlApplicationContext(</font>
						<font color="#2a00ff">"test/orm/hibernate/spring-hibernate.xml"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">TestHibernateTemplate hibernateTemplate = (TestHibernateTemplate) context.getBean(</font>
						<font color="#2a00ff">"testDao"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"name : " </font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">TestData data = hibernateTemplate.getTestData(</font>
						<font color="#990000">9</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"name : " </font>
						<font color="#000000">+ data.getName());</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">data = hibernateTemplate.getTestData2(</font>
						<font color="#990000">3</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"name 2: " </font>
						<font color="#000000">+ data.getName());</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dataUtils.disconnect();</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>　</p>
		<p>注意: 本测试中用到了上一篇使用到的<font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">DatabaseUtils.java 工具类来操作Derby数据库.</code></font></p>
		<p>
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New', Courier">由</span>
						</font>
				</code>
				<font color="#000000">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">以上实例可以看出,在Spring中使用Hibernate,效率更高一些. 你不这样认为吗?</code>
				</font>
		</p>
		<p>
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New', Courier">同时</span>
						</font>
				</code>
				<font color="#000000">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">Spring也提供了 JDO等其他一些数据操作框架的包装,使用上基本上 是一样的这里就不在详述了.</code>
				</font>
		</p>
		<p>
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New', Courier">下一次我们来看看Spring的I18N处理,和自定义属性编辑器的实现.</span>
						</font>
				</code>
		</p>
<img src ="http://www.blogjava.net/junky/aggbug/48849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-29 23:20 <a href="http://www.blogjava.net/junky/archive/2006/05/29/48849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 笔记 (IV) -- i18n问题和自定义属性编辑器</title><link>http://www.blogjava.net/junky/archive/2006/05/29/48846.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Mon, 29 May 2006 15:19:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/29/48846.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/48846.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/29/48846.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/48846.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/48846.html</trackback:ping><description><![CDATA[
		<p>Spring in Action 笔记 (IV) -- i18n问题和自定义属性编辑器</p>
		<p>  BY: icess Blog: <a href="http://blog.matrix.org.cn/page/icess">http://blog.matrix.org.cn/page/icess</a> </p>
		<p>   在Spring中处理I18N问题和使用Java里面的类基本上是一样的.使用<font color="#2a00ff" size="2">org.springframework.context.support.ResourceBundleMessageSource</font></p>
		<p>然后注入资源文件(一个名字为basename的属性),然后就可以在Context中使用资源文件了, 如下为一个配置示例: test.xml</p>
		<font color="#008080" size="2">
				<p align="left">&lt;?</p>
		</font>
		<font color="#3f7f7f" size="2">xml </font>
		<font color="#7f007f" size="2">version</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"1.0" </font>
		<font color="#7f007f" size="2">encoding</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"UTF-8"</font>
		<font color="#008080" size="2">?&gt;<p align="left">&lt;!</p></font>
		<font color="#3f7f7f" size="2">DOCTYPE </font>
		<font color="#000080" size="2">beans </font>
		<font color="#808080" size="2">PUBLIC </font>
		<font color="#000080" size="2">"-//SPRING//DTD BEAN//EN" </font>
		<font color="#3f7f5f" size="2">"spring-beans.dtd" </font>
		<font color="#008080" size="2">&gt;<p align="left">&lt;</p></font>
		<font color="#3f7f7f" size="2">beans</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">bean </font>
		<font color="#7f007f" size="2">id</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"messageSource" </font>
		<font color="#7f007f" size="2">class</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"org.springframework.context.support.ResourceBundleMessageSource"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">property </font>
		<font color="#7f007f" size="2">name</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"basename"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#3f5fbf" size="2">&lt;!-- 注意此处设置 资源 名字 和路径 --&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">value</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">test/i18n/test</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">value</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">property</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">bean</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">
				<p align="left">&lt;/</p>
		</font>
		<font color="#3f7f7f" size="2">beans</font>
		<font color="#008080" size="2">&gt;</font>
		<p>下面为资源文件 test.properties</p>
		<font size="2">
				<p align="left">name = </p>
		</font>
		<font color="#2a00ff" size="2">\u51B0\u96E8</font>
		<font size="2">
				<p align="left">
				</p>
				<p>sex = </p>
		</font>
		<font color="#2a00ff" size="2">\u5148\u751F</font>
		<p>test_zh.properties</p>
		<font size="2">
				<p align="left">name = </p>
		</font>
		<font color="#2a00ff" size="2">\u51B0\u96E8</font>
		<font size="2">
				<p align="left">
				</p>
				<p>sex = </p>
		</font>
		<font color="#2a00ff" size="2">\u5148\u751F</font>
		<p>test_en_US.properties</p>
		<font size="2">
				<p align="left">name = </p>
		</font>
		<font color="#2a00ff" size="2">ice</font>
		<font size="2">
		</font>
		<font color="#2a00ff" size="2">rain</font>
		<font size="2">
				<p align="left">
				</p>
				<p>sex = </p>
		</font>
		<font color="#2a00ff" size="2">male</font>
		<p>下面是一个简单的测试类:</p>
		<font color="#7f0055" size="2">
				<b>
						<p align="left">package</p>
				</b>
		</font>
		<font size="2"> test.i18n;<p align="left"></p></font>
		<font color="#7f0055" size="2">
				<b>
						<p align="left">import</p>
				</b>
		</font>
		<font size="2"> java.util.Locale;<p align="left"></p></font>
		<font color="#7f0055" size="2">
				<b>
						<p align="left">import</p>
				</b>
		</font>
		<font size="2"> org.springframework.context.ApplicationContext;</font>
		<font color="#7f0055" size="2">
				<b>
						<p align="left">import</p>
				</b>
		</font>
		<font size="2"> org.springframework.context.support.ClassPathXmlApplicationContext;<p align="left"></p></font>
		<font color="#7f0055" size="2">
				<b>
						<p align="left">public</p>
				</b>
		</font>
		<font size="2">
		</font>
		<font color="#7f0055" size="2">
				<b>class</b>
		</font>
		<font size="2"> TestI18n {<p align="left"></p><p align="left"></p></font>
		<font color="#3f5fbf" size="2">/**</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#3f5fbf" size="2">*</font>
		<font size="2">
		</font>
		<font color="#7f9fbf" size="2">
				<b>@param</b>
		</font>
		<font size="2">
		</font>
		<font color="#3f5fbf" size="2">args</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#3f5fbf" size="2">*/</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#7f0055" size="2">
				<b>  public</b>
		</font>
		<font size="2">
		</font>
		<font color="#7f0055" size="2">
				<b>static</b>
		</font>
		<font size="2">
		</font>
		<font color="#7f0055" size="2">
				<b>void</b>
		</font>
		<font size="2"> main(String[] args) {<p align="left"></p></font>
		<font color="#3f7f5f" size="2">    // </font>
		<font color="#7f9fbf" size="2">
				<b>TODO</b>
		</font>
		<font color="#3f7f5f" size="2"> Auto-generated method stub</font>
		<font size="2">
				<p align="left">    ApplicationContext context = </p>
		</font>
		<font color="#7f0055" size="2">
				<b>new</b>
		</font>
		<font size="2"> ClassPathXmlApplicationContext(</font>
		<font color="#2a00ff" size="2">"test/i18n/test.xml"</font>
		<font size="2">);<p align="left"></p><p align="left">    String text = context.getMessage(</p></font>
		<font color="#2a00ff" size="2">"sex"</font>
		<font size="2">, </font>
		<font color="#7f0055" size="2">
				<b>new</b>
		</font>
		<font size="2"> Object[0], Locale.</font>
		<font color="#0000c0" size="2">
				<i>US</i>
		</font>
		<font size="2">);<p align="left">    String textZH = context.getMessage(</p></font>
		<font color="#2a00ff" size="2">"sex"</font>
		<font size="2">, </font>
		<font color="#7f0055" size="2">
				<b>new</b>
		</font>
		<font size="2"> Object[0], Locale.</font>
		<font color="#0000c0" size="2">
				<i>CHINA</i>
		</font>
		<font size="2">);<p align="left">    System.</p></font>
		<font color="#0000c0" size="2">
				<i>out</i>
		</font>
		<font size="2">.println(text + </font>
		<font color="#2a00ff" size="2">" 中文:"</font>
		<font size="2"> +textZH);<p align="left">  }</p><p align="left"></p><p>}</p></font>
		<p>很简单,这样就可以了.</p>
		<p>下面来看看Spring中的属性自定义编辑器,这个和Hibernate中的自定义属性差不多 的. 例如下面我们要看到了例子,映射一个电话号码,有<font size="2">areaCode</font>,prefix和 number, 如果不使用自定义属性编辑器那么就要分别注入上面的3个代码,麻烦. 如果使用自定义属性编辑器,直接注入一个-分开的数字序列就可以了 如</p>
		<font size="2">
				<p>888-666-9999</p>
		</font>
		<p>.在下面的例子中的Contact.java类有个PhoneNumber属性,里面保存了上面的3个代码,两个类的代码如下:</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.propertyEditor;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">Contact {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">PhoneNumber phoneNumber;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String name;</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">Contact() {}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getName() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setName(String name) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.name = name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">PhoneNumber getPhoneNumber() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">phoneNumber;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setPhoneNumber(PhoneNumber phoneNumber) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.phoneNumber = phoneNumber;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>
				<font color="#000000" size="5">
						<code style="FONT-WEIGHT: 700; FONT-FAMILY: 'Courier New', Courier">PhoneNumber.java</code>
				</font>
		</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.propertyEditor;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">PhoneNumber {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String areaCode;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String prefix;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String number;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">PhoneNumber() {</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">PhoneNumber(String areaCode,String prefix,String number) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.areaCode = areaCode;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.prefix = prefix;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.number = number;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getAreaCode() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">areaCode;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setAreaCode(String areaCode) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.areaCode = areaCode;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getNumber() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">number;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setNumber(String number) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.number = number;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getPrefix() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">prefix;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setPrefix(String prefix) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.prefix = prefix;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>然后定义一个用来编辑PhoneNumber的编辑器PhoneEditor.java 如下:</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.propertyEditor;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.beans.PropertyEditorSupport;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">PhoneEditor </font>
						<font color="#7f0055">
								<b>extends </b>
						</font>
						<font color="#000000">PropertyEditorSupport {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setAsText(String textValue) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String stripped = stripNonNumber(textValue);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String areaCode = stripped.substring(</font>
						<font color="#990000">0</font>
						<font color="#000000">,</font>
						<font color="#990000">3</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String prefix = stripped.substring(</font>
						<font color="#990000">3</font>
						<font color="#000000">,</font>
						<font color="#990000">6</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String number = stripped.substring(</font>
						<font color="#990000">6</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">PhoneNumber phone = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">PhoneNumber(areaCode,prefix,number);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">setValue(phone);</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String stripNonNumber(String original) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">StringBuilder allNumeric = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">StringBuilder();</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>for</b>
						</font>
						<font color="#000000">(</font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">i = </font>
						<font color="#990000">0</font>
						<font color="#000000">; i &lt; original.length(); i ++) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>char </b>
						</font>
						<font color="#000000">c = original.charAt(i);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>if</b>
						</font>
						<font color="#000000">(Character.isDigit(c)) {</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">allNumeric.append(c);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">allNumeric.toString();</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>继承java里面的属性编辑器,实现里面的一个方法就可以了, 下面就是在配置文件中注册该编辑器.如下:</p>
		<p>testPropertyEditor.xml</p>
		<font color="#008080" size="2">
				<p align="left">&lt;?</p>
		</font>
		<font color="#3f7f7f" size="2">xml </font>
		<font color="#7f007f" size="2">version</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"1.0" </font>
		<font color="#7f007f" size="2">encoding</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"UTF-8"</font>
		<font color="#008080" size="2">?&gt;<p align="left">&lt;!</p></font>
		<font color="#3f7f7f" size="2">DOCTYPE </font>
		<font color="#000080" size="2">beans </font>
		<font color="#808080" size="2">PUBLIC </font>
		<font color="#000080" size="2">"-//SPRING//DTD BEAN//EN" </font>
		<font color="#3f7f5f" size="2">"spring-beans.dtd" </font>
		<font color="#008080" size="2">&gt;<p align="left">&lt;</p></font>
		<font color="#3f7f7f" size="2">beans</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">bean </font>
		<font color="#7f007f" size="2">id</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"customEditorConfigurer" </font>
		<font color="#7f007f" size="2">class</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"org.springframework.beans.factory.config.CustomEditorConfigurer"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">property </font>
		<font color="#7f007f" size="2">name</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"customEditors"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">map</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">entry </font>
		<font color="#7f007f" size="2">key</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"test.propertyEditor.PhoneNumber"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">bean </font>
		<font color="#7f007f" size="2">id</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"phoneEditor" </font>
		<font color="#7f007f" size="2">class</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"test.propertyEditor.PhoneEditor"</font>
		<font color="#008080" size="2">&gt;&lt;/</font>
		<font color="#3f7f7f" size="2">bean</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">entry</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">map</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">property</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">bean</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#3f5fbf" size="2">&lt;!-- 如果不注册上面自定义Editor的实现, 需要注册一个PhoneNumber的bean,设置其属性然后再注册<p align="left">Contact的PhoneNumber的属性</p><p align="left">--&gt;</p></font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">bean </font>
		<font color="#7f007f" size="2">id</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"contact" </font>
		<font color="#7f007f" size="2">class</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"test.propertyEditor.Contact"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">property </font>
		<font color="#7f007f" size="2">name</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"phoneNumber"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">value</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">888-666-9999</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">value</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">property</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">bean</font>
		<font color="#008080" size="2">&gt;<p align="left">&lt;/</p></font>
		<font color="#3f7f7f" size="2">beans</font>
		<font color="#008080" size="2">&gt;</font>
		<p>最后来测试一下注册的结果是否正确:</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.propertyEditor;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.context.ApplicationContext;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.context.support.ClassPathXmlApplicationContext;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestPropertyEditor {</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f5fbf">/**</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">* </font>
						<font color="#7f9fbf">@param </font>
						<font color="#3f5fbf">args</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">*/</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public static void </b>
						</font>
						<font color="#000000">main(String[] args) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// TODO Auto-generated method stub</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">ApplicationContext context = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">ClassPathXmlApplicationContext(</font>
						<font color="#2a00ff">"test/propertyEditor/testPropertyEditor.xml"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Contact c = (Contact) context.getBean(</font>
						<font color="#2a00ff">"contact"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(c.getPhoneNumber().getAreaCode());</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(c.getPhoneNumber().getPrefix());</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(c.getPhoneNumber().getNumber());</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>ok, 很简单,下一次来看看,Spring提供的一下比较有意思的功能.如定时,发送Email等.</p>
<img src ="http://www.blogjava.net/junky/aggbug/48846.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-29 23:19 <a href="http://www.blogjava.net/junky/archive/2006/05/29/48846.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 笔记(II) part II </title><link>http://www.blogjava.net/junky/archive/2006/05/25/48175.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 25 May 2006 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/25/48175.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/48175.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/25/48175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/48175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/48175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Spring in Action 笔记(II) part II				下面是测试Spring提高的Jdbc功能的主要测试类, 测试了一些使用JDBC操作数据的常用功能, 其他没有测试的请查看其Doc,TestJdbcTemplate.java																																																								packa...&nbsp;&nbsp;<a href='http://www.blogjava.net/junky/archive/2006/05/25/48175.html'>阅读全文</a><img src ="http://www.blogjava.net/junky/aggbug/48175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-25 20:22 <a href="http://www.blogjava.net/junky/archive/2006/05/25/48175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 笔记(II) part I </title><link>http://www.blogjava.net/junky/archive/2006/05/25/48174.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Thu, 25 May 2006 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/25/48174.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/48174.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/25/48174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/48174.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/48174.html</trackback:ping><description><![CDATA[
		<p align="center">
				<code>
						<font color="#7f0055" size="4">
								<b>
										<span style="FONT-FAMILY: 'Courier New', Courier">Spring in Action </span>
								</b>
						</font>
				</code>
				<b>
						<font size="4">笔记</font>
				</b>
				<span style="FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055" size="4">
								<b>
										<code>(II)</code>
								</b>
						</font>
				</span>
		</p>
		<p>
				<code>
						<b>
								<span style="FONT-FAMILY: 'Courier New', Courier">
										<font size="2">今天来看看使用JDBC来操作数据： 使用的是Derby（JavaDB）数据库，关于JavaDB的介绍请点击这里：</font>
										<font color="#7f0055" size="2">
												<a href="http://blog.matrix.org.cn/page/icess?catname=/JavaDB">http://blog.matrix.org.cn/page/icess?catname=%2FJavaDB</a>
										</font>
										<font size="2"> 。 下面建立一个DatabaseUtils.java的工具类，来操作数据库 。该类在上面的连接的文章中有讲述。</font>
								</span>
						</b>
				</code>
		</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.jdbc;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.io.File;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.io.IOException;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.io.InputStream;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.Connection;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.DriverManager;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.PreparedStatement;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.ResultSet;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.SQLException;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.Statement;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.util.Properties;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.util.logging.Logger;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">DatabaseUtils {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String DB_PROPERTIES_FILE = </font>
						<font color="#2a00ff">"jdbc.properties"</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String DB_OPPOSITE_LOCATION = </font>
						<font color="#2a00ff">"/.test"</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>static </b>
						</font>
						<font color="#000000">Logger logger = Logger.getLogger(DatabaseUtils.</font>
						<font color="#7f0055">
								<b>class</b>
						</font>
						<font color="#000000">.getName());</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">Connection dbConnection;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">Properties dbProperties;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private boolean </b>
						</font>
						<font color="#000000">isConnected;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f7f5f">// database name</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String dbName;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String strCreateTestClobTeble = </font>
						<font color="#2a00ff">"CREATE TABLE APP.test (id INT, name VARCHAR(30),text CLOB(64 K))"</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String strInsertIntoTestTeble = </font>
						<font color="#2a00ff">"INSERT INTO APP.test (id, name)  VALUES (?, ?)"</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public static final </b>
						</font>
						<font color="#000000">String strGetTest = </font>
						<font color="#2a00ff">"SELECT * FROM APP.test WHERE ID = ?"</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String strCreateCourseTable = </font>
						<font color="#2a00ff">"create table APP.Course ("</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    ID          INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),"</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    name    VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    description  VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    startDate  DATE, " </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    endDate     DATE " </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">")"</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String strCreateStudentTable = </font>
						<font color="#2a00ff">"create table APP.ADDRESS ("</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    ID          INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),"</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    LASTNAME    VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    FIRSTNAME   VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    MIDDLENAME  VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    PHONE       VARCHAR(20), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    EMAIL       VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    ADDRESS1    VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    ADDRESS2    VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    CITY        VARCHAR(30), "</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"    STATE       VARCHAR(30), " </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">")"</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">DatabaseUtils() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">(</font>
						<font color="#2a00ff">"test"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">DatabaseUtils(String dbName) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.dbName = dbName;</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">setDBSystemDir();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dbProperties = loadDBProperties();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String driverName = dbProperties.getProperty(</font>
						<font color="#2a00ff">"db.driver"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">loadDatabaseDriver(driverName);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>if </b>
						</font>
						<font color="#000000">(!dbExists()) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">createDatabase();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">Properties loadDBProperties() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">InputStream dbPropInputStream = </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dbPropInputStream = DatabaseUtils.</font>
						<font color="#7f0055">
								<b>class</b>
						</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">.getResourceAsStream(DB_PROPERTIES_FILE);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dbProperties = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">Properties();</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">dbProperties.load(dbPropInputStream);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(IOException e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">dbProperties;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private void </b>
						</font>
						<font color="#000000">setDBSystemDir() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String userDir = System.getProperty(</font>
						<font color="#2a00ff">"user.dir"</font>
						<font color="#000000">, </font>
						<font color="#2a00ff">"."</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String systemDir = userDir + DB_OPPOSITE_LOCATION;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.setProperty(</font>
						<font color="#2a00ff">"derby.system.home"</font>
						<font color="#000000">, systemDir);</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// create the db System dir</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">File fileSystemDir = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">File(systemDir);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">fileSystemDir.mkdir();</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private void </b>
						</font>
						<font color="#000000">loadDatabaseDriver(String driverName) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">Class.forName(driverName);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(ClassNotFoundException e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private boolean </b>
						</font>
						<font color="#000000">dbExists() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>boolean </b>
						</font>
						<font color="#000000">bExists = </font>
						<font color="#7f0055">
								<b>false</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String dbLocation = getDatabaseLocation();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">File dbFileDir = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">File(dbLocation);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>if </b>
						</font>
						<font color="#000000">(dbFileDir.exists()) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">bExists = </font>
						<font color="#7f0055">
								<b>true</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">bExists;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private boolean </b>
						</font>
						<font color="#000000">createDatabase() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>boolean </b>
						</font>
						<font color="#000000">bCreated = </font>
						<font color="#7f0055">
								<b>false</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Connection dbConnection = </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String dbUrl = getDatabaseUrl();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dbProperties.put(</font>
						<font color="#2a00ff">"create"</font>
						<font color="#000000">, </font>
						<font color="#2a00ff">"true"</font>
						<font color="#000000">);</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">dbConnection = DriverManager.getConnection(dbUrl, dbProperties);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">bCreated = createTables(dbConnection, strCreateTestClobTeble);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(SQLException e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">dbProperties.remove(</font>
						<font color="#2a00ff">"create"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">bCreated;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private boolean </b>
						</font>
						<font color="#000000">createTables(Connection dbConnection, String creatTableSql) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>boolean </b>
						</font>
						<font color="#000000">bCreatedTables = </font>
						<font color="#7f0055">
								<b>false</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Statement statement = </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">statement = dbConnection.createStatement();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">statement.execute(creatTableSql);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">bCreatedTables = </font>
						<font color="#7f0055">
								<b>true</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(SQLException e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">bCreatedTables;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getDatabaseUrl() {</font>
						<br />
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">dbProperties.getProperty(</font>
						<font color="#2a00ff">"db.url"</font>
						<font color="#000000">) + dbName;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getDatabaseLocation() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String dbLocation = System.getProperty(</font>
						<font color="#2a00ff">"derby.system.home"</font>
						<font color="#000000">) + </font>
						<font color="#2a00ff">"/"</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+ dbName;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">dbLocation;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public boolean </b>
						</font>
						<font color="#000000">connect() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">String dbUrl = getDatabaseUrl();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">logger.info(</font>
						<font color="#2a00ff">"DBUrl: " </font>
						<font color="#000000">+ dbUrl);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">dbConnection = DriverManager.getConnection(dbUrl, dbProperties);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">isConnected = dbConnection != </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(SQLException e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#3f7f5f">// TODO Auto-generated catch block</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">isConnected = </font>
						<font color="#7f0055">
								<b>false</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">logger.info(</font>
						<font color="#2a00ff">"create connection if failed!"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">isConnected;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">Connection getConnection() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">dbConnection;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">disconnect() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>if </b>
						</font>
						<font color="#000000">(isConnected) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">String dbUrl = getDatabaseUrl();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">dbProperties.put(</font>
						<font color="#2a00ff">"shutdown"</font>
						<font color="#000000">, </font>
						<font color="#2a00ff">"true"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"断开数据库连接????????????????"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">DriverManager.getConnection(dbUrl, dbProperties);</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"????????????????"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(SQLException e) {</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#3f7f5f">// e.printStackTrace();</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">logger.info(</font>
						<font color="#2a00ff">"disconnect the connection Successful!"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">isConnected = </font>
						<font color="#7f0055">
								<b>false</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f5fbf">/**</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">* </font>
						<font color="#7f9fbf">@param </font>
						<font color="#3f5fbf">args</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">*/</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public static void </b>
						</font>
						<font color="#000000">main(String[] args) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// TODO Auto-generated method stub</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">DatabaseUtils testdb = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">DatabaseUtils();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">logger.info(testdb.getDatabaseLocation());</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">logger.info(testdb.getDatabaseUrl());</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">testdb.connect();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Connection c = testdb.getConnection();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">PreparedStatement ps = </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps = c.prepareStatement(DatabaseUtils.strInsertIntoTestTeble, Statement.RETURN_GENERATED_KEYS);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.setInt(</font>
						<font color="#990000">1</font>
						<font color="#000000">, </font>
						<font color="#990000">1</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.setString(</font>
						<font color="#990000">2</font>
						<font color="#000000">, </font>
						<font color="#2a00ff">"test Icerain"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">i =ps.executeUpdate();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">System.out.println(i);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.close();</font>
						<br />
						<font color="#ffffff">      </font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps = c.prepareStatement(DatabaseUtils.strGetTest);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.setInt(</font>
						<font color="#990000">1</font>
						<font color="#000000">, </font>
						<font color="#990000">1</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ResultSet rs = ps.executeQuery();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>if</b>
						</font>
						<font color="#000000">(rs.next()) {</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">String name = rs.getString(</font>
						<font color="#990000">2</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">System.out.println(name);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.close();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(SQLException e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#3f7f5f">// TODO Auto-generated catch block</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">testdb.disconnect();</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>　</p>
		<p>下面是一个插入数据的类 InsertData.java</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.jdbc;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.Types;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.sql.DataSource;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.jdbc.core.SqlParameter;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.jdbc.object.SqlUpdate;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">InsertData </font>
						<font color="#7f0055">
								<b>extends </b>
						</font>
						<font color="#000000">SqlUpdate {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f7f5f">// 需要注入一个DataSource...</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">InsertData(DataSource ds) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">setDataSource(ds);  </font>
						<font color="#3f7f5f">// TODO 注意 设置数据源</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">setSql(</font>
						<font color="#2a00ff">"INSERT INTO APP.test (id, name)  VALUES (?, ?)"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">declareParameter(</font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">SqlParameter(Types.INTEGER));</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">declareParameter(</font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">SqlParameter(Types.VARCHAR));</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">compile();</font>
						<font color="#3f7f5f">// TODO 注意 , 要编译以后才可以使用</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f7f5f">// 覆盖insert方法</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public int </b>
						</font>
						<font color="#000000">insert(TestData data) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Object[] params = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">Object[] {data.id,data.name};</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">update(params);  </font>
						<font color="#3f7f5f">// 执行插入操作....</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>很简单, 并带有详细注释.</p>
		<p>下面是一个查询的类 <code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#000000">QueryDataById.java</font></code></p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.jdbc;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.ResultSet;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.SQLException;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.Types;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.sql.DataSource;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.jdbc.core.SqlParameter;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.jdbc.object.MappingSqlQuery;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">QueryDataById </font>
						<font color="#7f0055">
								<b>extends </b>
						</font>
						<font color="#000000">MappingSqlQuery{</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private static final </b>
						</font>
						<font color="#000000">String sql = </font>
						<font color="#2a00ff">"SELECT * FROM APP.test WHERE ID = ?"</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">QueryDataById(DataSource ds) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>super</b>
						</font>
						<font color="#000000">(ds,sql);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">declareParameter(</font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">SqlParameter(</font>
						<font color="#2a00ff">"id"</font>
						<font color="#000000">,Types.INTEGER));</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">compile();</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />　</code>
		</p>
		<p>
				<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">// 覆盖mapRow方法</font>
				</code>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Override</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>protected </b>
						</font>
						<font color="#000000">Object mapRow(ResultSet rs, </font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">index) </font>
						<font color="#7f0055">
								<b>throws </b>
						</font>
						<font color="#000000">SQLException {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// TODO Auto-generated method stub</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">TestData tdata = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">TestData();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">tdata.id = rs.getInt(</font>
						<font color="#990000">1</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">tdata.name = rs.getString(</font>
						<font color="#990000">2</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">tdata;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>　</p>
		<p>
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New', Courier">也很简单.</span>
						</font>
				</code>
		</p>
		<p>
				<b>
						<font color="#800000">注意:</font>
				</b>
		</p>
		<p>
				<font color="#800000">
						<b> 以上两个类都实现了Spring简化Jdbc操作的一些接口, 关于接口的信息请查考文档, 这里不在详细讲述.</b>
				</font>
		</p>
		<p>　</p>
		<p>下面是一个很简单的测试(数据)实体类.<font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestData.java</code></font></p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.jdbc;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestData {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public int </b>
						</font>
						<font color="#000000">id;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestData(</font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">id, String name) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.id = id;</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.name = name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">TestData() {}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>下面是一个测试数据源是否注入正确的类:<font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestDataSource.java</code></font></p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.jdbc;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.Connection;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.PreparedStatement;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.sql.ResultSet;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">javax.sql.DataSource;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestDataSource {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">DataSource dataSource;</font>
						<br />　</code>
		</p>
		<p>
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New', Courier">// 注入数据源</span>
						</font>
				</code>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setDataSource(DataSource dataSource) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.dataSource = dataSource;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />　</code>
		</p>
		<p>
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New', Courier">//测试数据源</span>
						</font>
				</code>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">testDataSource() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>try </b>
						</font>
						<font color="#000000">{</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"Test DataSource!!!"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">Connection connection = dataSource.getConnection();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>if </b>
						</font>
						<font color="#000000">(connection != </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">)</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"test ok!"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">PreparedStatement ps = </font>
						<font color="#7f0055">
								<b>null</b>
						</font>
						<font color="#000000">;</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps = connection.prepareStatement(DatabaseUtils.strGetTest);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.setInt(</font>
						<font color="#990000">1</font>
						<font color="#000000">, </font>
						<font color="#990000">1</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ResultSet rs = ps.executeQuery();</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#7f0055">
								<b>if</b>
						</font>
						<font color="#000000">(rs.next()) {</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">String name = rs.getString(</font>
						<font color="#990000">2</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"测试数据源配置:" </font>
						<font color="#000000">+ name);</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">ps.close();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">} </font>
						<font color="#7f0055">
								<b>catch </b>
						</font>
						<font color="#000000">(Exception e) {</font>
						<br />
						<font color="#ffffff">      </font>
						<font color="#000000">e.printStackTrace();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>下面是测试Spring提高的Jdbc功能的主要测试类, 测试了一些使用JDBC操作数据的常用功能, 其他没有测试的请查看其Doc,<font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestJdbcTemplate.java</code></font></p>
<img src ="http://www.blogjava.net/junky/aggbug/48174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-25 20:21 <a href="http://www.blogjava.net/junky/archive/2006/05/25/48174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring in Action 笔记(I) </title><link>http://www.blogjava.net/junky/archive/2006/05/23/47703.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 23 May 2006 11:37:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/23/47703.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/47703.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/23/47703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/47703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/47703.html</trackback:ping><description><![CDATA[
		<p>在考试前匆匆看了一遍Spring in Action 也没有记录什么,考试结束了,要抓紧时间整理一下.要不然就忘了.^_^:</p>
		<p>整理一下我目前可能会用到的模块, 对于那些现在根本用不到的冬冬还是等有时间再研究吧!</p>
		<p>第一个当然是最经典的HelloWorld 了 , 呵呵,简单,但是说明了原理.</p>
		<p>定义一个服务接口</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.helloworld;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public interface </b>
						</font>
						<font color="#000000">GreetingService {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">sayGreeting();</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>下面是其实现:</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.helloworld;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">GreetingServiceImpl </font>
						<font color="#7f0055">
								<b>implements </b>
						</font>
						<font color="#000000">GreetingService {</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String greeting;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">GreetingServiceImpl() {}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">GreetingServiceImpl(String greeting) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.greeting = greeting;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">sayGreeting() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">//  Auto-generated method stub</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(greeting);</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setGreeting(String greeting) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.greeting = greeting;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>然后就是测试 IoC 的测试代码:</p>
		<p>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier">
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.helloworld;</font>
						<br />
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.beans.factory.BeanFactory;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.beans.factory.xml.XmlBeanFactory;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.context.ApplicationContext;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.context.support.ClassPathXmlApplicationContext;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.springframework.core.io.FileSystemResource;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">HelloApp {</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#3f5fbf">/**</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">* </font>
						<font color="#7f9fbf">@param </font>
						<font color="#3f5fbf">args</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#3f5fbf">*/</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public static void </b>
						</font>
						<font color="#000000">main(String[] args) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// TODO Auto-generated method stub</font>
						<br />
						<font color="#3f7f5f">//    BeanFactory factory;</font>
						<br />
						<font color="#3f7f5f">//    factory = new XmlBeanFactory(new FileSystemResource("src/test/helloworld/hello.xml"));</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f7f5f">// 使用不同的方法得到bean. (BeanFactory or ApplicationContext)</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">ApplicationContext context = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">ClassPathXmlApplicationContext(</font>
						<font color="#2a00ff">"test/helloworld/hello.xml"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">GreetingService greetingService = (GreetingService) context.getBean(</font>
						<font color="#2a00ff">"greetingService"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#3f7f5f">//    GreetingService greetingService = (GreetingService) factory.getBean("greetingService");</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">greetingService.sayGreeting();</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p>还有重要的配置文件如下:hello.xml</p>
		<font color="#008080" size="2">
				<p align="left">&lt;?</p>
		</font>
		<font color="#3f7f7f" size="2">xml </font>
		<font color="#7f007f" size="2">version</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"1.0" </font>
		<font color="#7f007f" size="2">encoding</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"UTF-8"</font>
		<font color="#008080" size="2">?&gt;<p align="left">&lt;!</p></font>
		<font color="#3f7f7f" size="2">DOCTYPE </font>
		<font color="#000080" size="2">beans </font>
		<font color="#808080" size="2">PUBLIC </font>
		<font color="#000080" size="2">"-//SPRING//DTD BEAN//EN"<p align="left"></p></font>
		<font color="#3f7f5f" size="2">"http://www.springframework.org/dtd/spring-beans.dtd"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">
				<p align="left">&lt;</p>
		</font>
		<font color="#3f7f7f" size="2">beans</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">bean </font>
		<font color="#7f007f" size="2">id</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"greetingService"<p align="left"></p></font>
		<font color="#7f007f" size="2">class</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"test.helloworld.GreetingServiceImpl"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">property </font>
		<font color="#7f007f" size="2">name</font>
		<font size="2">=</font>
		<font color="#2a00ff" size="2">"greeting"</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;</font>
		<font color="#3f7f7f" size="2">value</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2"> ice rain !</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">value</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">property</font>
		<font color="#008080" size="2">&gt;</font>
		<font size="2">
				<p align="left">
				</p>
		</font>
		<font color="#008080" size="2">&lt;/</font>
		<font color="#3f7f7f" size="2">bean</font>
		<font color="#008080" size="2">&gt;<p align="left">&lt;/</p></font>
		<font color="#3f7f7f" size="2">beans</font>
		<font color="#008080" size="2">&gt;</font>
		<p>呵呵就这么简单,实现了 greeting 属性的 Ioc. </p>
		<p>这是Spring 两大基本支柱其一的工作原理, 关于AoP的内容,在这里不作讨论,因为现在我使用AoP的地方不是很多,简单的应用是很简单的啦.^_^.</p>
		<p>下面一篇我们来看看 在spring包装下的jdbc访问. 详细情况也可以<b><a href="http://blog.matrix.org.cn/page/icess?entry=why_spring_jdbc" target="_blank">参考这里</a></b></p>
<img src ="http://www.blogjava.net/junky/aggbug/47703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-23 19:37 <a href="http://www.blogjava.net/junky/archive/2006/05/23/47703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring框架学习前言---我的开源框架使用心得体会 </title><link>http://www.blogjava.net/junky/archive/2006/05/17/46514.html</link><dc:creator>junky</dc:creator><author>junky</author><pubDate>Tue, 16 May 2006 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/junky/archive/2006/05/17/46514.html</guid><wfw:comment>http://www.blogjava.net/junky/comments/46514.html</wfw:comment><comments>http://www.blogjava.net/junky/archive/2006/05/17/46514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/junky/comments/commentRss/46514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/junky/services/trackbacks/46514.html</trackback:ping><description><![CDATA[
		<p>
				<strong>目的：</strong>
				<br />在实际项目中出于稳定性以及团队开发技能我一直没考虑采用Spring框架，最近有时间就计划学习Spring框架，为以后的项目开发做相关的技术储备。</p>
		<p>
				<br />
				<strong>回顾：</strong>
				<br />开源框架在以前的项目中用过不少， struts,webwork,hibernate,前两者属于web框架，后者属于ORM框架，这些框架基本都是侧重于应用的某个层面，不能称之为J2EE全面的框架，往往是需要和其他框架相结合，我开发的项目采用过如下组合，有的根本就没有框架，只是自己做了设计封装<br />a、servlet+jdbc,<br />b、servlet+jsp+javabean+jdbc,<br />c、struts+BD+DAO ,<br />d、webwork+ejb+hibernate <br /><br /><strong>使用体会：</strong></p>
		<p> a、b就不要说了，那时候的代码结构真是天马行空，我当时初学，维护公司一个项目代码，1个jsp实现一个模块所有功能，我花了好长时间才 读懂代码。<br />  时代总是向前发展的，慢慢的系统结构层次上是越来越清晰，开发效率也越来越高，维护也越来越容易（基于一定的培训成本）。<br /> <br /><font color="#6666ff"> 相对而言出于设计理念来讲，个人更喜欢webwork+hibernate框架组合。</font> <br /><br /> 常有人讨论同等开发层面框架的优缺点，我所属产品的另外一个项目团队曾经为项目后续开发 应该采用struts还是webwork争论的不可开交， 其实个人认为struts,webwork都是非常好的web框架，都有自身的优缺点：<br /> struts开创web MVC框架之先河，2003－2004年开发的项目基本都是采用struts框架（当时招聘人的时候常问会不会struts，会基本就招了 ），实际MVC设计理念很早就提出了，在j2SE中有很多使用之处，但当时没有一个web框架开发中很好的贯彻该设计理念，直到struts 出现（可能有，只是没有apache更引人注意）。<br /><br /> struts优点使用用户多，相关技术文档比较全面，开发遇到的问题相关案例也比较多、比较容易解决，框架更加稳定(这一点非常重要）。<br /> <br /> webwork相对于struts来讲，的确有不少优异之处，（也是情理之中的事，后发布的框架如果再没有优点别人也不会使用）<br /> 个人认为在开发上主要有以下几点：<br /><br /> 1、页面数据封装成值对象功能比struts强大，webwork采用ognl类型转化。<br /> struts只能对简单类型的数据对象以及文件对象封装成值对象, 而webwork封装的值对象基本没有限制，值对象属性还可以是List,Map这些对象（这个特性在我们开发一些批量数据、复杂数据处理时非常方便），减少很多代码量，代码非常整洁。<br /> <br /> 2、拦截器功能<br /> 拦截器是webwork的一个亮点，实际上也是业界比较流行的AOP的一个体现，在实际开发中你可以配置默认的拦截器， 也可以为单独的模块指定特定的拦截器，并且可自定义拦截器，action执行前后拦截都可以。 <br /> <br /> 3、单元测试比较方便<br /> 最早使用struts框架开发测试时，相关的单元测试基本是不好做的，无法脱离web环境，测试都是只做集成测试、系统测试。<br /> 使用webwork可以简单对action相关属性赋值，可以相关的单元测试，当然前提是在对应action中没有引用web环境相关的对象。 <br /> 其实webwork框架核心还是xwork框架，最早框架使用在C/S结构下，webwork只是xwork的一个在web环境的实现，只是ActionContext 上下文发生了变化，所以说action能够做到脱离web环境也是情理之中的。</p>
		<p>
				<br />4、配置文件<br />webwork配置文件可以采用引用、继承其他配置文件方式，在团队开发一般都是分模块开发，这样比较方便，配置管理更容易，不会冲突。<br /><br />5、模板技术集成<br /> 我在实际应用项目中是采用velocity模板做视图展现，因为在对应版本的webwork框架中和velociy集成的相当好，比较方便，<br /> 比直接写jsp代码更整洁、同时利用velocity模板特性结合每个action的配置文件，可实现比较通用的页面查询、录入等视图的展现。<br /> 而struts是没有相关模板集成，不过struts的tag相对而言比webwork的tag好用，webwork如果视图是jsp类型，相关的tag真的比较麻烦<br /> 虽然tag 库很丰富，这也是我为什么使用velocity做视图的原因 。 <br /> <br />6、 框架的效验功能<br /> 老实说，两者框架的效验功能都比较麻烦，相对而言webwork更加麻烦点，配置较多，验证接口实现太麻烦，我实际项目使用中还是<br /> 自定义了相关后台验证接口， 要验证的相关action只要实现相关接口即可，相关拦截器负责拦截验证，<br /> 大部分的效验根据配置数据以及html对象自定义属性通过javascript通用效验，实际上现在基于XmlHttp的ajax技术应用成熟的话<br /> 后台验证接口的用途会逐渐淡化。 <br /> <br /><font style="BACKGROUND-COLOR: #ffffff" color="#6666ff"> 说明上述比较版本为 struts 1.0 /webwork 2.1.6，后续struts框架扩展很多功能，不是很了解，可能和上诉描述不一定很吻合。<br /></font> <br /> 现在两者已经合并，希望能结合两者的优势，发展出更好web框架。<br /> <br />7、关于Hibernate还是DAO模式，个人建议采用hibernate+DAO相集合的模式，hibernate占主导地位。<br /> 虽然DAO模式通过自动生成代码效率不会低，但如果需求变更就比较麻烦，维护修改代码较多，测试工作量也较大， 但Hibernate不是万能的，在一些必要的应用还是采用DAO模式，特别是性能相关的部分。 <br /> <br /> <br /> 废话一大堆，也算把我的工作回顾了一遍，呵呵，这两天简单了解Spring框架，个人感觉Spring更像一个全面的J2EE框架解决方案, 希望能够有时间系统的学习一把，大家有兴趣的请多多交流,我会将我的学习心得和大家分享。</p>
<img src ="http://www.blogjava.net/junky/aggbug/46514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/junky/" target="_blank">junky</a> 2006-05-17 00:26 <a href="http://www.blogjava.net/junky/archive/2006/05/17/46514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>