﻿<?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-西瓜地儿-随笔分类-java框架</title><link>http://www.blogjava.net/ashutc/category/42982.html</link><description>沈阳求职（java3年以上经验）！ashutc@126.com</description><language>zh-cn</language><lastBuildDate>Fri, 15 Apr 2011 09:12:43 GMT</lastBuildDate><pubDate>Fri, 15 Apr 2011 09:12:43 GMT</pubDate><ttl>60</ttl><item><title>spring3.0注解</title><link>http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 14 Apr 2011 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/348270.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/348270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/348270.html</trackback:ping><description><![CDATA[<p>使用 @Repository、@Service、@Controller 和 @Component 将类标识为 Bean</p>
<p>Spring 自 2.0 版本开始，陆续引入了一些注解用于简化 Spring 的开发。@Repository
注解便属于最先引入的一批，它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO
类上即可。同时，为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解，需要在 XML 配置文件中启用 Bean
的自动扫描功能，这可以通过 &lt;context:component-scan/&gt; 实现。如下所示：</p>
<p>&nbsp;// 首先使用 @Repository 将 DAO 类声明为 Bean <br />
&nbsp;package bookstore.dao; <br />
&nbsp;@Repository <br />
&nbsp;public class UserDaoImpl implements UserDao{ &#8230;&#8230; } </p>
<p>&nbsp;// 其次，在 XML 配置文件中启动 Spring 的自动扫描功能<br />
&nbsp;&lt;beans &#8230; &gt; <br />
&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br />
&nbsp;&lt;context:component-scan base-package=&#8221;bookstore.dao&#8221; /&gt; <br />
&#8230;&#8230;<br />
&nbsp;&lt;/beans&gt; <br />
&nbsp;</p>
<p>如此，我们就不再需要在 XML 中显式使用 &lt;bean/&gt; 进行 Bean 的配置。Spring 在容器初始化时将自动扫描
base-package 指定的包及其子包下的所有 class 文件，所有标注了 @Repository 的类都将被注册为 Spring
Bean。</p>
<p>为什么 @Repository 只能标注在 DAO 类上呢？这是因为该注解的作用不只是将类识别为
Bean，同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring
本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构，用于封装不同的持久层框架抛出的异常，使得异常独立于底层的框架。</p>
<p>Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解：@Component、@Service、@Constroller，它们分别用于软件系统的不同层次：</p>
<p><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#69;&#50;&#37;&#56;&#48;&#37;&#65;&#50;&#64;&#67;&#111;&#109;&#112;&#111;&#110;&#101;&#110;&#116;">&#8226;@Component</a> 是一个泛化的概念，仅仅表示一个组件 (Bean) ，可以作用在任何层次。<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#69;&#50;&#37;&#56;&#48;&#37;&#65;&#50;&#64;&#83;&#101;&#114;&#118;&#105;&#99;&#101;">&#8226;@Service</a> 通常作用在业务层，但是目前该功能与 @Component 相同。<br />
<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#37;&#69;&#50;&#37;&#56;&#48;&#37;&#65;&#50;&#64;&#67;&#111;&#110;&#115;&#116;&#114;&#111;&#108;&#108;&#101;&#114;">&#8226;@Constroller</a> 通常作用在控制层，但是目前该功能与 @Component 相同。<br />
通
过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解，Spring 会自动创建相应的
BeanDefinition 对象，并注册到 ApplicationContext 中。这些类就成了 Spring
受管组件。这三个注解除了作用于不同软件层次的类，其使用方式与 @Repository 是完全相同的。</p>
<p>另外，除了上面的四个注解外，用户可以创建自定义的注解，然后在注解上标注 @Component，那么，该自定义注解便具有了与所 @Component 相同的功能。不过这个功能并不常用。</p>
<p>当一个 Bean 被自动检测到时，会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean
名称。默认情况下，对于包含 name 属性的 @Component、@Repository、 @Service 和 @Controller，会把
name 取值作为 Bean 的名字。如果这个注解不包含 name 值或是其他被自定义过滤器发现的组件，默认 Bean
名称会是小写开头的非限定类名。如果你不想使用默认 bean 命名策略，可以提供一个自定义的命名策略。首先实现 BeanNameGenerator
接口，确认包含了一个默认的无参数构造方法。然后在配置扫描器时提供一个全限定类名，如下所示：</p>
<p>&nbsp;&lt;beans ...&gt; <br />
&nbsp;&lt;context:component-scan <br />
&nbsp;&nbsp;&nbsp; base-package="a.b" name-generator="a.SimpleNameGenerator"/&gt; <br />
&nbsp;&lt;/beans&gt; <br />
&nbsp;</p>
<p>与通过 XML 配置的 Spring Bean 一样，通过上述注解标识的
Bean，其默认作用域是"singleton"，为了配合这四个注解，在标注 Bean 的同时能够指定 Bean 的作用域，Spring 2.5
引入了 @Scope 注解。使用该注解时只需提供作用域的名称就行了，如下所示：</p>
<p>&nbsp;@Scope("prototype") <br />
&nbsp;@Repository <br />
&nbsp;public class Demo { &#8230; } <br />
&nbsp;</p>
<p>如果你想提供一个自定义的作用域解析策略而不使用基于注解的方法，只需实现 ScopeMetadataResolver 接口，确认包含一个默认的没有参数的构造方法。然后在配置扫描器时提供全限定类名：</p>
<p>&nbsp;&lt;context:component-scan base-package="a.b"<br />
&nbsp;scope-resolver="footmark.SimpleScopeResolver" /&gt; <br />
&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @PostConstruct 和 @PreDestroy 指定生命周期回调方法</p>
<p>Spring Bean 是受 Spring IoC 容器管理，由容器进行初始化和销毁的（prototype
类型由容器初始化之后便不受容器管理），通常我们不需要关注容器对 Bean 的初始化和销毁操作，由 Spring 经过构造函数或者工厂方法创建的
Bean
就是已经初始化完成并立即可用的。然而在某些情况下，可能需要我们手工做一些额外的初始化或者销毁操作，这通常是针对一些资源的获取和释放操作。
Spring 1.x 为此提供了两种方式供用户指定执行生命周期回调的方法。</p>
<p>第一种方式是实现 Spring 提供的两个接口：InitializingBean 和 DisposableBean。如果希望在 Bean
初始化完成之后执行一些自定义操作，则可以让 Bean 实现 InitializingBean 接口，该接口包含一个
afterPropertiesSet() 方法，容器在为该 Bean 设置了属性之后，将自动调用该方法；如果 Bean 实现了
DisposableBean 接口，则容器在销毁该 Bean 之前，将调用该接口的 destroy() 方法。这种方式的缺点是，让 Bean
类实现 Spring 提供的接口，增加了代码与 Spring 框架的耦合度，因此不推荐使用。</p>
<p>第二种方式是在 XML 文件中使用 &lt;bean&gt; 的 init-method 和 destroy-method
属性指定初始化之后和销毁之前的回调方法，代码无需实现任何接口。这两个属性的取值是相应 Bean
类中的初始化和销毁方法，方法名任意，但是方法不能有参数。示例如下：</p>
<p>&nbsp;&lt;bean id=&#8221;userService&#8221; <br />
&nbsp;class=&#8221;bookstore.service.UserService&#8221; <br />
&nbsp;init-method=&#8221;init&#8221; destroy-method=&#8221;destroy&#8221;&gt; <br />
&nbsp;&nbsp;&nbsp; &#8230;<br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;</p>
<p>Spring 2.5 在保留以上两种方式的基础上，提供了对 JSR-250 的支持。JSR-250
规范定义了两个用于指定声明周期方法的注解：@PostConstruct 和
@PreDestroy。这两个注解使用非常简单，只需分别将他们标注于初始化之后执行的回调方法或者销毁之前执行的回调方法上。由于使用了注解，因此需
要配置相应的 Bean 后处理器，亦即在 XML 中增加如下一行：</p>
<p>&nbsp;&lt;context:annotation-config /&gt; <br />
&nbsp;</p>
<p>比较上述三种指定生命周期回调方法的方式，第一种是不建议使用的，不但其用法不如后两种方式灵活，而且无形中增加了代码与框架的耦合度。后面两种方式开发者可以根据使用习惯选择其中一种，但是最好不要混合使用，以免增加维护的难度。</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @Required 进行 Bean 的依赖检查</p>
<p>依赖检查的作用是，判断给定 Bean 的相应 Setter 方法是否都在实例化的时候被调用了。而不是判断字段是否已经存在值了。Spring
进行依赖检查时，只会判断属性是否使用了 Setter 注入。如果某个属性没有使用 Setter
注入，即使是通过构造函数已经为该属性注入了值，Spring 仍然认为它没有执行注入，从而抛出异常。另外，Spring 只管是否通过 Setter
执行了注入，而对注入的值却没有任何要求，即使注入的 &lt;null/&gt;，Spring 也认为是执行了依赖注入。</p>
<p>&lt;bean&gt; 标签提供了 dependency-check 属性用于进行依赖检查。该属性的取值包括以下几种：</p>
<p>&#8226;none -- 默认不执行依赖检查。可以在 &lt;beans&gt; 标签上使用 default-dependency-check 属性改变默认值。<br />
&#8226;simple -- 对原始基本类型和集合类型进行检查。<br />
&#8226;objects -- 对复杂类型进行检查（除了 simple 所检查类型之外的其他类型）。<br />
&#8226;all -- 对所有类型进行检查。<br />
旧
版本使用 dependency-check 在配置文件中设置，缺点是粒度较粗。使用 Spring2.0 提供的 @Required
注解，提供了更细粒度的控制。@Required 注解只能标注在 Setter 方法之上。因为依赖注入的本质是检查 Setter
方法是否被调用了，而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非 setXxxx() 类型的方法则被忽略。</p>
<p>为了让 Spring 能够处理该注解，需要激活相应的 Bean 后处理器。要激活该后处理器，只需在 XML 中增加如下一行即可。</p>
<p>&nbsp;&lt;context:annotation-config/&gt; <br />
&nbsp;</p>
<p>当某个被标注了 @Required 的 Setter 方法没有被调用，则 Spring 在解析的时候会抛出异常，以提醒开发者对相应属性进行设置。</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @Resource、@Autowired 和 @Qualifier 指定 Bean 的自动装配策略</p>
<p>自动装配是指，Spring 在装配 Bean 的时候，根据指定的自动装配规则，将某个 Bean 所需要引用类型的 Bean 注入进来。&lt;bean&gt; 元素提供了一个指定自动装配类型的 autowire 属性，该属性有如下选项：</p>
<p>&#8226;no -- 显式指定不使用自动装配。<br />
&#8226;byName -- 如果存在一个和当前属性名字一致的 Bean，则使用该 Bean 进行注入。如果名称匹配但是类型不匹配，则抛出异常。如果没有匹配的类型，则什么也不做。<br />
&#8226;byType
-- 如果存在一个和当前属性类型一致的 Bean ( 相同类型或者子类型 )，则使用该 Bean 进行注入。byType
能够识别工厂方法，即能够识别 factory-method 的返回类型。如果存在多个类型一致的
Bean，则抛出异常。如果没有匹配的类型，则什么也不做。<br />
&#8226;constructor -- 与 byType 类似，只不过它是针对构造函数注入而言的。如果当前没有与构造函数的参数类型匹配的 Bean，则抛出异常。使用该种装配模式时，优先匹配参数最多的构造函数。<br />
&#8226;autodetect -- 根据 Bean 的自省机制决定采用 byType 还是 constructor 进行自动装配。如果 Bean 提供了默认的构造函数，则采用 byType；否则采用 constructor 进行自动装配。<br />
当
使用 byType 或者 constructor 类型的自动装配的时候，自动装配也支持引用类型的数组或者使用了泛型的集合，这样，Spring
就会检查容器中所有类型匹配的 Bean，组成集合或者数组后执行注入。对于使用了泛型的 Map 类型，如果键是 String 类型，则
Spring 也会自动执行装配，将所有类型匹配的 Bean 作为值，Bean 的名字作为键。</p>
<p>我们可以给 &lt;beans&gt; 增加 default-autowire
属性，设置默认的自动封装策略。默认值为"no"。如果使用自动装配的同时，也指定了 property 或者 constructor-arg
标签，则显式指定的值将覆盖自动装配的值。目前的自动封装不支持简单类型，比如基本类型、String、Class，以及它们的数组类型。</p>
<p>在按类型匹配的时候 ( 可能是 byType、constructor、autodetect)，同一个类型可能存在多个 Bean，如果被注入的属性是数组、集合或者 Map，这可能没有问题，但是如果只是简单的引用类型，则会抛出异常。解决方法有如下几种：</p>
<p>&#8226;取消该 Bean 的自动装配特性，使用显式的注入。我们可能不希望某个 Bean 被当作其他 Bean
执行自动封装时的候选对象，我们可以给该 &lt;bean&gt; 增加
autowire-candidate="false"。(autowire-candidate 属性和 autowire
属性相互独立，互不相干。某个 Bean 可以将 autowire-candidate 设置为 false，同时使用 autowire 特性。)
另外，我们可以设置 &lt;beans&gt; 的 default-autowire-candidates
属性，可以在该属性中指定可以用于自动装配候选 Bean 的匹配模式，比如
default-autowire-candidates="*serv,*dao"，这表示所有名字以 serv 或者 dao 结尾的 Bean
被列为候选，其他则忽略，相当于其他 Bean 都指定为 autowire-candidate="false"，此时可以显式为
&lt;bean&gt; 指定 autowire-candidate="true"。在 &lt;bean&gt; 上指定的设置要覆盖
&lt;beans&gt; 上指定的设置。<br />
&#8226;如果在多个类型相同的 Bean 中有首选的 Bean，那么可以将该 &lt;bean&gt;
的 primary 属性设置为 "true" ，这样自动装配时便优先使用该 Bean 进行装配。此时不能将
autowire-candidate 设为 false。<br />
&#8226;如果使用的是 Java 5 以上版本，可以使用注解进行更细粒度的控制。<br />
使用 @Autowired 和 @Qualifier 注解执行自动装配</p>
<p>使用 @Autowired 注解进行装配，只能是根据类型进行匹配。@Autowired 注解可以用于 Setter
方法、构造函数、字段，甚至普通方法，前提是方法必须有至少一个参数。@Autowired 可以用于数组和使用泛型的集合类型。然后 Spring
会将容器中所有类型符合的 Bean 注入进来。@Autowired 标注作用于 Map 类型时，如果 Map 的 key 为 String
类型，则 Spring 会将容器中所有类型符合 Map 的 value 对应的类型的 Bean 增加进来，用 Bean 的 id 或 name
作为 Map 的 key。</p>
<p>@Autowired 标注作用于普通方法时，会产生一个副作用，就是在容器初始化该 Bean 实例的时候就会调用该方法。当然，前提是执行了自动装配，对于不满足装配条件的情况，该方法也不会被执行。</p>
<p>当标注了 @Autowired 后，自动注入不能满足，则会抛出异常。我们可以给 @Autowired 标注增加一个
required=false 属性，以改变这个行为。另外，每一个类中只能有一个构造函数的 @Autowired.required() 属性为
true。否则就出问题了。如果用 @Autowired 同时标注了多个构造函数，那么，Spring 将采用贪心算法匹配构造函数 ( 构造函数最长
)。</p>
<p>@Autowired 还有一个作用就是，如果将其标注在 BeanFactory 类型、ApplicationContext
类型、ResourceLoader 类型、ApplicationEventPublisher 类型、MessageSource 类型上，那么
Spring 会自动注入这些实现类的实例，不需要额外的操作。</p>
<p>当容器中存在多个 Bean 的类型与需要注入的相同时，注入将不能执行，我们可以给 @Autowired 增加一个候选值，做法是在
@Autowired 后面增加一个 @Qualifier 标注，提供一个 String 类型的值作为候选的 Bean 的名字。举例如下：</p>
<p>&nbsp;@Autowired(required=false) <br />
&nbsp;@Qualifier("ppp") <br />
&nbsp;public void setPerson(person p){} <br />
&nbsp;</p>
<p>@Qualifier 甚至可以作用于方法的参数 ( 对于方法只有一个参数的情况，我们可以将 @Qualifer 标注放置在方法声明上面，但是推荐放置在参数前面 )，举例如下：</p>
<p>&nbsp;@Autowired(required=false) <br />
&nbsp;public void sayHello(@Qualifier("ppp")Person p,String name){} <br />
&nbsp;</p>
<p>我们可以在配置文件中指定某个 Bean 的 qualifier 名字，方法如下：</p>
<p>&nbsp;&lt;bean id="person" class="footmark.spring.Person"&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;qualifier value="ppp"/&gt; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;</p>
<p>如果没有明确指定 Bean 的 qualifier 名字，那么默认名字就是 Bean 的名字。通常，qualifier 应该是有业务含义的，例如 "domain"，"persistent" 等，而不应该是类似 "person" 方式。</p>
<p>我们还可以将 @Qualifier 标注在集合类型上，那么所有 qualifier 名字与指定值相同的 Bean 都将被注入进来。</p>
<p>最后，配置文件中需要指定每一个自定义注解的属性值。我们可以使用 &lt;meta&gt; 标签来代替 &lt;qualifier/&gt;
标签，如果 &lt;meta&gt; 标签和 &lt;qualifier/&gt; 标签同时出现，那么优先使用
&lt;qualifier&gt; 标签。如果没有 &lt;qualifier&gt; 标签，那么会用 &lt;meta&gt;
提供的键值对来封装 &lt;qualifier&gt; 标签。示例如下：</p>
<p>&nbsp;&lt;bean class="footmark.HelloWorld"&gt; <br />
&nbsp;&lt;qualifier type="MovieQualifier"&gt; <br />
&nbsp;&lt;attribute key="format" value="VHS"/&gt; <br />
&nbsp;&lt;attribute key="genre" value="Comedy"/&gt; <br />
&nbsp;&lt;/qualifier&gt; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;&lt;bean class="footmark.HelloWorld"&gt; <br />
&nbsp;&lt;meta key="format" value="DVD"/&gt; <br />
&nbsp;&lt;meta key="genre" value="Action"/&gt; <br />
&nbsp;&lt;/bean&gt; <br />
&nbsp;</p>
<p>@Autowired 注解对应的后处理注册与前面相似，只需在配置文件中增加如下一行即可：</p>
<p>&nbsp;&lt;context:annotation-config/&gt; <br />
&nbsp;</p>
<p>如果 @Autowired 注入的是 BeanFactory、ApplicationContext、ResourceLoader
等系统类型，那么则不需要 @Qualifier，此时即使提供了 @Qualifier 注解，也将会被忽略；而对于自定义类型的自动装配，如果使用了
@Qualifier 注解并且没有名字与之匹配的 Bean，则自动装配匹配失败。</p>
<p>使用 JSR-250 中的 @Resource 和 @Qualifier 注解</p>
<p>如果希望根据 name 执行自动装配，那么应该使用 JSR-250 提供的 @Resource 注解，而不应该使用 @Autowired 与 @Qualifier 的组合。</p>
<p>@Resource 使用 byName 的方式执行自动封装。@Resource 标注可以作用于带一个参数的 Setter
方法、字段，以及带一个参数的普通方法上。@Resource 注解有一个 name 属性，用于指定 Bean 在配置文件中对应的名字。如果没有指定
name 属性，那么默认值就是字段或者属性的名字。@Resource 和 @Qualifier 的配合虽然仍然成立，但是 @Qualifier
对于 @Resource 而言，几乎与 name 属性等效。</p>
<p>如果 @Resource 没有指定 name 属性，那么使用 byName 匹配失败后，会退而使用 byType
继续匹配，如果再失败，则抛出异常。在没有为 @Resource 注解显式指定 name 属性的前提下，如果将其标注在 BeanFactory
类型、ApplicationContext 类型、ResourceLoader 类型、ApplicationEventPublisher
类型、MessageSource 类型上，那么 Spring 会自动注入这些实现类的实例，不需要额外的操作。此时 name 属性不需要指定 (
或者指定为"")，否则注入失败；如果使用了 @Qualifier，则该注解将被忽略。而对于用户自定义类型的注入，@Qualifier 和
name 等价，并且不被忽略。</p>
<p>&lt;bean&gt; 的 primary 和 autowire-candidate 属性对 @Resource、@Autowired 仍然有效。</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>使用 @Configuration 和 @Bean 进行 Bean 的声明</p>
<p>虽然 2.0 版本发布以来，Spring 陆续提供了十多个注解，但是提供的这些注解只是为了在某些情况下简化 XML 的配置，并非要取代
XML 配置方式。这一点可以从 Spring IoC 容器的初始化类可以看出：ApplicationContext 接口的最常用的实现类是
ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext，以及面向
Portlet 的 XmlPortletApplicationContext 和面向 web 的
XmlWebApplicationContext，它们都是面向 XML 的。Spring 3.0
新增了另外两个实现类：AnnotationConfigApplicationContext 和
AnnotationConfigWebApplicationContext。从名字便可以看出，它们是为注解而生，直接依赖于注解作为容器配置信息来
源的 IoC 容器初始化类。由于 AnnotationConfigWebApplicationContext 是
AnnotationConfigApplicationContext 的 web 版本，其用法与后者相比几乎没有什么差别，因此本文将以
AnnotationConfigApplicationContext 为例进行讲解。</p>
<p>AnnotationConfigApplicationContext 搭配上 @Configuration 和 @Bean
注解，自此，XML 配置方式不再是 Spring IoC
容器的唯一配置方式。两者在一定范围内存在着竞争的关系，但是它们在大多数情况下还是相互协作的关系，两者的结合使得 Spring IoC
容器的配置更简单，更强大。</p>
<p>之前，我们将配置信息集中写在 XML 中，如今使用注解，配置信息的载体由 XML 文件转移到了 Java
类中。我们通常将用于存放配置信息的类的类名以 &#8220;Config&#8221; 结尾，比如
AppDaoConfig.java、AppServiceConfig.java 等等。我们需要在用于指定配置信息的类上加上
@Configuration 注解，以明确指出该类是 Bean 配置的信息源。并且 Spring 对标注 Configuration
的类有如下要求：</p>
<p>&#8226;配置类不能是 final 的；<br />
&#8226;配置类不能是本地化的，亦即不能将配置类定义在其他类的方法内部；<br />
&#8226;配置类必须有一个无参构造函数。<br />
AnnotationConfigApplicationContext
将配置类中标注了 @Bean 的方法的返回值识别为 Spring Bean，并注册到容器中，受 IoC 容器管理。@Bean 的作用等价于
XML 配置中的 &lt;bean/&gt; 标签。示例如下：</p>
<p>&nbsp;@Configuration <br />
&nbsp;public class BookStoreDaoConfig{ <br />
&nbsp;&nbsp;&nbsp; @Bean <br />
&nbsp;&nbsp;&nbsp; public UserDao userDao(){ return new UserDaoImpl();} <br />
&nbsp;&nbsp;&nbsp; @Bean <br />
&nbsp;&nbsp;&nbsp; public BookDao bookDao(){return new BookDaoImpl();} <br />
&nbsp;} <br />
&nbsp;</p>
<p>Spring 在解析到以上文件时，将识别出标注 @Bean 的所有方法，执行之，并将方法的返回值 ( 这里是 UserDaoImpl 和
BookDaoImpl 对象 ) 注册到 IoC 容器中。默认情况下，Bean 的名字即为方法名。因此，与以上配置等价的 XML 配置如下：</p>
<p>&nbsp;&lt;bean id=&#8221;userDao&#8221; class=&#8221;bookstore.dao.UserDaoImpl&#8221;/&gt; <br />
&nbsp;&lt;bean id=&#8221;bookDao&#8221; class=&#8221;bookstore.dao.BookDaoImpl&#8221;/&gt; <br />
&nbsp;</p>
<p>@Bean 具有以下四个属性：</p>
<p>&#8226;name -- 指定一个或者多个 Bean 的名字。这等价于 XML 配置中 &lt;bean&gt; 的 name 属性。<br />
&#8226;initMethod -- 容器在初始化完 Bean 之后，会调用该属性指定的方法。这等价于 XML 配置中 &lt;bean&gt; 的 init-method 属性。<br />
&#8226;destroyMethod -- 该属性与 initMethod 功能相似，在容器销毁 Bean 之前，会调用该属性指定的方法。这等价于 XML 配置中 &lt;bean&gt; 的 destroy-method 属性。<br />
&#8226;autowire
-- 指定 Bean 属性的自动装配策略，取值是 Autowire
类型的三个静态属性。Autowire.BY_NAME，Autowire.BY_TYPE，Autowire.NO。与 XML 配置中的
autowire 属性的取值相比，这里少了 constructor，这是因为 constructor 在这里已经没有意义了。<br />
@Bean 没有直接提供指定作用域的属性，可以通过 @Scope 来实现该功能，关于 @Scope 的用法已在上文列举。</p>
<p>下面讲解基于注解的容器初始化。AnnotationConfigApplicationContext 提供了三个构造函数用于初始化容器。</p>
<p>&#8226;AnnotationConfigApplicationContext()：该构造函数初始化一个空容器，容器不包含任何 Bean 信息，需要在稍后通过调用其 register() 方法注册配置类，并调用 refresh() 方法刷新容器。<br />
&#8226;AnnotationConfigApplicationContext(Class&lt;?&gt;... annotatedClasses)：这是最常用的构造函数，通过将涉及到的配置类传递给该构造函数，以实现将相应配置类中的 Bean 自动注册到容器中。<br />
&#8226;AnnotationConfigApplicationContext(String...
basePackages)：该构造函数会自动扫描以给定的包及其子包下的所有类，并自动识别所有的 Spring
Bean，将其注册到容器中。它不但识别标注 @Configuration 的配置类并正确解析，而且同样能识别使用
@Repository、@Service、@Controller、@Component 标注的类。<br />
除了使用上面第三种类型的构造函数让容器
自动扫描 Bean 的配置信息以外，AnnotationConfigApplicationContext 还提供了 scan()
方法，其功能与上面也类似，该方法主要用在容器初始化之后动态增加 Bean 至容器中。调用了该方法以后，通常需要立即手动调用 refresh()
刷新容器，以让变更立即生效。</p>
<p>需要注意的是，AnnotationConfigApplicationContext 在解析配置类时，会将配置类自身注册为一个
Bean，因为 @Configuration 注解本身定义时被 @Component 标注了。因此可以说，一个 @Configuration
同时也是一个 @Component。大多数情况下，开发者用不到该 Bean，并且在理想情况下，该 Bean
应该是对开发者透明的。@Configuration 的定义如下所示：</p>
<p>&nbsp;@Target({ElementType.TYPE}) <br />
&nbsp;@Retention(RetentionPolicy.RUNTIME) <br />
&nbsp;@Documented <br />
&nbsp;@Component <br />
&nbsp;public @interface Configuration { <br />
&nbsp;String value() default ""; <br />
&nbsp;} <br />
&nbsp;</p>
<p>在一般的项目中，为了结构清晰，通常会根据软件的模块或者结构定义多个 XML 配置文件，然后再定义一个入口的配置文件，该文件使用
&lt;import/&gt; 将其他的配置文件组织起来。最后只需将该文件传给 ClassPathXmlApplicationContext
的构造函数即可。针对基于注解的配置，Spring 也提供了类似的功能，只需定义一个入口配置类，并在该类上使用 @Import
注解引入其他的配置类即可，最后只需要将该入口类传递给 AnnotationConfigApplicationContext。具体示例如下：</p>
<p>&nbsp;@Configuration <br />
&nbsp;@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class}) <br />
&nbsp;public class BookStoreConfig{ &#8230; } <br />
&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------</p>
<p>回页首</p>
<p>混合使用 XML 与注解进行 Bean 的配置</p>
<p>设计 @Configuration 和 @Bean 的初衷，并不是为了完全取代 XML，而是为了在 XML 之外多一种可行的选择。由于
Spring 自发布以来，Spring 开发小组便不断简化 XML 配置，使得 XML 配置方式已经非常成熟，加上 Spring 2.0
以后出现了一系列命名空间的支持，使得 XML 配置方式成为了使用简单、功能强大的 Bean 定义方式。而且，XML
配置的一些高级功能目前还没有相关注解能够直接支持。因此，在目前的多数项目中，要么使用纯粹的 XML 配置方式进行 Bean
的配置，要么使用以注解为主，XML 为辅的配置方式进行 Bean 的配置。</p>
<p>之所以会出现两者共存的情况，主要归结为三个原因：其一，目前绝大多数采用 Spring 进行开发的项目，几乎都是基于 XML
配置方式的，Spring 在引入注解的同时，必须保证注解能够与 XML 和谐共存，这是前提；其二，由于注解引入较晚，因此功能也没有发展多年的
XML 强大，因此，对于复杂的配置，注解还很难独当一面，在一段时间内仍然需要 XML 的配合才能解决问题。除此之外，Spring 的 Bean
的配置方式与 Spring 核心模块之间是解耦的，因此，改变配置方式对 Spring 的框架自身是透明的。Spring 可以通过使用 Bean
后处理器 (BeanPostProcessor) 非常方便的增加对于注解的支持。这在技术实现上非常容易的事情。</p>
<p>要使用混合配置方式，首先需要判断以哪一种配置方式为主。对这个问题的不同回答将会直接影响到实现的方式。然而大可不必为此伤脑筋，因为不论是以
XML 为主，还是以注解为主，配置方式都是简单而且容易理解的。这里不存在错误的决定，因为仅仅是表现方式不一样。我们首先假设以 XML
配置为主的情况。</p>
<p>对于已经存在的大型项目，可能初期是以 XML 进行 Bean 配置的，后续逐渐加入了注解的支持，这时我们只需在 XML 配置文件中将被
@Configuration 标注的类定义为普通的 &lt;bean&gt;，同时注册处理注解的 Bean 后处理器即可。示例如下：</p>
<p>&nbsp;// 假设存在如下的 @Configuration 类：<br />
&nbsp;package bookstore.config; <br />
&nbsp;import bookstore.dao.*; <br />
&nbsp;@Configuration <br />
&nbsp;public class MyConfig{ <br />
&nbsp;@Bean <br />
&nbsp;&nbsp;&nbsp; public UserDao userDao(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new UserDaoImpl(); <br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;} <br />
此时，只需在 XML 中作如下声明即可：<br />
&nbsp;&lt;beans &#8230; &gt; <br />
&nbsp;&nbsp;&nbsp; &#8230;&#8230;<br />
&nbsp;&nbsp;&nbsp; &lt;context:annotation-config /&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;bean class=&#8221;demo.config.MyConfig&#8221;/&gt; <br />
&nbsp;&lt;/beans&gt; <br />
&nbsp;</p>
<p>由于启用了针对注解的 Bean 后处理器，因此在 ApplicationContext 解析到 MyConfig 类时，会发现该类标注了
@Configuration 注解，随后便会处理该类中标注 @Bean 的方法，将这些方法的返回值注册为容器总的 Bean。</p>
<p>对于以上的方式，如果存在多个标注了 @Configuration 的类，则需要在 XML 文件中逐一列出。另一种方式是使用前面提到的自动扫描功能，配置如下：</p>
<p>&nbsp;&lt;context:component-scan base-package=&#8221;bookstore.config&#8221; /&gt; <br />
&nbsp;</p>
<p>如此，Spring 将扫描所有 demo.config 包及其子包中的类，识别所有标记了
@Component、@Controller、@Service、@Repository 注解的类，由于 @Configuration
注解本身也用 @Component 标注了，Spring 将能够识别出 @Configuration 标注类并正确解析之。</p>
<p>对于以注解为中心的配置方式，只需使用 @ImportResource 注解引入存在的 XML 即可，如下所示：</p>
&nbsp;@Configuration <br />
&nbsp;@ImportResource(&#8220;classpath:/bookstore/config/spring-beans.xml&#8221;) <br />
&nbsp;public class MyConfig{ <br />
&#8230;&#8230;<br />
&nbsp;} <br />
&nbsp;// 容器的初始化过程和纯粹的以配置为中心的方式一致：<br />
&nbsp;AnnotationConfigApplicationContext ctx = <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new AnnotationConfigApplicationContext(MyConfig.class); <br />
&#8230;&#8230;
<img src ="http://www.blogjava.net/ashutc/aggbug/348270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2011-04-14 10:01 <a href="http://www.blogjava.net/ashutc/archive/2011/04/14/348270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3：aop实现,2.0中pointcut的定义</title><link>http://www.blogjava.net/ashutc/archive/2010/11/02/336777.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 02 Nov 2010 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/11/02/336777.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/336777.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/11/02/336777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/336777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/336777.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">在Spring&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.0中，Pointcut的定义包括两个部分：Pointcut表示式(expression)和Pointcut签名(signature)。让我们先看看execution表示式的格式：<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;execution(modifier</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret</span><span style="color: #000000;">-</span><span style="color: #000000;">type</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declaring</span><span style="color: #000000;">-</span><span style="color: #000000;">type</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">?</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern(param</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">?</span><span style="color: #000000;">)<br />
<br />
<br />
括号中各个pattern分别表示修饰符匹配（modifier</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">?</span><span style="color: #000000;">）、返回值匹配（ret</span><span style="color: #000000;">-</span><span style="color: #000000;">type</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern）、类路径匹配（declaring</span><span style="color: #000000;">-</span><span style="color: #000000;">type</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">?</span><span style="color: #000000;">）、方法名匹配（name</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern）、参数匹配（(param</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern)）、异常类型匹配（</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">?</span><span style="color: #000000;">），其中后面跟着&#8220;</span><span style="color: #000000;">?</span><span style="color: #000000;">&#8221;的是可选项。<br />
在各个pattern中可以使用&#8220;</span><span style="color: #000000;">*</span><span style="color: #000000;">&#8221;来表示匹配所有。在(param</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern)中，可以指定具体的参数类型，多个参数间用&#8220;,&#8221;隔开，各个也可以用&#8220;</span><span style="color: #000000;">*</span><span style="color: #000000;">&#8221;来表示匹配任意类型的参数，如(String)表示匹配一个String参数的方法；(</span><span style="color: #000000;">*</span><span style="color: #000000;">,String)表示匹配有两个参数的方法，第一个参数可以是任意类型，而第二个参数是String类型；可以用(..)表示零个或多个任意参数。<br />
现在来看看几个例子：<br />
</span><span style="color: #000000;">1</span><span style="color: #000000;">）execution(</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">(..))<br />
表示匹配所有方法<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;">）execution(</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;com.&nbsp;savage.service.UserService.</span><span style="color: #000000;">*</span><span style="color: #000000;">(..))<br />
表示匹配com.savage.server.UserService中所有的公有方法<br />
</span><span style="color: #000000;">3</span><span style="color: #000000;">）execution(</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;com.savage.server..</span><span style="color: #000000;">*</span><span style="color: #000000;">.</span><span style="color: #000000;">*</span><span style="color: #000000;">(..))<br />
表示匹配com.savage.server包及其子包下的所有方法<br />
除了execution表示式外，还有within、</span><span style="color: #0000ff;">this</span><span style="color: #000000;">、target、args等Pointcut表示式。一个Pointcut定义由Pointcut表示式和Pointcut签名组成，例如：<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Pointcut表示式</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;com.savage.aop.MessageSender.*(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Point签名</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;log(){}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
<br />
然后要使用所定义的Pointcut时，可以指定Pointcut签名，如<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;@Before(</span><span style="color: #000000;">"</span><span style="color: #000000;">og()</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
<br />
<br />
上面的定义等同与：<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;@Before(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;com.savage.aop.MessageSender.*(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
<br />
<br />
Pointcut定义时，还可以使用</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">、</span><span style="color: #000000;">||</span><span style="color: #000000;">、</span><span style="color: #000000;">!</span><span style="color: #000000;">运算，如：<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;com.savage.aop.MessageSender.*(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;logSender(){}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;com.savage.aop.MessageReceiver.*(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;logReceiver(){}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">logSender()&nbsp;||&nbsp;logReceiver()</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;logMessage(){}<br />
<br />
<br />
这个例子中，logMessage()将匹配任何MessageSender和MessageReceiver中的任何方法。<br />
还可以将一些公用的Pointcut放到一个类中，以供整个应用程序使用，如：<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.savage.aop;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.aspectj.lang.annotation.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Pointcuts&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;*Message(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;logMessage(){}<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;*Attachment(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;logAttachment(){}<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;@Pointcut(</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;*Service.*(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;</span><span style="color: #000000;">13</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;auth(){}<br />
&nbsp;&nbsp;</span><span style="color: #000000;">14</span><span style="color: #000000;">.&nbsp;}<br />
<br />
<br />
在使用这些Pointcut时，指定完整的类名加上Pointcut签名就可以了，如：<br />
java&nbsp;代码<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;com.savage.aop;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.aspectj.lang.JoinPoint;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.aspectj.lang.annotation.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;@Aspect<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LogBeforeAdvice&nbsp;{<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;@Before(</span><span style="color: #000000;">"</span><span style="color: #000000;">com.sagage.aop.Pointcuts.logMessage()</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">9</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;before(JoinPoint&nbsp;joinPoint)&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Logging&nbsp;before&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;joinPoint.getSignature().getName());<br />
&nbsp;&nbsp;</span><span style="color: #000000;">11</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">.&nbsp;}<br />
<br />
<br />
当基于XML&nbsp;Sechma实现Advice时，如果Pointcut需要被重用，可以使用</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">aop:pointcut</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">aop:pointcut</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">来声明Pointcut，然后在需要使用这个Pointcut的地方，用pointcut</span><span style="color: #000000;">-</span><span style="color: #000000;">ref引用就行了，如：<br />
xml&nbsp;代码<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">aop:config</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">aop:pointcut&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">log</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">execution(*&nbsp;com.savage.simplespring.bean.MessageSender.*(..))</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">aop:aspect&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">logging</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;ref</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">logBeforeAdvice</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">aop:before&nbsp;pointcut</span><span style="color: #000000;">-</span><span style="color: #000000;">ref</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">log</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;method</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">before</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">aop:after</span><span style="color: #000000;">-</span><span style="color: #000000;">returning&nbsp;pointcut</span><span style="color: #000000;">-</span><span style="color: #000000;">ref</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">log</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;method</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">afterReturning</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">7</span><span style="color: #000000;">.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">aop:aspect</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">.&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">aop:config</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<br />
<br />
</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/336777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-11-02 11:50 <a href="http://www.blogjava.net/ashutc/archive/2010/11/02/336777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2:aop实现-spring2.0中的aop实现</title><link>http://www.blogjava.net/ashutc/archive/2010/11/02/336776.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 02 Nov 2010 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/11/02/336776.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/336776.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/11/02/336776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/336776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/336776.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->在Spring&nbsp;2.0中，除了传统的通过实现AOP&nbsp;AIP的方式来实现Advice之外，还提供了两种更加简便的方式来实现Advice：1）基于XML&nbsp;Schema...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/11/02/336776.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/336776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-11-02 11:49 <a href="http://www.blogjava.net/ashutc/archive/2010/11/02/336776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1:aop实现-advice</title><link>http://www.blogjava.net/ashutc/archive/2010/11/02/336775.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 02 Nov 2010 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/11/02/336775.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/336775.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/11/02/336775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/336775.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/336775.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->在Spring1.2或之前的版本中，实现AOP的传统方式就是通过实现Spring的AOP&nbsp;API来定义Advice，并设置代理对象。Spring根据Adivce加入到业务流程的时机的...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/11/02/336775.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/336775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-11-02 11:47 <a href="http://www.blogjava.net/ashutc/archive/2010/11/02/336775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring 3.0 mvc</title><link>http://www.blogjava.net/ashutc/archive/2010/10/27/336249.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 27 Oct 2010 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/10/27/336249.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/336249.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/10/27/336249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/336249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/336249.html</trackback:ping><description><![CDATA[<br />
<strong>RestController.java</strong><br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;cn.yu.test;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletResponse;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.stereotype.Controller;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.ui.ModelMap;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.bind.annotation.PathVariable;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.bind.annotation.RequestMapping;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.bind.annotation.RequestMethod;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.springframework.web.servlet.ModelAndView;<br />
<br />
@Controller<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;RestController&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;RestController()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/login/{user}</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;RequestMethod.GET)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;ModelAndView&nbsp;myMethod(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response,&nbsp;@PathVariable(</span><span style="color: #000000;">"</span><span style="color: #000000;">user</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;String&nbsp;user,&nbsp;ModelMap&nbsp;modelMap)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modelMap.put(</span><span style="color: #000000;">"</span><span style="color: #000000;">loginUser</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ModelAndView(</span><span style="color: #000000;">"</span><span style="color: #000000;">/hello</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;modelMap);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/welcome</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;RequestMethod.GET)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;registjsp()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/welcome</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@RequestMapping(value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/welcomehtml</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;RequestMethod.GET)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;registPost()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">redirect:/jsp/welcomehtml.html</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
spring-servlet.xml<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">beans&nbsp;xmlns</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/beans</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns:xsi</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns:p</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/p</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns:context</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/context</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xsi:schemaLocation</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.springframework.org/schema/beans&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000;">//</span><span style="color: #008000;">www.springframework.org/schema/beans/spring-beans-3.0.xsd&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000;">//</span><span style="color: #008000;">www.springframework.org/schema/context&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000;">//</span><span style="color: #008000;">www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;自动扫描bean，把作了注解的类转换为bean&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">context:component</span><span style="color: #000000;">-</span><span style="color: #000000;">scan&nbsp;base</span><span style="color: #000000;">-</span><span style="color: #0000ff;">package</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">cn.yu.test</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;启动Spring&nbsp;MVC的注解功能，完成请求和注解POJO的映射&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;对模型视图名称的解析，在请求时模型视图名称添加前后缀&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.web.servlet.view.InternalResourceViewResolver</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;p:prefix</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/jsp</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;p:suffix</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">.jsp</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">multipartResolver</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.web.multipart.commons.CommonsMultipartResolver</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;p:defaultEncoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">utf-8</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">beans</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; <br />
</span></div>
<br />
<br />
web.xml<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;?</span><span style="color: #000000;">xml&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">1.0</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;encoding</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">web</span><span style="color: #000000;">-</span><span style="color: #000000;">app&nbsp;version</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">2.5</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/xml/ns/javaee</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xmlns:xsi</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://www.w3.org/2001/XMLSchema-instance</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;xsi:schemaLocation</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">http://java.sun.com/xml/ns/javaee&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000;">//</span><span style="color: #008000;">java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;*</span><span style="color: #000000;">.js</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;*</span><span style="color: #000000;">.css</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;*</span><span style="color: #000000;">.gif</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;*</span><span style="color: #000000;">.jpg</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;*</span><span style="color: #000000;">.html</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">spring</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">org.springframework.web.servlet.DispatcherServlet</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">load</span><span style="color: #000000;">-</span><span style="color: #000000;">on</span><span style="color: #000000;">-</span><span style="color: #000000;">startup</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">1</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">load</span><span style="color: #000000;">-</span><span style="color: #000000;">on</span><span style="color: #000000;">-</span><span style="color: #000000;">startup</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">spring</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;/&lt;/</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;url配置为</span><span style="color: #000000;">/</span><span style="color: #000000;">，不带文件后缀，会造成其它静态文件(js，css等)不能访问。如配为</span><span style="color: #000000;">*</span><span style="color: #000000;">.</span><span style="color: #0000ff;">do</span><span style="color: #000000;">，则不影响静态文件的<br />
<br />
访问&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">servlet</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">web</span><span style="color: #000000;">-</span><span style="color: #000000;">app</span><span style="color: #000000;">&gt;</span></div>
<br />
jsp文件下3个网页。hello.jsp,welcome.jsp,welcomehtml.html<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/336249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-10-27 09:43 <a href="http://www.blogjava.net/ashutc/archive/2010/10/27/336249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>no matching editors or conversion strategy（配置事物时出现的错误）</title><link>http://www.blogjava.net/ashutc/archive/2010/09/27/333020.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 27 Sep 2010 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/09/27/333020.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/333020.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/09/27/333020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/333020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/333020.html</trackback:ping><description><![CDATA[错误为:<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">Caused&nbsp;by:&nbsp;java.lang.IllegalArgumentException:&nbsp;Cannot&nbsp;convert&nbsp;value&nbsp;of&nbsp;type&nbsp;[$Proxy5&nbsp;implementing&nbsp;java.lang.Runnable,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]&nbsp;to&nbsp;required&nbsp;type&nbsp;[java.util.TimerTask]&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;property&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">timerTask</span><span style="color: #000000;">'</span><span style="color: #000000;">:&nbsp;no&nbsp;matching&nbsp;editors&nbsp;or&nbsp;conversion&nbsp;strategy&nbsp;found<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:</span><span style="color: #000000;">231</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:</span><span style="color: #000000;">138</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:</span><span style="color: #000000;">386</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img src="../../Images/dot.gif"  alt="" />&nbsp;</span><span style="color: #000000;">42</span><span style="color: #000000;">&nbsp;more</span></div>
<br />
<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">tx:annotation</span><span style="color: #000000;">-</span><span style="color: #000000;">driven&nbsp;transaction</span><span style="color: #000000;">-</span><span style="color: #000000;">manager</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">txManager</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
更改为<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tx:annotation</span><span style="color: #000000;">-</span><span style="color: #000000;">driven&nbsp;transaction</span><span style="color: #000000;">-</span><span style="color: #000000;">manager</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">txManager</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;proxy</span><span style="color: #000000;">-</span><span style="color: #000000;">target</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
<br />
</span>表示proxy代理的是类而不是接口。<br />
<span style="color: #000000;"><br />
</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;Tranceaction&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">txManager</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.jdbc.datasource.DataSourceTransactionManager</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">dataSource</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;local</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">dataSource</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span></div>
<pre style="line-height: 150%; margin: 0px;"><br />
错误为:<br />
<br />
</pre>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">Caused&nbsp;by:&nbsp;org.springframework.aop.framework.AopConfigException:&nbsp;Cannot&nbsp;proxy&nbsp;target&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;because&nbsp;CGLIB2&nbsp;is&nbsp;not&nbsp;available.&nbsp;Add&nbsp;CGLIB&nbsp;to&nbsp;the&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;path&nbsp;or&nbsp;specify&nbsp;proxy&nbsp;interfaces.</span><br />
</div>
<pre style="line-height: 150%; margin: 0px;">原因为:<br />
缺少包：<span style="font-size: 10pt; color: red;">cglib-2.1.3.jar</span><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</pre>
<img src ="http://www.blogjava.net/ashutc/aggbug/333020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-09-27 09:35 <a href="http://www.blogjava.net/ashutc/archive/2010/09/27/333020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Spring提供的JUnit框架扩展对DAO或Service层进行单元测试</title><link>http://www.blogjava.net/ashutc/archive/2010/09/06/331175.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 06 Sep 2010 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/09/06/331175.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/331175.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/09/06/331175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/331175.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/331175.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">一、Spring提供的JUnit框架扩展：<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.&nbsp;AbstractSpringContextTests：spring中使用spring上下文测试的Junit扩展类，我们一般不会使用这个类来进行单元测试，它是spring内部设计使用到的类<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">.&nbsp;AbstractDependencyInjectionSpringContextTests：这是AbstractSpringContextTests的直接子类，支持依赖spring上下文的测试类，这个类不支持事务。<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">.&nbsp;AbstractTransactionalSpringContextTests：这是&nbsp;AbstractDependencyInjectionSpringContextTests的直接子类，这个类一般应用在事务相关的测试中，一旦完成每个测试它就会正常地回滚事务，不会真正更新数据库，若要手动设置事务相关操作，你可以重载onSetUpInTransaction和&nbsp;onTearDownInTransaction方法，以便手工开始并提交事务，或者调用setComplete()方法。这个类也可以在没有事务的情况下，使用这个类。<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">4</span><span style="color: #000000;">.&nbsp;AbstractTransactionalDataSourceSpringContextTests：这是&nbsp;AbstractTransactionalSpringContextTests的直接子类，它使用了Spring的基于JDBC的&nbsp;jdbcTemplate工具类，支持数据库级别的事务。<br />
<br />
二、如何在你的TestCase&nbsp;Class里取得spring&nbsp;context<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你的TestCase&nbsp;Class必须继承的是上述四个AbstractXXXSpringContextTests中的其中一个，那么就必须实现下面这个方法来取得spring&nbsp;context：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">abstract</span><span style="color: #000000;">&nbsp;String[]&nbsp;getConfigLocations();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;getConfigLocations()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;configLocations&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate-context.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;configLocations;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
请&nbsp;注意要加载的context&nbsp;xml&nbsp;file的路径问题：上述的代码是基于classpath，因此applicationContext.xml和hibernate</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;context.xml必须放在classpath里（方法一是把xml&nbsp;files放到WEB</span><span style="color: #000000;">-</span><span style="color: #000000;">INF</span><span style="color: #000000;">/</span><span style="color: #000000;">classes目录下，另一种方法就是在project&nbsp;properties里把xml&nbsp;files的路径加到classpath里）<br />
<br />
那么如果你一定要把context&nbsp;xml&nbsp;files放到WEB</span><span style="color: #000000;">-</span><span style="color: #000000;">INF目录下，也是可以的，那么应该基于file(基于file的相对路径是相对于project&nbsp;root&nbsp;folder)，代码如下：<br />
<br />
&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;getConfigLocations()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;configLocations&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">file:WebContent/WEB-INF/applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;configLocations;<br />
&nbsp;}<br />
<br />
AbstractXXXSpringContextTests就会根据根据getConfigLocations方法返回的context&nbsp;xml位置的数组来加载并且对加载的Context提供缓存。这是非常重要的，因为如果你在从事一个大项目时，启动时间可能成为一个问题－－这不是&nbsp;Spring自身的开销，而是被Spring容器实例化的对象在实例&nbsp;化自身时所需要的时间。例如，一个包括50</span><span style="color: #000000;">-</span><span style="color: #000000;">100个Hibernate映射文件的项目可能需要10</span><span style="color: #000000;">-</span><span style="color: #000000;">20秒的时间来加载上述的映射文件，如果在运行每个测试fixture里的每个测试案例前都有这样的开销，将导致整个测试工作的延时，最终有可能（实际上很可能）降低效率。<br />
<br />
在某种极偶然的情况下，某个测试可能&#8220;弄脏&#8221;了配置场所，并要求重新加载－－例如改变一个bean的定义或者一个应用对象的状态－－你可以调用&nbsp;AbstractDependencyInjectionSpringContextTests&nbsp;上的&nbsp;setDirty()&nbsp;方法来重新加载配置并在执行下一个测试案例前重建application&nbsp;context<br />
<br />
&nbsp;<br />
<br />
当类&nbsp;AbstractDependencyInjectionSpringContextTests（及其子类）装载你的Application&nbsp;Context时，你可以通过Setter方法来注入你想要的来自context的bean,而不需要显式的调用&nbsp;applicationContext.getBean(XXX)。因为&nbsp;AbstractDependencyInjectionSpringContextTests会从getConfigLocations()方法指定的配置文件中帮你自动注入<br />
<br />
下面的例子就是通过setter方法来获得context里的ProductManager&nbsp;bean：<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyTest&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;AbstractDependencyInjectionSpringContextTests&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ProductManager&nbsp;productManager;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;getConfigLocations()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;configLocations&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">file:WebContent/WEB-INF/applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;configLocations;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testGetProduct()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span style="color: #000000;">"</span><span style="color: #000000;">tomson</span><span style="color: #000000;">"</span><span style="color: #000000;">,productManager.getProductByName(</span><span style="color: #000000;">"</span><span style="color: #000000;">tomson</span><span style="color: #000000;">"</span><span style="color: #000000;">).getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">通过setter方法自动从context里注入productManager&nbsp;bean，而不用显示调用applicationContext.getBean(XXX)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setProductManager(ProductManager&nbsp;productManager)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.productManager&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;productManager;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
但是如&nbsp;果context里有多个bean都定义为一个类型（例如有多个bean都是ProductManager&nbsp;class类型的），那么对这些bean就无法通过setter方法来自动依赖注入（因为有多个bean同一个类型，不知要自动注入哪个）。在这种情况下&nbsp;你需要显示的调用applicationContext.getBean(XXX)来注入。如：<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyTest&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;AbstractDependencyInjectionSpringContextTests&nbsp;{<br />
&nbsp;&nbsp;&nbsp;ProductManager&nbsp;productManager;<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String[]&nbsp;getConfigLocations()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;configLocations&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">file:WebContent/WEB-INF/applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;configLocations;<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;onSetUp()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;productManager&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(ProductManager)&nbsp;applicationContext.getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">productManager</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;testGetProduct()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(</span><span style="color: #000000;">"</span><span style="color: #000000;">tomson</span><span style="color: #000000;">"</span><span style="color: #000000;">,productManager.getProductByName(</span><span style="color: #000000;">"</span><span style="color: #000000;">tomson</span><span style="color: #000000;">"</span><span style="color: #000000;">).getName());<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
}<br />
<br />
如果你的TestCase不使用依赖注入，只要不定义任何setters方法即可。或者你可以继承&nbsp;AbstractSpringContextTests&nbsp;－－这个&nbsp;org.springframework.test&nbsp;包中的根类，而不是继承AbstractDependencyInjectionSpringContextTests（及其子类）。这是因为&nbsp;AbstractSpringContextTests&nbsp;只包括用来加载Spring&nbsp;Context的便利方法但没有自动依赖注入的功能。<br />
<br />
</span></div>
<img src ="http://www.blogjava.net/ashutc/aggbug/331175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-09-06 11:02 <a href="http://www.blogjava.net/ashutc/archive/2010/09/06/331175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unable to load configuration. - bean - jar:file:/D:/Tomcat-6.0.18/webapps/teabank/WEB-INF/lib/struts2-core-2.1.6.jar!/struts-default.xml</title><link>http://www.blogjava.net/ashutc/archive/2010/07/09/325671.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 09 Jul 2010 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/07/09/325671.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/325671.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/07/09/325671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/325671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/325671.html</trackback:ping><description><![CDATA[<p><span style="font-size: medium;">Struts2所需的jar包导入不全，导致该错误。</span></p>
<span style="font-size: medium;">主要需要以下几个jar包： <br />
<br />
<br />
struts2-core-2.1.6.jar
<br />
xwork-2.1.2.jar <br />
ognl-2.6.11.jar <br />
freemarker-2.3.13.jar <br />
commons-logging.jar
<br />
commons-fileupload.jar <br />
commons-io.jar </span>
<img src ="http://www.blogjava.net/ashutc/aggbug/325671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-07-09 16:45 <a href="http://www.blogjava.net/ashutc/archive/2010/07/09/325671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 文件上传及缩放</title><link>http://www.blogjava.net/ashutc/archive/2010/06/03/322682.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Thu, 03 Jun 2010 14:54:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/06/03/322682.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/322682.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/06/03/322682.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/322682.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/322682.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->package&nbsp;upload;import&nbsp;java.io.*;import&nbsp;java.util.*;import&nbsp;com.sun.im...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/06/03/322682.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/322682.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-06-03 22:54 <a href="http://www.blogjava.net/ashutc/archive/2010/06/03/322682.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>userlogin</title><link>http://www.blogjava.net/ashutc/archive/2010/04/06/317590.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 06 Apr 2010 13:42:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/04/06/317590.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/317590.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/04/06/317590.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/317590.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/317590.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;package&nbsp;cn.userlogin.dao;import&nbsp;java.util.List;public&nbsp;interface&nbsp;userloginDAO&nbsp;{&nbsp;&nbsp;&nbsp;public&nbsp;List&nbsp;getUser(String&nbsp;username,String&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/ashutc/archive/2010/04/06/317590.html'>阅读全文</a><img src ="http://www.blogjava.net/ashutc/aggbug/317590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-04-06 21:42 <a href="http://www.blogjava.net/ashutc/archive/2010/04/06/317590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate并发控制乐观锁实现——Version</title><link>http://www.blogjava.net/ashutc/archive/2010/01/22/310557.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 22 Jan 2010 12:09:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2010/01/22/310557.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/310557.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2010/01/22/310557.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/310557.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/310557.html</trackback:ping><description><![CDATA[<p>乐观并发控制，可以有三种方式。</p>
<p>1，Version版本号</p>
<p>2，时间戳</p>
<p>3，自动版本控制。</p>
<p>这里不建议在新的应用程序中定义没有版本或者时间戳列的版本控制：它更慢，更复杂，如果你正在使用脱管对象，它则不会生效。</p>
<p>以下信息来自 : <a href="http://esffor.javaeye.com/blog/168243">http://esffor.javaeye.com/blog/168243</a></p>
<p>通过在表中及POJO中增加一个version字段来表示记录的版本，来达到多用户同时更改一条数据的冲突</p>
<p>数据库脚本：&nbsp;</p>
<div style="padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 95%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<div>
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">create</span>&nbsp;<span style="color: #0000ff;">table</span><span style="color: #000000;">&nbsp;studentVersion&nbsp;(id&nbsp;</span><span style="color: #000000; font-weight: bold;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">32</span><span style="color: #000000;">),name&nbsp;</span><span style="color: #000000; font-weight: bold;">varchar</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">32</span><span style="color: #000000;">),ver&nbsp;</span><span style="color: #000000; font-weight: bold;">int</span><span style="color: #000000;">);</span> </div>
</div>
<p>POJO</p>
<div style="padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 95%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<div>
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;Version;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img id="_39_404_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="_39_404_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Student&nbsp;</span><span id="_39_404_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;id;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span>&nbsp;<span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;version;<br />
<img id="_130_144_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_130_144_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getId()&nbsp;</span><span id="_130_144_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;id;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="_175_192_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_175_192_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setId(String&nbsp;id)&nbsp;</span><span id="_175_192_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;id;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="_218_234_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_218_234_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()&nbsp;</span><span id="_218_234_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="_269_290_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_269_290_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)&nbsp;</span><span id="_269_290_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="_316_335_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_316_335_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;getVersion()&nbsp;</span><span id="_316_335_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;version;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="_373_400_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_373_400_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setVersion(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;version)&nbsp;</span><span id="_373_400_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.version&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;version;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span> </div>
</div>
<p>Student.hbm.xml</p>
<div style="padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 95%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<div>
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;"-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD&nbsp;3.0//EN"<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Mapping&nbsp;file&nbsp;autogenerated&nbsp;by&nbsp;MyEclipse&nbsp;-&nbsp;Hibernate&nbsp;Tools<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">class&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="Version.Student"</span><span style="color: #ff0000;">&nbsp;table</span><span style="color: #0000ff;">="studentVersion"</span>&nbsp;<span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">id&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;unsaved-value</span><span style="color: #0000ff;">="null"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">generator&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="uuid.hex"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">generator</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">id</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">version标签必须跟在id标签后面</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="version"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="ver"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="int"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="string"</span><span style="color: #ff0000;">&nbsp;column</span><span style="color: #0000ff;">="name"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">class</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-mapping</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span> </div>
</div>
<p>Hibernate.cfg.xml</p>
<div style="padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 95%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<div>
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version='1.0'&nbsp;encoding='UTF-8'</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;hibernate-configuration&nbsp;PUBLIC<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"-//Hibernate/Hibernate&nbsp;Configuration&nbsp;DTD&nbsp;3.0//EN"<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;Generated&nbsp;by&nbsp;MyEclipse&nbsp;Hibernate&nbsp;Tools.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">hibernate-configuration</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">session-factory</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="connection.username"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">root</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="connection.url"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312</span><span style="color: #ff0000;">&amp;amp;</span><span style="color: #000000;">useUnicode=true<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dialect"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="myeclipse.connection.profile"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">mysql</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="connection.password"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1234</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="connection.driver_class"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.mysql.jdbc.Driver<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="hibernate.dialect"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.MySQLDialect<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="hibernate.show_sql"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">true</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="current_session_context_class"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">thread</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="jdbc.batch_size"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">15</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">property</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mapping&nbsp;</span><span style="color: #ff0000;">resource</span><span style="color: #0000ff;">="Version/Student.hbm.xml"</span>&nbsp;<span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">session-factory</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">hibernate-configuration</span><span style="color: #0000ff;">&gt;</span> </div>
</div>
<p>测试代码：</p>
<div style="padding: 4px 5.4pt; background: #e6e6e6 none repeat scroll 0% 0%; width: 95%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous;">
<div>
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;Version;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.File;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Iterator;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Set;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Session;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.SessionFactory;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.Transaction;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.hibernate.cfg.Configuration;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img id="_250_1585_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="_250_1585_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /></span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test&nbsp;</span><span id="_250_1585_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img id="_294_1582_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_294_1582_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="_294_1582_Open_Text"><span style="color: #000000;">{<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filePath</span><span style="color: #000000;">=</span><span style="color: #000000;">System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">user.dir</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">+</span><span style="color: #000000;">File.separator</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">src/Version</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">File.separator</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">hibernate.cfg.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(filePath);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(filePath);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory&nbsp;sessionFactory</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure(file).buildSessionFactory();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session</span><span style="color: #000000;">=</span><span style="color: #000000;">sessionFactory.openSession();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;t</span><span style="color: #000000;">=</span><span style="color: #000000;">session.beginTransaction();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Student();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">tom11</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(stu);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.commit();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="_782_824_Open_Image" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top" /><img id="_782_824_Closed_Image" style="display: none;" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="_782_824_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;模拟多个session操作student数据表<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span></span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session1</span><span style="color: #000000;">=</span><span style="color: #000000;">sessionFactory.openSession();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session2</span><span style="color: #000000;">=</span><span style="color: #000000;">sessionFactory.openSession();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu1</span><span style="color: #000000;">=</span><span style="color: #000000;">(Student)session1.createQuery(</span><span style="color: #000000;">"</span><span style="color: #000000;">from&nbsp;Student&nbsp;s&nbsp;where&nbsp;s.name='tom11'</span><span style="color: #000000;">"</span><span style="color: #000000;">).uniqueResult();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu2</span><span style="color: #000000;">=</span><span style="color: #000000;">(Student)session2.createQuery(</span><span style="color: #000000;">"</span><span style="color: #000000;">from&nbsp;Student&nbsp;s&nbsp;where&nbsp;s.name='tom11'</span><span style="color: #000000;">"</span><span style="color: #000000;">).uniqueResult();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这时候，两个版本号是相同的</span><span style="color: #008000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">v1=</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">stu1.getVersion()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">--v2=</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">stu2.getVersion());<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx1</span><span style="color: #000000;">=</span><span style="color: #000000;">session1.beginTransaction();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu1.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">session1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx1.commit();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">这时候，两个版本号是不同的，其中一个的版本号递增了</span><span style="color: #008000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">v1=</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">stu1.getVersion()</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">--v2=</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">stu2.getVersion());<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx2</span><span style="color: #000000;">=</span><span style="color: #000000;">session2.beginTransaction();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stu2.setName(</span><span style="color: #000000;">"</span><span style="color: #000000;">session2</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx2.commit();<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" alt="" align="top" /><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top" /></span> </div>
</div>
<p>运行结果：</p>
<p>Hibernate: insert into studentVersion (ver, name, id) values (?, ?, ?)<br />
Hibernate:
select student0_.id as id0_, student0_.ver as ver0_, student0_.name as
name0_ from studentVersion student0_ where student0_.name='tom11'<br />
Hibernate:
select student0_.id as id0_, student0_.ver as ver0_, student0_.name as
name0_ from studentVersion student0_ where student0_.name='tom11'<br />
v1=0--v2=0<br />
Hibernate: update studentVersion set ver=?, name=? where id=? and ver=?<br />
v1=1--v2=0<br />
Hibernate: update studentVersion set ver=?, name=? where id=? and ver=?<br />
Exception in thread "main" org.hibernate.StaleObjectStateException: <span style="color: #ff0000;">Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect):</span> [Version.Student#4028818316cd6b460116cd6b50830001]</p>
<p>可以看到，第二个&#8220;用户&#8221;session2修改数据时候，记录的版本号已经被session1更新过了，所以抛出了红色的异常，我们可以在实际应用
中处理这个异常，例如在处理中重新读取数据库中的数据，同时将目前的数据与数据库中的数据展示出来，让使用者有机会比较一下，或者设计程序自动读取新的数
据</p>
<p><span style="color: #ff0000; font-size: small;"><strong>注意：</strong></span></p>
<p><strong><span style="font-size: small;">&nbsp;&nbsp;&nbsp; 要注意的是，由于乐观锁定是使用系统中的程式来控制，而不是使用资料库中的锁定机制，因而如果有人特意自行更新版本讯息来越过检查，则锁定机制就会无效，例如在上例中自行更改<span style="color: #ff0000;">stu</span>的version属性，使之与资料库中的版本号相同的话就不会有错误，像这样版本号被更改，或是由于资料是由外部系统而来，因而版本资讯不受控制时，锁定机制将会有问题，设计时必须注意。</span></strong></p>
<p><span style="color: #ff0000; font-size: small;"><strong>&nbsp;&nbsp;&nbsp; 如果手工设置stu.setVersion()自行更新版本以跳过检查,则这种乐观锁就会失效，应对方法可以将Student.java的setVersion设置成private</strong></span></p>
<img src ="http://www.blogjava.net/ashutc/aggbug/310557.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2010-01-22 20:09 <a href="http://www.blogjava.net/ashutc/archive/2010/01/22/310557.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2验证框架</title><link>http://www.blogjava.net/ashutc/archive/2009/11/11/302023.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 11 Nov 2009 14:35:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/11/11/302023.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/302023.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/11/11/302023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/302023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/302023.html</trackback:ping><description><![CDATA[我们在配置文件中指定了method其实和验证没什么关系，比如我们指定method="save"&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="background-color: rgb(240, 240, 240);">&lt;action name="saveUser" class="saveUserAction" method="save"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success" type="redirect"&gt;listUser!list.action&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;/save.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/action&gt;<br />
</font><br />
saveUserAction 里面有方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="background-color: rgb(240, 240, 240);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String save() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.service.saveUser(user);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font><br />
然后我们验证文件配置成UserAction-save-validation.xml。这样struts验证是不会成功的。<br />
因为验证跟本就跟method指定的方法和action里面的方法名无关，而是和struts.xml里面的name指定的名字有关，<br />
如果我们的配置文件这样命名：UserAction-aveUser-validation.xml 那么才能验证成功<br />
<br />
UserAction-aveUser-validation.xml ：<br />
<font style="background-color: rgb(240, 240, 240);">&lt;validators&gt;<br />
&nbsp;&lt;field name="user.age"&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="required"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;required age&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&nbsp;&lt;field-validator type="int"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="min"&gt;1&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param name="max"&gt;150&lt;/param&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;message&gt;age should be between ${min} and ${max}&lt;/message&gt;<br />
&nbsp;&nbsp;&lt;/field-validator&gt;<br />
&nbsp;&lt;/field&gt;<br />
&lt;/validators&gt;<br />
<br />
防止验证出现多行重复性提示,scope定义为prototype使struts2的action不使用单例模式<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="saveUserAction" class="com.yu.useraction.saveUserAction" scope="prototype"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="service" ref="userService"&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
所有在spring里面的action都需要配置scope="prototype"不能使用默认<br />
<br />
<br />
如果oracle数据库 把age的Long类型都改成Interger类型（user.java和user.hbm.xml），否者验证时会不能通过<br />
</font>
<img src ="http://www.blogjava.net/ashutc/aggbug/302023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-11-11 22:35 <a href="http://www.blogjava.net/ashutc/archive/2009/11/11/302023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Caught exception while loading file struts-default.xml  错误</title><link>http://www.blogjava.net/ashutc/archive/2009/11/11/302011.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Wed, 11 Nov 2009 12:56:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/11/11/302011.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/302011.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/11/11/302011.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/302011.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/302011.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em;">严重: Exception starting filter struts2 </p>
<p style="text-indent: 2em;">Caught exception while loading file struts-default.xml - [unknown location] </p>
<p style="text-indent: 2em;">at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadConfigurationFiles(XmlConfigurationProvider.java:839) </p>
<p style="text-indent: 2em;">at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadDocuments(XmlConfigurationProvider.java:131) </p>
<p style="text-indent: 2em;">at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.init(XmlConfigurationProvider.java:100) </p>
<p style="text-indent: 2em;">&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;</p>
<p style="text-indent: 2em;">现象: 第一次能运行, reload就不行.</p>
<p style="text-indent: 2em;">试了Struts2自带的blank包, 没问题. </p>
<p style="text-indent: 2em;">那基本可断定是其他jar包有冲突, 应该是XML解析包有冲突. </p>
<p style="text-indent: 2em;">检查发布后的WEB-INF/lib有两个XML解析包: xml-apis.jar和xerces-2.6.2.jar </p>
<p style="text-indent: 2em;">这种错误真正原因不是JDK 6和Struts 2冲突, 而是 MyEclipse Hibernate 类库中多了两个包: xml-apis.jar和xerces-2.6.2.jar, 这两个包的功能和JDK的冲突了. 解决办法: 1. 删除发布后目录的 WEB-INF/lib/ 下的这两个文件; 2. 或者使用JDK 1.5来启动Tomcat 6. </p>
<img src ="http://www.blogjava.net/ashutc/aggbug/302011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-11-11 20:56 <a href="http://www.blogjava.net/ashutc/archive/2009/11/11/302011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate二级缓存ehcache配置</title><link>http://www.blogjava.net/ashutc/archive/2009/10/31/300486.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Sat, 31 Oct 2009 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/10/31/300486.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/300486.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/10/31/300486.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/300486.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/300486.html</trackback:ping><description><![CDATA[<p>需要两个包:<br />
commons-logging-1.0.4.jar<br />
ehcache-1.2.3.jar<br />
<br />
在src根目录下新建　ehcache.xml <br />
<br />
</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: rgb(0, 0, 0);">&lt;?</span><span style="color: rgb(0, 0, 0);">xml&nbsp;version</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1.0</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;encoding</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">UTF-8</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">?&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">ehcache</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">diskStore&nbsp;path</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">java.io.tmpdir</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">defaultCache&nbsp;maxElementsInMemory</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">10000</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;eternal</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">false</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;timeToIdleSeconds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">120</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;timeToLiveSeconds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">120</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;overflowToDisk</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;diskExpiryThreadIntervalSeconds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">120</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;memoryStoreEvictionPolicy</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">LRU</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">cache&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cn.yu.vo.Guestbook</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;maxElementsInMemory</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1000</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;eternal</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">false</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;timeToIdleSeconds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">3000</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;timeToLiveSeconds</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">600</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;overflowToDisk</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">ehcache</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img style="width: 11px; height: 16px;" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" height="16" width="11" /></span></div>
&nbsp; <span style="color: rgb(0, 0, 0);">&lt;!--</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskStore:保存在硬盘上的临时目录<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name：Cache的唯一标识<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxElementsInMemory：内存中最大缓存对象数。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxElementsOnDisk：磁盘中最大缓存对象数，若是0表示无穷大。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eternal：Element是否永久有效，一但设置了，timeout将不起作用。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overflowToDisk：配置此属性，当内存中Element数量达到maxElementsInMemory时，Ehcache将会Element写到磁盘中。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToIdleSeconds：设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用，可选属性，默认值是0，&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也就是可闲置时间无穷大。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeToLiveSeconds：设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有效时使用，默认是0.，&nbsp; 也就是element存活时间无穷大。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskPersistent：是否缓存虚拟机重启期数据。（这个虚拟机是指什么虚拟机一直没看明白是什么,有高人还希望能指点<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一二）。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskExpiryThreadIntervalSeconds：磁盘失效线程运行时间间隔，默认是120秒。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;diskSpoolBufferSizeMB：这个参数设置DiskStore（磁盘缓存）的缓存区大小。默认是30MB。每个Cache都应该有自己的一<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 个缓冲区。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memoryStoreEvictionPolicy：当达到maxElementsInMemory限制时，Ehcache将会根据指定的策略去清理内存。默认策略是<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LRU（最近最少使用）。你可以设置为FIFO（先进先出）或是LFU（较少使用）。这里比较<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 遗憾，Ehcache并没有提供一个用户定制策略的接口，仅仅支持三种指定策略，感觉做的不够<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理想。<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;</span><span style="color: rgb(0, 0, 0);">--&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><br />
在hibernate.cfg.xml里面新增属性<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">property&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cache.provider_class</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.cache.EhCacheProvider<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">property</span><span style="color: rgb(0, 0, 0);">&gt;</span></div>
在guestbook.hbm.xml里面新增属性<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cn.yu.vo.Guestbook</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;table</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GUESTBOOK</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;schema</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">OLIVER</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"><span style="color: red;">cache&nbsp;usage="read-write"</span></span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">id&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;type</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">java.lang.Long</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">column&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ID</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;precision</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">22</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;scale</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">generator&nbsp;</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">sequence</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">param&nbsp;name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">sequence</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">gb_seq</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">param</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">generator</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;/</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 0);">&gt;</span></div>
<img src ="http://www.blogjava.net/ashutc/aggbug/300486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-10-31 15:45 <a href="http://www.blogjava.net/ashutc/archive/2009/10/31/300486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3.0 HQL条件子语句like 中文乱码</title><link>http://www.blogjava.net/ashutc/archive/2009/10/31/300439.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 30 Oct 2009 20:09:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/10/31/300439.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/300439.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/10/31/300439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/300439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/300439.html</trackback:ping><description><![CDATA[String str = "中文字符串";<br />
String hql = "FROM Table AS t WHERE t.field like '%" + str + "%'";<br />
<br />
Query query = getSession().createQuery(hql);<br />
query.list();<br />
<br />
使用这种形式传入参数str, 会导致控制台输出:<br />
FROM Table AS t WHERE t.field like '% ????%' <br />
之类的乱码, 从而在数据库找不到匹配记录.<br />
<br />
据说这是hibernate3.0 like子句处理中文的一个问题, 3.1已得到修正。3.0版可以通过设置参数解决。改正如下：<br />
<br />
String str = "中文字符串";<br />
String hql = "FROM Table AS t WHERE t.field LIKE :param";<br />
Query query = getSession().createQuery(hql);<br />
query.setString("param", "%" + str + "%");<br />
query.list();<br />
<img src ="http://www.blogjava.net/ashutc/aggbug/300439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-10-31 04:09 <a href="http://www.blogjava.net/ashutc/archive/2009/10/31/300439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>getCurrentSession 与 openSession() 的区别 </title><link>http://www.blogjava.net/ashutc/archive/2009/09/27/296632.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Sun, 27 Sep 2009 05:50:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/09/27/296632.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/296632.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/09/27/296632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/296632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/296632.html</trackback:ping><description><![CDATA[<p><font style="background-color: #f0f0f0;">&nbsp; getCurrentSession创建的session会和绑定到当前线程,而openSession不会。</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp; getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; 如果使用的是本地事务（jdbc事务）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
如果使用的是全局事务（jta事务）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="hibernate.current_session_context_class"&gt;jta&lt;/property&gt;&nbsp; </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; getCurrentSession ()使用当前的session，openSession()重新建立一个新的session </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 在一个应用程序中，如果DAO 层使用Spring 的hibernate 模板，通过Spring 来控制session 的生命周期，则首选getCurrentSession ()。</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 使用Hibernate的大多数应用程序需要某种形式的&#8220;上下文相关的&#8221; session，特定的session在整个特定的上下文范围内始终有效。然而，对不同类型的应用程序而言，要为什么是组成这种&#8220;上下文&#8221;下一个定义通常 是困难的；不同的上下文对&#8220;当前&#8221;这个概念定义了不同的范围。在3.0版本之前，使用Hibernate的程序要么采用自行编写的基于 ThreadLocal的上下文session，要么采用HibernateUtil这样的辅助类，要么采用第三方框架（比如Spring或Pico)， 它们提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关session。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 从3.0.1版本开 始，Hibernate增加了SessionFactory.getCurrentSession()方法。一开始，它假定了采用JTA事务，JTA事务 定义了当前session的范围和上下文(scope and context)。Hibernate开发团队坚信，因为有好几个独立的JTA TransactionManager实现稳定可用，不论是否被部署到一个J2EE容器中，大多数(假若不是所有的）应用程序都应该采用JTA事务管理。 基于这一点，采用JTA的上下文相关session可以满足你一切需要。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 更好的是，从3.1开 始，SessionFactory.getCurrentSession()的后台实现是可拔插的。因此，我们引入了新的扩展接口 (org.hibernate.context.CurrentSessionContext)和新的配置参数 (hibernate.current_session_context_class)，以便对什么是&#8220;当前session&#8221;的范围和上下文(scope and context)的定义进行拔插。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 请参阅 org.hibernate.context.CurrentSessionContext接口的Javadoc,那里有关于它的契约的详细讨论。它定义 了单一的方法，currentSession()，特定的实现用它来负责跟踪当前的上下文session。Hibernate内置了此接口的两种实现。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; org.hibernate.context.JTASessionContext - 当前session根据JTA来跟踪和界定。这和以前的仅支持JTA的方法是完全一样的。详情请参阅Javadoc。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; org.hibernate.context.ThreadLocalSessionContext - 当前session通过当前执行的线程来跟踪和界定。详情也请参阅Javadoc。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 这两种实现都提供了&#8220;每数据库事务对应一个session&#8221;的编程模型，也称作每次请求一个session。Hibernate session的起始和终结由数据库事务的生存来控制。假若你采用自行编写代码来管理事务（比如，在纯粹的J2SE,或者 JTA/UserTransaction/BMT），建议你使用Hibernate Transaction API来把底层事务实现从你的代码中隐藏掉。如果你在支持CMT的EJB容器中执行，事务边界是声明式定义的，你不需要在代码中进行任何事务或 session管理操作。请参阅第 11 章 事务和并发一节来阅读更多的内容和示例代码。 </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; hibernate.current_session_context_class 配置参数定义了应该采用哪个&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; org.hibernate.context.CurrentSessionContext实现。注意，为了向下兼容，如果未 配置此参数，但是存在&nbsp; <br />
</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; org.hibernate.transaction.TransactionManagerLookup的配 置，Hibernate会采用&nbsp; <br />
</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; org.hibernate.context.JTASessionContext。一般而言，此参数的值指明了要使用的实 现类的全名，但那两个内置的实现可以使用简写，即"jta"和"thread"。</font></p>
<p><font style="background-color: #f0f0f0;"><br />
</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利于ThreadLocal模式管理Session<br />
&nbsp;&nbsp; 早在Java1.2推出之时，Java平台中就引入了一个新的支持：java.lang.ThreadLocal，给我们在编写多线程程序<br />
&nbsp;&nbsp; 时提供了一种新的选择。ThreadLocal是什么呢？其实ThreadLocal并非是一个线程的本地实现版本，它并不是一个Thread，<br />
&nbsp;&nbsp; 而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)<br />
&nbsp;&nbsp; 其实的功用非常简单，就是为每一个使用某变量的线程都提供一个该变量值的副本，是每一个线程都可以独立地改变自己的副本，<br />
&nbsp;&nbsp; 而不会和其它线程的副本冲突。从线程的角度看，就好像每一个线程都完全拥有一个该变量。 <br />
&nbsp;&nbsp; ThreadLocal是如何做到为每一个线程维护变量的副本的呢？其实实现的思路很简单，在ThreadLocal类中有一个Map，<br />
&nbsp;&nbsp; 用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单，没有考虑集合的泛型)： <br />
public class HibernateUtil {</font></p>
<p><font style="background-color: #f0f0f0;">public static final ThreadLocal session =new ThreadLocal();</font></p>
<p><font style="background-color: #f0f0f0;">public static final SessionFactory sessionFactory;<br />
&nbsp;&nbsp; static {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = new Configuration().configure().buildSessionFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ExceptionInInitializerError(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />
}</font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp;&nbsp;&nbsp; public static Session currentSession() throws HibernateException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session s = session.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = sessionFactory.openSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.set(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp;&nbsp; public static void closeSession() throws HibernateException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session s = session.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(s != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.set(null);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font style="background-color: #f0f0f0;">openSession() 与 getCurrentSession() 有何不同和关联呢？ </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp; </font></p>
<p><font style="background-color: #f0f0f0;">&nbsp;&nbsp; 在 SessionFactory 启动的时候， Hibernate 会根据配置创建相应的 CurrentSessionContext ，在 getCurrentSession() 被调用的时候，实际被执行的方法是 CurrentSessionContext.currentSession() 。在 currentSession() 执行时，如果当前 Session 为空， currentSession 会调用 SessionFactory 的 openSession 。所以 getCurrentSession() 对于 Java EE 来说是更好的获取 Session 的方法。</font></p>
<p><font style="background-color: #f0f0f0;"><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/LoveYouT/archive/2009/05/17/4193894.aspx</font></p>
<img src ="http://www.blogjava.net/ashutc/aggbug/296632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-09-27 13:50 <a href="http://www.blogjava.net/ashutc/archive/2009/09/27/296632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts1和Struts2的区别和对比</title><link>http://www.blogjava.net/ashutc/archive/2009/06/19/283206.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 19 Jun 2009 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/06/19/283206.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/283206.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/06/19/283206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/283206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/283206.html</trackback:ping><description><![CDATA[Action 类: <br />
&#8226; Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 <br />
&#8226; Struts 2 Action类可以实现一个Action接口，也可实现其他接口，使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去 实现 常用的接口。Action接口不是必须的，任何有execute标识的POJO对象都可以用作Struts2的Action对象。 <br />
<br />
线程模式: <br />
&#8226; Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 <br />
&#8226; Struts2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生许多可丢弃的对象，并且不会导致性能和垃圾回收问题） <br />
<br />
Servlet 依赖: <br />
&#8226; Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 <br />
&#8226; Struts 2 Action不依赖于容器，允许Action脱离容器单独被测试。如果需要，Struts2 Action仍然可以访问初始的request和response。但是，其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。 <br />
<br />
可测性: <br />
&#8226; 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API（这使得测试要依赖于容器）。一个第三方扩展－－Struts TestCase－－提供了一套Struts1的模拟对象（来进行测试）。 <br />
&#8226; Struts 2 Action可以通过初始化、设置属性、调用方法来测试，&#8220;依赖注入&#8221;支持也使测试更容易。 <br />
<br />
捕获输入: <br />
&#8226; Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm，开发者经 常创建多余的类捕获输入。动态Bean（DynaBeans）可以作为创建传统ActionForm的选择，但是，开发者可能是在重新描述(创建)已经存 在的JavaBean（仍然会导致有冗余的javabean）。 <br />
&#8226; Struts 2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。 <br />
<br />
表达式语言： <br />
&#8226; Struts1 整合了JSTL，因此使用JSTL EL。这种EL有基本对象图遍历，但是对集合和索引属性的支持很弱。 <br />
&#8226; Struts2可以使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL). <br />
<br />
绑定值到页面（view）: <br />
&#8226; Struts 1使用标准JSP机制把对象绑定到页面中来访问。 <br />
&#8226; Struts 2 使用 "ValueStack"技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。 <br />
<br />
类型转换： <br />
&#8226; Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器，对每一个实例来说是不可配置的。 <br />
&#8226; Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。 <br />
<br />
校验： <br />
&#8226; Struts 1支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。 <br />
&#8226; Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 <br />
<br />
Action执行的控制： <br />
&#8226; Struts1支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。 <br />
&#8226; Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。
<img src ="http://www.blogjava.net/ashutc/aggbug/283206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-06-19 12:32 <a href="http://www.blogjava.net/ashutc/archive/2009/06/19/283206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts 四种验证方法</title><link>http://www.blogjava.net/ashutc/archive/2009/06/09/280997.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 09 Jun 2009 10:51:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/06/09/280997.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/280997.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/06/09/280997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/280997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/280997.html</trackback:ping><description><![CDATA[<font style="background-color: rgb(244, 244, 244);">
</font>
<p><font style="background-color: rgb(244, 244, 244);"><br />
文件struts-config.xml :</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><font style="background-color: rgb(244, 244, 244);">&lt;action-mappings&gt;<br />
&nbsp;&nbsp;&lt;action attribute="userloginForm" input="/login.jsp"<br />
&nbsp;&nbsp;&nbsp;name="userloginForm" parameter="method" path="/userlogin"<br />
&nbsp;&nbsp;&nbsp;scope="request" validate="true"<br />
&nbsp;&nbsp;&nbsp;type="cn.userlogin.struts.action.UserloginAction" /&gt;</font></font></p>
<p><font style="background-color: rgb(244, 244, 244);"><font style="background-color: rgb(244, 244, 244);">&nbsp;&lt;/action-mappings&gt;<br />
&nbsp;&lt;message-resources<br />
&nbsp;&nbsp;parameter="cn.userlogin.struts.ApplicationResources" /&gt;<br />
&nbsp;&lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;<br />
&nbsp;&nbsp;&lt;set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" /&gt;<br />
&nbsp;&lt;/plug-in&gt;</font><br />
</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
1．用Javascript在客户端进行验证<br />
配置：在需要验证的JSP文件中写入</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&lt;html:form action="/XXX" onsubmit="return validateXXXX(this);"&gt;<br />
这里的XXX 是与要进行验证的 forward name<br />
validateXXXX (this);里面的XXXX是需要进行验证的ActionForm名</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&lt;html:javascript formName="mytestForm"/&gt;</font></p>
<p><font style="background-color: rgb(244, 244, 244);">在validation.xml文件中写入验证代码就可以进行基本的验证了。具体请参照http://www.chinajavaworld.net/forum/topic.cgi?forum=48&amp;topic=1413&amp;show=50</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;</font></p>
<p><font style="background-color: rgb(244, 244, 244);">这种方法是在客户端进行验证，客户端可以看到JAVASCRIPT部分的全代码。安全性不高</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
2．使自己的ActionForm继承ValidatorForm类，在里面编写自己的方法：<br />
public ActionErrors validate (ActionMapping mapping,HttpServletRequest request) {</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionErrors errors = new ActionErrors();</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
。。。。。。<br />
if ( mytext.equals("aaa") ) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //my example<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errors.add("mytext",new ActionError("mytext.error"));<br />
}<br />
。。。。。。<br />
return errors;</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
}<br />
此时，如果写了这个方法，就会屏蔽掉在Validation.xml中定义的验证部分，换句话说就是系统运行时，Validation.xml里对应此ActionForm的定义的错误验证部分不实行<br />
如果不写这个方法的话，系统运行时会进行Validation.xml里对应此ActionForm的定义的错误验证部分的操作</font></p>
<p><font style="background-color: rgb(244, 244, 244);">此类方法是在服务器端进行验证，验证部分代码客户端不可见。</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
3．动态验证DynaValidatorForm的使用<br />
&nbsp; 不需要再写对应的ActionForm，只需在struts-config.xml里把自己的ActionForm进行配置</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;&nbsp;&nbsp; &lt;form-bean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="testForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="org.apache.struts.validator.DynaValidatorForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="mytext" type="java.lang.String"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="mytextarea" type="java.lang.String"/&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="mydatetext" type="java.lang.String"/&gt; <br />
&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;</font></p>
<p><font style="background-color: rgb(244, 244, 244);">在form-property里设置相应的项目，比如说mytext，mytextarea什么的，执行的时候会动态生成ActionForm</font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;&nbsp; 再在validation.xml里写入所希望的验证代码，就可以了</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
JSP文件里不需要写入任何东西，验证也是在服务器端进行，验证部分代码在JSP中不可见</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
&nbsp;</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
4．组合验证<br />
如果使用动态验证DynaValidatorForm的话，不许编写自己的对应的ActionForm，相应的特殊验证会受到相当程度的限制。</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
这个时候，需要将特殊验证部分写入对应的Action，</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
if(mytext.equals("aaa")){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //My Example<br />
ActionErrors errors = new ActionErrors();<br />
errors.add("***",new ActionError("***.error"));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
saveErrors(request,errors);return (mapping.findForward("false"));<br />
}</font></p>
<p><font style="background-color: rgb(244, 244, 244);"><br />
</font>&nbsp;</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/280997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-06-09 18:51 <a href="http://www.blogjava.net/ashutc/archive/2009/06/09/280997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 mvc视图实例分析</title><link>http://www.blogjava.net/ashutc/archive/2009/05/29/278955.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 29 May 2009 14:41:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/05/29/278955.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/278955.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/05/29/278955.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/278955.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/278955.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;">从一个高度层次来看,Strtsu2属性pull-MVC(或是MVC2)框架;这与传统的MVC框架略有不同,因为action的角色采用模型,而不是控制器,虽然这样有一些重叠."pull"来自于视图从action拉数据,而不是持有一个分开的可用模型对象.<br />
<br />
我们知道在概念方面意味着什么,但在执行层面意味着什么?这个模型-视图-控制器模式在Struts2中被实现成了五个核心部分--actions,拦截器,值栈/OGNL,结果类型和结果/视图技术.<br />
<a title="在新窗口打开图片" href="http://www.blogjava.net/images/blogjava_net/puras/1e.gif" target="_blank"><img style="width: 770px; height: 455px;" alt="" src="http://www.blogjava.net/images/blogjava_net/puras/1e.gif" border="0" height="455" width="770" /></a><br />
图1:The MVC / Struts2 Architecture<br />
<br />
图1描述了从Struts2高度层面上的结构, 包含了模型,视图和控制器.控制器是一个实现了Struts2里分派Servlet过滤器以及拦截器,模型实现的actions,视图则是由结果类型和结果的组成.值栈和ONGL提供了一个通用的路线，链接和集成其他组件.<br />
<br />
我们在这章讨论一些通用的部分,将会有很多信息涉及到配置.配置WEB应用,配置actions,拦截器,结果等等.记住,这些说明只是为了提供如果完成的背景,或许不是最有效的配置应用的方式.在后面的章节我们将讨论更加容易和更有效的方式以完成同样的目标,使用约定俗成的配置,注释和零配置插件.<br />
<br />
在我们进入详细讲解核心构成之前我们先来讨论一下全局的配置.<br />
<br />
Configuration<br />
<br />
在配置Struts2之前,你需要先下载发行版或是在你的Maven2的"pom.xml"文件中配置它的依赖关系:<br />
&lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.apache.struts&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;struts2-core&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;2.0.6&lt;/version&gt;<br />
&lt;/dependency&gt;<br />
做完之后,Struts2应用的配置就可以分成三个独立的文件,如图2中所示.<br />
<a title="在新窗口打开图片" href="http://www.blogjava.net/images/blogjava_net/puras/2.gif" target="_blank"><img style="width: 765px; height: 454px;" alt="" src="http://www.blogjava.net/images/blogjava_net/puras/2.gif" border="0" height="454" width="765" /></a><br />
Figure 2: Configuration file scope for framework elements<br />
<br />
需要在你的"web.xml"文件里为WEB应用的配置FilterDispatcher Servlet过滤器:<br />
1 &lt;filter&gt;<br />
2&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;action2&lt;/filter-name&gt;<br />
3&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;<br />
4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
5&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt;<br />
6 &lt;/filter&gt;<br />
7 &lt;filter-mapping&gt;<br />
8&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;action2&lt;/filter-name&gt;<br />
9&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
10 &lt;/filter-mapping&gt;<br />
11 <br />
它配置了基本的WEB应用.剩下来的事就是使用"struts.properties"配置文件来自定义WEB应用的执行环境,通过"struts.xml"配置文件来配置WEB应用的构件.我们现在来看看这两个配置文件的详细描述.<br />
<br />
The struts.properties File<br />
<br />
这个配置文件提供了一个改变框架默认行为的机制.一般情况下,你是不需要修改这个文件的,一个例外是你想配置一个对于开发者友好的调试环境.所有的包含在"struts.properties"配置文件中的配置项,都可以使用"init-param"标签配置在"web.xml"文件中,同样也可以使用"constant"标签配置在"struts.xml"配置文件中.<br />
<br />
Properties允许修改如改变Freemarker选项,替换action的映射类,决定是否重新加载XML配置文件,默认使用的用户界面主题等等.更多的关于properties的最新信息,请查阅位于<a href="http://struts.apache.org/2.x/docs/strutsproperties.html" target="_blank" rel="external">http://struts.apache.org/2.x/docs/strutsproperties.html</a>的Struts2的Wiki.<br />
<br />
一个默认的名为"default.properties"配置文件包含在发行版的Struts2-Core JAR文件中.想要修改一个配置项,只需在你项目的源文件的类路径的根目录里创建一个名为"struts.properties"的文件.之后,添加你想修改的配置项.新的值将覆盖掉默认值.<br />
<br />
在开发环境中,这有一些配置项你可能需要更改:<br />
<br />
struts.i18n.reload = true -- 能够重新加载国际化文件 <br />
struts.devMode = true -- 能够在开发模式下提供更全面的调试 <br />
struts.configuration.xml.reload = true 能够重新加载XML配置文件(适用于action),修改之后可以在Servlet容器里重新加载整个WEB应用 <br />
struts.url.http.prot = 8080 -- 设置服务运行的端口(以便生成正确的URL) <br />
The struts.xml File<br />
<br />
"struts.xml"文件包含配置信息,你将修改它用于发布action,我们将在本章剩余的部分详细的讲解指定的元素.现在,让我们看看不会改变的结构.<br />
<br />
注:<br />
根据你应用的功能,可能会从你的应用中移除"struts.xml"文件.配置上我们将在本章讨论一种替换的方法,使用注释,"web.xml"启动参数,和交替的URL映射配置.<br />
唯一的配置仍然需要"struts.xml"文件,如全局结果,异常处理,和自定义的拦截器栈.<br />
<br />
这是一个XML文件,所以第一个元素是XML的版本和编码信息.下一个则是XML的文档类型定义(DTD).DTD提供了一些文件里的元素的结构,并最终用XML来解析和编辑.<br />
1 &lt;?xml version="1.0" encoding="UTF-8" ?&gt;<br />
2 &lt;!DOCTYPE struts PUBLIC<br />
3&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration<br />
4&nbsp;&nbsp;&nbsp;&nbsp; 2.0//EN"<br />
5&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://struts.apache.org/dtds/struts-2.0.dtd" target="_blank" rel="external">http://struts.apache.org/dtds/struts-2.0.dtd</a>"&gt;<br />
6 &lt;struts&gt;<br />
7&nbsp;&nbsp;&nbsp;&nbsp; &lt;package<br />
8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="struts2"<br />
9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extends="struts-default"<br />
10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace="/struts2"&gt;<br />
11&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
12&nbsp;&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />
13 &lt;/struts&gt;<br />
我们现在到达了&lt;struts&gt;标签.这是Struts2具体配置的最外层标签.所有其他的标签都将被包含在这个当中.<br />
<br />
The Include Tag:<br />
<br />
&lt;include ... /&gt;标签用于将Struts2应用模块化时引入其他配置文件时使用并且它始终是&lt;struts&gt;标签的子标签.它仅仅包含一个"file"属性,用于提供被引入的文件的名称,那个文件必须与"struts.xml"配置文件的结构相同.例如,如果你想拆分一个计费应用的配置文件,你可以选择按组将缴费,管理和报表配置到单独的文件中:<br />
1 &lt;struts&gt;<br />
2&nbsp;&nbsp;&nbsp;&nbsp; &lt;include file="billing-config.xml" /&gt;<br />
3&nbsp;&nbsp;&nbsp;&nbsp; &lt;include file="admin-config.xml" /&gt;<br />
4&nbsp;&nbsp;&nbsp;&nbsp; &lt;include file="reports-config.xml" /&gt;<br />
5&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
6 &lt;/struts&gt;<br />
引入文件时,顺序是重要的.来自引入文件的信息将在文件中引入标签的位置开始有效.因此,使用一个配置在另一个文件中的标签,这个引入的配置必须出现在被引用之前.<br />
<br />
有一些文件你是必须明确的引入,还有一些文件是自动引入的.比如说"struts-default"和"struts-plugin.xml".两者都包含了默认的结果类型,拦截器,拦截器栈,包,以及WEB应用执行环境的配置信息(也可以配置在"struts.properties"文件中)的配置.区别在于"struts-default.xml"文件提供的是Struts2的核心配置,而"struts-plugin.xml"提供的是详细插件的配置.每个插件JAR文件中都应包含一个"struts-plugin.xml"文件,所有这些都将在启动的时候加载.</span>
<script type="text/javascript"><!-- google_ad_client="pub-2356171061458507" ;
/* 728x90, 创建于 08-12-22 */ google_ad_slot="1422198601" ; google_ad_width="728;
google_ad_height" = 90;
//-->
</script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script>
<script>window.google_render_ad();</script>
<img src ="http://www.blogjava.net/ashutc/aggbug/278955.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-05-29 22:41 <a href="http://www.blogjava.net/ashutc/archive/2009/05/29/278955.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ThreadLocal在spring框架中的作用 </title><link>http://www.blogjava.net/ashutc/archive/2009/05/29/278954.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Fri, 29 May 2009 14:36:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/05/29/278954.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/278954.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/05/29/278954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/278954.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/278954.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p><font style="background-color: rgb(244, 244, 244);">我们知道Spring通过各种DAO模板类降低了研发者使用各种数据持久技术的难度。这些模板类都是线程安全的，也就是说，多个DAO能够复用同一个模板实例而不会发生冲突。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">我们使用模板类访问底层数据，根据持久化技术的不同，模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的，也就是说他们不能在同一时刻被多个线程共享。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">虽然模板类通过资源池获取数据连接或会话，但资源池本身解决的是数据连接或会话的缓存问题，并非数据连接或会话的线程安全问题。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">按照传统经验，假如某个对象是非线程安全的，在多线程环境下，对对象的访问必须采用synchronized进行线程同步。但Spring的DAO模板类并未采用线程同步机制，因为线程同步限制了并发访问，会带来很大的性能损失。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">此外，通过代码同步解决性能安全问题挑战性很大，可能会增强好几倍的实现难度。那模板类究竟仰丈何种魔法神功，能够在无需同步的情况下就化解线程安全的难题呢？答案就是ThreadLocal！ </font></p>
<p><font style="background-color: rgb(244, 244, 244);">ThreadLocal在Spring中发挥着重要的作用，在管理request作用域的Bean、事务管理、任务调度、AOP等模块都出现了他们的身影，起着举足轻重的作用。要想了解Spring事务管理的底层技术，ThreadLocal是必须攻克的山头堡垒。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">ThreadLocal是什么 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">早在JDK 1.2的版本中就提供java.lang.ThreadLocal，ThreadLocal为解决多线程程式的并发问题提供了一种新的思路。使用这个工具类能够很简洁地编写出优美的多线程程式。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">ThreadLocal很容易让人望文生义，想当然地认为是个&#8220;本地线程&#8221;。其实，ThreadLocal并不是个Thread，而是Thread的局部变量，也许把他命名为ThreadLocalVariable更容易让人理解一些。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">当使用ThreadLocal维护变量时，ThreadLocal为每个使用该变量的线程提供单独的变量副本，所以每一个线程都能够单独地改变自己的副本，而不会影响其他线程所对应的副本。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">从线程的角度看，目标变量就象是线程的本地变量，这也是类名中&#8220;Local&#8221;所要表达的意思。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">线程局部变量并不是Java的新发明，很多语言（如IBM IBM XL FORTRAN）在语法层面就提供线程局部变量。在Java中没有提供在语言级支持，而是变相地通过ThreadLocal的类提供支持。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">所以，在Java中编写线程局部变量的代码相对来说要笨拙一些，因此造成线程局部变量没有在Java研发者中得到很好的普及。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">ThreadLocal的接口方法 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">ThreadLocal类接口很简单，只有4个方法，我们先来了解一下： </font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;&nbsp;&nbsp; * void set(Object value) </font></p>
<p><font style="background-color: rgb(244, 244, 244);">配置当前线程的线程局部变量的值。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;&nbsp;&nbsp; * public Object get() </font></p>
<p><font style="background-color: rgb(244, 244, 244);">该方法返回当前线程所对应的线程局部变量。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;&nbsp;&nbsp; * public void remove() </font></p>
<p><font style="background-color: rgb(244, 244, 244);">将当前线程局部变量的值删除，目的是为了减少内存的占用，该方法是JDK 5.0新增的方法。需要指出的是，当线程结束后，对应该线程的局部变量将自动被垃圾回收，所以显式调用该方法清除线程的局部变量并不是必须的操作，但他能够加快内存回收的速度。 </font></p>
<p><font style="background-color: rgb(244, 244, 244);">&nbsp;&nbsp;&nbsp; * protected Object initialValue() </font></p>
<p><font style="background-color: rgb(244, 244, 244);">返回该线程局部变量的初始值，该方法是个protected的方法，显然是为了让子类覆盖而设计的。这个方法是个延迟调用方法，在线程第1次调用get()或set(Object)时才执行，并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。 </font></p>
</div>
<img src ="http://www.blogjava.net/ashutc/aggbug/278954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-05-29 22:36 <a href="http://www.blogjava.net/ashutc/archive/2009/05/29/278954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring XML配置实践</title><link>http://www.blogjava.net/ashutc/archive/2009/03/09/258594.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Mon, 09 Mar 2009 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/03/09/258594.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/258594.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/03/09/258594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/258594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/258594.html</trackback:ping><description><![CDATA[<p align="left">&nbsp;</p>
<p>Spring是一个强大的Java应用框架，它广泛地应用于Java应用程序中，为Plain Old Java Objects（POJO）提供企业级服务。Spring利用依赖注入机制来简化工作，同时提高可测试性。其配置文件（通常是XML格式）中指定了Spring bean、依赖性以及bean所需的服务。但是，这些XML配置文件既冗长又不实用。对于需要定义大量Spring bean的大型项目来说，它们难以阅读和管理。<br />
在本文中，我将向您展示12种用于Spring XML配置的最佳实践。其中的一些实践与其说是最佳实践，倒不如说是必要实践。注意，其他因素（如域模型的设置）也可能影响XML的配置，但是本文重点研究XML配置的可读性和可管理性。</p>
<p><strong>1。避免使用自动绑定（autowiring）功能</strong><br />
Spring可以通过bean类的自省自动绑定依赖性，所以不必显式指明bean的属性和构造函数。Bean属性可以通过属性名称或类型匹配来实现自动绑定。构造函数通过类型匹配来实现自动绑定。甚至可以指定自动检测autowiring模式，它可以引导Spring选择一种适当的运行机制。先来看看下面的一个例子：<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="orderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.OrderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autowire="byName"/&gt;<br />
OrderService类的属性名在容器中用于匹配bean实例。自动绑定可能会节省一些键入工作量并减少混乱。但是在现实项目中不应该使用这种方式，因为它牺牲了配置的可读性和可维护性。许多指南和介绍中大肆吹捧自动绑定是Spring的一项极好的特性，而没有提到这一特性所带来的牺牲。依我来看，这就像Spring中的对象池（object－pooling），更大程度上只是宣传的噱头。对于精简XML配置文件来说，它是一个好办法，但它实际上增加了复杂性，尤其是在运行包含大量类声明的项目时。虽然Spring允许混合使用自动绑定和显式绑定，但这会使XML配置更加晦涩难懂。</p>
<p><strong>2.使用命名约定</strong><br />
该原则对于Java编码也一样适用。在项目中使用清晰的、描述性的、一致的命名约定将非常有利于开发人员理解XML配置。例如，对于bean ID，可以按照Java类字段名约定来命名它。OrderServiceDAO实例的bean ID应该命名为orderServiceDAO。对于大型项目，可以在bean ID前面加上包名作为前缀。</p>
<p><strong>3. 使用简洁形式</strong><br />
简洁形式避免了冗长，因为它将属性值和引用从子元素中移入属性中。例如下面的例子：<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="orderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.OrderService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="companyName"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;lizjason&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref bean="orderDAO"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/constructor-arg&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
可以使用简洁形式将上述代码重写为：<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="orderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.OrderService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="companyName"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="lizjason"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg ref="orderDAO"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>简洁形式自1.2版本起就可以使用。注意，对于&lt;ref local="..."&gt;，没有简洁形式。<br />
简洁形式不但可以节约键入工作量，而且可以使XML配置文件更清晰。当一个配置文件中定义了大量的类时，它可以显著提高可读性。</p>
<p><strong>4. 对于构造函数参数匹配，类型比下标好</strong><br />
当构造函数含有一个以上同种类型的参数，或者属性值的标签已经被占用时，Spring允许使用从0开始的下标来避免混淆。例如：<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="billingService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.BillingService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg index="0" value="lizjason"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg index="1" value="100"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
利用type属性来编写会更好一些，如下：<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="billingService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.BillingService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg type="java.lang.String"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="lizjason"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg type="int" value="100"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>使用index可以减少一些代码，但是与type属性相比，它更易于出错且难于阅读。只有在构造函数参数不明确的时候，才应该使用index。</p>
<p><strong>5. 尽可能重用已定义的bean</strong><br />
Spring提供了一种类似于继承的机制来减少配置信息的复制并简化XML配置。定义一个子类，它就可以从父类那里继承配置信息，而父类实际上成为子类的一个模板。这就是大型项目中所谓的重用。只需在父类bean中设置abstract=true，然后在子bean中指定parent引用。例如：<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="abstractService" abstract="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.AbstractService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="companyName"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="lizjason"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;bean id="shippingService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent="abstractService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.ShippingService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="shippedBy" value="lizjason"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>ShippingService类从abstractService类继承companyName属性的值——lizjason。如果一个bean没有指定类或工厂方法，那么这个bean便是抽象的。</p>
<p><strong>6. 在导入时，首选通过ApplicationContext来汇编bean定义</strong><br />
像Ant脚本中的导入一样，Spring的import元素对于汇编模块化的bean定义来说是很有用的。例如：<br />
&nbsp;&nbsp;&nbsp; &lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="billingServices.xml"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;import resource="shippingServices.xml"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean id="orderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.OrderService"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;beans&gt;</p>
<p>然而，相对于使用import在XML配置中进行预汇编，通过ApplicationContext来配置这些bean则显得更加灵活。使用ApplicationContext的话，XML配置也更易于管理。可以向ApplictionContext构造函数传递一组bean定义，如下：<br />
&nbsp;&nbsp;&nbsp; String[] serviceResources =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {"orderServices.xml",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "billingServices.xml",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "shippingServices.xml"};<br />
&nbsp;&nbsp;&nbsp; ApplicationContext orderServiceContext = new<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassPathXmlApplicationContext(serviceResources);</p>
<p><strong>7. 使用id作为bean标识符</strong><br />
可以指定一个id或名称来作为bean标识符。虽然使用id不能提高可读性，但是它可以利用XML分析程序来对bean引用进行验证。如果由于XML IDREF的约束而不能使用某个id，那么可以使用名称来作为bean的标识符。XML IDREF的约束是：id必须以字母（或者XML规范中定义的标点符号）开头，后面是字母、数字、连字符、下划线、冒号或句点。实际上，很少会遇到XML IDREF约束问题。</p>
<p><strong>8. 在开发阶段使用依赖性检查（dependency-check）</strong><br />
可以在bean定义中为dependency-check属性设置一个非默认值，比如simple、objects或all，以便容器进行依赖性检查。当需要显式或通过自动绑定设置bean的全部属性（或某类属性）时，依赖性检查便显得很有用。<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="orderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.OrderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dependency-check="objects"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="companyName"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="lizjason"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg ref="orderDAO"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>在这个例子中，容器确保为orderService bean设置的属性不是primitives或collections。也可以为所有的bean设置默认依赖性检查，但是我们很少这样做，因为有些bean属性根本就不必设置。</p>
<p><strong>9. 为每个配置文件添加首部注释</strong><br />
最好使用描述性的id和名称来取代XML配置文件中的内置注释。此外，添加一个配置文件首部也很有用，它可以概述文件中所定义的bean。可以选择将描述添加到description标签中。例如：<br />
&nbsp;&nbsp;&nbsp; &lt;beans&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This file defines billing service<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; related beans and it depends on<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baseServices.xml,which provides<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; service bean templates...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp; &lt;/beans&gt;<br />
使用description标签的一个好处是可以轻松地利用工具从标签中选获取描述内容。</p>
<p><strong>10. 对于更改，团队成员要积极交流</strong><br />
在重构Java代码时，需要随时更新配置文件并通知团队成员。XML配置文件也是代码，它们是应用程序的至关重要的部分，但是它们难于阅读和维护。大部分情况下，需要同时阅读XML配置文件和运行中的Java代码。</p>
<p><strong>11. Setter注入优于构造函数注入</strong><br />
Spring提供了3种类型的依赖注入：构造函数注入（constructor injection）、setter注入（setter injection）和方法注入（method injection）。我们一般只用前两种。<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="orderService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.OrderService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;constructor-arg ref="orderDAO"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;bean id="billingService"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.lizjason.spring.BillingService"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="billingDAO"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ref="billingDAO"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
<p>在这个例子中，orderService类使用的是构造函数注入，而BillingService类使用的是setter注入。构造函数注入可以确保bean不会在一个非法状态下被创建，但是setter注入更加灵活且更易于管理，尤其是在类包含许多属性并且其中一些可选的情况下。</p>
<p><strong>12. 不要滥用依赖注入</strong><br />
最后一点，Spring ApplicationContext可以为您创建Java对象，但并不是所有的Java对象都应通过依赖注入来创建。例如，全局对象不应该通过ApplicationContext来创建。Spring是一个很棒的框架，但是，就可读性和易管理性而言，如果定义了大量bean，基于XML的配置就可能成为问题。过度使用依赖注入会使XML配置变得复杂且臃肿。要知道，借助于功能强大的IDE（如Eclipse和IntelliJ），Java代码比XML文件更加易读、易维护、易管理。</p>
<p><strong>结束语</strong><br />
XML是通用的Spring配置方式。但如果定义了大量bean，基于XML的配置就会变得冗长而不实用。Spring提供了丰富的配置选项，恰当地利用其中的选项可以使XML配置更清晰，但是，有些选项（如autowiring）往往会降低配置文件的可读性和可维护性。遵循本文中所描述的最佳实践，将有助于您创建出清晰易读的XML配置文件。</p>
<img src ="http://www.blogjava.net/ashutc/aggbug/258594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-03-09 14:39 <a href="http://www.blogjava.net/ashutc/archive/2009/03/09/258594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置WebWork</title><link>http://www.blogjava.net/ashutc/archive/2009/03/03/257483.html</link><dc:creator>西瓜</dc:creator><author>西瓜</author><pubDate>Tue, 03 Mar 2009 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/ashutc/archive/2009/03/03/257483.html</guid><wfw:comment>http://www.blogjava.net/ashutc/comments/257483.html</wfw:comment><comments>http://www.blogjava.net/ashutc/archive/2009/03/03/257483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ashutc/comments/commentRss/257483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ashutc/services/trackbacks/257483.html</trackback:ping><description><![CDATA[一. 配置Action <br />
<br />
&nbsp;&nbsp;&nbsp; 1. 基本配置<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . action名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . action类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . result类型<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; &lt;xwork&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;include file="<span class="hilite1">webwork</span>-default.xml"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;package extends="<span class="hilite1">webwork</span>-default" name="default"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;default-action-ref name="home"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="helloWorld"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="ch2.example1.HelloWorld"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;login.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;result type="redirect" name="success"&gt;/index.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/default-action-ref&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/package&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上例子中，如果helloWorld action返回的result code是SUCCESS，那么用户将会重定向到/index.jsp。如果返回的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result code是INPUT，将会显示login.jsp页面。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.&nbsp; 配置别名重用action<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将多个名字映射到相同的action类；这个名字称为别名。这时多个请求访问相同的execute()方法；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在别名基础上，可增加一个可选的method属性，指定<span class="hilite1">webwork</span>该调用哪个方法。所指定的方法格式与execute()方法一样。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这时多个请求访问不同的方法；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.Cal" name="add"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"&gt;cal.jsp&lt;/result&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action method="minus" class="ch2.example1.Cal" name="minus"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"&gt;cal.jsp&lt;/result&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：<span class="hilite1">WebWork</span>通过xwork.xml映射至方法有两种途径：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 通过查找与method属性的值一致的方法；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 通过查找doMethod()形式的方法；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">WebWork</span>先找method属性一致方法，如找不到，再找doMethod()形式方法；<br />
<br />
&nbsp;&nbsp;&nbsp; 3.&nbsp; 不配置别名重用action<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过name!method.action形式请求访问action，其中name为action的映射名字。这时不需额外配置。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：优先推荐，但要预防不怀好意的用户通过该途径使用你不想让用户调用的方法；<br />
<br />
&nbsp;&nbsp;&nbsp; 4.&nbsp; 通过参数自定义action<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可通过在配置文件中设置参数传递给action. 从而达到非常灵活设置的目的。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a. 在xwork.xml文件的action配置位置处配置以下信息(配置参数名称为url)：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.ParamTest" name="paramTest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"&gt;paramTest.jsp&lt;/result&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b. action<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在action中定义与参数名同名的属性以及对应的setter/getter方法，<span class="hilite1">webwork</span>在action执行时会自动调用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setter方法为属性赋在xwork.xml文件中所配置的参数值；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c. jsp<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过标记: &lt;ww:property value="属性名"&gt;&nbsp; 获取参数值；<br />
<br />
二. 配置Result<br />
<br />
&nbsp;&nbsp;&nbsp; 1.&nbsp; 基本配置：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result type="redirect" name="success"&gt;paramTest.jsp&lt;/result&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result由两个部分组成:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . result映射： 通过name属性指定result的逻辑名，name的属性值与action中execute()方法中的返回值相同;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result标记本体内容指定跳转的路径，既可以为绝对路径(/代表包含namespace内容在内的web应用根路径)，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也可以为相对路径；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . result类型： 通过type属性指定，默认值为dispatcher，可以指定为redirect。如指定为redirect，则产生<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个新的请求跳转至目的地址；<br />
<br />
&nbsp;&nbsp;&nbsp; 2.&nbsp; 使用全局result映射减少重复配置<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设定全局result，服务于多个action配置，减少重复配置；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;global-results&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;result type="redirect" name="success"&gt;paramTest.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/global-results&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.ParamTest" name="paramTest"&gt;<br />
<br />
三. 配置interceptor<br />
<br />
&nbsp;&nbsp;&nbsp; interceptor(拦截器)是一种很特殊的对象，它围绕着action及result的执行过程。它可以在action之前或之后及result<br />
&nbsp;&nbsp;&nbsp; 之后工作，实现了某些逻辑的松耦合，譬如安全、日志和校验。<br />
<br />
&nbsp;&nbsp;&nbsp; 1.&nbsp; 定义interceptor<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 定义<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package name="<span class="hilite1">webwork</span>-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：一般不需自行定义，在<span class="hilite1">webwork</span>-default.xml文件中已定义了很多interceptor。<span class="hilite1">webwork</span>-default.xml位于<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">webwork</span>-2.2.4.jar文件根目录中;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 使用<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package name="<span class="hilite1">webwork</span>-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.ParamTest" name="paramTest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样设置后，当paramTest.action被调用的时侯，timer和logger两个interceptor也会相应地被调用。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.&nbsp; 将多个interceptor组合为栈<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将多个interceptor组合到一起，而不需要为每一个action声明数量众多的&lt;interceptor-ref&gt;。一个interceptor栈包含<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一组interceptor，并且按照它们本身在栈中定义的顺序来执行。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 定义<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package name="<span class="hilite1">webwork</span>-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="myStack"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . 使用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package name="<span class="hilite1">webwork</span>-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="myStack"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.ParamTest" name="paramTest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="myStack"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 3.&nbsp; 使用默认interceptor-ref减少重复配置<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过使用default-interceptor-ref元素，package中每一个action都不再需要定义任何interceptor。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package name="<span class="hilite1">webwork</span>-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptors&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.LoggingInterceptor" name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor class="com.opensymphony.xwork.interceptor.TimerInterceptor" name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="myStack"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="logger"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="timer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-ref&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;default-interceptor-ref name="myStack"&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.ParamTest" name="paramTest"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：如为一个action定义了interceptor，那么这个action将不再使用默认的interceptor。<br />
<br />
四. 高级配置<br />
<br />
&nbsp;&nbsp;&nbsp; 1.&nbsp; package<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">WebWork</span>中的package和Java中的package在很多方面非常相似，它将多个action组织成一个模块。简化维护工作，提高<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 重用性。一个package中包含了所有将用到的action, result, interceptor的定义。<br />
<br />
&nbsp;&nbsp;&nbsp; 2.&nbsp; 扩展package<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">WebWork</span>中的package可以扩展另外的package：为其extends属性指定一个用逗号分隔的package列表，从而扩展该列表的<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; package。当一个<span class="hilite1">WebWork</span> package扩展另外一个package时，将会从被包含的package中复制所有的定义，并在自己本身<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 已有的定义基础上增加这些配置。这让你可以将配置的公共部分集中起来，减少package中重复定义的内容。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package extends="<span class="hilite1">webwork</span>-default" name="default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/package&gt; <br />
<br />
&nbsp;&nbsp;&nbsp; 3.&nbsp; 映射namespace<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">WebWork</span>通过action名字和所属的namespace标识action。如果package没定义namespace属性，将使用默认的namespace: "/"。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当<span class="hilite1">WebWork</span>接收到一个请求的时侯，<span class="hilite1">WebWork</span>会将请求的URL分为namespace和action名字两个部分，然后从xwork.xml中查找<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; namespace/action内容，如果没有找到，则从默认的namespace中查找action。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package namespace="/enterinfo" extends="<span class="hilite1">webwork</span>-default" name="default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;action class="ch2.example1.ParamTest" name="paramTest"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;result type="redirect" name="success"&gt;paramTest.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/package&gt; <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上访问paramTest，通过URL: http://localhost:8080/enterinfo/paramTest.action，其中：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . /enterinfo为namespace的名字；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . paramTest为action的名字；<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多个package可以使用相同的namespace。<br />
<br />
&nbsp;&nbsp;&nbsp; 4.&nbsp; 使用include标签实现组件化<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了支持将应用程序划分为更容易管理的模块，<span class="hilite1">WebWork</span>提供了一种包含机制，可以将xwork.xml划分为多个文件，而每一个<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子文件又是与一个模块相联系的。可以通过使用&lt;include&gt;标签指定文件名的方法将子文件包含到xwork.xml中，而<span class="hilite1">WebWork</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 就会在应用程序的classpath中查找指定的子文件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xwork&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include file="<span class="hilite1">webwork</span>-default.xml"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;package namespace="/enterinfo" extends="<span class="hilite1">webwork</span>-default" name="default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/package&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/include&gt;<br />
&nbsp;<br />
五. 其它配置<br />
<br />
&nbsp;&nbsp;&nbsp; 1. web.xml<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;<span class="hilite1">webwork</span>&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; com.opensymphony.<span class="hilite1">webwork</span>.dispatcher.ServletDispatcher<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;<span class="hilite1">webwork</span>&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;jsp-config&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;taglib&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;<span class="hilite1">webwork</span>&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /WEB-INF/lib/<span class="hilite1">webwork</span>-2.2.4.jar<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/taglib-location&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/taglib&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/jsp-config&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/web-app&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; 2. <span class="hilite1">webwork</span>.properties<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xwork.xml定义了action映射，并且将interceptor和result应用到这些action上。而<span class="hilite1">webwork</span>.properties用来定义<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application范围的设置，以及能够改变框架功能的配置参数。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">WebWork</span>首先会装载位于<span class="hilite1">WebWork</span> JAR文件中的default.properties，然后再装载<span class="hilite1">webwork</span>.properties，并且根据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="hilite1">webwork</span>.properties内容改写之前装载的配置设定。&lt;/xwork&gt;&lt;/include&gt;&lt;/default-interceptor-ref&gt;&lt;/interceptor-ref&gt;&lt;/interceptor-stack&gt;&lt;/interceptor&gt;&lt;/interceptors&gt;&lt;/package&gt; &lt;/interceptor-ref&gt;&lt;/interceptor-stack&gt;&lt;/interceptor&gt;&lt;/interceptors&gt;&lt;/package&gt; &lt;/interceptor-stack&gt;&lt;/interceptor&gt;&lt;/interceptors&gt;&lt;/package&gt; &lt;/interceptor-ref&gt;&lt;/action&gt;&lt;/interceptor&gt;&lt;/interceptors&gt;&lt;/package&gt; &lt;/interceptors&gt;&lt;/package&gt; &lt;/action&gt;&lt;/ww:property&gt;&lt;/include&gt;&lt;/xwork&gt;
<img src ="http://www.blogjava.net/ashutc/aggbug/257483.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ashutc/" target="_blank">西瓜</a> 2009-03-03 10:27 <a href="http://www.blogjava.net/ashutc/archive/2009/03/03/257483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>