﻿<?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-Vincent</title><link>http://www.blogjava.net/lijiajia418/</link><description>Vicent's blog</description><language>zh-cn</language><lastBuildDate>Tue, 12 May 2026 10:37:40 GMT</lastBuildDate><pubDate>Tue, 12 May 2026 10:37:40 GMT</pubDate><ttl>60</ttl><item><title>一、 桥梁（Bridge）模式</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/18/70268.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Mon, 18 Sep 2006 05:38:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/18/70268.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/70268.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/18/70268.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/70268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/70268.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、 桥梁（Bridge）模式		桥梁模式是一个非常有用的模式，也是比较复杂的一个模式。熟悉这个模式对于理解面向对象的设计原则，包括"开－闭"原则(OCP)以及组合/聚合复用原则(CARP)都很有帮助。理解好这两个原则，有助于形成正确的设计思想和培养良好的设计风格。						注：《Java与模式》一书认为Bridge模式不是一个使用频率很高的模式，我不太赞同，我认为Bridge模式中...&nbsp;&nbsp;<a href='http://www.blogjava.net/lijiajia418/archive/2006/09/18/70268.html'>阅读全文</a><img src ="http://www.blogjava.net/lijiajia418/aggbug/70268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-18 13:38 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/18/70268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Validator 简介</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67094.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67094.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67094.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67094.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#008000">在项目的业务属性中,你是不是要经常验证属性的取值范围呢. 想要了解比较优美的解决方案吗?           </font>
		</p>
		<p align="left">
				<font color="#008000">看看Hibernate Validator 是怎么做的吧.一见到她,相信你就会说: Oh God, 这就是我需要的.</font>
		</p>
		<p align="left">
				<span style="COLOR: red">任何获得Matrix授权的网站，转载请保留以下作者信息和链接：</span>
				<br />作者：icess(作者的blog:<a href="http://blog.matrix.org.cn/page/icess" target="_new">http://blog.matrix.org.cn/page/icess</a>)<br />关键字：Hibernate Validator</p>
		<p>用Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值是很优雅的.Hibernate Validator就是这样的一个框架.该框架是十分容易的(就像参考文档中宣称的那样),几乎没有什么学习曲线,Validator 是一个验证框架 不需要和Hibernate的其他部分绑定就可以使用,只要在你的项目中添加Hibernate-annotations.jar库就可以了.那么下面就让我们看看怎么使用吧.</p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
						<font color="#3f7f5f">Person.java 类</font>
				</code>
		</p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<font color="#3f7f5f">/*</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">* Created on 2006-1-12 Person.java</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">* @author </font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">*/</font>
						<br />
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.annotation.validator;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Length;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Min;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Valid;</font>
						<br />　</code>
		</p>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">/<font color="#808000">/@Serializability  //测试自定义约束</font></span>
						</font>
				</code>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">Person {</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private int </b>
						</font>
						<font color="#000000">age;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">Address address;</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">Person() {}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#ff0000">@Valid //注意此处</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">Address getAddress() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">address;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setAddress(Address address) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.address = address;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Min(value = </font>
						<font color="#990000">1</font>
						<font color="#000000">)</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public int </b>
						</font>
						<font color="#000000">getAge() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">age;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setAge(</font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">age) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.age = age;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Length(min = </font>
						<font color="#990000">4</font>
						<font color="#000000">)</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getName() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setName(String name) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.name = name;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p align="left">　</p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
						<font color="#3f7f5f">Address.java 类</font>
				</code>
		</p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<font color="#3f7f5f">/*</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">* Created on 2006-1-12 Address.java</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">* @author </font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">*/</font>
						<br />
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.annotation.validator;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Length;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Max;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Min;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">Address {</font>
						<br />
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private </b>
						</font>
						<font color="#000000">String street;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>private int </b>
						</font>
						<font color="#000000">num;</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">Address() {}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Min(value = </font>
						<font color="#990000">1</font>
						<font color="#000000">)</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Max(value = </font>
						<font color="#990000">100</font>
						<font color="#000000">)</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public int </b>
						</font>
						<font color="#000000">getNum() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">num;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setNum(</font>
						<font color="#7f0055">
								<b>int </b>
						</font>
						<font color="#000000">num) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.num = num;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">@Length(min = </font>
						<font color="#990000">3</font>
						<font color="#000000">,max = </font>
						<font color="#990000">8</font>
						<font color="#000000">)</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public </b>
						</font>
						<font color="#000000">String getStreet() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>
						<font color="#000000">street;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">setStreet(String street) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>this</b>
						</font>
						<font color="#000000">.street = street;</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<div class="java" align="left">
				<p>上面是两个用 Validator Annotations 注释的 类. 每个属性都用 约束限制了.  下面看看测试的类吧:</p>
		</div>
		<p align="left">
				<!-- ======================================================== -->
				<!-- = Java Sourcecode to HTML automatically converted code = -->
				<!-- =   Java2Html Converter V4.1 2004 by Markus Gebhard  markus@jave.de   = -->
				<!-- =     Further information: http://www.java2html.de     = -->
				<font color="#000000">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">TestValidator.java 类</code>
				</font>
		</p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<font color="#3f7f5f">/*</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">* Created on 2006-1-12</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">* @author icerain</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f7f5f">*/</font>
						<br />
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.annotation.validator;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.ClassValidator;</font>
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.InvalidValue;</font>
						<br />
						<br />
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">TestValidator {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public void </b>
						</font>
						<font color="#000000">test() {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Address add = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">Address();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">add.setNum(</font>
						<font color="#990000">0</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">add.setStreet(</font>
						<font color="#2a00ff">"1"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">Person p = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">Person();</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">p.setAddress(add);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">p.setAge(</font>
						<font color="#990000">0</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">p.setName(</font>
						<font color="#2a00ff">"ice"</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#3f5fbf">/******************Test validator ********/</font>
				</code>
		</p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<font color="#000000">    </font>
						<font color="#ff0000">// 注意该处只验证了Person 为了说明 @Valid 注释的使用</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">ClassValidator&lt;Person&gt; classValidator = </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">ClassValidator&lt;Person&gt; (Person.</font>
						<font color="#7f0055">
								<b>class</b>
						</font>
						<font color="#000000">);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">InvalidValue[] validMessages = classValidator.getInvalidValues(p);</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>for </b>
						</font>
						<font color="#000000">(InvalidValue value : validMessages) {</font>
						<br />
						<font color="#ffffff">      </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"InvalidValue 的长度是:" </font>
						<font color="#000000">+ validMessages.length</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+</font>
						<font color="#2a00ff">" . 验证消息是: " </font>
						<font color="#000000">+ value.getMessage() </font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">" . PropertyPath 是:" </font>
						<font color="#000000">+ value.getPropertyPath()</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+</font>
						<font color="#2a00ff">" .\n\t PropertyName 是: " </font>
						<font color="#000000">+value.getPropertyName()</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+ </font>
						<font color="#2a00ff">"Value 是: " </font>
						<font color="#000000">+ value.getValue()</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+</font>
						<font color="#2a00ff">" Bean 是: "</font>
						<font color="#000000">+ value.getBean()</font>
						<br />
						<font color="#ffffff">        </font>
						<font color="#000000">+</font>
						<font color="#2a00ff">"\n\t BeanClass 是:" </font>
						<font color="#000000">+ value.getBeanClass());</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#ffffff">  </font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public static void </b>
						</font>
						<font color="#000000">main(String[] args) {</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>new </b>
						</font>
						<font color="#000000">TestValidator().test();</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p align="left">　</p>
		<p align="left">程序的输出如下 <font size="2"><p align="left"><font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 必须大于等于 1 . PropertyPath 是:age .</font></p><p align="left"><font color="#ff00ff">PropertyName 是: age. Value 是: 0 Bean 是: test.annotation.validator.Person@dd87b2</font></p><p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font></p><p align="left"><font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 长度必须介于 4 与 2147483647 之间 . PropertyPath 是:name .</font></p><p align="left"><font color="#ff00ff">PropertyName 是: name. Value 是: ice Bean 是: test.annotation.validator.Person@dd87b2</font></p><p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font></p><p align="left"><font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 必须大于等于 1 . PropertyPath 是:address.num .</font></p><p align="left"><font color="#ff00ff">PropertyName 是: num. Value 是: 0 Bean 是: test.annotation.validator.Address@197d257</font></p><p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Address</font></p><p align="left"><font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 长度必须介于 3 与 8 之间 . PropertyPath 是:address.street .</font></p><p align="left"><font color="#ff00ff">PropertyName 是: street. Value 是: 1 Bean 是: test.annotation.validator.Address@197d257</font></p><p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Address</font></p><p align="left">可以看出不满足约束的值都被指出了.</p><p align="left">同时该句: <code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#000000">ClassValidator&lt;Person&gt; classValidator = </font><font color="#7f0055"><b>new </b></font><font color="#000000">ClassValidator&lt;Person&gt; (Person.</font><font color="#7f0055"><b>class</b></font><font color="#000000">);</font></code></p><p align="left">我们只验证了 Person. 在Person里面的Address的属性 由于有<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#ff0000">@Valid Annotations </font>所以 Address的相关属性也被机联验证了 .</code></p><p align="left"><code><span style="FONT-FAMILY: 'Courier New',Courier">如果 把</span></code><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#ff0000">@Valid Annotations </font>去掉,结果如下:</code></p><p align="left"><font color="#ff00ff">InvalidValue 的长度是:2 . 验证消息是: 必须大于等于 1 . PropertyPath 是:age .</font></p><p align="left"><font color="#ff00ff">PropertyName 是: age. Value 是: 0 Bean 是: test.annotation.validator.Person@18fef3d</font></p><p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font></p><p align="left"><font color="#ff00ff">InvalidValue 的长度是:2 . 验证消息是: 长度必须介于 4 与 2147483647 之间 . PropertyPath 是:name .</font></p><p align="left"><font color="#ff00ff">PropertyName 是: name. Value 是: ice Bean 是: test.annotation.validator.Person@18fef3d</font></p><p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font></p></font></p>
		<p>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">可以看出 没有验证 Address.</span>
				</code>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">当然了 ,你还可以只验证一个属性 , 没有必要验证整个类.只需要在调用</span>
						<font face="Courier New, Courier">classValidator.getInvalidValues(p,"age")方法时 加上你要验证的属性就可以了.如我们只想验证age 属性 把代码改为如下所示:</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" color="#ff0000">InvalidValue[] validMessages = classValidator.getInvalidValues(p,"age"); /</font>
						<font face="Courier New, Courier" color="#0000ff">/只验证age 属性</font>
				</code>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">运行结果如下:</span>
				</code>
		</p>
		<p align="left">
				<font color="#ff00ff">InvalidValue 的长度是:1 . 验证消息是: 必须大于等于 1 . PropertyPath 是:age .</font>
		</p>
		<p align="left">
				<font color="#ff00ff">PropertyName 是: age. Value 是: 0 Bean 是: test.annotation.validator.Person@1457cb</font>
		</p>
		<p align="left">
				<font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">只是验证了 age 属性.</span>
				</code>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">怎么样 ,很简单吧. 关于 Hibernate Validator 内建的验证Annotations 大家可以看看 API 或者 参考文档(中文版我正在翻译中 请访问我的 <a href="http://blog.matrix.org.cn/page/icess">Blog </a>获得最新信息).</span>
				</code>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">如果你要写自己的约束呢 , 你不用担心 ,这也是很容易的. </span>
				</code>任何约束有两部分组成: [约束描述符 即注释]the constraint <span class="emphasis"><em>descriptor</em></span> (the annotation) 和[约束validator 即 实现类] the constraint <span class="emphasis"><em>validator</em></span> (the implementation class).<code><span style="FONT-FAMILY: 'Courier New',Courier">下面我们扩展Hibernate Test suit 中的一个Test 来讲解一下.</span></code></p>
		<font size="2">
				<p align="left">
						<code>
								<span style="FONT-FAMILY: 'Courier New',Courier">首先: 要声明一个</span>
						</code>constraint <span class="emphasis"><em>descriptor .如下:</em></span></p>
				<p align="left">
						<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
								<font color="#7f0055">
										<b>package </b>
								</font>
								<font color="#000000">test.annotation.validator;</font>
								<br />
								<br />
								<font color="#7f0055">
										<b>import </b>
								</font>
								<font color="#000000">java.lang.annotation.Documented;</font>
								<br />
								<font color="#7f0055">
										<b>import static </b>
								</font>
								<font color="#000000">java.lang.annotation.ElementType.TYPE;</font>
								<br />
								<font color="#7f0055">
										<b>import static </b>
								</font>
								<font color="#000000">java.lang.annotation.ElementType.FIELD;</font>
								<br />
								<font color="#7f0055">
										<b>import static </b>
								</font>
								<font color="#000000">java.lang.annotation.ElementType.METHOD;</font>
								<br />
								<font color="#7f0055">
										<b>import </b>
								</font>
								<font color="#000000">java.lang.annotation.Retention;</font>
								<br />
								<font color="#7f0055">
										<b>import static </b>
								</font>
								<font color="#000000">java.lang.annotation.RetentionPolicy.RUNTIME;</font>
								<br />
								<font color="#7f0055">
										<b>import </b>
								</font>
								<font color="#000000">java.lang.annotation.Target;</font>
								<br />
								<br />
								<font color="#7f0055">
										<b>import </b>
								</font>
								<font color="#000000">org.hibernate.validator.ValidatorClass;</font>
								<br />
								<br />
								<font color="#3f5fbf">/**</font>
								<br />
								<font color="#ffffff"> </font>
								<font color="#3f5fbf">* Dummy sample of a bean-level validation annotation</font>
								<br />
								<font color="#ffffff"> </font>
								<font color="#3f5fbf">*</font>
								<br />
								<font color="#ffffff"> </font>
								<font color="#3f5fbf">* </font>
								<font color="#7f9fbf">@author </font>
								<font color="#3f5fbf">Emmanuel Bernard</font>
								<br />
								<font color="#ffffff"> </font>
								<font color="#3f5fbf">*/</font>
								<br />
								<font color="#000000">@ValidatorClass(SerializabilityValidator.</font>
								<font color="#7f0055">
										<b>class</b>
								</font>
								<font color="#000000">)</font>
								<br />
								<font color="#000000">@Target({METHOD,FIELD,TYPE})</font>
								<br />
								<font color="#000000">@Retention(RUNTIME)</font>
								<br />
								<font color="#000000">@Documented</font>
								<br />
								<font color="#7f0055">
										<b>public </b>
								</font>
								<font color="#000000">@interface Serializability {</font>
								<br />
								<font color="#ffffff">  </font>
								<font color="#7f0055">
										<b>int </b>
								</font>
								<font color="#000000">num() </font>
								<font color="#7f0055">
										<b>default </b>
								</font>
								<font color="#990000">11</font>
								<font color="#000000">; </font>
								<br />
								<font color="#ffffff">  </font>
								<font color="#000000">String message() </font>
								<font color="#7f0055">
										<b>default </b>
								</font>
								<font color="#2a00ff">"bean must be serialiable"</font>
								<font color="#000000">;</font>
								<br />
								<font color="#000000">}</font>
						</code>
				</p>
		</font>
		<p align="left">
				<font size="2">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
								<font color="#000000">@ValidatorClass(SerializabilityValidator.</font>
								<font color="#7f0055">
										<b>class</b>
								</font>
								<font color="#000000">) 指出了 </font>
						</code>constraint <span class="emphasis"><em>validator 类.</em></span></font>
		</p>
		<p align="left">
				<font size="2">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
								<font color="#000000">@Target({METHOD,FIELD,TYPE})</font>
								<br />
								<font color="#000000">@Retention(RUNTIME)</font>
								<br />
								<font color="#000000">@Documented                 </font>
						</code>
				</font>
		</p>
		<p align="left">
				<code style="FONT-FAMILY: 'Courier New',Courier">
						<font color="#000000">这几个我就不用解释了吧.</font>
				</code>
		</p>
		<p align="left">
				<code style="FONT-FAMILY: 'Courier New',Courier">
						<font color="#000000">Serializability 里面声明了一个 message 显示约束的提示信息. num 只是为了说明一个方面 在这里面没有实际用途用 .</font>
				</code>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">然后就是 实现一个</span>
				</code>constraint <em><span class="emphasis">validator 类 该类要实现</span></em><tt class="literal">Validator&lt;ConstraintAnnotation&gt;</tt><em><span class="emphasis">.这里是</span></em><font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#000000">SerializabilityValidator.java 如下:</font></code></font></p>
		<p align="left">
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<font color="#3f7f5f">//$Id: SerializabilityValidator.java,v 1.3 2005/11/17 18:12:11 epbernard Exp $</font>
						<br />
						<font color="#7f0055">
								<b>package </b>
						</font>
						<font color="#000000">test.annotation.validator;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">java.io.Serializable;</font>
						<br />
						<br />
						<font color="#7f0055">
								<b>import </b>
						</font>
						<font color="#000000">org.hibernate.validator.Validator;</font>
						<br />
						<br />
						<font color="#3f5fbf">/**</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f5fbf">* Sample of a bean-level validator</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f5fbf">*</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f5fbf">* </font>
						<font color="#7f9fbf">@author </font>
						<font color="#3f5fbf">Emmanuel Bernard</font>
						<br />
						<font color="#ffffff"> </font>
						<font color="#3f5fbf">*/</font>
						<br />
						<font color="#7f0055">
								<b>public class </b>
						</font>
						<font color="#000000">SerializabilityValidator </font>
						<font color="#7f0055">
								<b>implements </b>
						</font>
						<font color="#000000">Validator&lt;Serializability&gt;, Serializable {</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#7f0055">
								<b>public boolean </b>
						</font>
						<font color="#000000">isValid(Object value) {</font>
						<br />
						<font color="#ffffff">   </font>
						<font color="#00ff00">//这里只是Validator 里面的 实现验证规则的 方法. value 是要验证的值.</font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"IN SerializabilityValidator isValid:"</font>
						<font color="#000000">+value.getClass()+</font>
						<font color="#2a00ff">": " </font>
						<font color="#000000">+value.toString()); </font>
						<br />
						<font color="#ffffff">    </font>
						<font color="#7f0055">
								<b>return </b>
						</font>value<font color="#3f7f5f"> </font><font color="#800080">instanceof</font><font color="#3f7f5f"> </font>Serializable<font color="#3f7f5f">;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public void </b></font><font color="#000000">initialize(Serializability parameters) {</font><br /><font color="#ffffff">    </font><font color="#3f7f5f">// 在这里可以 取得 </font></code>
				<font size="2">constraint <em><span class="emphasis">descriptor 里面的属性 如上面我们声明的 num </span></em></font>
				<code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New',Courier">
						<br />
						<font color="#ffffff">    </font>
						<font color="#000000">System.out.println(</font>
						<font color="#2a00ff">"IN SerializabilityValidator: parameters:"</font>
						<font color="#000000">+ parameters.num() );</font>
						<br />
						<font color="#ffffff">  </font>
						<font color="#000000">}</font>
						<br />
						<font color="#000000">}</font>
				</code>
		</p>
		<p align="left">然后在你的类中应用@<font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#000000">Serializability  就可以约束一个类实现</font></code></font><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">Serializable 接口了. 如下:</code></p>
		<p align="left">在我们的Person.java类 添加@<font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#000000">Serializability  Annotations ,把Person.java 中的 </font></code></font><code><font size="2"><span style="FONT-FAMILY: 'Courier New',Courier">/<font color="#808000">/@Serializability //测试自定义约束 </font>注释去掉就ok了.</span></font></code></p>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">运行结果如下:</span>
						</font>
				</code>
				<font size="2">
						<p align="left">
								<font color="#ff00ff">InvalidValue 的长度是:3 . 验证消息是: </font>
								<font color="#008000">bean must be serialiable</font>
								<font color="#ff00ff"> . PropertyPath 是:null .</font>
						</p>
						<p align="left">
								<font color="#ff00ff">PropertyName 是: null. Value 是: test.annotation.validator.Person@1a73d3c Bean 是: test.annotation.validator.Person@1a73d3c</font>
						</p>
						<p align="left">
								<font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font>
						</p>
				</font>
		</p>
		<p>
		</p>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">现在把Person类实现 java.io.Serializable 接口 则没有出现 验证错误消息.</span>
						</font>
				</code>
		</p>
		<p align="left">
				<code>
						<span style="FONT-FAMILY: 'Courier New',Courier">消息的国际化也是很简单的,把</span>
				</code>
				<font size="2">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
								<font color="#000000">Serializability  中的message 改为以{}扩住的 属性文件的Key就可以了 </font>
						</code>
				</font>
		</p>
		<p align="left">
				<font size="2">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
								<font color="#7f0055">
										<b>public </b>
								</font>
								<font color="#000000">@interface Serializability {</font>
								<br />
								<font color="#ffffff">  </font>
								<font color="#7f0055">
										<b>int </b>
								</font>
								<font color="#000000">num() </font>
								<font color="#7f0055">
										<b>default </b>
								</font>
								<font color="#990000">11</font>
								<font color="#000000">; </font>
								<br />
								<font color="#ffffff">  </font>
								<font color="#000000">String message() </font>
								<font color="#7f0055">
										<b>default </b>
								</font>
								<font color="#2a00ff">"{Serializable}"; </font>
								<font color="#008000">//"bean must be serialiable"; </font>
								<font color="#ff0000">//消息的国际化</font>
								<br />
								<font color="#000000">}</font>
						</code>
				</font>
		</p>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">然后编辑资料文件. 注意 该资源文件中要包括 Hibernate Validator 内建的资源. 可以在该org\hibernate\validator\resources 包里面的资源文件基础上修改 ,在打包里面 这样就可以了. 自己打包可能不太方便.你可以把该包里面的文件复制出来.然后放到你自己的项目包下在自己编辑, 该测试中 我是放在 test\resources 包下的.</span>
						</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">然后在 资源文件中添加 </span>
						</font>
				</code>
				<font size="2">
						<code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier">
								<font color="#2a00ff">Serializable = '''''' </font>这么一行, 样例如下:</code>
				</font>
		</p>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">#<font color="#ff0000">DefaultValidatorMessages.properties (DefaultValidatorMessages_zh.properties 不再列出^_^)</font></span>
						</font>
				</code>
		</p>
		<p align="left">　</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" color="#ff0000" size="2">#下面是 Hibernate Validator 内建的国际化消息 </font>
				</code>
				<font size="2">
				</font>
		</p>
		<p align="left">
				<font size="2">validator.assertFalse=</font>
				<font color="#2a00ff" size="2">assertion</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">failed</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.assertTrue=</font>
				<font color="#2a00ff" size="2">assertion</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">failed</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.future=</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">a</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">future</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">date</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.length=</font>
				<font color="#2a00ff" size="2">length</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">between</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{min}</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">and</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{max}</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.max=</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">less</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">than</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">or</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">equal</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">to</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{value}</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.min=</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">greater</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">than</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">or</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">equal</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">to</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{value}</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.notNull=</font>
				<font color="#2a00ff" size="2">may</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">not</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">null</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.past=</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">a</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">past</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">date</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.pattern=</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">match</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">"{regex}"</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.range=</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">between</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{min}</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">and</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{max}</font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">validator.size=</font>
				<font color="#2a00ff" size="2">size</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">must</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">be</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">between</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{min}</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">and</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">{max}</font>
		</p>
		<p align="left">
				<font color="#2a00ff" size="2">#下面是自定义的消息</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">Serializable=</font>
				<font color="#2a00ff" size="2">Bean</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">not</font>
				<font size="2">
				</font>
				<font color="#2a00ff" size="2">Serializable  //加上自己定义的国际化消息. </font>
		</p>
		<font color="#2a00ff" size="2">
		</font>
		<p align="left">
				<code>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier">在构造</span>
						</font>
						<font face="Courier New, Courier" size="2">ClassValidator</font>
						<font size="2">
								<span style="FONT-FAMILY: 'Courier New',Courier"> 时要添上 资源文件 如下:(在测试类中)</span>
						</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" size="2">ClassValidator&lt;Person&gt; classValidator = new ClassValidator&lt;Person&gt; (Person.class,<font color="#ff0000">ResourceBundle.getBundle("</font><font color="#0000ff">test.resources.DefaultValidatorMessages</font><font color="#ff0000">"</font>));//加载资源</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" size="2">这样就可以了 .  当然 你还可以 更改 Hibernate Validator 的消息(不是在上面的资源文件中直接修改</font>
				</code>
				<font size="2">validator.length = ... 等等 </font>
				<code>
						<font face="Courier New, Courier" size="2">) , 还记得 Validator 注释中有个 message 元素吗? 你以前用的都是默认值,现在你可以该为你自己定义的了.</font>
				</code>
				<font size="2">如:validator.length 我把他改为 "<font color="#0000ff">该字符串的长度不符合规定范围范围</font>". 在资源文件中添加一行键值属性对(key定义为 "<font color="#ff0000">myMsg</font>")如下:</font>
		</p>
		<p align="left">
				<font size="2">myMsg=<font color="#0000ff">该字符串的长度不符合规定范围范围</font></font>
		</p>
		<p align="left">
				<font size="2">并且还要在</font>
				<font color="#0000ff" size="2">@Length </font>
				<font size="2">注释中提供message的引用的key 如下</font>
				<font color="#0000ff" size="2">@Length(min = 4,message = "{</font>
				<font color="#ff0000" size="2">myMsg</font>
				<font color="#0000ff" size="2">}")</font>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" size="2">再一次运行测试 ,我们就可以看到上面两条自定义绑定的消息了 .如下:</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" size="2">InvalidValue 的长度是:3 . <font color="#008000">验证消息是</font>: <font color="#ff0000">Bean 不是 可 Serializable</font> . PropertyPath 是:null .<br />PropertyName 是: null. Value 是: test.annotation.validator.Person@1bd4722 Bean 是: test.annotation.validator.Person@1bd4722<br />BeanClass 是:class test.annotation.validator.Person</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier">
								<br />InvalidValue 的长度是:3 . <font color="#008000">验证消息是</font>: <font color="#ff0000">该字符串的长度不符合规定范围范围</font> . PropertyPath 是:name .<br />PropertyName 是: name. Value 是: ice Bean 是: test.annotation.validator.Person@1bd4722<br />BeanClass 是:class test.annotation.validator.Person</font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier">怎么样,比你想象的简单吧. </font>
				</code>
		</p>
		<p align="left">
				<code>
						<font face="Courier New, Courier" size="2">OK 上面我们讨论了 </font>
				</code>Hibernate Validator 的主要用法: 但是 该框架有什么用呢? ^_^</p>
		<p align="left">看到这里其实不用我在多说了 大家都知道怎么用,什么时候用. 作为一篇介绍性文章我还是在此给出一个最常用的例子吧,更好的使用方式大家慢慢挖掘吧.</p>
		<p align="left">比如 : 你现在在开发一个人力资源(HR)系统 (其实是我们ERP课程的一个作业 ^_^), 里面要处理大量的数据,尤其是在输入各种资料时 如 登记员工信息. 如果你公司的员工的年龄要求是18 -- 60 那么你所输入的年龄就不能超出这个范围. 你可能会说这很容易啊 , 不用Validator就可以解决啊.这保持数据前验证就可以啦 如if ( e.getAge() &gt; 60 || e.getAge() &lt; 18 ) ........ 给出错误信息 然后提示重新输入不就OK啦 用得着 兴师动众的来个第三方框架吗? </p>
		<p align="left">是啊 当就验证这一个属性时, 没有必要啊 ! 但是一个真正的HR 系统,会只有一个属性要验证吗? 恐怕要有N多吧</p>
		<p align="left">你要是每一个都那样 写一段验证代码 是不是很烦啊 ,况且也不方便代码重用. 现在考虑一些 Validator 是不是更高效啊,拦截到 约束违例的 属性 就可以直接得到 国际化的消息 可以把该消息显示到一个弹出对话框上 提示更正  !</p>
		<p align="left">Validator的用处不只这一种 ,你可以想到如何用呢 ! 欢迎发表你的高见!!</p>
		<p align="left">OK 到此 我们的 Hibernate Validator 之旅就要先告一段落了 . 希望这是令你心旷神怡的一次寒冬之旅,</p>
		<p align="left">把你学到的应用到你的项目中吧,一定会提高你的生产率的. 相信我 ,没错的  ^_^ !</p>
<img src ="http://www.blogjava.net/lijiajia418/aggbug/67094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 14:05 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Annotations 实战(二)</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67093.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67093.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67093.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67093.html</trackback:ping><description><![CDATA[
		<a>-- hbm.xml 与 Annotations 性能比较</a>
		<p align="left">
				<span style="COLOR: red">任何获得Matrix授权的网站，转载请保留以下作者信息和链接：</span>
				<br />作者：icess(作者的blog:<a href="http://blog.matrix.org.cn/page/icess" target="_new">http://blog.matrix.org.cn/page/icess</a>)<br />关键字：Hibernate Validator</p>
		<p align="left">我在前面一篇文章&lt;<a href="http://www.matrix.org.cn/resource/article/44/44141_Hibernate_Annotations.html">Hibernate Annotations 实战-- 从 hbm.xml 到 Annotations</a>&gt;:</p>
		<p align="left">中,有很多开发者在谈论中提到,有没有必要从 hbm.xml 往 Annotations 上转移. 那么在这篇文章中我们就来讨论一下 hbm.xml 与 Annotations的优缺点,看看那种情况最适合你.</p>
		<p align="left">首先,讨论一下 xml 配置文件的优点, 个人认为主要优点就是当你改变底层配置时 不需要改变和重新编译代码,只需要在xml 中更改就可以了,例如 Hibernate.cfg.xml 当你要更改底层数据库时, 只要更改配置文件就可以了.Hibernate会为你做好别的事情.</p>
		<p align="left">那么xml的缺点呢,个人认为有以下几点:</p>
		<div id="bodyColumn">
				<div class="contentBox">
						<div class="section">
								<ul>
										<li>
												<p align="left">描述符多，不容易记忆,掌握 要深入了解还有看DTD文件 </p>
										</li>
										<li>
												<p align="left">无法做自动校验，需要人工查找 </p>
										</li>
										<li>
												<p align="left">读取和解析xml配置要消耗一定时间，导致应用启动慢，不便于测试和维护 </p>
										</li>
										<li>
												<p align="left">当系统很大时，大量的xml文件难以管理 </p>
										</li>
										<li>
												<p align="left">运行中保存xml配置需要消耗额外的内存 </p>
										</li>
										<li>
												<p align="left">在O/R Mapping的时候需要在java文件和xml配置文件之间交替，增大了工作量 </p>
										</li>
								</ul>
								<p align="left">其中第一 二点 借助于先进的IDE 可能不是什么问题. 但是对初学者还是个问题 ^_^.</p>
						</div>
				</div>
		</div>　 
<p align="left">下面我们看看 Annotations的 特性吧! 可以解决xml遇到的问题,有以下优点</p><div id="bodyColumn0"><div class="contentBox"><div class="section"><ul><li><p align="left">描述符减少。以前在xml配置中往往需要描述java属性的类型，关系等等。而元数据本身就是java语言，从而省略了大量的描述符 </p></li><li><p align="left">编译期校验。错误的批注在编译期间就会报错。 </p></li><li><p align="left">元数据批注在java代码中，避免了额外的文件维护工作 </p></li><li><p align="left">元数据被编译成java bytecode，消耗的内存少，读取也很快，利于测试和维护 </p></li></ul><p align="left">关于 映射文件是使用 hbm.xml 文件还是使用 Annotations 我们来看看2者的性能吧. 先声明一下,个人认为映射文件一旦配置好就不会在很大程度上改变了.所以使用xml文件并不会带来很大的好处.如果你认为 映射文件在你的项目中也经常变化,比如一列String数据 ,今天你使用 <font color="#7f007f" size="2">length</font><font size="2">=</font><font color="#2a00ff" size="2">"16"</font><font size="2"> 明天你认为 该数据的长度应该更长才能满足业务需求 于是改为</font><font color="#7f007f" size="2">length</font><font size="2">=</font><font color="#2a00ff" size="2">"128"</font> 等等类似的问题 . 如果你经常有这方面的变动的话,下面的比较你可以不用看了 , 你应该使用 xml文件 因为Annotations 无法很好的满足你的要求.</p><p align="left">现在让我们就来看看2者的性能比较吧.</p><p align="left">(说明: 这里只是比较查找 插入 的时间快慢,没有比较除运行时间以外的其他性能,如 内存占用量 等等)</p><p align="left">先来看看测试程序和配置.</p><p align="left">首先在 Hibernate.cfg.xml 文件中去掉了 </p><font color="#008080" size="2"></font><p align="left"><font color="#008080" size="2">&lt;</font><font color="#3f7f7f" size="2">property </font><font color="#7f007f" size="2">name</font><font size="2">=</font><font color="#2a00ff" size="2">"hibernate.hbm2ddl.auto"</font><font color="#008080" size="2">&gt;</font><font size="2">update</font><font color="#008080" size="2">&lt;/</font><font color="#3f7f7f" size="2">property</font><font color="#008080" size="2">&gt;</font></p></div></div></div><p align="left">这一行, 因为在前面的实验中以及建立了数据库表了 不再需要更新了.如果你是第一次运行该例子 还是要该行的.</p><p align="left">Test.java 如下:</p><p align="left"><code><font color="#3f7f5f">/*</font><br /><font color="#ffffff"> </font><font color="#3f7f5f">* Created on 2005</font><br /><font color="#ffffff"> </font><font color="#3f7f5f">* @author </font><br /><font color="#ffffff"> </font><font color="#3f7f5f">*/</font><br /><font color="#7f0055"><b>package </b></font><font color="#000000">test.hibernate.annotation;</font><br /><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.hibernate.Session;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">org.hibernate.Transaction;</font><br /><br /><font color="#7f0055"><b>public class </b></font><font color="#000000">Test {</font><br /><font color="#ffffff">  </font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public static void </b></font><font color="#000000">main(String [] args) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>long </b></font><font color="#000000">start = </font><font color="#990000">0</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>long </b></font><font color="#000000">end = </font><font color="#990000">0</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">start = System.currentTimeMillis();  </font><font color="#3f7f5f">//程序开始时间</font><br /><font color="#ffffff">    </font><br /><font color="#ffffff">    </font><font color="#000000">Session s = HibernateUtil.currentSession();</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>long </b></font><font color="#000000">mid =  System.currentTimeMillis();  </font><font color="#3f7f5f">//</font><font color="#3f7f5f">初始化完毕的时间 (可能此时并没有初始化完毕^_^)</font><br /><font color="#ffffff">    </font><br /><font color="#ffffff">    </font><font color="#000000">Transaction tx = s.beginTransaction();    </font><br /><font color="#ffffff">    </font><font color="#3f5fbf">/********************测试读取的代码************************/</font><br /><font color="#ffffff">    </font><font color="#000000">Person p = </font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>for</b></font><font color="#000000">(</font><font color="#7f0055"><b>int </b></font><font color="#000000">i = </font><font color="#990000">1</font><font color="#000000">; i &lt;= </font><font color="#990000">100</font><font color="#000000">; i ++) {</font><br /><font color="#ffffff">    </font><font color="#000000">p = (Person) s.get(Person.class, i);</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(p.getName());</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(p.getName());</font></code></p><p align="left"><code><font color="#3f5fbf">    /********************测试读取1次的代码************************/</font><br /><font color="#ffffff">    </font><font color="#000000">Person p = </font><font color="#7f0055"><b>null</b></font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">p = (Person) s.get(Person.class, 1);</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(p.getName());</font><br /><font color="#ffffff">    </font><font color="#3f5fbf">/*********************测试插入的代码*************************************/</font><br /><font color="#ffffff">    </font><font color="#3f7f5f">/*</font><br /><font color="#ffffff">    </font><font color="#3f7f5f">for (int i = 0; i &lt; 100; i ++) {</font><br /><font color="#ffffff">      </font><font color="#3f7f5f">Person p = new Person();</font><br /><font color="#ffffff">      </font><font color="#3f7f5f">p.setAge(i+1);</font><br /><font color="#ffffff">      </font><font color="#3f7f5f">p.setName("icerain"+i);</font><br /><font color="#ffffff">      </font><font color="#3f7f5f">p.setSex("male"+i);</font><br /><font color="#ffffff">      </font><font color="#3f7f5f">s.save(p);</font><br /><font color="#ffffff">      </font><font color="#3f7f5f">s.flush();</font><br /><font color="#ffffff">    </font><font color="#3f7f5f">}</font><br /><font color="#ffffff">    </font><font color="#3f7f5f">*/</font><br /><font color="#ffffff">    </font><font color="#000000">tx.commit();</font><br /><font color="#ffffff">    </font><font color="#000000">HibernateUtil.closeSession();</font><br /><font color="#ffffff">    </font><br /><font color="#ffffff">    </font><font color="#000000">end = System.currentTimeMillis(); </font><font color="#3f7f5f">//</font><font color="#3f7f5f">测试结束时间</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(</font><font color="#2a00ff">"String[] - start time: " </font><font color="#000000">+ start);</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(</font><font color="#2a00ff">"String[] - end time: " </font><font color="#000000">+ end);</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(</font><font color="#2a00ff">"Init time : " </font><font color="#000000">+ (mid-start)); </font><font color="#008000">// 打印初始化用的时间</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(</font><font color="#2a00ff">"Last time is :" </font><font color="#000000">+(end - mid) ); </font><font color="#008000">//打印 数据操作的时间</font><br /><font color="#ffffff">    </font><font color="#000000">System.out.println(</font><font color="#2a00ff">"Total time : " </font><font color="#000000">+(end - start)); </font><font color="#008000">//打印总时间<br /> </font> }<br /><font color="#000000">}</font></code></p><p align="left">Annotations 包中的Person.java 如下</p><p align="left"><code><font color="#7f0055"><b>package </b></font><font color="#000000">test.hibernate.annotation;</font><br /><br /><font color="#7f0055"><b>import </b></font><font color="#000000">java.util.LinkedList;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">java.util.List;</font><br /><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.AccessType;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.Basic;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.Entity;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.GeneratorType;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.Id;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.Table;</font><br /><font color="#7f0055"><b>import </b></font><font color="#000000">javax.persistence.Transient;</font><br /><br /><font color="#3f5fbf">/**</font><br /><font color="#ffffff"> </font><font color="#3f5fbf">* Person generated by hbm2java</font><br /><font color="#ffffff"> </font><font color="#3f5fbf">*/</font><br /><br /><font color="#000000">@SuppressWarnings(</font><font color="#2a00ff">"serial"</font><font color="#000000">)</font><br /><font color="#000000">@Entity(access = AccessType.PROPERTY)</font><br /><font color="#000000">@Table</font><br /><font color="#7f0055"><b>public class </b></font><font color="#000000">Person </font><font color="#7f0055"><b>implements </b></font><font color="#000000">java.io.Serializable {</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>private </b></font><font color="#000000">Integer id;</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>private </b></font><font color="#000000">String name;</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>private </b></font><font color="#000000">String sex;</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>private </b></font><font color="#000000">Integer age;</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>private </b></font><font color="#000000">List list = </font><font color="#7f0055"><b>new </b></font><font color="#000000">LinkedList();</font><br /><br /><font color="#ffffff">  </font><font color="#3f7f5f">// Constructors</font><br /><font color="#ffffff">  </font><font color="#3f5fbf">/** default constructor */</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">Person() {</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#3f5fbf">/** constructor with id */</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">Person(Integer id) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>this</b></font><font color="#000000">.id = id;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#3f7f5f">// Property accessors</font><br /><font color="#ffffff">  </font><font color="#000000">@Id(generate=GeneratorType.AUTO)</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">Integer getId() {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.id;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public void </b></font><font color="#000000">setId(Integer id) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>this</b></font><font color="#000000">.id = id;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#000000">@Basic</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">String getName() {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.name;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public void </b></font><font color="#000000">setName(String name) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>this</b></font><font color="#000000">.name = name;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#000000">@Basic</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">String getSex() {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.sex;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public void </b></font><font color="#000000">setSex(String sex) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>this</b></font><font color="#000000">.sex = sex;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#000000">@Basic</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">Integer getAge() {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>return this</b></font><font color="#000000">.age;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public void </b></font><font color="#000000">setAge(Integer age) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>this</b></font><font color="#000000">.age = age;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><font color="#ffffff">  </font><font color="#000000">@Transient</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public </b></font><font color="#000000">List getList() {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>return </b></font><font color="#000000">list;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><font color="#ffffff">  </font><font color="#7f0055"><b>public void </b></font><font color="#000000">setList(List list) {</font><br /><font color="#ffffff">    </font><font color="#7f0055"><b>this</b></font><font color="#000000">.list = list;</font><br /><font color="#ffffff">  </font><font color="#000000">}</font><br /><br /><font color="#000000">}</font></code></p><p align="left">其他的代码几乎没有改变:</p><p align="left">下面的每种类型的测试都测试了3次以上, 取中间的测试时间.</p><p align="left">测试机器配置:</p><p align="left">CPU:  AMD Athlon (xp) 2000+</p><p align="left">内存: 784880KB</p><p align="left">硬盘: 三星 SP0812N</p><p align="left">读取一次  的比较:(单位: 毫秒)</p><table id="table4" width="100%" border="1"><tbody><tr><td colspan="2">使用Annotations 的测试数据</td><td width="24%" colspan="2">使用Xml文件的测试数据</td><td width="46%">简要说明</td></tr><tr><td width="15%">Init time : </td><td width="12%">2444</td><td width="16%">Init time : </td><td width="8%">2431</td><td width="46%">测试前我认为该项结果xml应该比较大,要读取映射文件啊,实际情况不是这样,不知道为什么?</td></tr><tr><td width="15%">Last time is :</td><td width="12%"><font color="#ff00ff">62</font></td><td width="16%">Last time is :</td><td width="8%"><font color="#ff0000">85</font></td><td width="46%">相差比较大不知道为什么?</td></tr><tr><td width="15%">Total time : </td><td width="12%">2506</td><td width="16%">Total time : </td><td width="8%">2516</td><td width="46%">xml文件总体上慢了一点</td></tr></tbody></table><p>   读取100次的比较:</p><table id="table5" width="100%" border="1"><tbody><tr><td colspan="2">使用Annotations 的测试数据</td><td width="29%" colspan="2">使用Xml文件的测试数据</td><td width="42%">简要说明</td></tr><tr><td width="15%">Init time : </td><td width="12%">2437</td><td width="16%">Init time : </td><td width="11%">2422</td><td width="42%">和前面初始化差不多</td></tr><tr><td width="15%">Last time is :</td><td width="12%"><font color="#ff00ff">438</font></td><td width="16%">Last time is :</td><td width="11%"><font color="#ff0000">484</font></td><td width="42%">有时间差</td></tr><tr><td width="15%">Total time : </td><td width="12%">2875</td><td width="16%">Total time : </td><td width="11%">2906</td><td width="42%">也是xml文件总体上慢了一点</td></tr></tbody></table><p>插入100次的比较:</p><table id="table6" width="100%" border="1"><tbody><tr><td colspan="2">使用Annotations 的测试数据</td><td width="29%" colspan="2">使用Xml文件的测试数据</td><td width="42%">简要说明</td></tr><tr><td width="15%">Init time : </td><td width="12%">2453</td><td width="16%">Init time : </td><td width="11%">2469</td><td width="42%">和前面初始化差不多</td></tr><tr><td width="15%">Last time is :</td><td width="12%"><font color="#ff00ff">469</font></td><td width="16%">Last time is :</td><td width="11%"><font color="#ff0000">656</font></td><td width="42%">有时间差</td></tr><tr><td width="15%">Total time : </td><td width="12%">2922</td><td width="16%">Total time : </td><td width="11%">3125</td><td width="42%">也是xml文件总体上慢了一点</td></tr></tbody></table><p>从上面的三次对比中大家可以看到 初始化的部分几乎两者是一样的, 在数据操作上面 使用xml文件 总是比使用Annotations 慢一点.在我们只操纵一个只有几个属性的小持久化类的操作中就有 几十毫秒的差距. 几十毫秒在计算机中算不算很大 大家应该都知道,我就不在多说了.</p><p>总结: 经过 xml 文件 和Annotations 的优缺点和 性能上的对比.现在使用那个作为你持久化映射策略.我相信大家都会正确选择的.</p><p>测试后记: 经过多次测试 感觉有时候很不稳定 ,有的时候很稳定不知道是测试有问题还是别的问题.大家可以自己测试一下. 有什么新的发现 请大家讨论讨论.</p><img src ="http://www.blogjava.net/lijiajia418/aggbug/67093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 14:04 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>第一个Hibernate with Annotation程式</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67092.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 06:00:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67092.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67092.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67092.html</trackback:ping><description><![CDATA[
		<a>
				<font size="5">H</font>ibernate是ORM的解决方案，其底层对数据库的操作依赖于JDBC，所以您必须先取得JDBC驱动程序，在这边所使用的是MySQL，所以您必须至 MySQL® Connector/J 取得MySQL的JDBC驱动程序。 <br /><br />接下来至 </a>
		<a href="http://www.hibernate.org/">Hibernate 官方网站</a> 取得<span style="COLOR: rgb(255,0,0)">Hibernate 3.2</span>、<span style="COLOR: rgb(255,0,0)">Hibernate Annotations 3.2</span>。 <br /><br />您必须<span style="COLOR: rgb(255,0,0)">安装JDK 5.0</span>才可以使用Hibernate Annotations的功能。 <br /><br />解开Hibernate 3.2的zip档案后，当中的hibernate3.jar是必要的，而在lib目录中还包括了许多jar档案，您可以在 Hibernate 3.0官方的参考手册 上找到这些jar的相关说明，其中必要的是 antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache，Hibernate底层还需要Java Transaction API，所以您还需要jta.jar。 <br /><br />解开Hibernate Annotations 3.2的zip档案后，您需要hibernate-annotations.jar、ejb3-persistence.jar这两个档案。 <br /><br />到这边为止，总共需要以下的jar档案：<br /><a href="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/1152886204259.jpg" target="_blank"><img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/1152886204259.jpg" onload="java_script_:if(this.width&gt;500)this.width=500" border="0" /></a><br /><br />Hibernate可以运行于单机之上，也可以运行于Web应用程序之中，如果是运行于单机，则将所有用到的jar档案（包括JDBC驱动程序）设定至CLASSPATH中，如果是运行于Web应用程序中，则将jar档案置放于WEB-INF/lib中。<br /><br />如果您还需要额外的Library，再依需求加入，例如JUnit、Proxool等等，接下来可以将etc目录下的 log4j.properties复制至Hibernate项目的Classpath下，并修改一下当中的 log4j.logger.org.hibernate为error，也就是只在在错误发生时显示必要的讯息。<br /><br />接着设置基本的Hibernate配置文件，可以使用XML或Properties档案，这边先使用XML，档名预设为hibernate.cfg.xml：<br /><br /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">&lt;?xml version="1.0" encoding="utf-8"?&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">&lt;!DOCTYPE hibernate-configuration PUBLIC</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">&lt;hibernate-configuration&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    &lt;session-factory&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- 显示实际操作数据库时的SQL --&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;property name="show_sql"&gt;true&lt;/property&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- SQL方言，这边设定的是MySQL --&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;property name="dialect"&gt;org.hibernate.dialect.MySQLDialect&lt;/property&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- JDBC驱动程序 --&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;property name="connection.driver_class"&gt;com.mysql.jdbc.Driver&lt;/property&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- JDBC URL --&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;property name="connection.url"&gt;jdbc:mysql://localhost/demo&lt;/property&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- 数据库使用者 --&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;property name="connection.username"&gt;root&lt;/property&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- 数据库密码 --&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;property name="connection.password"&gt;123456&lt;/property&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;!-- 以下设置对象与数据库表格映像类别 --&gt;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        &lt;mapping class="onlyfun.caterpillar.User"/&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    &lt;/session-factory&gt; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">&lt;/hibernate-configuration&gt;</span><br /><br />这边以一个简单的单机程序来示范Hibernate的配置与功能，首先作数据库的准备工作，在MySQL中新增一个demo数据库，并建立user表格：<span class="javascript" id="text160062" style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"><pre>CREATE TABLE user (<br />    id INT(11) NOT NULL auto_increment PRIMARY KEY,<br />    name VARCHAR(100) NOT NULL <font class="java-reserved_word">default</font><font class="java-string">''</font>,<br />    age INT<br />);</pre></span><font face="宋体, MS Song">对于这个表格，您有一个User类别与之对应，表格中的每一个字段将对应至User实例上的Field成员。<br /><br /></font><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">package onlyfun.caterpillar;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">import javax.persistence.*;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">@Entity</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">@Table(name="user") // 非必要，在表格名称与类别名称不同时使用</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">public class User {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  @Id</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  @GeneratedValue(strategy=GenerationType.AUTO)</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    private Integer id;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  @Column(name="name") // 非必要，在字段名称与属性名称不同时使用</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    private String name;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">  @Column(name="age") </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    private Integer age; // 非必要，在字段名称与属性名称不同时使用</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    // 必须要有一个预设的建构方法</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    // 以使得Hibernate可以使用Constructor.newInstance()建立对象</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public User() {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public Integer getId() {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        return id;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public void setId(Integer id) {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        this.id = id;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public String getName() {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        return name;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public void setName(String name) {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        this.name = name;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public Integer getAge() {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        return age;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public void setAge(Integer age) {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        this.age = age;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">}</span><br /><br /><font face="宋体, MS Song">其中id是个特殊的属性，Hibernate会使用它来作为主键识别，您可以定义主键产生的方式，这边设定为自动产生主键，可以看到，实体标识，主键生成，以及相关映像，都可以使用Annotation来完成。 <br /><br />接下来撰写一个测试的程序，这个程序直接以Java程序设计人员熟悉的语法方式来操作对象，而实际上也直接完成对数据库的操作，程序将会将一笔数据存入表格之中：<br /></font><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">package onlyfun.caterpillar;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">import org.hibernate.SessionFactory;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">import org.hibernate.Session;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">import org.hibernate.Transaction; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">import org.hibernate.cfg.AnnotationConfiguration;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">import org.hibernate.cfg.Configuration; </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">public class HibernateAnnotationDemo {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    public static void main(String[] args) {</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // 需要AnnotationConfiguration读取Annotation讯息</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        Configuration config = new AnnotationConfiguration().configure();</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // 根据 config 建立 SessionFactory</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // SessionFactory 将用于建立 Session</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        SessionFactory sessionFactory = config.buildSessionFactory(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // 将持久化的物件</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        User user = new User(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        user.setName("caterpillar"); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        user.setAge(new Integer(30));     </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New"> </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // 开启Session，相当于开启JDBC的Connection</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        Session session = sessionFactory.openSession(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // Transaction表示一组会话操作</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        Transaction tx= session.beginTransaction(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        // 将对象映像至数据库表格中储存</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        session.save(user); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        tx.commit(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        session.close(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        sessionFactory.close(); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">       </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">        System.out.println("新增资料OK!请先用MySQL观看结果！"); </span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">    }</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">}</span><br /><br /><font face="宋体, MS Song">注意，使用Annotation时，需要的是AnnotationConfiguration类别。 <br /><br />如您所看到的，程序中只需要直接操作User对象，并进行Session与Transaction的相关操作，Hibernate就会自动完成对数据库的操作，您看不到任何一行JDBC或SQL的陈述，撰写好以上的各个档案之后，各档案的放置位置如下：<br /></font><a href="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/1152886574068.jpg" target="_blank"><font face="宋体, MS Song"><img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" style="ZOOM: 100%" alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/caterpillar_here/1152886574068.jpg" onload="java_script_:if(this.width&gt;500)this.width=500" border="0" /></font></a><br /><br /><font face="宋体, MS Song">接着可以开始运行程序，结果如下：<br /></font><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">Hibernate: insert into user (name, age) values (?, ?)</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">新增资料OK!请先用MySQL观看结果！</span><br /></div><br />执行结果中显示了Hibernate所实际使用的SQL，由于这个程序还没有查询功能，所以要进入MySQL中看看新增的数据，如下：<br /><div style="MARGIN-LEFT: 40px"><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">mysql&gt; select * from user;</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">+----+-----------------+------+</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">| id    | name         | age  |</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">+----+-----------------+------+</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">|  1    | caterpillar  | 30   |</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">+----+-----------------+------+</span><br style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New" /><span style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">1 row in set (0.03 sec)</span><br /></div><img src ="http://www.blogjava.net/lijiajia418/aggbug/67092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 14:00 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Annotations 实战</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67090.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 05:59:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67090.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67090.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67090.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 任何获得Matrix授权的网站，转载请保留以下作者信息和链接：				作者：icess(作者的blog:http://blog.matrix.org.cn/page/icess)关键字：Hibernate Validator		下面让我们先看一个通常用 hbm.xml 映射文件的例子. 有3个类 .HibernateUtil.java 也就是 Hibernate文档中推荐的工具类,Pers...&nbsp;&nbsp;<a href='http://www.blogjava.net/lijiajia418/archive/2006/09/01/67090.html'>阅读全文</a><img src ="http://www.blogjava.net/lijiajia418/aggbug/67090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 13:59 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在filter中關閉session</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67085.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67085.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67085.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67085.html</trackback:ping><description><![CDATA[
		<p>利用<a title="Thread-Specific Storage" href="http://www.javaworld.com.tw/confluence/display/designpattern/Thread-Specific+Storage">Thread-Specific Storage</a>撰寫一個HibernateUtil</p>
		<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
				<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
						<b>HibernateSessionUtil.java</b>
				</div>
				<div class="codeContent">
						<pre class="code-java">
								<span class="code-keyword">import</span> java.io.Serializable;<br /><br /><span class="code-keyword">import</span> net.sf.hibernate.HibernateException;<br /><span class="code-keyword">import</span> net.sf.hibernate.Session;<br /><span class="code-keyword">import</span> net.sf.hibernate.SessionFactory;<br /><span class="code-keyword">import</span> net.sf.hibernate.Transaction;<br /><br /><span class="code-keyword">public</span> class HibernateSessionUtil <span class="code-keyword">implements</span> Serializable<br />{<br /><span class="code-keyword">public</span><span class="code-keyword">static</span><span class="code-keyword">final</span> ThreadLocal tLocalsess = <span class="code-keyword">new</span> ThreadLocal();<br /><br /><span class="code-keyword">public</span><span class="code-keyword">static</span><span class="code-keyword">final</span> ThreadLocal tLocaltx = <span class="code-keyword">new</span> ThreadLocal();<br /><br />    /*<br />     * getting the thread-safe session <span class="code-keyword">for</span> using<br />     */<br /><span class="code-keyword">public</span><span class="code-keyword">static</span> Session currentSession(){<br />        Session session = (Session) tLocalsess.get();<br /><br /><span class="code-comment">//open a <span class="code-keyword">new</span> one, <span class="code-keyword">if</span> none can be found.<br /></span><span class="code-keyword">try</span>{<br /><span class="code-keyword">if</span> (session == <span class="code-keyword">null</span>){<br />                session = openSession();<br />                tLocalsess.set(session);<br />            }<br />        }<span class="code-keyword">catch</span> (HibernateException e){<br /><span class="code-keyword">throw</span><span class="code-keyword">new</span> InfrastructureException(e);<br />        }<br /><span class="code-keyword">return</span> session;<br />    }<br /><br />    /*<br />     * closing the thread-safe session<br />     */<br /><span class="code-keyword">public</span><span class="code-keyword">static</span> void closeSession(){<br /><br />        Session session = (Session) tLocalsess.get();<br />        tLocalsess.set(<span class="code-keyword">null</span>);<br /><span class="code-keyword">try</span>{<br /><span class="code-keyword">if</span> (session != <span class="code-keyword">null</span> &amp;&amp; session.isOpen()){<br />                session.close();<br />            }<br /><br />        }<span class="code-keyword">catch</span> (HibernateException e){<br /><span class="code-keyword">throw</span><span class="code-keyword">new</span> InfrastructureException(e);<br />        }<br />    }<br /><br />    /*<br />     * begin the transaction<br />     */<br /><span class="code-keyword">public</span><span class="code-keyword">static</span> void beginTransaction(){<br />        Transaction tx = (Transaction) tLocaltx.get();<br /><span class="code-keyword">try</span>{<br /><span class="code-keyword">if</span> (tx == <span class="code-keyword">null</span>){<br />                tx = currentSession().beginTransaction();<br />                tLocaltx.set(tx);<br />            }<br />        }<span class="code-keyword">catch</span> (HibernateException e){<br /><span class="code-keyword">throw</span><span class="code-keyword">new</span> InfrastructureException(e);<br />        }<br />    }<br /><br />    /*<br />     * close the transaction<br />     */<br /><span class="code-keyword">public</span><span class="code-keyword">static</span> void commitTransaction(){<br />        Transaction tx = (Transaction) tLocaltx.get();<br /><span class="code-keyword">try</span>{<br /><span class="code-keyword">if</span> (tx != <span class="code-keyword">null</span> &amp;&amp; !tx.wasCommitted() &amp;&amp; !tx.wasRolledBack())<br />                tx.commit();<br />            tLocaltx.set(<span class="code-keyword">null</span>);<br />        }<span class="code-keyword">catch</span> (HibernateException e){<br /><span class="code-keyword">throw</span><span class="code-keyword">new</span> InfrastructureException(e);<br />        }<br />    }<br /><br />    /*<br />     * <span class="code-keyword">for</span> rollbacking<br />     */<br /><span class="code-keyword">public</span><span class="code-keyword">static</span> void rollbackTransaction(){<br />        Transaction tx = (Transaction) tLocaltx.get();<br /><span class="code-keyword">try</span>{<br />            tLocaltx.set(<span class="code-keyword">null</span>);<br /><span class="code-keyword">if</span> (tx != <span class="code-keyword">null</span> &amp;&amp; !tx.wasCommitted() &amp;&amp; !tx.wasRolledBack()){<br />                tx.rollback();<br />            }<br />        }<span class="code-keyword">catch</span> (HibernateException e){<br /><span class="code-keyword">throw</span><span class="code-keyword">new</span> InfrastructureException(e);<br />        }<br />    }<br /><br /><span class="code-keyword">private</span><span class="code-keyword">static</span> Session openSession() <span class="code-keyword">throws</span> HibernateException{<br /><span class="code-keyword">return</span> getSessionFactory().openSession();<br />    }<br /><br /><span class="code-keyword">private</span><span class="code-keyword">static</span> SessionFactory getSessionFactory() <span class="code-keyword">throws</span> HibernateException{<br /><span class="code-keyword">return</span> SingletonSessionFactory.getInstance();<br />    }<br />}</pre>
				</div>
		</div>
		<p>　filter中的程式碼如下</p>
		<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
				<div class="codeHeader" style="BORDER-BOTTOM-STYLE: solid">
						<b>HibernateSessionCloser.java</b>
				</div>
				<div class="codeContent">
						<pre class="code-java">
								<span class="code-keyword">public</span> class HibernateSessionCloser <span class="code-keyword">implements</span> Filter{<br /><br /><span class="code-keyword">protected</span> FilterConfig filterConfig = <span class="code-keyword">null</span>;<br /><br /><span class="code-keyword">public</span> void init(FilterConfig filterConfig)<span class="code-keyword">throws</span> ServletException{<br /><span class="code-keyword">this</span>.filterConfig = filterConfig;<br />    }<br /><br /><span class="code-keyword">public</span> void destroy(){<br /><span class="code-keyword">this</span>.filterConfig = <span class="code-keyword">null</span>;<br />    }    <br /><br /><span class="code-keyword">public</span> void doFilter(ServletRequest request, ServletResponse response,<br />                         FilterChain chain)<br /><span class="code-keyword">throws</span> IOException, ServletException {<br /><span class="code-keyword">try</span>{<br />            chain.doFilter(request, response);<br />        }<br /><span class="code-keyword">finally</span>{<br /><span class="code-keyword">try</span>{<br />                HibernateSessionUtil.commitTransaction();<br />            }<span class="code-keyword">catch</span> (InfrastructureException e){<br />                HibernateSessionUtil.rollbackTransaction();<br />            }<span class="code-keyword">finally</span>{<br />                HibernateSessionUtil.closeSession();<br />            }   <br />        }<br /><br />    }<br />}</pre>
				</div>
		</div>
		<p>然後在操作資料庫之前加上</p>
		<div class="code" style="BORDER-TOP-STYLE: solid; BORDER-RIGHT-STYLE: solid; BORDER-LEFT-STYLE: solid; BORDER-BOTTOM-STYLE: solid">
				<div class="codeContent">
						<pre class="code-java">HibernateSessionUtil.beginTransaction();<br />HibernateSessionUtil.currentSession();<span class="code-comment">//取得Session</span></pre>
				</div>
		</div>
<img src ="http://www.blogjava.net/lijiajia418/aggbug/67085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 13:51 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>acegi-security-sample-contacts-filter例子学习(二)</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67083.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67083.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67083.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67083.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67083.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67083.html</trackback:ping><description><![CDATA[
		<p>功能实现分析</p>
		<p>这个例子使用了HSQL做数据库，spring的AOP作为基础，使用Acegi做安全控制组件。<br />联系人管理的web应用在启动时候，会做一系列初始化动作：<br />1. 读取web.xml文件，</p>
		<p>2. 并解析文件里的内容。<br />a) context-param元素。<br />i. contextConfigLocation属性。这个属性定义了spring所需要的3个属性文件。它们分别是：applicationContext -acegi-security.xml、applicationContext-common-business.xml、 applicationContext-common-authorization.xml<br />ii. log4jConfigLocation属性。这个属性定义了log4j配置文件。</p>
		<p>b) filter元素。<br />这里定义了acegi的一个过滤器。Acegi的大部分过滤器都是这样配置的。使用FilterToBeanProxy组件，给它传递一个targetClass属性。这个targetClass必须实现javax.servlet.Filter接口。<br />这里配置的是FilterChainProxy。这个FilterChainProxy比较好用，可以为它定义一串filter属性。这些filter将会按照定义的顺序被调用。例如，<br />&lt;bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy"&gt;<br />&lt;property name="filterInvocationDefinitionSource"&gt;<br />&lt;value&gt;<br />CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />PATTERN_TYPE_APACHE_ANT<br />/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter<br />&lt;/value&gt;<br />&lt;/property&gt;<br />&lt;/bean&gt;<br />这个过滤器的mapping是“/*”。<br />c) listener元素。<br />i. ContextLoaderListener。这个是Spring使用来加载根applicationcontext。并分别解析 applicationContext-acegi-security.xml、applicationContext-common- business.xml、applicationContext-common-authorization.xml等配置文件，把相关的对象初始化<br />iii. Log4jConfigListener。这个是spring用来初始化log4j组件的listener。<br />iv. HttpSessionEventPublisher。这个组件将发布HttpSessionCreatedEvent和HttpSessionDestroyedEvent事件给spring的applicationcontext。<br />d) servlet元素。<br />i. contacts。这里采用了spring的MVC框架， 所以这个servlet是spring MVC的一个核心控制器（org.springframework.web.servlet.DispatcherServlet）。这个servlet 启动时候，会从contacts-servlet.xml里面读取信息，并做相关的初始化。<br />v. remoting。也是spring MVC的一个核心控制器。与contacts不同，这个servlet主要是提供web services服务。这个servlet启动时候， 会从remoting-servlet.xml里面读取信息，并做相关的初始化。<br />e) taglib元素。这里定义了spring的标f) 签库。<br />3. 解析applicationContext-acegi-security.xml。<br />a) 过滤器链。定义了一个FilterChainProxy，b) 并指c) 定了一系列的过滤器链。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter<br />d) 认证管理器。这个管理器由acegi提供。这个管理器需要一个providers参数。这个providers参数包含了提供系统认证的对象。<br />i. daoAuthenticationProvider。一般用户认证。<br />ii. anonymousAuthenticationProvider。匿名用户认证。<br />iv. rememberMeAuthenticationProvider。记住我认证。</p>
		<p>e) 密码加密。这里定义了一个acegi的Md5算法加密对象Md5PasswordEncoder。<br />f) 定义了一个jdbcDao实现类。这个类由acegi提供的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。这个对象需要一个dataSource的参数。<br />g) 定义daoAuthenticationProvider。这个对象由acegi提供。它有3个属性：<br />authenticationDao。这里指向前面定义的jdbcDao。<br />userCache。这里指向后面定义的user缓存对象。<br />passwordEncoder。这里指向前面定义的密码加密对象。<br />h) 用户缓存管理。<br />为了缓存user，这里使用spring的ehcache来缓存user。缓存机制：<br />i. 定义缓存管理器――CacheManager。这个对象是spring的EhCacheManagerFactoryBean对象<br />ii. 定义user缓存实际执行对象――UserCacheBackend。这个对象是spring的EhCacheFactoryBean。它有两个属性：<br />1. cacheManager。这里指向前面定义的缓存管理器。<br />2. cacheName。<br />iii. 定义user缓存――UserCache。它是acegi提供的EhCacheBasedUserCache对象。它有一个属性：<br />1. cache。这里指向的是前面定义的userCacheBackend。</p>
		<p>i) 定义接收来自DaoAuthenticationProvider的认证事件的listener――LoggerListener。<br />j) <br />4. 解析applicationContext-common-business.xml。<br />a) dataSource.<br />这里使用了spring的DriverManagerDataSource对象。这个对象是一个JDBC数据源的定义。<br />b) TransactionManager。这里使用spring的DataSourceTransactionManager对象。<br />c) 事务拦截器。这里使用spring的事务拦截器TransactionInterceptor。它有2个属性：<br />transactionManager。这个属性指向前面定义的TransactionManager。<br />transactionAttributeSource。这个属性里， 指定了ContactManager的各个方法的事务方面的要求。<br />d) DataSourcePopulator。<br />使用sample.contact.DataSourcePopulator对象，往HSQL里创建相关的表结构和数据。<br />实现原理：DataSourcePopulator 实现了接口 InitializingBean。其中afterPropertiesSet方法将在spring初始化DataSourcePopulator后被调用。<br />e) ContactDao。这里指向一个ContactDaoSpring对象。它继承spring的 JdbcDaoSupport，g) 并实现ContactDao接口。它是真正实现JDBC操作的对象。<br />h) ContactManager。这里使用的是spring的ProxyFactoryBean。它有2个属性：<br />i. ProxyInterfaces。代理接口：sample.contact.ContactManager</p>
		<p>ii. InterceptorNames。拦截器名称。可以有多个，iv. 这里包括：transactionInterceptor、contactManagerSecurity、contactManagerTarget。其中，v. transactionInterceptor是前面定义的事务拦截器。ContactManagerSecurity则是在 applicationContext-common-authorization.xml里定义的方法调用授权。<br />i) ContactManagerTarget。这里指向的是sample.contact.ContactManagerBackend对象。 ContactManagerBackend实现了ContactManager接口和InitializingBean接口。它有2个自定义属性： contactDao和basicAclExtendedDao。这里会调用ACL的API去做些创建权限和删除权限的工作。</p>
<img src ="http://www.blogjava.net/lijiajia418/aggbug/67083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 13:45 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>acegi-security-sample-contacts-filter例子学习(一)</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67082.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 05:44:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67082.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67082.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67082.html</trackback:ping><description><![CDATA[
		<p>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">这是一个</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt" times="" new="" roman="">Acegi</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">官方的例子。它以联系人的管理为例子，说明如何使用</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt" times="" new="" roman="">Acegi</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">作权限控制。这个例子包含在</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt" times="" new="" roman="">acegi</span>
				<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">的包里面。下载地址：</span>
				<span lang="EN-US" style="FONT-SIZE: 10.5pt" times="" new="" roman="">
						<a href="http://prdownloads.sourceforge.net/acegisecurity/acegi-security-0.8.3.zip?download">http://prdownloads.sourceforge.net/acegisecurity/acegi-security-0.8.3.zip?download</a>。</span>
				<br />
		</p>
		<p>
				<font face="宋体">联系人管理说明了下列中心的<span lang="EN-US">Acegi安全控制能力: </span></font>
		</p>
		<ul>
				<li>
						<b>
								<span lang="EN-US">Role-based security</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（基于角色的安全）</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――每个责任人都是某个角色的一员。而角色被用来限制对某些安全对象的访问。</span>
						<span lang="EN-US">
						</span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Domain object instance security</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（域对象实例安全）</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――合同，这个系统里的主要域对象，拥有一个访问控制列表（</span>
						<span lang="EN-US">ACL</span>
						<span style="FONT-FAMILY: 宋体">），用来指明谁允许读、管理和删除对象。</span>
						<span lang="EN-US">
						</span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Method invocation security</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（方法调用安全）――</span>
						</b>
						<span style="FONT-FAMILY: 宋体">这个</span>
						<code>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">ContactManager</span>
						</code>
						<span style="FONT-FAMILY: 宋体">服务层对象</span>
						<span style="FONT-FAMILY: 宋体">包含一些受保护的和公开的方法。</span>
						<span lang="EN-US">
						</span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Web request security</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（</span>
								<span lang="EN-US">Web</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">请求安全）</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――这个“</span>
						<code>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">/secure</span>
						</code>
						<span style="FONT-FAMILY: 宋体">”</span>
						<span lang="EN-US">URI</span>
						<span style="FONT-FAMILY: 宋体">路径被使用</span>
						<span lang="EN-US">Acegi</span>
						<span style="FONT-FAMILY: 宋体">安全保护，使得没有</span>
						<code>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">ROLE_USER</span>
						</code>
						<span lang="EN-US">
						</span>
						<span style="FONT-FAMILY: 宋体">角色的用户无法访问。</span>
						<span lang="EN-US">. </span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Security unaware application objects</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（保护未知的应用对象）</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――受保护的对象与</span>
						<span lang="EN-US">Acegi</span>
						<span style="FONT-FAMILY: 宋体">之间没有明显的耦合或契约，所以它们没有察觉到安全是由</span>
						<span lang="EN-US">Acegi </span>
						<span style="FONT-FAMILY: 宋体">提供的。</span>
						<span lang="EN-US">* </span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Security taglib usage</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（安全标签库使用）</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――所有的</span>
						<span lang="EN-US">JSP</span>
						<span style="FONT-FAMILY: 宋体">使用</span>
						<span lang="EN-US">Acegi </span>
						<span style="FONT-FAMILY: 宋体">安全标签库来封装安全信息。</span>
						<span lang="EN-US">* </span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Fully declarative security(</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">完全声明式的安全</span>
								<span lang="EN-US">)</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――每一个安全方面特性都是在</span>
						<span lang="EN-US">application context</span>
						<span style="FONT-FAMILY: 宋体">里面使用标准的</span>
						<span lang="EN-US">Acegi</span>
						<span style="FONT-FAMILY: 宋体">安全对象来配置的。</span>
						<span lang="EN-US"> * </span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Database-sourced security data</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（支持数据库来源的安全数据）</span>
						</b>
						<span style="FONT-FAMILY: 宋体">――所有的用户、角色和</span>
						<span lang="EN-US">ACL</span>
						<span style="FONT-FAMILY: 宋体">信息都可以从一个兼容</span>
						<span lang="EN-US">JDBC</span>
						<span style="FONT-FAMILY: 宋体">的内存数据库获得。</span>
						<span lang="EN-US">
						</span>
				</li>
				<li>
						<b>
								<span lang="EN-US">Integrated form-based and BASIC authentication</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">（集成基于表单和</span>
								<span lang="EN-US">BASIC</span>
						</b>
						<b>
								<span style="FONT-FAMILY: 宋体">验证）――</span>
						</b>
						<span style="FONT-FAMILY: 宋体">任何</span>
						<span lang="EN-US">BASIC</span>
						<span style="FONT-FAMILY: 宋体">验证头部被检测以及作为验证使用。默认使用基于表单的普通交互式验证。</span>
						<span lang="EN-US">
						</span>
				</li>
				<li>
						<b>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">Remember-me services</span>
								<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">（记住我的服务）――</span>
						</b>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'"> Acegi</span>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">安全的插件式的“</span>
						<span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">remember-me</span>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">”</span>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
						</span>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体">策略被演示。在登录表单里有一个相关的选择框与之对应。</span>
						<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
						</span>
				</li>
		</ul>
		<p>
		</p>
		<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'">
				<p>
						<span style="FONT-FAMILY: 宋体">联系人管理的业务功能描述：</span>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US">1.<span><font size="2">1. </font></span></span>
						<span style="FONT-FAMILY: 宋体">每个用户登录后，可以看到一个联系人列表。例如，</span>
				</p>
				<h1>
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<font face="宋体">marissa's Contacts</font>
						</span>
				</h1>
				<table cellpadding="0" border="0">
						<tbody>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<b>
																<span lang="EN-US">id</span>
														</b>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<b>
																<span lang="EN-US">Name</span>
														</b>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<b>
																<span lang="EN-US">Email</span>
														</b>
												</p>
										</td>
								</tr>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">1 </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">John Smith </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">john@somewhere.com </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/del.htm?contactId=1">Del</a>
														</span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/adminPermission.htm?contactId=1">Admin Permission</a>
														</span>
												</p>
										</td>
								</tr>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">2 </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">Michael Citizen </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">michael@xyz.com </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
												</p>
												<br />
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
												</p>
												<br />
										</td>
								</tr>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">3 </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">Joe Bloggs </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">joe@demo.com </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/del.htm?contactId=3">Del</a>
														</span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
												</p>
												<br />
										</td>
								</tr>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">4 </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">Karen Sutherland </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">karen@sutherland.com </span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/del.htm?contactId=4">Del</a>
														</span>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/adminPermission.htm?contactId=4">Admin Permission</a>
														</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<span lang="EN-US">
								<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/add.htm">
										<font face="宋体" size="3">Add</font>
								</a>
								<font face="宋体" size="3">
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">说明：用户没有权限访问的联系人信息，将不会显示。</span>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US">2.<span><font size="2">2.</font></span></span>
						<span style="FONT-FAMILY: 宋体">用户可以增加新的联系人信息。</span>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US">3.<span><font size="2">3.</font></span></span>
						<span style="FONT-FAMILY: 宋体">如果有删除权限，用户可以看到在联系人后面有一个“</span>
						<span lang="EN-US">Del</span>
						<span style="FONT-FAMILY: 宋体">”链接。用户可以点击这个链接来删除某个联系人信息。</span>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US">4.<span><font size="2">4.</font></span></span>
						<span style="FONT-FAMILY: 宋体">如果有管理权限，用户可以看到在联系人后面有一个“</span>
						<span lang="EN-US">Admin Permission</span>
						<span style="FONT-FAMILY: 宋体">”链接。用户可以点击这个链接来管理访问这个联系人的权限。例如，</span>
				</p>
				<h1>
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<font face="宋体">Administer Permissions</font>
						</span>
				</h1>
				<p>
						<code>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">sample.contact.Contact@26807f: Id: 1; Name: John Smith; Email: john@somewhere.com </span>
						</code>
				</p>
				<table cellpadding="0" border="0">
						<tbody>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<code>
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">-R--- [2] dianne </span>
														</code>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/deletePermission.htm?contactId=1&amp;recipient=dianne">Del</a>
														</span>
												</p>
										</td>
								</tr>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<code>
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">-RW-D [22] peter </span>
														</code>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/deletePermission.htm?contactId=1&amp;recipient=peter">Del</a>
														</span>
												</p>
										</td>
								</tr>
								<tr>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<code>
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">A---- [1] marissa </span>
														</code>
												</p>
										</td>
										<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 2.25pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 2.25pt; PADDING-BOTTOM: 2.25pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 2.25pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
												<p>
														<span lang="EN-US">
																<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/deletePermission.htm?contactId=1&amp;recipient=marissa">Del</a>
														</span>
												</p>
										</td>
								</tr>
						</tbody>
				</table>
				<p>
						<span lang="EN-US">
								<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/addPermission.htm?contactId=1">
										<font face="宋体" size="3">Add Permission</font>
								</a>
								<font face="宋体" size="3">
								</font>
								<a href="http://localhost:8080/acegi-security-sample-contacts-filter/secure/index.htm">
										<font face="宋体" size="3">Manage</font>
								</a>
								<font face="宋体" size="3">
								</font>
						</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">说明：每一行记录包含有</span>
						<span lang="EN-US">3</span>
						<span style="FONT-FAMILY: 宋体">列。</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">第一列表示权限，例如，“</span>
						<code>
								<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 黑体">-RW-D</span>
						</code>
						<span style="FONT-FAMILY: 宋体">”表示可读、可写、可删除。</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">第二列也表示权限，但它是以类似</span>
						<span lang="EN-US">unix</span>
						<span style="FONT-FAMILY: 宋体">权限的数字表达。例如，“</span>
						<span lang="EN-US">[22]</span>
						<span style="FONT-FAMILY: 宋体">”</span>
						<span lang="EN-US">, </span>
						<span style="FONT-FAMILY: 宋体">表示可读、可写、可删除。</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">第三列是用户名称。</span>
				</p>
				<p>
						<span style="FONT-FAMILY: 宋体">每一行记录后面都有一个“</span>
						<span lang="EN-US">Del</span>
						<span style="FONT-FAMILY: 宋体">”链接。点击这个链接，可以删除掉指定用户对这个联系人信息的权限。</span>
				</p>
				<p style="TEXT-INDENT: -21pt">
						<span lang="EN-US">5.<span><font size="2">5.</font></span></span>
						<span style="FONT-FAMILY: 宋体">用户可以为某个联系人信息添加权限。例如，</span>
				</p>
				<h1>
						<span lang="EN-US" style="FONT-SIZE: 12pt">
								<font face="宋体">Add Permission</font>
						</span>
				</h1>
				<form>
						<table style="WIDTH: 95%" cellspacing="0" cellpadding="0" width="95%" bgcolor="#f8f8ff" border="0">
								<tbody>
										<tr>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 20%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="20%">
														<p>
																<span lang="EN-US">Contact:</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 60%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="60%">
														<p>
																<span lang="EN-US">sample.contact.Contact@1787005: Id: 1; Name: John Smith; Email: john@somewhere.com</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 0cm; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 0cm; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="328">
														<p>
														</p>
														<br />
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 20%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="20%">
														<p>
																<span lang="EN-US">Recipient:</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 20%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="20%">
														<p>
																<span lang="EN-US">
																		<select name="recipient">
																				<option selected="">-- please select --</option>
																				<option value="dianne">dianne</option>
																				<option value="marissa">marissa</option>
																				<option value="peter">peter</option>
																				<option value="scott">scott</option>
																				<option value="ROLE_SUPERVISOR">ROLE_SUPERVISOR</option>
																				<option value="ROLE_USER">ROLE_USER</option>
																		</select>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 60%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="60%">
														<p>
														</p>
														<br />
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 20%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="20%">
														<p>
																<span lang="EN-US">Permission:</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); WIDTH: 20%; PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent" width="20%">
														<p>
																<span lang="EN-US">
																		<select name="permission">
																				<option value="0" selected="">None</option>
																				<option value="1">Administer</option>
																				<option value="2">Read</option>
																				<option value="16">Delete</option>
																				<option value="22">Read+Write+Delete</option>
																		</select>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: rgb(212,208,200); PADDING-RIGHT: 3.75pt; BORDER-TOP: rgb(212,208,200); PADDING-LEFT: 3.75pt; PADDING-BOTTOM: 3.75pt; BORDER-LEFT: rgb(212,208,200); PADDING-TOP: 3.75pt; BORDER-BOTTOM: rgb(212,208,200); BACKGROUND-COLOR: transparent">
														<p>
														</p>
														<br />
												</td>
										</tr>
								</tbody>
						</table>
				</form>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">说明：权限是动态添加的。例如，上图中给用户</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'">scott</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">增加了读联系人</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'">John</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">的权限。那么</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'">scott</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">马上就可以看到联系人</span>
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: 'Times New Roman'">John</span>
				<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">的信息了。</span>
		</span>
<img src ="http://www.blogjava.net/lijiajia418/aggbug/67082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 13:44 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork教程－ServletDispatcher</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67077.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67077.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67077.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67077.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ServletDispatcher																										原理																										ServletDispatcher				是默认的处理				Web Http				请求的调度器，它是一个				JavaServlet				，是				WebWork				框架的控制器。...&nbsp;&nbsp;<a href='http://www.blogjava.net/lijiajia418/archive/2006/09/01/67077.html'>阅读全文</a><img src ="http://www.blogjava.net/lijiajia418/aggbug/67077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 13:41 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork教程－validator</title><link>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67076.html</link><dc:creator>Binary</dc:creator><author>Binary</author><pubDate>Fri, 01 Sep 2006 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67076.html</guid><wfw:comment>http://www.blogjava.net/lijiajia418/comments/67076.html</wfw:comment><comments>http://www.blogjava.net/lijiajia418/archive/2006/09/01/67076.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lijiajia418/comments/commentRss/67076.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lijiajia418/services/trackbacks/67076.html</trackback:ping><description><![CDATA[
		<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="5">
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">验证框架</span>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">提供了在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行之前，对输入数据的验证功能，它使用了其核心</span>
				<span style="FONT-SIZE: 9pt">XWork</span>
				<span style="FONT-SIZE: 9pt">的验证框架。提供了如下功能：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				<span style="FONT-SIZE: 9pt">可配置的验证文件。它的验证文件是一个独立的</span>
				<span style="FONT-SIZE: 9pt">XML</span>
				<span style="FONT-SIZE: 9pt">配置文件，对验证的添加、修改只需更改配置文件，无需编译任何的</span>
				<span style="FONT-SIZE: 9pt">Class</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				<span style="FONT-SIZE: 9pt">验证文件和被验证的对象完全解藕。验证对象是普通的</span>
				<span style="FONT-SIZE: 9pt">JavaBean</span>
				<span style="FONT-SIZE: 9pt">就可以了（可以是</span>
				<span style="FONT-SIZE: 9pt">FormBean</span>
				<span style="FONT-SIZE: 9pt">、域对象等），它们不需实现任何额外的方法或继承额外的类。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				<span style="FONT-SIZE: 9pt">多种不同的验证方式。因为它验证功能是可以继承的，所以可以用多种不同的方式指定验证文件，比如：通过父类的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">、通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">、通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的方法、通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">所使用的对象，等等。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				<span style="FONT-SIZE: 9pt">强大的表达式验证。它使用了</span>
				<span style="FONT-SIZE: 9pt">OGNL</span>
				<span style="FONT-SIZE: 9pt">的表达式语言，提供强大的表达式验证功能。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">5、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				<span style="FONT-SIZE: 9pt">同时支持服务器端和客户端验证。</span>
		</div>
		<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="4">
								<a name="_Toc76287482">
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">为用户注册添加验证功能</span>
								</a>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">下面我们来看看如何为用户注册添加验证功能：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">注册我们的验证类型</span>
				</strong>
		</div>
		<div style="TEXT-INDENT: 22.5pt">
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">为不同的验证要求提供不同的验证类型。一个验证类型，一般是有一个类来提供。这个类必须实现接口：</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.xwork.validator.Validator</span>
				<span style="FONT-SIZE: 9pt">，但我们在写自己的验证类型时，无需直接实现</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">Validator</span>
				<span style="FONT-SIZE: 9pt">接口，它有抽象类可供直接使用如</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidatorSupport</span>
				<span style="FONT-SIZE: 9pt">、</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">FieldValidatorSupport</span>
				<span style="FONT-SIZE: 9pt">等。</span>
		</div>
		<div style="TEXT-INDENT: 22.5pt">
				<span style="FONT-SIZE: 9pt">验证类型在使用之前，必须要在</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidatorFactory</span>
				<span style="FONT-SIZE: 9pt">（</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.xwork.validator</span>
				<span style="FONT-SIZE: 9pt">.<span style="BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> ValidatorFactory</span></span>
				<span style="FONT-SIZE: 9pt">）中</span>
				<span style="FONT-SIZE: 9pt">注册。可以有二种方法实现验证类型的注册。一、写程序代码进行注册，它使用</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidatorFactory</span>
				<span style="FONT-SIZE: 9pt">类的静态方法：</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">registerValidator(String name, String className)</span>
				<span style="FONT-SIZE: 9pt">。</span>
				<span style="FONT-SIZE: 9pt">二、使用配置文件</span>
				<span style="FONT-SIZE: 9pt">validators.xml</span>
				<span style="FONT-SIZE: 9pt">进行注册，要求把文件</span>
				<span style="FONT-SIZE: 9pt">validators.xml</span>
				<span style="FONT-SIZE: 9pt">放到</span>
				<span style="FONT-SIZE: 9pt">ClassPath</span>
				<span style="FONT-SIZE: 9pt">的跟目录中（</span>
				<span style="FONT-SIZE: 9pt">/WEB-INF/classes</span>
				<span style="FONT-SIZE: 9pt">）。但在实际开发中，一般都使用第二中注册方法。我们的验证类型注册如下：</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;validators&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/validators&gt;</span>
		</div>
		<div style="TEXT-INDENT: 18pt">
				<span style="FONT-SIZE: 9pt">注册验证类型的配置文件非常简单。它使用标签</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;validator</span>
				<span style="FONT-SIZE: 9pt">&gt;</span>
				<span style="FONT-SIZE: 9pt">提供名－值对的形式注册。这样我们的验证文件就可以直接引用它的名字。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">开启</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">Action</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">的验证功能</span>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt"> </span>
				<span style="FONT-SIZE: 9pt">如果</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">要使用验证框架的验证功能，它必须在配置文件中指定拦截器“</span>
				<span style="FONT-SIZE: 9pt">validation</span>
				<span style="FONT-SIZE: 9pt">”，它的定义如下：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&lt;interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/&gt;</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们的验证文件必须以</span>
				<span style="FONT-SIZE: 9pt">ActionName-validation.xml</span>
				<span style="FONT-SIZE: 9pt">格式命名，它必须被放置到与这个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">相同的包中。你也可以为这个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">通过别名的方式指定验证文件，它的命名格式为：</span>
				<span style="FONT-SIZE: 9pt">ActionName-aliasname-validation.xml</span>
				<span style="FONT-SIZE: 9pt">。“</span>
				<span style="FONT-SIZE: 9pt">ActionName </span>
				<span style="FONT-SIZE: 9pt">”是我们</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的类名；“</span>
				<span style="FONT-SIZE: 9pt">aliasname</span>
				<span style="FONT-SIZE: 9pt">”是我们在配置文件（</span>
				<span style="FONT-SIZE: 9pt">xwork.xml</span>
				<span style="FONT-SIZE: 9pt">）中定义这个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">所用到的名称。这样，同一个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">类，在配置文件中的不同定义就可以对应不同的验证文件。验证框架也会根据</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的继承结构去查找</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的父类验证文件，如果找到它会去执行这个父类的验证。</span>
		</div>
		<div> </div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">实现我们的验证文件：</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">RegisterActionSupport-validation.xml</span>
				</strong>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;validators&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field name="user.username"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field-validator type="requiredstring"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;message&gt;You must enter a value for username.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;/field&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field name="user.password"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field-validator type="requiredstring"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;message&gt;You must enter a value for password.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;field-validator type="fieldexpression"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;param name="expression"&gt;user.password == verifyPassword&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;message&gt;Passwords don't match.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;/field&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field name="user.email"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field-validator type="email"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;message&gt;You must enter a valid email.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;/field&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field name="user.age"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;field-validator type="int"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;param name="min"&gt;6&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;param name="max"&gt;100&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;message&gt;Age must be between ${min} and ${max}, current value is ${user.age}.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;/field&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/validators&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">说明：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">1</span>
				<span style="FONT-SIZE: 9pt">）、</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;field</span>
				<span style="FONT-SIZE: 9pt">&gt;</span>
				<span style="FONT-SIZE: 9pt">标签代表一个字段，它的属性“</span>
				<span style="FONT-SIZE: 9pt">name</span>
				<span style="FONT-SIZE: 9pt">”和页面输入框的“</span>
				<span style="FONT-SIZE: 9pt">name</span>
				<span style="FONT-SIZE: 9pt">”属性必需完全一致，其实它也就是我们的表达式语言。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">2</span>
				<span style="FONT-SIZE: 9pt">）、</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;field-validator</span>
				<span style="FONT-SIZE: 9pt">&gt;</span>
				<span style="FONT-SIZE: 9pt">标签定义我们的验证规则，</span>
				<span style="FONT-SIZE: 9pt">type</span>
				<span style="FONT-SIZE: 9pt">属性的值就是就是我们前面定义的验证类型。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">3</span>
				<span style="FONT-SIZE: 9pt">）、验证文件中，字段的数据是通过表达式语言从我们的值堆栈（</span>
				<span style="FONT-SIZE: 9pt">OgnlValueStack</span>
				<span style="FONT-SIZE: 9pt">）中取得，一般是</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">或</span>
				<span style="FONT-SIZE: 9pt">Model</span>
				<span style="FONT-SIZE: 9pt">对象。例如：我们的字段“</span>
				<span style="FONT-SIZE: 9pt">user.age</span>
				<span style="FONT-SIZE: 9pt">”，它会通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt">getUser().getAge()</span>
				<span style="FONT-SIZE: 9pt">来取得用户输入的年龄，再来根据验证的类型“</span>
				<span style="FONT-SIZE: 9pt">int</span>
				<span style="FONT-SIZE: 9pt">”和最大值最小值的参数来判断输入的数据是否能通过验证。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">4</span>
				<span style="FONT-SIZE: 9pt">）、不管验证是否通过，我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">都会执行，但如果验证没有通过，它不会调用</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">execute()</span>
				<span style="FONT-SIZE: 9pt">方法。</span>
		</div>
		<div> </div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">显示</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">Action</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">的验证错误信息</span>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">如果用户输入的数据验证没有通过，我们需重新返回输入页面，并给出错误信息提示。拦截器栈“</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">validationWorkflowStack</span>
				<span style="FONT-SIZE: 9pt">”为我们实现了这个功能。它首先验证用户输入的数据，如果验证没有通过将不执行我们</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">execute()</span>
				<span style="FONT-SIZE: 9pt">方法，而是将请求重新返回到输入页面。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们的</span>
				<span style="FONT-SIZE: 9pt">xwork.xml</span>
				<span style="FONT-SIZE: 9pt">配置文件如下：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;action name="registerSupport" class="example.register.RegisterActionSupport"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;result name="success" type="dispatcher"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">                &lt;param name="location"&gt;/register-result.jsp&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;/result&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;<font color="#ff0000">result name="input" type="dispatcher"&gt;</font></span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						<font color="#ff0000">                &lt;param name="location"&gt;/registerSupport.jsp&lt;/param&gt;</font>
				</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						<font color="#ff0000">            &lt;/result&gt;</font>
				</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;interceptor-ref name="validationWorkflowStack"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        &lt;/action&gt;</span>
		</div>
		<div> </div>
		<div>
				<span style="FONT-SIZE: 9pt">通过接口</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidationAware</span>
				<span style="FONT-SIZE: 9pt">，</span>
				<span style="FONT-SIZE: 9pt">我们可以获得类级别或字段级别的验证错误信息，这个错误信息也就是我们验证文件中</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;message&gt;</span>
				<span style="FONT-SIZE: 9pt">标签里的数据。</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ActionSupport</span>
				<span style="FONT-SIZE: 9pt">类已实现了此接口，这样在应用中我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">只要继承</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ActionSupport</span>
				<span style="FONT-SIZE: 9pt">类就可以了。</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">RegisterActionSupport</span>
				<span style="FONT-SIZE: 9pt">.java</span>
				<span style="FONT-SIZE: 9pt">代码如下：</span>
		</div>
		<div align="left">
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">package</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> example.register;</span>
		</div>
		<div align="left"> </div>
		<div align="left">
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">import</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> com.opensymphony.xwork.ActionSupport;</span>
		</div>
		<div align="left"> </div>
		<div align="left">
				<div align="left">
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						</span>
				</div>
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">public</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						<strong>class</strong> RegisterActionSupport <strong>extends</strong> ActionSupport {</span>
		</div>
		<div align="left"> </div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    <strong>private</strong> User user= <strong>new</strong> User();</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    <strong>private</strong> String verifyPassword;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    </span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    <strong>public</strong> User getUser(){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        <strong>return</strong><strong>this</strong>.user;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    }</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    </span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    <strong>public</strong> String execute(){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        //</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">在这里调用用户注册的业务逻辑，比如：将注册信息存储到数据库</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        <strong>return</strong> SUCCESS;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    }</span>
		</div>
		<div align="left"> </div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    <strong>public</strong> String getVerifyPassword(){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        <strong>return</strong><strong>this</strong>.verifyPassword;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    }</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    </span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    <strong>public</strong><strong>void</strong> setVerifyPassword(String verPassword){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">        <strong>this</strong>.verifyPassword = verPassword;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    }</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">}</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt">UI</span>
				<span style="FONT-SIZE: 9pt">标签库直接提供了验证错误信息显示功能。如果字段级别的验证没有通过，它会在输入框上方显示验证文件定义的错误提示信息。我们将用户输入的页面更改如下：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">registerSupport.jsp</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;%@ taglib uri="webwork" prefix="ww" %&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;html&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;head&gt;&lt;title&gt;Register Example&lt;/title&gt;&lt;/head&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;body&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;table border=0 width=97%&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;tr&gt;&lt;td align="left"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">    &lt;ww:form name="'test'" action="'/example/registerSupport.action'" method="'POST'"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;ww:textfield label="'Username'" name="'user.username'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;ww:textfield label="'Password'" name="'user.password'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;ww:textfield label="'VerifyPassword'" name="'verifyPassword'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;ww:textfield label="'Email'" name="'user.email'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;ww:textfield label="'Age'" name="'user.age'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">            &lt;ww:submit value="'Submit'"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">         &lt;/ww:form&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/td&gt;&lt;/tr&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/table&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/body&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/html&gt;</span>
		</div>
		<div style="TEXT-INDENT: 22.5pt">
				<span style="FONT-SIZE: 9pt">我们上面的例子使用的是服务器端验证。</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">也为我们提供了方便的客户端验证。它将验证自动生成</span>
				<span style="FONT-SIZE: 9pt">JavaScript</span>
				<span style="FONT-SIZE: 9pt">脚本。如果要使用客户端验证只需改变相应的验证类型就可以了（输入页面的表单必需使用</span>
				<span style="FONT-SIZE: 9pt">&lt;ww:form&gt;</span>
				<span style="FONT-SIZE: 9pt">标签，并设置属性“</span>
				<span style="FONT-SIZE: 9pt">validate="true"</span>
				<span style="FONT-SIZE: 9pt">”）。具体的验证类型可以在</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">的包</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.webwork.validators</span>
				<span style="FONT-SIZE: 9pt">中找到。</span>
		</div>
<img src ="http://www.blogjava.net/lijiajia418/aggbug/67076.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lijiajia418/" target="_blank">Binary</a> 2006-09-01 13:40 <a href="http://www.blogjava.net/lijiajia418/archive/2006/09/01/67076.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>