??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品秘入口,久久久久五月天,亚洲 国产 日韩 综合一区http://www.aygfsteel.com/lijiajia418/Vicent's blogzh-cnSat, 17 May 2025 08:28:11 GMTSat, 17 May 2025 08:28:11 GMT60一?桥梁QBridgeQ模?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/lijiajia418/archive/2006/09/18/70268.html</guid><wfw:comment>http://www.aygfsteel.com/lijiajia418/comments/70268.html</wfw:comment><comments>http://www.aygfsteel.com/lijiajia418/archive/2006/09/18/70268.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lijiajia418/comments/commentRss/70268.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lijiajia418/services/trackbacks/70268.html</trackback:ping><description><![CDATA[     摘要: 一、 桥梁(BridgeQ模? 桥梁模式是一个非常有用的模式Q也是比较复杂的一个模式。熟悉这个模式对于理解面向对象的设计原则Q包?开Q闭"原则(OCP)以及l合/聚合复用原则(CARP)都很有帮助。理解好q两个原则,有助于Ş成正的设计思想和培养良好的设计风格? 注:《Java与模式》一书认为Bridge模式不是一个用频率很高的模式Q我不太赞同Q我认ؓBridge模式?..  <a href='http://www.aygfsteel.com/lijiajia418/archive/2006/09/18/70268.html'>阅读全文</a><img src ="http://www.aygfsteel.com/lijiajia418/aggbug/70268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lijiajia418/" target="_blank">Binary</a> 2006-09-18 13:38 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/lijiajia418/archive/2006/09/01/67094.html</guid><wfw:comment>http://www.aygfsteel.com/lijiajia418/comments/67094.html</wfw:comment><comments>http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/lijiajia418/comments/commentRss/67094.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/lijiajia418/services/trackbacks/67094.html</trackback:ping><description><![CDATA[ <p> <font color="#008000">在项目的业务属性中,你是不是要经帔R证属性的取D围呢. 惌了解比较优美的解x案吗?           </font> </p> <p align="left"> <font color="#008000">看看Hibernate Validator 是怎么做的?一见到?怿你就会说: Oh God, q就是我需要的.</font> </p> <p align="left"> <span style="COLOR: red">M获得Matrix授权的网站,转蝲请保留以下作者信息和链接Q?/span> <br />作者:icess(作者的blog:<a target="_new">http://blog.matrix.org.cn/page/icess</a>)<br />关键字:Hibernate Validator</p> <p>用Annotations l类或者类的属性加上约?constraint),在运行期查属性值是很优雅的.Hibernate Validator是q样的一个框?该框架是十分Ҏ?像参考文档中宣称的那?,几乎没有什么学习曲U?Validator 是一个验证框?不需要和Hibernate的其他部分绑定就可以使用,只要在你的项目中dHibernate-annotations.jar库就可以?那么下面p我们看看怎么使用?</p> <p align="left"> <code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"> <font color="#3f7f5f">Person.java c?/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 c?/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 id="wmqeeuq" class="java" align="left"> <p>上面是两个用 Validator Annotations 注释?c? 每个属性都?U束限制?  下面看看试的类?</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 c?/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 Z说明 @Valid 注释的?/font> <br /> <font color="#ffffff">    </font> <font color="#000000">ClassValidator<Person> classValidator = </font> <font color="#7f0055"> <b>new </b> </font> <font color="#000000">ClassValidator<Person> (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">E序的输出如?<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">可以看出不满约束的值都被指Z.</p><p align="left">同时该句: <code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"><font color="#000000">ClassValidator<Person> classValidator = </font><font color="#7f0055"><b>new </b></font><font color="#000000">ClassValidator<Person> (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>L,l果如下:</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">当然?,你还可以只验证一个属?, 没有必要验证整个c?只需要在调用</span> <font face="Courier New, Courier">classValidator.getInvalidValues(p,"age")Ҏ?加上你要验证的属性就可以?如我们只想验证age 属?把代码改为如下所C?</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">q行l果如下:</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 >Blog </a>获得最C?.</span> </code> </p> <p align="left"> <code> <span style="FONT-FAMILY: 'Courier New',Courier">如果你要写自qU束?, 你不用担?,q也是很Ҏ? </span> </code>MU束有两部分l成: [U束描述W?x释]the constraint <span id="wmqeeuq" class="emphasis"><em>descriptor</em></span> (the annotation) 和[U束validator ?实现c] the constraint <span id="wmqeeuq" 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 id="wmqeeuq" 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 id="wmqeeuq" class="emphasis"><em>validator c?</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">q几个我׃用解释了?</font> </code> </p> <p align="left"> <code style="FONT-FAMILY: 'Courier New',Courier"> <font color="#000000">Serializability 里面声明了一?message 昄U束的提CZ? num 只是Z说明一个方?在这里面没有实际用途用 .</font> </code> </p> <p align="left"> <code> <span style="FONT-FAMILY: 'Courier New',Courier">然后是 实现一?/span> </code>constraint <em><span id="wmqeeuq" class="emphasis">validator c?该类要实?/span></em><tt class="literal">Validator<ConstraintAnnotation></tt><em><span id="wmqeeuq" class="emphasis">.q里?/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<Serializability>, 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">//q里只是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 id="wmqeeuq" 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.javac?d@<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>注释Lok?</span></font></code></p> <p align="left"> <code> <font size="2"> <span style="FONT-FAMILY: 'Courier New',Courier">q行l果如下:</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">现在把Personcd?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">然后~辑资料文g. 注意 该资源文件中要包?Hibernate Validator 内徏的资? 可以在该org\hibernate\validator\resources 包里面的资源文g基础上修?,在打包里?q样可以了. 自己打包可能不太方便.你可以把该包里面的文件复制出?然后攑ֈ你自q目包下在自q? 该测试中 我是攑֜ test\resources 包下?</span> </font> </code> </p> <p align="left"> <code> <font size="2"> <span style="FONT-FAMILY: 'Courier New',Courier">然后?资源文g中添?</span> </font> </code> <font size="2"> <code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New',Courier"> <font color="#2a00ff">Serializable = '''''' </font>q么一? 样例如下:</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"> 时要M 资源文g 如下:(在测试类?</span> </font> </code> </p> <p align="left"> <code> <font face="Courier New, Courier" size="2">ClassValidator<Person> classValidator = new ClassValidator<Person> (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">q样可以了 .  当然 你还可以 更改 Hibernate Validator 的消?不是在上面的资源文g中直接修?/font> </code> <font size="2">validator.length = ... {等 </font> <code> <font face="Courier New, Courier" size="2">) , q记?Validator 注释中有?message 元素? 你以前用的都是默认?现在你可以该Z自己定义的了.</font> </code> <font size="2">?validator.length 我把他改?"<font color="#0000ff">该字W串的长度不W合规定范围范围</font>". 在资源文件中d一行键值属性对(key定义?"<font color="#ff0000">myMsg</font>")如下:</font> </p> <p align="left"> <font size="2">myMsg=<font color="#0000ff">该字W串的长度不W合规定范围范围</font></font> </p> <p align="left"> <font size="2">q且q要?/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">再一ơ运行测?,我们可以看C面两条自定义l定的消息了 .如下:</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">该字W串的长度不W合规定范围范围</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">看到q里其实不用我在多说?大家都知道怎么?什么时候用. 作ؓ一介l性文章我q是在此l出一个最常用的例子吧,更好的用方式大家慢慢挖掘吧.</p> <p align="left">比如 : 你现在在开发一个h力资?HR)pȝ (其实是我们ERP评的一个作?^_^), 里面要处理大量的数据,其是在输入各种资料??登记员工信息. 如果你公司的员工的年龄要求是18 -- 60 那么你所输入的年龄就不能出q个范围. 你可能会说这很容易啊 , 不用Validator可以解军_.q保持数据前验证可以啦 如if ( e.getAge() > 60 || e.getAge() < 18 ) ........ l出错误信息 然后提示重新输入不就OK?用得着 兴师动众的来个第三方框架? </p> <p align="left">是啊 当就验证q一个属性时, 没有必要?! 但是一个真正的HR pȝ,会只有一个属性要验证? 恐怕要有N多吧</p> <p align="left">你要是每一个都那样 写一D验证代?是不是很烦啊 ,况且也不方便代码重用. 现在考虑一?Validator 是不是更高效?拦截?U束q例?属?可以直接得?国际化的消息 可以把该消息昄C个弹出对话框?提示更正  !</p> <p align="left">Validator的用处不只这一U?,你可以想到如何用?! Ƣ迎发表你的高见!!</p> <p align="left">OK 到此 我们?Hibernate Validator 之旅p先告一D落?. 希望q是令你心旷怡的一ơ寒冬之?</p> <p align="left">把你学到的应用到你的目中吧,一定会提高你的生率的. 怿?,没错的?^_^ !</p> <img src ="http://www.aygfsteel.com/lijiajia418/aggbug/67094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/lijiajia418/" target="_blank">Binary</a> 2006-09-01 14:05 <a href="http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Annotations 实战(?http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67093.htmlBinaryBinaryFri, 01 Sep 2006 06:04:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67093.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67093.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67093.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67093.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67093.html-- hbm.xml ?Annotations 性能比较

M获得Matrix授权的网站,转蝲请保留以下作者信息和链接Q?/span>
作者:icess(作者的blog:http://blog.matrix.org.cn/page/icess)
关键字:Hibernate Validator

我在前面一文?lt;Hibernate Annotations 实战-- ?hbm.xml ?Annotations>:

?有很多开发者在谈论中提?有没有必要从 hbm.xml 往 Annotations 上{U? 那么在这文章中我们来讨论一?hbm.xml ?Annotations的优~点,看看那种情况最适合?

首先,讨论一?xml 配置文g的优? 个h认ؓ主要优点是当你改变底层配置?不需要改变和重新~译代码,只需要在xml 中更改就可以?例如 Hibernate.cfg.xml 当你要更改底层数据库? 只要更改配置文g可以了.Hibernate会ؓ你做好别的事?

那么xml的缺点呢,个h认ؓ有以下几?

  • 描述W多Q不Ҏ记忆,掌握 要深入了解还有看DTD文g

  • 无法做自动校验,需要h工查?

  • d和解析xml配置要消耗一定时_D应用启动慢,不便于测试和l护

  • 当系l很大时Q大量的xml文g难以理

  • q行中保存xml配置需要消耗额外的内存

  • 在O/R Mapping的时候需要在java文g和xml配置文g之间交替Q增大了工作?

其中W一 二点 借助于先q的IDE 可能不是什么问? 但是对初学者还是个问题 ^_^.

 

下面我们看看 Annotations?Ҏ吧! 可以解决xml遇到的问?有以下优?/p>

  • 描述W减。以前在xml配置中往往需要描qjava属性的cdQ关pȝ{。而元数据本n是java语言Q从而省略了大量的描q符

  • ~译期校验。错误的Ҏ在编译期间就会报错?

  • 元数据批注在java代码中,避免了额外的文gl护工作

  • 元数据被~译成java bytecodeQ消耗的内存,d也很快,利于试和维?

关于 映射文g是?hbm.xml 文gq是使用 Annotations 我们来看?者的性能? 先声明一?个h认ؓ映射文g一旦配|好׃会在很大E度上改变了.所以用xml文gq不会带来很大的好处.如果你认?映射文g在你的项目中也经常变?比如一列String数据 ,今天你?length="16" 明天你认?该数据的长度应该更长才能满业务需?于是改ؓlength="128" {等cM的问?. 如果你经常有q方面的变动的话,下面的比较你可以不用看了 , 你应该?xml文g 因ؓAnnotations 无法很好的满你的要?

现在让我们就来看?者的性能比较?

(说明: q里只是比较查找 插入 的时间快?没有比较除运行时间以外的其他性能,?内存占用?{等)

先来看看试E序和配|?

首先?Hibernate.cfg.xml 文g中去掉了

<property name="hibernate.hbm2ddl.auto">update</property>

q一? 因ؓ在前面的实验中以及徏立了数据库表?不再需要更C.如果你是W一ơ运行该例子 q是要该行的.

Test.java 如下:

/*
 * Created on 2005
 * @author 
 */
package test.hibernate.annotation;

import org.hibernate.Session;
import org.hibernate.Transaction;

public class Test {
  
  public static void main(String [] args) {
    long start = 0;
    long end = 0;
    start = System.currentTimeMillis();  //E序开始时?/font>
    
    Session s = HibernateUtil.currentSession();
    long mid =  System.currentTimeMillis();  //初始化完毕的旉 (可能此时q没有初始化完毕^_^)
    
    Transaction tx = s.beginTransaction();    
    /********************试d的代?***********************/
    Person p = null;
    for(int i = 1; i <= 100; i ++) {
    p = (Person) s.get(Person.class, i);
    System.out.println(p.getName());
    }
    System.out.println(p.getName());

    /********************试d1ơ的代码************************/
    Person p = null;
    p = (Person) s.get(Person.class, 1);
    System.out.println(p.getName());
    /*********************试插入的代?************************************/
    /*
    for (int i = 0; i < 100; i ++) {
      Person p = new Person();
      p.setAge(i+1);
      p.setName("icerain"+i);
      p.setSex("male"+i);
      s.save(p);
      s.flush();
    }
    */
    tx.commit();
    HibernateUtil.closeSession();
    
    end = System.currentTimeMillis(); //试l束旉
    System.out.println("String[] - start time: " + start);
    System.out.println("String[] - end time: " + end);
    System.out.println("Init time : " + (mid-start)); // 打印初始化用的时?/font>
    System.out.println("Last time is :" +(end - mid) ); //打印 数据操作的时?/font>
    System.out.println("Total time : " +(end - start)); //打印L?br />  }
}

Annotations 包中的Person.java 如下

package test.hibernate.annotation;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.AccessType;
import javax.persistence.Basic;
import javax.persistence.Entity;
import javax.persistence.GeneratorType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 * Person generated by hbm2java
 */

@SuppressWarnings("serial")
@Entity(access = AccessType.PROPERTY)
@Table
public class Person implements java.io.Serializable {
  private Integer id;
  private String name;
  private String sex;
  private Integer age;
  private List list = new LinkedList();

  // Constructors
  /** default constructor */
  public Person() {
  }

  /** constructor with id */
  public Person(Integer id) {
    this.id = id;
  }

  // Property accessors
  @Id(generate=GeneratorType.AUTO)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @Basic
  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Basic
  public String getSex() {
    return this.sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }

  @Basic
  public Integer getAge() {
    return this.age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }
  @Transient
  public List getList() {
    return list;
  }
  public void setList(List list) {
    this.list = list;
  }

}

其他的代码几乎没有改?

下面的每U类型的试都测试了3ơ以? 取中间的试旉.

试机器配置:

CPU:  AMD Athlon (xp) 2000+

内存: 784880KB

盘: 三星 SP0812N

d一ơ  的比较:(单位: 毫秒)

使用Annotations 的测试数?/td>使用Xml文g的测试数?/td>要说?/td>
Init time : 2444Init time : 2431试前我认ؓ该项l果xml应该比较?要读取映文件啊,实际情况不是q样,不知道ؓ什?
Last time is :62Last time is :85相差比较大不知道Z?
Total time : 2506Total time : 2516xml文gM上慢了一?/td>

   d100ơ的比较:

使用Annotations 的测试数?/td>使用Xml文g的测试数?/td>要说?/td>
Init time : 2437Init time : 2422和前面初始化差不?/td>
Last time is :438Last time is :484有时间差
Total time : 2875Total time : 2906也是xml文gM上慢了一?/td>

插入100ơ的比较:

使用Annotations 的测试数?/td>使用Xml文g的测试数?/td>要说?/td>
Init time : 2453Init time : 2469和前面初始化差不?/td>
Last time is :469Last time is :656有时间差
Total time : 2922Total time : 3125也是xml文gM上慢了一?/td>

从上面的三次Ҏ中大家可以看?初始化的部分几乎两者是一L, 在数据操作上?使用xml文g L比用Annotations 慢一?在我们只操纵一个只有几个属性的持久化cȝ操作中就?几十毫秒的差? 几十毫秒在计机中算不算很大 大家应该都知?我就不在多说?

ȝ: l过 xml 文g 和Annotations 的优~点?性能上的Ҏ.现在使用那个作ؓ你持久化映射{略.我相信大安会正选择?

试后记: l过多次试 感觉有时候很不稳?,有的时候很E_不知道是试有问题还是别的问?大家可以自己试一? 有什么新的发?请大家讨?



Binary 2006-09-01 14:04 发表评论
]]>
W一个Hibernate with AnnotationE式http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67092.htmlBinaryBinaryFri, 01 Sep 2006 06:00:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67092.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67092.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67092.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67092.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67092.html Hibernate是ORM的解x案,其底层对数据库的操作依赖于JDBCQ所以您必须先取得JDBC驱动E序Q在q边所使用的是MySQLQ所以您必须?MySQL] Connector/J 取得MySQL的JDBC驱动E序?

接下来至 Hibernate 官方|站 取得Hibernate 3.2?span style="COLOR: rgb(255,0,0)">Hibernate Annotations 3.2?

您必?span style="COLOR: rgb(255,0,0)">安装JDK 5.0才可以用Hibernate Annotations的功能?

解开Hibernate 3.2的zip档案后,当中的hibernate3.jar是必要的Q而在lib目录中还包括了许多jar档案Q您可以?Hibernate 3.0官方的参考手?上找到这些jar的相兌明,其中必要的是 antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging?EHCacheQHibernate底层q需要Java Transaction APIQ所以您q需要jta.jar?

解开Hibernate Annotations 3.2的zip档案后,您需要hibernate-annotations.jar、ejb3-persistence.jarq两个档案?

到这边ؓ止,d需要以下的jar档案Q?br />

Hibernate可以q行于单Z上,也可以运行于Web应用E序之中Q如果是q行于单机,则将所有用到的jar档案Q包括JDBC驱动E序Q设定至CLASSPATH中,如果是运行于Web应用E序中,则将jar档案|放于WEB-INF/lib中?br />
如果您还需要额外的LibraryQ再依需求加入,例如JUnit、Proxool{等Q接下来可以etc目录下的 log4j.properties复制至Hibernate目的Classpath下,q修改一下当中的 log4j.logger.org.hibernate为errorQ也是只在在错误发生时昄必要的讯息?br />
接着讄基本的Hibernate配置文gQ可以用XML或Properties档案Q这边先使用XMLQ档名预设ؓhibernate.cfg.xmlQ?br />
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 
<hibernate-configuration>
    <session-factory>
        <!-- 昄实际操作数据库时的SQL -->
        <property name="show_sql">true</property>
        <!-- SQL方言Q这边设定的是MySQL -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- JDBC驱动E序 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- JDBC URL -->
        <property name="connection.url">jdbc:mysql://localhost/demo</property>
        <!-- 数据库用?-->
        <property name="connection.username">root</property>
        <!-- 数据库密?-->
        <property name="connection.password">123456</property>
 
        <!-- 以下讄对象与数据库表格映像cd -->
        <mapping class="onlyfun.caterpillar.User"/>
    </session-factory>
</hibernate-configuration>

q边以一个简单的单机E序来示范Hibernate的配|与功能Q首先作数据库的准备工作Q在MySQL中新增一个demo数据库,q徏立user表格Q?span class="javascript" id="text160062" style="FONT-WEIGHT: bold; FONT-FAMILY: Courier New">
CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default'',
age INT
);
对于q个表格Q您有一个Usercd与之对应Q表g的每一个字D将对应至User实例上的Field成员?br />
package onlyfun.caterpillar;
 
import javax.persistence.*;
 
@Entity
@Table(name="user") // 非必要,在表格名UCcd名称不同时?/span>
public class User {
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
 
  @Column(name="name") // 非必要,在字D名UC属性名UC同时使用
    private String name;
 
  @Column(name="age")
    private Integer age; // 非必要,在字D名UC属性名UC同时使用
   
    // 必须要有一个预讄建构Ҏ
    // 以得Hibernate可以使用Constructor.newInstance()建立对象
    public User() {
    }
 
    public Integer getId() {
        return id;
    }
 
    public void setId(Integer id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
   
    public Integer getAge() {
        return age;
    }
 
    public void setAge(Integer age) {
        this.age = age;
    }
}

其中id是个Ҏ的属性,Hibernate会用它来作Z键识别,您可以定义主键生的方式Q这边设定ؓ自动产生主键Q可以看刎ͼ实体标识Q主键生成,以及相关映像Q都可以使用Annotation来完成?

接下来撰写一个测试的E序Q这个程序直接以JavaE序设计人员熟悉的语法方式来操作对象Q而实际上也直接完成对数据库的操作Q程序将会将一W数据存入表g中:
package onlyfun.caterpillar;
 
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
 
public class HibernateAnnotationDemo {
 
    public static void main(String[] args) {
        // 需要AnnotationConfigurationdAnnotation讯息
        Configuration config = new AnnotationConfiguration().configure();
        // Ҏ config 建立 SessionFactory
        // SessionFactory 用于徏?Session
        SessionFactory sessionFactory = config.buildSessionFactory();
 
        // 持久化的物?/span>
        User user = new User();
        user.setName("caterpillar");
        user.setAge(new Integer(30));    
 
        // 开启SessionQ相当于开启JDBC的Connection
        Session session = sessionFactory.openSession();
        // Transaction表示一l会话操?/span>
        Transaction tx= session.beginTransaction();
        // 对象映像至数据库表g储存
        session.save(user);
        tx.commit();
        session.close();
        sessionFactory.close();
      
        System.out.println("新增资料OK!请先用MySQL观看l果Q?);
    }
}

注意Q用AnnotationӞ需要的是AnnotationConfigurationcd?

如您所看到的,E序中只需要直接操作User对象Qƈq行Session与Transaction的相x作,Hibernate׃自动完成Ҏ据库的操作,您看不到M一行JDBC或SQL的陈qͼ撰写好以上的各个档案之后Q各档案的放|位|如下:


接着可以开始运行程序,l果如下Q?br />
Hibernate: insert into user (name, age) values (?, ?)
新增资料OK!请先用MySQL观看l果Q?/span>

执行l果中显CZHibernate所实际使用的SQLQ由于这个程序还没有查询功能Q所以要q入MySQL中看看新增的数据Q如下:
mysql> select * from user;
+----+-----------------+------+
| id    | name         | age  |
+----+-----------------+------+
|  1    | caterpillar  | 30   |
+----+-----------------+------+
1 row in set (0.03 sec)


Binary 2006-09-01 14:00 发表评论
]]>
Hibernate Annotations 实战http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67090.htmlBinaryBinaryFri, 01 Sep 2006 05:59:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67090.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67090.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67090.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67090.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67090.html阅读全文

Binary 2006-09-01 13:59 发表评论
]]>
在filter中關閉sessionhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67085.htmlBinaryBinaryFri, 01 Sep 2006 05:51:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67085.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67085.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67085.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67085.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67085.html利用Thread-Specific Storage撰寫一個HibernateUtil

HibernateSessionUtil.java
								import java.io.Serializable;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.Transaction;

public class HibernateSessionUtil implements Serializable
{
publicstaticfinal ThreadLocal tLocalsess = new ThreadLocal();

publicstaticfinal ThreadLocal tLocaltx = new ThreadLocal();

/*
* getting the thread-safe session for using
*/
publicstatic Session currentSession(){
Session session = (Session) tLocalsess.get();

//open a new one, if none can be found.
try{
if (session == null){
session = openSession();
tLocalsess.set(session);
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
return session;
}

/*
* closing the thread-safe session
*/
publicstatic void closeSession(){

Session session = (Session) tLocalsess.get();
tLocalsess.set(null);
try{
if (session != null && session.isOpen()){
session.close();
}

}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}

/*
* begin the transaction
*/
publicstatic void beginTransaction(){
Transaction tx = (Transaction) tLocaltx.get();
try{
if (tx == null){
tx = currentSession().beginTransaction();
tLocaltx.set(tx);
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}

/*
* close the transaction
*/
publicstatic void commitTransaction(){
Transaction tx = (Transaction) tLocaltx.get();
try{
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack())
tx.commit();
tLocaltx.set(null);
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}

/*
* for rollbacking
*/
publicstatic void rollbackTransaction(){
Transaction tx = (Transaction) tLocaltx.get();
try{
tLocaltx.set(null);
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()){
tx.rollback();
}
}catch (HibernateException e){
thrownew InfrastructureException(e);
}
}

privatestatic Session openSession() throws HibernateException{
return getSessionFactory().openSession();
}

privatestatic SessionFactory getSessionFactory() throws HibernateException{
return SingletonSessionFactory.getInstance();
}
}

 filter中的E式如?/p>

HibernateSessionCloser.java
								public class HibernateSessionCloser implements Filter{

protected FilterConfig filterConfig = null;

public void init(FilterConfig filterConfig)throws ServletException{
this.filterConfig = filterConfig;
}

public void destroy(){
this.filterConfig = null;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
try{
chain.doFilter(request, response);
}
finally{
try{
HibernateSessionUtil.commitTransaction();
}catch (InfrastructureException e){
HibernateSessionUtil.rollbackTransaction();
}finally{
HibernateSessionUtil.closeSession();
}
}

}
}

然後在操作資料n之前加上

HibernateSessionUtil.beginTransaction();
HibernateSessionUtil.currentSession();//取得Session


Binary 2006-09-01 13:51 发表评论
]]>
acegi-security-sample-contacts-filter例子学习(?http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67083.htmlBinaryBinaryFri, 01 Sep 2006 05:45:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67083.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67083.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67083.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67083.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67083.html功能实现分析

q个例子使用了HSQL做数据库Qspring的AOP作ؓ基础Q用Acegi做安全控制组件?br />联系人管理的web应用在启动时候,会做一pd初始化动作:
1. dweb.xml文gQ?/p>

2. q解析文仉的内宏V?br />a) context-param元素?br />i. contextConfigLocation属性。这个属性定义了spring所需要的3个属性文件。它们分别是QapplicationContext -acegi-security.xml、applicationContext-common-business.xml?applicationContext-common-authorization.xml
ii. log4jConfigLocation属性。这个属性定义了log4j配置文g?/p>

b) filter元素?br />q里定义了acegi的一个过滤器。Acegi的大部分qo器都是这样配|的。用FilterToBeanProxylgQ给它传递一个targetClass属性。这个targetClass必须实现javax.servlet.Filter接口?br />q里配置的是FilterChainProxy。这个FilterChainProxy比较好用Q可以ؓ它定义一串filter属性。这些filter会按照定义的顺序被调用。例如,
<bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
</value>
</property>
</bean>
q个qo器的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用来初始化log4jlg的listener?br />iv. HttpSessionEventPublisher。这个组件将发布HttpSessionCreatedEvent和HttpSessionDestroyedEvent事glspring的applicationcontext?br />d) servlet元素?br />i. contacts。这里采用了spring的MVC框架Q?所以这个servlet是spring MVC的一个核心控制器Qorg.springframework.web.servlet.DispatcherServletQ。这个servlet 启动时候,会从contacts-servlet.xml里面d信息Qƈ做相关的初始化?br />v. remoting。也是spring MVC的一个核心控制器。与contacts不同Q这个servlet主要是提供web services服务。这个servlet启动时候, 会从remoting-servlet.xml里面d信息Qƈ做相关的初始化?br />e) taglib元素。这里定义了spring的标f) {ֺ?br />3. 解析applicationContext-acegi-security.xml?br />a) qo器链。定义了一个FilterChainProxyQb) q指c) 定了一pd的过滤器链。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
d) 认证理器。这个管理器由acegi提供。这个管理器需要一个providers参数。这个providers参数包含了提供系l认证的对象?br />i. daoAuthenticationProvider。一般用戯证?br />ii. anonymousAuthenticationProvider。匿名用戯证?br />iv. rememberMeAuthenticationProvider。记住我认证?/p>

e) 密码加密。这里定义了一个acegi的Md5法加密对象Md5PasswordEncoder?br />f) 定义了一个jdbcDao实现cR这个类由acegi提供的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。这个对象需要一个dataSource的参数?br />g) 定义daoAuthenticationProvider。这个对象由acegi提供。它?个属性:
authenticationDao。这里指向前面定义的jdbcDao?br />userCache。这里指向后面定义的user~存对象?br />passwordEncoder。这里指向前面定义的密码加密对象?br />h) 用户~存理?br />Z~存userQ这里用spring的ehcache来缓存user。缓存机Ӟ
i. 定义~存理器――CacheManager。这个对象是spring的EhCacheManagerFactoryBean对象
ii. 定义user~存实际执行对象――UserCacheBackend。这个对象是spring的EhCacheFactoryBean。它有两个属性:
1. cacheManager。这里指向前面定义的~存理器?br />2. cacheName?br />iii. 定义user~存――UserCache。它是acegi提供的EhCacheBasedUserCache对象。它有一个属性:
1. cache。这里指向的是前面定义的userCacheBackend?/p>

i) 定义接收来自DaoAuthenticationProvider的认证事件的listener――LoggerListener?br />j)
4. 解析applicationContext-common-business.xml?br />a) dataSource.
q里使用了spring的DriverManagerDataSource对象。这个对象是一个JDBC数据源的定义?br />b) TransactionManager。这里用spring的DataSourceTransactionManager对象?br />c) 事务拦截器。这里用spring的事务拦截器TransactionInterceptor。它?个属性:
transactionManager。这个属性指向前面定义的TransactionManager?br />transactionAttributeSource。这个属性里Q?指定了ContactManager的各个方法的事务斚w的要求?br />d) DataSourcePopulator?br />使用sample.contact.DataSourcePopulator对象Q往HSQL里创建相关的表结构和数据?br />实现原理QDataSourcePopulator 实现了接?InitializingBean。其中afterPropertiesSetҎ在spring初始化DataSourcePopulator后被调用?br />e) ContactDao。这里指向一个ContactDaoSpring对象。它l承spring?JdbcDaoSupportQg) q实现ContactDao接口。它是真正实现JDBC操作的对象?br />h) ContactManager。这里用的是spring的ProxyFactoryBean。它?个属性:
i. ProxyInterfaces。代理接口:sample.contact.ContactManager

ii. InterceptorNames。拦截器名称。可以有多个Qiv. q里包括QtransactionInterceptor、contactManagerSecurity、contactManagerTarget。其中,v. transactionInterceptor是前面定义的事务拦截器。ContactManagerSecurity则是?applicationContext-common-authorization.xml里定义的Ҏ调用授权?br />i) ContactManagerTarget。这里指向的是sample.contact.ContactManagerBackend对象?ContactManagerBackend实现了ContactManager接口和InitializingBean接口。它?个自定义属性: contactDao和basicAclExtendedDao。这里会调用ACL的APId些创建权限和删除权限的工作?/p>

Binary 2006-09-01 13:45 发表评论
]]>
acegi-security-sample-contacts-filter例子学习(一)http://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67082.htmlBinaryBinaryFri, 01 Sep 2006 05:44:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67082.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67082.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67082.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67082.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67082.html q是一?/span> Acegi 官方的例子。它以联pMh的管理ؓ例子Q说明如何?/span> Acegi 作权限控制。这个例子包含在 acegi 的包里面。下载地址Q?/span> http://prdownloads.sourceforge.net/acegisecurity/acegi-security-0.8.3.zip?download?/span>

联系人管理说明了下列中心?span lang="EN-US">Acegi安全控制能力:

  • Role-based security Q基于角色的安全Q?/span> ――每个责Mh都是某个角色的一员。而角色被用来限制Ҏ些安全对象的讉K?/span>
  • Domain object instance security Q域对象实例安全Q?/span> ――合同,q个pȝ里的主要域对象,拥有一个访问控制列表( ACL Q,用来指明谁允许读、管理和删除对象?/span>
  • Method invocation security Q方法调用安全)―?/span> q个 ContactManager 服务层对?/span> 包含一些受保护的和公开的方法?/span>
  • Web request security Q?/span> Web h安全Q?/span> ――这个?/span> /secure ?/span> URI 路径被?/span> Acegi 安全保护Q得没?/span> ROLE_USER 角色的用h法访问?/span> .
  • Security unaware application objects Q保护未知的应用对象Q?/span> ――受保护的对象与 Acegi 之间没有明显的耦合或契U,所以它们没有察觉到安全是由 Acegi 提供的?/span> *
  • Security taglib usage Q安全标{ֺ使用Q?/span> ――所有的 JSP 使用 Acegi 安全标签库来装安全信息?/span> *
  • Fully declarative security( 完全声明式的安全 ) ――每一个安全方面特性都是在 application context 里面使用标准?/span> Acegi 安全对象来配|的?/span> *
  • Database-sourced security data Q支持数据库来源的安全数据) ――所有的用户、角色和 ACL 信息都可以从一个兼?/span> JDBC 的内存数据库获得?/span>
  • Integrated form-based and BASIC authentication Q集成基于表单和 BASIC 验证Q―?/span> M BASIC 验证头部被检以及作为验证用。默认用基于表单的普通交互式验证?/span>
  • Remember-me services Q记住我的服务)―?/span> Acegi 安全的插件式的?/span> remember-me ?/span> {略被演C。在d表单里有一个相关的选择框与之对应?/span>

联系人管理的业务功能描述Q?/span>

1.1. 每个用户d后,可以看到一个联pMh列表。例如,

marissa's Contacts

id

Name

Email

1

John Smith

john@somewhere.com

Del

Admin Permission

2

Michael Citizen

michael@xyz.com



3

Joe Bloggs

joe@demo.com

Del


4

Karen Sutherland

karen@sutherland.com

Del

Admin Permission

Add

说明Q用h有权限访问的联系Z息,不会显C?/span>

2.2. 用户可以增加新的联系Z息?/span>

3.3. 如果有删除权限,用户可以看到在联pMh后面有一个?/span> Del ”链接。用户可以点击这个链接来删除某个联系Z息?/span>

4.4. 如果有管理权限,用户可以看到在联pMh后面有一个?/span> Admin Permission ”链接。用户可以点击这个链接来理讉Kq个联系人的权限。例如,

Administer Permissions

sample.contact.Contact@26807f: Id: 1; Name: John Smith; Email: john@somewhere.com

-R--- [2] dianne

Del

-RW-D [22] peter

Del

A---- [1] marissa

Del

Add Permission Manage

说明Q每一行记录包含有 3 列?/span>

W一列表C权限,例如Q?/span> -RW-D ”表C可诅R可写、可删除?/span>

W二列也表示权限Q但它是以类?/span> unix 权限的数字表达。例如,?/span> [22] ?/span> , 表示可读、可写、可删除?/span>

W三列是用户名称?/span>

每一行记录后面都有一个?/span> Del ”链接。点击这个链接,可以删除掉指定用户对q个联系Z息的权限?/span>

5.5. 用户可以为某个联pMh信息d权限。例如,

Add Permission

Contact:

sample.contact.Contact@1787005: Id: 1; Name: John Smith; Email: john@somewhere.com


Recipient:


Permission:


说明Q权限是动态添加的。例如,上图中给用户 scott 增加了读联系?/span> John 的权限。那?/span> scott 马上可以看到联pMh John 的信息了?/span>

Binary 2006-09-01 13:44 发表评论
]]>
WebWork教程QServletDispatcherhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67077.htmlBinaryBinaryFri, 01 Sep 2006 05:41:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67077.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67077.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67077.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67077.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67077.html阅读全文

Binary 2006-09-01 13:41 发表评论
]]>
WebWork教程Qvalidatorhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67076.htmlBinaryBinaryFri, 01 Sep 2006 05:40:00 GMThttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67076.htmlhttp://www.aygfsteel.com/lijiajia418/comments/67076.htmlhttp://www.aygfsteel.com/lijiajia418/archive/2006/09/01/67076.html#Feedback0http://www.aygfsteel.com/lijiajia418/comments/commentRss/67076.htmlhttp://www.aygfsteel.com/lijiajia418/services/trackbacks/67076.html 验证框架
WebWork 提供了在 Action 执行之前Q对输入数据的验证功能,它用了其核?/span> XWork 的验证框架。提供了如下功能Q?/span>
1?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   可配|的验证文g。它的验证文件是一个独立的 XML 配置文gQ对验证的添加、修改只需更改配置文gQ无需~译M?/span> Class ?/span>
2?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   验证文g和被验证的对象完全解藕。验证对象是普通的 JavaBean 可以了Q可以是 FormBean 、域对象{)Q它们不需实现M额外的方法或l承额外的类?/span>
3?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   多种不同的验证方式。因为它验证功能是可以承的Q所以可以用多种不同的方式指定验证文Ӟ比如Q通过父类?/span> Action 、通过 Action 、通过 Action 的方法、通过 Action 所使用的对象,{等?/span>
4?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   强大的表辑ּ验证。它使用?/span> OGNL 的表辑ּ语言Q提供强大的表达式验证功能?/span>
5?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   同时支持服务器端和客L验证?/span>
下面我们来看看如何ؓ用户注册d验证功能Q?/span>
1?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   注册我们的验证类?/span>
WebWork Z同的验证要求提供不同的验证类型。一个验证类型,一般是有一个类来提供。这个类必须实现接口Q?/span> com.opensymphony.xwork.validator.Validator Q但我们在写自己的验证类型时Q无需直接实现 Validator 接口Q它有抽象类可供直接使用?/span> ValidatorSupport ?/span> FieldValidatorSupport {?/span>
验证cd在用之前,必须要在 ValidatorFactory Q?/span> com.opensymphony.xwork.validator . ValidatorFactory Q中 注册。可以有二种Ҏ实现验证cd的注册。一、写E序代码q行注册Q它使用 ValidatorFactory cȝ静态方法: registerValidator(String name, String className) ?/span> 二、用配|文?/span> validators.xml q行注册Q要求把文g validators.xml 攑ֈ ClassPath 的跟目录中( /WEB-INF/classes Q。但在实际开发中Q一般都使用W二中注册方法。我们的验证cd注册如下Q?/span>
<validators>
    <validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/>
</validators>
注册验证cd的配|文仉常简单。它使用标签 <validator > 提供名-值对的Ş式注册。这h们的验证文g可以直接引用它的名字?/span>
2?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   开?/span> Action 的验证功?/span>
  如果 Action 要用验证框架的验证功能Q它必须在配|文件中指定拦截器?/span> validation ”,它的定义如下Q?/span>
<interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/> ?/span>
我们的验证文件必M ActionName-validation.xml 格式命名Q它必须被放|到与这?/span> Action 相同的包中。你也可以ؓq个 Action 通过别名的方式指定验证文Ӟ它的命名格式为: ActionName-aliasname-validation.xml 。?/span> ActionName ”是我们 Action 的类名;?/span> aliasname ”是我们在配|文Ӟ xwork.xml Q中定义q个 Action 所用到的名U。这P同一?/span> Action c,在配|文件中的不同定义就可以对应不同的验证文件。验证框架也会根?/span> Action 的承结构去查找 Action 的父c验证文Ӟ如果扑ֈ它会L行这个父cȝ验证?/span>
 
3?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   实现我们的验证文Ӟ RegisterActionSupport-validation.xml
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
<validators>
    <field name="user.username">
    <field-validator type="requiredstring">
            <message>You must enter a value for username.</message>
        </field-validator>
    </field>
    <field name="user.password">
    <field-validator type="requiredstring">
            <message>You must enter a value for password.</message>
        </field-validator>
        <field-validator type="fieldexpression">
            <param name="expression">user.password == verifyPassword</param>
            <message>Passwords don't match.</message>
        </field-validator>
    </field>
    <field name="user.email">
    <field-validator type="email">
            <message>You must enter a valid email.</message>
        </field-validator>
    </field>
    <field name="user.age">
    <field-validator type="int">
            <param name="min">6</param>
            <param name="max">100</param>
            <message>Age must be between ${min} and ${max}, current value is ${user.age}.</message>
        </field-validator>
    </field>
</validators>
说明Q?/span>
1 Q?/span> <field > 标签代表一个字D,它的属性?/span> name ”和面输入框的?/span> name ”属性必需完全一_其实它也是我们的表辑ּ语言?/span>
2 Q?/span> <field-validator > 标签定义我们的验证规则, type 属性的值就是就是我们前面定义的验证cd?/span>
3 Q、验证文件中Q字D늚数据是通过表达式语a从我们的值堆栈( OgnlValueStack Q中取得Q一般是 Action ?/span> Model 对象。例如:我们的字D?/span> user.age ”,它会通过 Action ?/span> getUser().getAge() 来取得用戯入的q龄Q再来根据验证的cd?/span> int ”和最大值最值的参数来判断输入的数据是否能通过验证?/span>
4 Q、不验证是否通过Q我们的 Action 都会执行Q但如果验证没有通过Q它不会调用 Action ?/span> execute() Ҏ?/span>
 
4?span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">   Action 的验证错误信?/span>
如果用户输入的数据验证没有通过Q我们需重新q回输入面Qƈl出错误信息提示。拦截器栈?/span> validationWorkflowStack ”ؓ我们实现了这个功能。它首先验证用户输入的数据,如果验证没有通过不执行我们 Action ?/span> execute() ҎQ而是请求重新返回到输入面?/span>
我们?/span> xwork.xml 配置文g如下Q?/span>
<action name="registerSupport" class="example.register.RegisterActionSupport">
            <result name="success" type="dispatcher">
                <param name="location">/register-result.jsp</param>
            </result>
            <result name="input" type="dispatcher">
                <param name="location">/registerSupport.jsp</param>
            </result>
            <interceptor-ref name="validationWorkflowStack"/>
        </action>
 
通过接口 ValidationAware Q?/span> 我们可以获得cȝ别或字段U别的验证错误信息,q个错误信息也就是我们验证文件中 <message> 标签里的数据?/span> ActionSupport cd实现了此接口Q这样在应用中我们的 Action 只要l承 ActionSupport cd可以了?/span> RegisterActionSupport .java 代码如下Q?/span>
package example.register;
 
import com.opensymphony.xwork.ActionSupport;
 
public class RegisterActionSupport extends ActionSupport {
 
    private User user= new User();
    private String verifyPassword;
   
    public User getUser(){
        returnthis.user;
    }
   
    public String execute(){
        // 在这里调用用h册的业务逻辑Q比如:注册信息存储到数据?/span>
        return SUCCESS;
    }
 
    public String getVerifyPassword(){
        returnthis.verifyPassword;
    }
   
    publicvoid setVerifyPassword(String verPassword){
        this.verifyPassword = verPassword;
    }
}
我们 WebWork ?/span> UI 标签库直接提供了验证错误信息昄功能。如果字D别的验证没有通过Q它会在输入框上ҎC验证文件定义的错误提示信息。我们将用户输入的页面更改如下:
registerSupport.jsp
<%@ taglib uri="webwork" prefix="ww" %>
<html>
<head><title>Register Example</title></head>
<body>
<table border=0 width=97%>
<tr><td align="left">
    <ww:form name="'test'" action="'/example/registerSupport.action'" method="'POST'">
            <ww:textfield label="'Username'" name="'user.username'" required="true"/>
            <ww:textfield label="'Password'" name="'user.password'" required="true"/>
            <ww:textfield label="'VerifyPassword'" name="'verifyPassword'" required="true"/>
            <ww:textfield label="'Email'" name="'user.email'" required="true"/>
            <ww:textfield label="'Age'" name="'user.age'" required="true"/>
            <ww:submit value="'Submit'"/>
         </ww:form>
</td></tr>
</table>
</body>
</html>
我们上面的例子用的是服务器端验证?/span> WebWork 也ؓ我们提供了方便的客户端验证。它验证自动生?/span> JavaScript 脚本。如果要使用客户端验证只需改变相应的验证类型就可以了(输入面的表单必需使用 <ww:form> 标签Qƈ讄属性?/span> validate="true" ”)。具体的验证cd可以?/span> WebWork 的包 com.opensymphony.webwork.validators 中找到?/span>


Binary 2006-09-01 13:40 发表评论
]]>
վ֩ģ壺 | ʯ| | | | | | Ϳ| | ƽȪ| ǡ| ͼʲ| | | | | | ɽ| կ| Դ| | ˮ| ܱ| ƽ| ƽ| ֱ| ɽ| | | | ˮ| | | ˼| | | | ߰| ϻ| ¡| |