﻿<?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-SoA爱好者-随笔分类-Opensource</title><link>http://www.blogjava.net/51AOP/category/10363.html</link><description>关注SoA发展</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:31:10 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:31:10 GMT</pubDate><ttl>60</ttl><item><title>Frails 介绍.</title><link>http://www.blogjava.net/51AOP/archive/2006/11/17/81778.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 17 Nov 2006 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/11/17/81778.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/81778.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/11/17/81778.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/81778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/81778.html</trackback:ping><description><![CDATA[使用JSF的人都知道,JSF本身是一个很优秀的Web Model 2框架, 具有很多优秀的思想. <br /><br />但是有些时候JSF的使用还是不是十分方便. 尤其是对于初学者而言, 常常被一些莫明其妙的问题搞得晕头转向. <br />相信很多初学者都见到过这个Exception吧: <br /><br />严重: Servlet.service() for servlet jsp threw exception<br />javax.servlet.jsp.JspException: Cannot find FacesContext<br /><br />当我在学习JSF的时候,看到这个Exception我找了半天都没有发现我的代码哪里错了(代码不可能出错,因为是直接copy的书中的源代码 呵呵), 后来不经意间才发现原来访问页面的URL错了, 在JSF配置文件中配置的servlet映射为.jsf,所以访问的URL应该是 .... index.jsf, 而不是.... index.jsp., 就这么一点疏忽就让人白忙活了半天. 郁闷哦.<br /><br />随着学习的深入,这种基本错误是很少再出现了(就算出现也可以马上知道问题的根本), 但是JSF其他的一些限制又是让人感到很郁闷的. 比如 Form数据的提交, JSF规范中为了维护服务端的组件树 只能使用Post提交, 而不可以使用Get. 而Get方法在很多地方还是非常有用的. <br /><br />另外还有Faces API使用起来不是十分直接的问题, 要把一个数据放入到session中就要一大串的操作( FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(name, val); ),让人感觉很不爽.<br /><br />....<br /><br />如果你经常遇到这些问题, 那么现在我将告诉你一个好消息, 有了Frails 这些问题都可以轻而易举的解决了.<br /><br />我们先来看看Frails是什么?<br /><br />在Frails主页上定义 <a href="http://frails.hexiao.cn/what-is-frails.html" target="_blank">http://frails.hexiao.cn/what-is-frails.html</a><br /><br />what is frails?<br /><br />Frails 是基于JSF上的一个开发效率和RoR可以向媲美的JavaEE框架 !<br /><br />Ruby On Rails(RoR)因为在开发web程序的高效性而风行一时(可能现在仍然很热), 那些RoR的支持者说, RoR可以比java的开发效率高出10倍以上,我们对此观点持怀疑的态度. 我们相信,如果有正确的开发方法来支持现在的Java web framework,则 Java web开发的效率 不会如此的低下.所以 我们研究了一下RoR的实现机制,来实现我们Java框架中的RoR. 因此, 我们提供一个在开发效率上和RoR可以媲美的JavaEE开发框架 -- Frails !<br /><br />知道了Frails是什么后, 我们再来看看Frails有什么特性, 能给JSF带来什么功能上的增强.<br /><br /><br />在Frails主页上列举了Frails的如下主要特性: <a href="http://frails.hexiao.cn/frails-features.html" target="_blank">http://frails.hexiao.cn/frails-features.html</a><br /><br />Frails(Java Server Faces On Rails)基于Java Server Faces (JSF),并将提供对 Hibernate和Spring的支持. 主要特征如下:<br /><br />Frails 让开发者使用约定(习惯)和注解(annotations)来省略在 faces-config.xml 文件中 managed-bean 和 navigation-rule的配置. <br />Frails 提供一个更简单的方法来使用 Faces API. <br />Frails 重定向非 faces 请求为一个 faces 请求,这样可以避免因为URL输入的疏忽导致的异常. <br />Frails 提供一些预定义的 Managed Bean 基类让开发者扩展 . <br />Frails 可以让开发者在 Managed Bean 中使用注解(Annotation)来支持AOP功能 ,如 函数拦截(method interception). <br />Frails 提供 Managed Bean 属性的injection 和 outjection <br />Frails 中的Hibernate GenericDao 对象提供了基本的 CRUD 函数 和 其他一些有用(常用)的数据访问函数. <br />Frails 还提供了一些有用的注解(annotations)来简化JSF的开发. <br />Frails 完全支持 jsf 1.1 和 jsf 1.2 规范,并且可以自动的探测你使用的版本. <br />Frails 提供了对action Method 和 Listener 函数的增强,在这些函数中现在你可以传递参数了. <br /><br /><br />知道这这么多Frails的东东, 那么你不禁要问,如何使用Frails呢. <br /><br />这个是很简单的.   你只需要在web.xml文件中添加下面的配置:<br /><br />&lt;filter&gt;<br />&lt;filter-name&gt;FacesFilter&lt;/filter-name&gt; <br />&lt;filter-class&gt;net.sf.frails.filters.FacesFilter&lt;/filter-class&gt; <br />&lt;/filter&gt;<br />&lt;filter-mapping&gt;<br />&lt;filter-name&gt;FacesFilter&lt;/filter-name&gt; <br />&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />&lt;/filter-mapping&gt;<br /><br /><br />然后把你下载的frails4jsf1.X.jar 放到类路径中就可以使用了. <br /><br />现在可以使用了, 你不禁要问, 如果在使用过程中我遇到了问题, 要到哪里得到帮助呢,如果我有好的Frails改进建议要到哪里提议呢.<br />关于frails的服务问题, 你可以到JavaCafe <a href="http://www.hexiao.cn/jsf/" target="_blank">http://www.hexiao.cn/jsf/</a> 论坛的Frails专区中取得帮助. <br /><br />ok, 这次Frails 简介就先到这里, 希望Frails能在你开发Java web app时给你带来一丝清爽. <br /><br /><br />资源: <br /><br />Frails英文主页 <a href="http://frails.sf.net/" target="_blank">http://frails.sf.net</a><br />Frails中文主页 <a href="http://frails.hexiao.cn/" target="_blank">http://frails.hexiao.cn</a><br />Frails中文论坛 <a href="http://www.hexiao.cn/jsf" target="_blank">http://www.hexiao.cn/jsf</a><br /><br /><img src ="http://www.blogjava.net/51AOP/aggbug/81778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-11-17 16:14 <a href="http://www.blogjava.net/51AOP/archive/2006/11/17/81778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于maven2eclipse plugin的错误解决办法</title><link>http://www.blogjava.net/51AOP/archive/2006/10/19/76142.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Thu, 19 Oct 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/10/19/76142.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/76142.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/10/19/76142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/76142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/76142.html</trackback:ping><description><![CDATA[在直接安装(在线or手动) m2plugin 0.0.6以上时候, 打开Maven2的 <b class="highlight">Preferences</b> page <b class="highlight">就会出现下面的错误<br /></b><span><br />"<b class="highlight">Unable</b><b class="highlight">to</b> create the selected preference page </span><br /><span>Reason: </span><br /><span><b class="highlight">Plug</b>-<b class="highlight">in</b><b class="highlight">org</b>.<b class="highlight"><a title="Apache Maven tools " href="http://maven.apache.org/" target="_blank">Maven</a></b>.<b class="highlight">ide</b>.<b class="highlight">eclipse</b><b class="highlight">was</b><b class="highlight">unable</b><b class="highlight">to</b><b class="highlight">load</b><b class="highlight">class</b></span><br /><span><b class="highlight">org</b>.<b class="highlight">maven</b>.<b class="highlight">ide</b>.<b class="highlight">eclipse</b>.<b class="highlight">preferences</b>.<b class="highlight">Maven2PreferencePage</b>" <br /></span><br /><br /><br />经过多方查找资料发现, 先安装0.0.5 然后升级就可以解决该问题了,<br /><br />不知道为什么要这么麻烦, <br /><br /><br /><img src ="http://www.blogjava.net/51AOP/aggbug/76142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-10-19 13:12 <a href="http://www.blogjava.net/51AOP/archive/2006/10/19/76142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AJAX支持的自动填充表单</title><link>http://www.blogjava.net/51AOP/archive/2006/09/26/71893.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 26 Sep 2006 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/09/26/71893.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/71893.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/09/26/71893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/71893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/71893.html</trackback:ping><description><![CDATA[<p>前几天 在这里<a href="https://bpcatalog.dev.java.net/nonav/ajax/textfield-jsf/design.html">https://bpcatalog.dev.java.net/nonav/ajax/textfield-jsf/design.html</a> 看到了一个实现AJAX支持的自动填充表单, 使用这种方式可以改善用户体验, 举个例子: 在填写用户信息的时候 要填写用户的籍贯, 在全国有这么省市和地区,要是仅仅提供一个下拉菜单来选择, 在这么多选项中选择是否很郁闷呢, 如果也可以让用户输入一部分文字 然后弹出相关的选项这样不是更好吗,用户使用更方便. </p>
		<p>上面的文章介绍的比较详细, 也是jsf的一个ajax扩展项目, 其实对于使用myfaces的用户来说还有个更的选择:使用<strong>MyFaces Sandbox 中的 InputSuggestAjax</strong>   </p>
		<p>
				<a href="http://myfaces.apache.org/sandbox/inputSuggestAjax.html">http://myfaces.apache.org/sandbox/inputSuggestAjax.html</a> </p>
		<p>用法如下:</p>
		<p>1.创建一个managed bean: </p>
		<p>package test;</p>
		<p>import java.util.ArrayList;</p>
		<p>import java.util.List;</p>
		<p>public class Bean {     </p>
		<p>            //In that function all what you had to do is to</p>
		<p>            //Specify what will be displayed in the list</p>
		<p>            //Note that the keyword is the text entered by the user</p>
		<p>            public List getSuggestedWords(String keyword) {</p>
		<p>                        List list = new ArrayList();</p>
		<p>                        list.add(keyword + " Ahmed Saleh");</p>
		<p>                        list.add(keyword + " Kahki");</p>
		<p>                        list.add(keyword + " Kourany");</p>
		<p>                        list.add(keyword + " Kiki");</p>
		<p>                        list.add(keyword + " Saleh Abouetta");</p>
		<p>                        list.add(keyword + " Hashim");</p>
		<p>                        return list;</p>
		<p>            }</p>
		<p>            public String getCurrentValue() {</p>
		<p>                        return currentValue;</p>
		<p>            }<br />            public void setCurrentValue(String currentValue) {</p>
		<p>                        this.currentValue = currentValue;</p>
		<p>            }<br />            String currentValue;</p>
		<p>}</p>
		<p>2.     jsp 页面代码</p>
		<p>&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/html">http://java.sun.com/jsf/html</a>" prefix="h" %&gt;</p>
		<p>&lt;%@ taglib uri="<a href="http://java.sun.com/jsf/core">http://java.sun.com/jsf/core</a>" prefix="f" %&gt;</p>
		<p>&lt;%@ taglib uri="<a href="http://myfaces.apache.org/sandbox">http://myfaces.apache.org/sandbox</a>" prefix="s" %&gt;</p>
		<p>&lt;html&gt;</p>
		<p>&lt;head&gt;</p>
		<p>&lt;title&gt;Ajax JSF sample (InputSuggestAjax)&lt;/title&gt;</p>
		<p>&lt;/head&gt;</p>
		<p>&lt;body&gt;</p>
		<p>&lt;f:view&gt;</p>
		<p> &lt;h:form&gt;</p>
		<p>  &lt;h:outputText value="Enter your name : "/&gt;</p>
		<p>   &lt;s:inputSuggestAjax suggestedItemsMethod="#{bean.getSuggestedWords}" </p>
		<p>    value="#{bean.currentValue}" /&gt;</p>
		<p>   &lt;br /&gt;</p>
		<p>   &lt;h:commandButton action="" value="Submit"/&gt;</p>
		<p>   &lt;br /&gt;</p>
		<p>   &lt;h:outputText value="Your name is #{bean.currentValue}"/&gt;</p>
		<p> &lt;/h:form&gt;</p>
		<p>&lt;/f:view&gt;</p>
		<p>&lt;/body&gt;     </p>
		<p>&lt;/html&gt;  </p>
		<p> 3.  web.xml配置</p>
		<p>&lt;context-param&gt;</p>
		<p>  &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;</p>
		<p>  &lt;param-value&gt;client&lt;/param-value&gt;</p>
		<p>&lt;/context-param&gt;</p>
		<p>//Instead of server make the state saving method on the client to make it works</p>
		<p> 4. 输出页面:</p>
		<div align="left" forimg="1">
				<a href="http://hiphotos.baidu.com/jsfcn/abpic/item/9325da43a19e551372f05de1.jpg" target="_blank">
						<img class="blogimg" src="http://hiphotos.baidu.com/jsfcn/abpic/item/9325da43a19e551372f05de1.jpg" border="0" small="1" />
				</a>
		</div>
		<p>版本为   1.1.4 示例代码提供<a href="http://jroller.com/page/HazemBlog" target="_blank">Hazem</a> <a href="http://bbs.hexiao.cn/read.php?fid=11&amp;tid=19&amp;fpage=1">http://bbs.hexiao.cn/</a> </p><img src ="http://www.blogjava.net/51AOP/aggbug/71893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-09-26 09:41 <a href="http://www.blogjava.net/51AOP/archive/2006/09/26/71893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 问题: Cannot serialize session attribute XXX  for  ..的解决办法</title><link>http://www.blogjava.net/51AOP/archive/2006/09/25/71662.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Mon, 25 Sep 2006 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/09/25/71662.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/71662.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/09/25/71662.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/71662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/71662.html</trackback:ping><description><![CDATA[<p>在关闭和重启Tomcat 5时, tomcat 会试图 serialize存在的session资源. 如果 sessions中相关的对象没有实现 serializable 接口, 就会出现Cannot serialize session attribute XXX  for  异常.</p>
		<p>如果你不想看到该异常, 也不想保存session. 那么你可以在项目部署描述文件中(如. test.xml,)(instead of just exploding the war)  的  &lt;Context&gt; tags中间 加上 :<br />&lt;Manager className="org.apache.catalina.session.PersistentManager" <br />saveOnRestart="false"/&gt;<br />这样 tomcat 在关闭的时候就不会保存session资源了.</p>
		<p>
				<br />你也可以在server.xml中指定上面的值. 这也所有的程序都使用这个设置了.</p>
		<p> </p>
		<p>试试看. </p><img src ="http://www.blogjava.net/51AOP/aggbug/71662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-09-25 10:15 <a href="http://www.blogjava.net/51AOP/archive/2006/09/25/71662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用G4JSF集成 Google Web Toolkit 和 JSF(3)</title><link>http://www.blogjava.net/51AOP/archive/2006/09/07/68165.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Thu, 07 Sep 2006 00:32:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/09/07/68165.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/68165.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/09/07/68165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/68165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/68165.html</trackback:ping><description><![CDATA[<p>原文:http://www.theserverside.com/tt/articles/article.tss?l=GWTandJSF</p>
		<p>翻译:icess <a href="http://blog.matrix.org.cn/page/icess"><font color="#800080">http://blog.matrix.org.cn/page/icess</font></a> <a href="http://bbs.hexiao.cn/read.php?fid=15&amp;tid=15" target="_blank"><font color="#800080">讨论</font></a></p>
		<h2>AJAX, AJAX, AJAX </h2>
		<p>如果你听说过 GWT,那么你一定也听说过它的一个核心特性就是 AJAX 支持.在 GWT中, the "X" part,在客户端和服务器端来回传递数据, 该功能是通过RPC (Remote Procedure Call) 机制实现的而不是使用 XMLHttpRequest object. </p>
		<p>不管这些,你想在服务器端做什么是有你决定的. Google称它为"Server Agnostic". </p>
		<p>让我们看看如何添加 AJAX 方式的异步通信到我们的程序中. </p>
		<h2>Asynchronous Communication in Hosted Mode </h2>
		<p>在下个阶段中,我们将改变该程序的环境.我们添加一个用户可以输入姓名的文本域,一旦按钮被点击了,请求将会发送到服务器端.服务器将返回出现在弹出窗口的消息.为了跟踪请求和响应,我们添加一个文本标签来显示请求的状态. </p>
		<p>为了在服务器和客户端传送数据.我们使用两个Java beans.  – 一个把数据带回服务器端,一个把响应带回客户端. . </p>
		<h2>Client-Side Coding </h2>
		<p>28. 在JavaSource中创建一个 demo.gwt.client.EventData 类,内容如下:</p>
		<p>package demo.gwt.client;<br /><br />import org.ajax4jsf.gwt.client.GwtFacesEvent;<br /><br />public class EventData extends GwtFacesEvent {<br />String name;<br /><br />public String getName() {<br />return name;<br />}<br /><br />public void setName(String name) {<br />this.name = name;<br />}<br /><br />}<br /></p>
		<p>用来在客户端到服务器端传送数据的类(发送事件)应该继承 G4jsf的 GwtFacesEvent类. </p>
		<p>29. 创建另外一个类 demo.gwt.client.ResultGreeting. </p>
		<p>内容如下:</p>
		<p>package demo.gwt.client;<br /><br />import org.ajax4jsf.gwt.client.GwtFacesResult;<br /><br />public class ResultGreeting extends GwtFacesResult {<br />String greetingText;<br /><br />public String getGreetingText() {<br />return this.greetingText;<br />}<br /><br />public void setGreetingText(String greetingText) {<br />this.greetingText = greetingText;<br />}<br />}<br /> </p>
		<p>从服务器端带来响应的类应该继承G4jsf的 GwtFacesResult 类. </p>
		<p> GwtFacesEvent 和GwtFacesResult 都实现了  com.google.gwt.user.client.rpc.IsSerializable 接口,用来序列化在客户端和服务器端传递的被GWT使用的数据. </p>
		<p>让我们更新我们的widget 类. </p>
		<p>30. 打开demo.gwt.client.HelloWidgetEntryPoint 使用下面代码替换它:</p>
		<p>package demo.gwt.client;<br /><br />import java.util.Map;<br /><br />import org.ajax4jsf.gwt.client.ComponentEntryPoint;<br />import org.ajax4jsf.gwt.client.GwtFacesServiceAsync;<br /><br />import com.google.gwt.user.client.Element;<br />import com.google.gwt.user.client.Window;<br />import com.google.gwt.user.client.rpc.AsyncCallback;<br />import com.google.gwt.user.client.ui.Button;<br />import com.google.gwt.user.client.ui.ClickListener;<br />import com.google.gwt.user.client.ui.HorizontalPanel;<br />import com.google.gwt.user.client.ui.Label;<br />import com.google.gwt.user.client.ui.TextBox;<br />import com.google.gwt.user.client.ui.Widget;<br /><br />/**<br />* Entry point classes define &lt;code&gt;onModuleLoad()&lt;/code&gt;.<br />*/<br />public class HelloWidgetEntryPoint extends ComponentEntryPoint {<br />Label status;<br />TextBox input;<br />protected Widget createWidget(final String id) {<br /><br />Map m = getWidgetParams(id);<br />final String buttonLabel = (String) m.get("buttonLabel");<br /><br /><br />HorizontalPanel panel = new HorizontalPanel();<br /><br /><br />input = new TextBox();<br />status = new Label("Loaded.");<br /><br />final GwtFacesServiceAsync service = createFacesService(id);<br /><br />final AsyncCallback callback = new AsyncCallback() {<br />public void onSuccess(Object result) {<br />if (null != result) {<br />status.setText("Loaded");<br />String greeting =  ((ResultGreeting)result).getGreetingText();<br />Window.alert(greeting);<br />} else {<br />status.setText("Request finished, but the result is empty");<br />}<br />}<br /><br />public void onFailure(Throwable caught) {<br />status.setText("Error call :" + caught.getMessage());<br />}<br />};<br />Button btn = new Button(buttonLabel, new ClickListener() {<br />public void onClick(Widget sender) {<br />EventData eventData = new EventData();<br />eventData.setName(input.getText());<br />service.sendEvent(eventData, callback);<br />status.setText("Loading...");      <br />      }<br />});<br /><br /><br />panel.add(input);<br />panel.add(btn);<br />panel.add(status);<br />return panel;<br />}<br />}<br /></p>
		<p>这里有3个重要的部分.1.组件的布局.我们创建了一个水平面板,然后添加了一个input box,button,和text label. </p>
		<p>2.声明了异步服务和事件,它继承至异步模型的AJAX请求. </p>
		<p>...<br />final GwtFacesServiceAsync service = createFacesService(id);<br />...<br />Button btn = new Button(buttonLabel, new ClickListener() {<br />public void onClick(Widget sender) {<br />EventData eventData = new EventData();<br />eventData.setName(input.getText());<br />service.sendEvent(eventData, callback);<br />status.setText("Loading...");      <br />      }<br />});<br />...<br />: </p>
		<p> </p>
		<p>我们添加ClickListener 到button上. 当 On Click 事件发生时,我们创建并且使用输入的数据填充  EventData bean 然后使用异步服务发送该事件.在代码的组后一行,我们设置text label的文本为 "Loading…",因此在  AJAX request 开始的时候,用户可以看到变化 . </p>
		<p>3.发送事件,我们注册了一个回调函数.  </p>
		<p>.........<br />.........<br />final AsyncCallback callback = new AsyncCallback() {<br />public void onSuccess(Object result) {<br />if (null != result) {<br />status.setText("Loaded");<br />String greeting =  ((ResultGreeting)result).getGreetingText();<br />Window.alert(greeting);<br />} else {<br />status.setText("Request finished, but the result is empty");<br />}<br />}<br /><br />public void onFailure(Throwable caught) {<br />status.setText("Error call :" + caught.getMessage());<br />}<br />};<br />...........<br />...........<br /></p>
		<p>Callback 是 Google toolkit中AsyncCallback  类的一个接口.我们实现了两个方法 onSucess and onFailure. 在onSuccess情况下, 我们添加了一个附加的检测到来的结果.如果我们没有受到一个期望的类,我们标记在状态文本中.  </p>
		<p>现在我们完成了客户端的代码.如果你使用  Hosted Mode (with the "ant shell" command)来启动程序, 你将看到 "Request finished, but the result is empty", 因为我们还没有写服务器端代码.</p>
		<p>Server-Side Coding </p>
		<p>在Hosted Mode中的服务器端代码, 在server包中的一个类扮演了一个重要角色. </p>
		<p>31. 打开JavaSource中的demo.gwt.server.MockHelloWidget java 文件. </p>
		<p> sendEvent 函数复杂发送响应到客户端 </p>
		<p>32. 把sendEvent函数替换为下面的内容.:</p>
		<p>public GwtFacesResult sendEvent(GwtFacesEvent event){<br /><br />        ResultGreeting result = new ResultGreeting();<br />        result.setGreetingText( "Hello " + <br />((EventData)event).getName() );<br />               return result;<br />}<br /> </p>
		<p>33. 导入需要的类:</p>
		<p>import demo.gwt.client.ResultGreeting;<br />import demo.gwt.client.EventData;</p>
		<p>The parameter of the method points to the event content that came from the client. What we do here is create the Result bean filling it with a greeting message and then returning. </p>
		<p>34.在Hosted Mode中启动ant: </p>
		<p>
				<tt>
						<font face="新宋体">ant shell</font>
				</tt>
		</p>
		<p>现在程序如下: </p>
		<p>
				<img height="459" src="http://www.theserverside.com/tt/articles/content/GWTandJSF/figure5.jpg" width="600" />
		</p>
		<h2>Adding JSF Listeners for Run-Time Mode </h2>
		<p>处理JSF的事件和Hosted Mode的代码差不多. 客户端代码不变.在服务器端 , G4jsf使用 JSF 监听器机制来处理 Ajax events. </p>
		<p>35. 打开 WebContent/pages/Base.xhtml并添加监听器组件声明. </p>
		<p>&lt;widget:component id="main" buttonLabel="#{bundle.buttonLabel}"<br />greeting="Hello #{greetingBean.name}!" &gt;<br />   &lt;gwt:gwtListener method="#{greetingBean.takeGreeting}" <br />   event ="demo.gwt.client.EventData"/&gt;<br />&lt;/widget:component&gt;<br /> </p>
		<p>  gwtListener 元素有两个属性. "method"使用JSFEL指向处理器."event"用来定义事件类型. 事件类型是类的全限定名 .最后一步是实现该函数. </p>
		<p>36. 打开demo.gwt.app.GreetingBean添加下面的代码:</p>
		<p>public ResultGreeting takeGreeting(EventData event) {<br />name = event.getName();<br />ResultGreeting result = new ResultGreeting();<br />result.setGreetingText("Hello " + name + " from JSF!");<br />return result;<br />}<br /> </p>
		<p>37. 和需要导入的类: </p>
		<p>import demo.gwt.client.ResultGreeting;<br />import demo.gwt.client.EventData;<br /></p>
		<p>该函数的签名(signature  )很容易记住,该函数使用来自于客户端的事件作为他的唯一一个参数.返回值为 用来返回结果的事件类型(type of the method equals is just the type of the class used to return the result).在这个函数中,我们合成响应数据并且返回它. </p>
		<p>38. 创建war文件,部署它. </p>
		<p>如果你启动服务器,可以看导: </p>
		<p>
				<img height="449" src="http://www.theserverside.com/tt/articles/content/GWTandJSF/figure6.jpg" width="600" />
		</p>
		<h2>The Last Word </h2>
		<p>就如你看到的,通过G4JSF使用两种互补的技术(GWT and JSF)可以做很多漂亮的事情. 但是,仍然还有很多东西可以进一步添加到G4jsf中.作为一个开源项目, , G4jsf依靠一个开源社区来支持和开发它.如果你只是使用它,那是很好的.但是你也可以加入到G4JSF社区中来, 帮助G4JSF让他做的更好.  Come visit us at: </p>
		<p>
				<a href="https://ajax4jsf.dev.java.net/">
						<font color="#800080">https://ajax4jsf.dev.java.net</font>
				</a>
		</p>
		<h2>About the Author</h2>
		<p>Sergey Smirnov is Senior Product Manager at Exadel where he oversees the development of major products including Exadel Visual Components Platform and Exadel Studio. He has more than 15 years of in-depth development experience, primarily in the area of Web applications. His experience with JSF goes back to the very early days. For two years, he has served as a member of the JSF expert group. In addition to this, he manages a site for JSF-related resources, <a href="http://www.jsftutorials.net/"><font color="#800080">www.jsftutorials.net</font></a>. Finally, Sergey is the co-lead of the open source project Ajax4jsf (<a href="https://ajax4jsf.dev.java.net/"><font color="#800080">https://ajax4jsf.dev.java.net</font></a>). He can be reached at <a href="mailto:ssmirnov@exadel.com">ssmirnov@exadel.com</a>. </p><img src ="http://www.blogjava.net/51AOP/aggbug/68165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-09-07 08:32 <a href="http://www.blogjava.net/51AOP/archive/2006/09/07/68165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用G4JSF集成 Google Web Toolkit 和 JSF(2)</title><link>http://www.blogjava.net/51AOP/archive/2006/09/07/68163.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Thu, 07 Sep 2006 00:31:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/09/07/68163.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/68163.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/09/07/68163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/68163.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/68163.html</trackback:ping><description><![CDATA[<p>原文:http://www.theserverside.com/tt/articles/article.tss?l=GWTandJSF</p>
		<p>翻译:icess <a href="http://blog.matrix.org.cn/page/icess"><font color="#800080">http://blog.matrix.org.cn/page/icess</font></a> <a href="http://bbs.hexiao.cn/read.php?fid=15&amp;tid=15" target="_blank"><font color="#800080">讨论</font></a></p>
		<p> </p>
		<h2>使用更多的动态文本</h2>
		<p>在我们应用程序的第一个版本中,我们硬编码标签字符到程序中.在下一个版本中,我们将保持该文本与java代码分离. </p>
		<h2>GWT Parameters in Hosted Mode </h2>
		<p>一种方式是使用GWT来定义label 和message. </p>
		<p>13. 打开demo.gwt.client.HelloWidgetEntryPoint.java 文件用下面的代码替换createWidget 方法.</p>
		<p>protected Widget createWidget(final String id) {<br />Map m = getWidgetParams(id);<br />final String buttonLabel = (String) m.get("buttonLabel");<br />final String greeting = (String) m.get("greeting");<br /><br />Button btn = new Button(buttonLabel, new ClickListener() {<br />public void onClick(Widget sender) {<br />      Window.alert(greeting);<br />      }<br />});<br /><br />return btn;<br />}<br /> </p>
		<p>
				<span style="FONT-SIZE: 80%">
				</span>14. 保存文件.</p>
		<p>15. 打开 JavaSource\demo\gwt\public\index.html 文件. </p>
		<p>该文件已经包含了一个如何定义参数的示例,我们只需要修改一下就可以了. :</p>
		<p>16. 修改为如下的代码:</p>
		<p>&lt;html&gt;<br />&lt;head&gt;<br />&lt;meta name="gwt:module" content="demo.gwt.HelloWidget"&gt;<br />&lt;meta name="gwt:property" content="viewid=hello"&gt;<br />&lt;meta name="gwt:property" content="action=/gwtFacesServlet"&gt;<br />&lt;title&gt;gwt-jsf integration&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body bgcolor="white"&gt; <br />&lt;script language="javascript" src="gwt.js"&gt;&lt;/script&gt;<br />&lt;iframe id="__gwt_historyFrame" <br />style="width:0;height:0;border:0"&gt;&lt;/iframe&gt;<br /><br />&lt;span id="_id1" class="demo.gwt.HelloWidget"&gt;<br />&lt;span id="_id1:_data" style="display:none;"&gt;<br />&lt;span  title="buttonLabel"&gt;Say Hello&lt;/span&gt;<br />&lt;span  title="greeting"&gt;Hello GWT!&lt;/span&gt;<br />&lt;/span&gt;<br />&lt;input type="hidden" id="javax.faces.ViewState" <br />name="javax.faces.ViewState" value="_id0:_id0" /&gt;<br />&lt;/span&gt;<br /><br />&lt;/body&gt;<br />&lt;/html&gt;<br /></p>
		<p>17. 在 Hosted Mode 中启动ant: </p>
		<p>
				<tt>
						<font face="新宋体">ant shell</font>
				</tt>
		</p>
		<p>你现在可以看到文本定义在 public/index.html 文件中: </p>
		<p>
				<img height="424" src="http://www.theserverside.com/tt/articles/content/GWTandJSF/figure3.jpg" width="600" />
		</p>
		<p>然而,如果你想创建一个war文件,然后部署它.你将看不到相同的结果.这是因为 public/index.html仅仅在Hosted Mode中其作用.在 Run-Time Mode,我们需要使用 JSF page. </p>
		<h2>Using JSF Expression Language (EL) in Run-Time Mode </h2>
		<p>看一下WebContent\pages\Base.xhtml文件.它包含如下代码:  </p>
		<p>&lt;widget:component id="main"  /&gt; </p>
		<p>这实际上是一个GWT widget 的 JSF 包装. </p>
		<p>18. 定义组件的"buttonLabel" 和"greeting" 参数 : </p>
		<p>&lt;widget:component id="main"  buttonLabel ="Click Me!" <br />greeting="Hello, GWT and JSF"/&gt; </p>
		<p>19. 在Run-Time Mode中运行该项目. </p>
		<p>看看结果. 然而这是不是太简单了, 下面来看看如何使用  JSF EL来使它更动态一些. </p>
		<p>20.现在关闭XHTML 文件.</p>
		<p> </p>
		<h2>Adding a Resource File </h2>
		<p>21. 在JavaSource  文件夹下创建demo/gwt/app/bundle/Labels.properties文件,包含下面的内容:</p>
		<p>#<br />buttonLabel=Say Hello!<br /> </p>
		<h2>Adding a Managed Bean </h2>
		<p>22. 在JavaSource中创建一个类demo.gwt.app.GreetingBean  .使用下面的代码:</p>
		<p>package demo.gwt.app;<br /><br />public class GreetingBean {<br />String name;<br /><br />public String getName() {<br />return name;<br />}<br /><br />public void setName(String name) {<br />this.name = name;<br />}<br />}<br /></p>
		<p>23. 在WEB-INF/faces-context.xml 中注册该bean. </p>
		<p>The faces-context.xml should contain</p>
		<p>:</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.<br />//DTD JavaServer Faces Config 1.1//EN"<br />                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"&gt;<br />&lt;faces-config&gt;<br /><br />&lt;managed-bean&gt;<br />  &lt;managed-bean-name&gt;greetingBean&lt;/managed-bean-name&gt;<br />  &lt;managed-bean-class&gt;demo.gwt.app.GreetingBean&lt;/managed-bean-class&gt;<br />  &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;<br />  &lt;managed-property&gt;<br />   &lt;property-name&gt;name&lt;/property-name&gt;<br />   &lt;property-class&gt;java.lang.String&lt;/property-class&gt;<br />   &lt;value&gt;GWT and JSF&lt;/value&gt;<br />  &lt;/managed-property&gt;<br />&lt;/managed-bean&gt;<br /><br /><br />  &lt;application&gt;<br />  &lt;view-handler&gt;com.sun.facelets.FaceletViewHandler&lt;/view-handler&gt;<br />&lt;/application&gt;<br />&lt;/faces-config&gt;<br /> </p>
		<h2>Finishing Up </h2>
		<p>要让EL工作.我们要在组件类中添加属性到属性map中.</p>
		<p>24. 打开demo.gwt.jsf.UIHelloWidget, 找到 getWidgetParameters() 方法,使用下面的代码替换.</p>
		<p>public Map getWidgetParameters() {<br />HashMap params = new HashMap();<br />params.put("greeting",getAttributes().get("greeting"));<br />params.put("buttonLabel",getAttributes().get("buttonLabel"));<br />return params;<br />}<br /></p>
		<p>25. 添加下面的import语句:</p>
		<p>import java.util.HashMap;</p>
		<p>现在回到 pages/Base.xhtml文件中. </p>
		<p>26. 把资源声明放到该文件的顶部:</p>
		<p>&lt;f:loadBundle basename="demo.gwt.app.bundle.Labels" var="bundle"/&gt;</p>
		<p>27. 修改widget:component的属性:  </p>
		<p>&lt;widget:component id="main" buttonLabel ="#{bundle.buttonLabel}"<br />greeting="Hello #{greetingBean.name}!" /&gt;</p>
		<p>   </p>
		<p> </p>
		<p>现在两个属性都通过el来产生了,一个来自于 bundle resource file, 一个来自于 backing bean. </p>
		<p>如果你创建,部署,启动该程序,你可以看到该程序现在使用的按钮标签了: </p>
		<p>
				<img height="424" src="http://www.theserverside.com/tt/articles/content/GWTandJSF/figure4.jpg" width="600" />
		</p>
		<p>OK,我们已经在JSF环境中参数化了GWT widget的数据. 因此你可以使用同样的方法用数据初始化该  widget  .然而目前这一切看起来想一张单程车票( one-way ticket).我们还没有提到一个非常重要的方面 . </p><img src ="http://www.blogjava.net/51AOP/aggbug/68163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-09-07 08:31 <a href="http://www.blogjava.net/51AOP/archive/2006/09/07/68163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用G4JSF集成 Google Web Toolkit 和 JSF(1)</title><link>http://www.blogjava.net/51AOP/archive/2006/09/06/68081.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Wed, 06 Sep 2006 09:51:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/09/06/68081.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/68081.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/09/06/68081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/68081.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/68081.html</trackback:ping><description><![CDATA[<p>原文:http://www.theserverside.com/tt/articles/article.tss?l=GWTandJSF</p>
		<p>翻译:icess <a href="http://blog.matrix.org.cn/page/icess">http://blog.matrix.org.cn/page/icess</a>  <a href="http://bbs.hexiao.cn/read.php?fid=15&amp;tid=15" target="_blank">讨论</a></p>
		<p>Google Web Toolkit (GWT) 吸引了一些开发者的注意.因为使用它你可以很容易的添加AJAX Web 2.0功能到你的程序中. GWT的设计师努力隔绝用户和JavaScript打交道.你只要使用GWT就可以了,不需要知道如何使用JS. GWT 通过从java代码来产生JS代码的\方式 实现了创建高级客户端JS小组件(client-side JavaScript widgets)的任务. </p>
		<p>与此同时, JavaServer Faces (JSF)聚集了愈来愈多的成为通用服务端web框架的要素.JSF成功的主要原因是:自顶向下的基于组件的方式来开发web程序. 同时JSF带有自己标准的随时可用(out-of-the-box)的UI组件 , 它被设计为简单的包含其他组件库(it is designed for the easy inclusion of other component libraries). </p>
		<p>然而,这两项技术是不可思议的使他们自己获益,他们两个相互结合的非常好(相互互补). GWT 不知道服务端的状态( server-side-agnostic),然而 JSF's基于组件的结构可以很容易的适应任何组件的渲染.在这篇文章中,我们将讨论 (首先通过一个step-by-step 的例子)一个促进这两个技术互补的新框架. </p>
		<p>  <strong>G4jsf</strong> 已经成为Ajax4jsf开源项目的一个子项目了 (<a href="https://ajax4sf.dev.java.net/">https://ajax4sf.dev.java.net</a>) ,有它来产生这种集成库. </p>
		<p>
				<em>GWT和JSF之间看起来是相互竞争的技术,而使用G4JSF则看起来是很自然的互补技术.而G4JSF的任务就是使这种互补关系的技术看起来更自然一些. </em>
		</p>
		<h2>关于G4jsf </h2>
		<p>库文件包含两个部分: </p>
		<ul>
				<li>  <strong>G4jsf组件开发包( Component Developer Kit)包含</strong> 项目骨架产生器. 
</li>
				<li>一个 <strong>run-time library</strong> 提供在GWT widgets和JSF环境之间的过渡作用. </li>
		</ul>
		<p>G4jsf 注意了JSF 和 GWT 两种技术的发展过程\.对于 GWT,  widgets仍然在主机模型中开发,并且在使用 Google browser来调试.  GWT 项目结构包含 /client, /public, 和 /server 包, 并且还在继续维护. </p>
		<p> G4jsf 组件开发包(G4jsf CDK)产生的组件包含两个部分.一是 包含客户端行为的GWT widget .二是负责 GWT widget 和 JSF 环境之间的通信问题.</p>
		<p>G4jsf CDK 使用Facelets方式来写JSF组件. 它比不同的JSP方式要简单, 使用普通的方式要创建一个TLD文件和一个Tag类.使用Facelets的方式是相当直接的. </p>
		<h2>示例程序 </h2>
		<p>在这篇文章中,我们将一步一步的通过一个简单的"Hello, World" 例子来讲述G4JSF的主要功能.我们也创建一个实际的例子,a4j-gwtdemo. 在这里 <a href="http://livedemo.exadel.com/a4j-gwtdemo/">http://livedemo.exadel.com/a4j-gwtdemo/</a> 可以看到该例子.</p>
		<p>你可以从Ajax4jsf示例页面上下载到示例的源代码和war部署文件 <a href="https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html#examples"><font color="#800080"></font>.<font color="#000000">该</font></a><a href="https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html#examples.该">https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html#examples</a> 文章描述的最终示例版本在哪里也可以下载到.</p>
		<p>虽然我们使用专业的工具(大部分是Ant)来建构这篇文章中的示例,但是这些例子并不需要任何特殊的开发工具,你只需要产生一个标准的Java项目就可以了,只要注意一个非常重要的关于 GWT compiler的问题就可以了.它产生组件的JavaScript代码,这些代码应该在META-INF/gwt 文件夹下面 (在 WEB-INF/classes中).  我们建构代码的compile.js目标启动编译器并且把结果放到一个 JavaSource 目录中. 确定你的工具copy这些代码到deployable code中. </p>
		<h2>下载和设置 </h2>
		<p>1. 访问<a href="https://ajax4jsf.dev.java.net/nonav/ajax/gwt/gwt-cdk.html">https://ajax4jsf.dev.java.net/nonav/ajax/gwt/gwt-cdk.html</a> 来下载G4jsf CDK.</p>
		<p>为了使用G4jsf CDK, 你需要Google Web Toolkit SDK. 由于版权问题请到这里单独下载<a href="http://code.google.com/webtoolkit/download.html"><font color="#800080">http://code.google.com/webtoolkit/download.html</font></a>.</p>
		<p>2. 保存GWT SDK  .</p>
		<p>3. 把G4JSF CDK中的  build.properties.sample 重命名为 build.properties,打开它,把gwt.home改为你的本地GWT 主目录.</p>
		<p>例如,你把 Google Web Toolkit SDK 解压到:<br /><font face="新宋体"><tt>D:/gwt-windows-1.1.0</tt><br /></font>你应该把build.properties 文件中的GWT.home改为下面的代码: <br /><font face="新宋体"><tt>gwt.home=D:/gwt-windows-1.1.0</tt><br /></font></p>
		<p>4. 编辑,保存文件</p>
		<p>初始化工作已经做好了,下面来产生项目框架. </p>
		<h2>产生一个项目框架 </h2>
		<p>在刚才的目录下的build文件中有个 "create-component" target. 它需要俩个运行参数: </p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="0">
				<tbody>
						<tr>
								<td valign="top" width="79">
										<p>out </p>
								</td>
								<td valign="top" width="559">
										<p>产生的项目代码文件存放的目录.路径的最后一部分为项目的名字</p>
								</td>
						</tr>
						<tr>
								<td valign="top" width="79">
										<p>m odule</p>
								</td>
								<td valign="top" width="559">
										<p> GWT module的全限定名. 产生的JSF 组件类型将有同样的名字. </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>让我们命名模型为 demo.gwt.HelloWidget 保存项目的名字为, KickStart, 在D:/workspace/ 文件夹下. (Of course, you can change any of these.) </p>
		<p>5.使用下面的命令运行ant: </p>
		<p>
				<tt>
						<font face="新宋体">ant -Dout=D:/workspace/KickStart -Dmodule=demo.gwt.HelloWidget create-component</font>
				</tt>
		</p>
		<p>Ant应该产生了该项目文件</p>
		<p>6. 导航到项目目录.</p>
		<h2>"Hello, world!" with GWT </h2>
		<p>让我们来激活我们的项目.我们在标准的GWT Hosted Mode中来看看效果,在下个部分中将在servlet container中 来允许该例子. </p>
		<p>7.打开 JavaSource/demo/gwt/client/HelloWidgetEntryPoint.java文件.</p>
		<p>它包含一个 HelloWidgetEntryPoint 类, 里面有个返回null的方法. </p>
		<p>8. 使用下面的代码替换该方法: </p>
		<pre>public class HelloWidgetEntryPoint extends ComponentEntryPoint {

 protected Widget createWidget(final String id) {
  
   Button btn = new Button("Click me", new ClickListener() {
        public void onClick(Widget sender) {
         Window.alert("Hello, World");
        }
  });
  
  return btn;
 }
} 
</pre>
		<p>9. 保存文件,到ant文件夹下面.</p>
		<h2>Hosted Mode </h2>
		<p>10. 使用shell目标启动ant: </p>
		<p>
				<tt>
						<font face="新宋体">ant shell</font>
				</tt>
		</p>
		<p>
				<img height="474" src="http://www.theserverside.com/tt/articles/content/GWTandJSF/figure1.jpg" width="600" />
		</p>
		<p>  Google Toolkit Development shell 和 Google browser 启动了.在browser中显示了我们刚才创建的button.如果你点击button ,一个带问候消息的警告框出现了. </p>
		<p> Google browser包含一个  "Compile/Browser" 按钮.如果你点击它,你可以在你默认的浏览器中查看该示例.  </p>
		<p>目前还没有任何JSF代码搀合进来.到此为之我们只是在使用 "Hosted Mode."你可以在该模式下开发和调试你的 GWT widget . 如果你已经有了开发 GWT的经验了,那么你应该很熟悉它了. G4jsf　ＣＤＫ　的处理过程和这里是一样的. </p>
		<h2>Run-Time Mode </h2>
		<p>下一步是在JSF 环境中运行该示例. </p>
		<p>11.使用 "war" target启动ant: </p>
		<p>
				<tt>
						<font face="新宋体">ant war</font>
				</tt>
		</p>
		<p>ant创建一个文件, build/KickStart.war. 他是一个标准的JaveEE Web 文件. </p>
		<p>12. 把它部署到服务器中. </p>
		<p>例如,复制 KickStart.war到 tomcat的webapps 文件夹下. </p>
		<p>
				<img height="460" src="http://www.theserverside.com/tt/articles/content/GWTandJSF/figure2.jpg" width="600" />
		</p>
		<p>运行该项目 就可以看到同样的效果,但是运行在JSF环境中我们称它为  "Run-Time Mode."我们已经把  GWT widget 包装为JSF 组件了.这才是集成的第一步. </p>
		<p> </p>
		<pre>
				<a href="http://bbs.hexiao.cn/read.php?fid=15&amp;tid=15" target="_blank">讨论</a>
		</pre><img src ="http://www.blogjava.net/51AOP/aggbug/68081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-09-06 17:51 <a href="http://www.blogjava.net/51AOP/archive/2006/09/06/68081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>替换类路径中的jar文件(在eclipse中升级jar文件 -- eclipse使用技巧)</title><link>http://www.blogjava.net/51AOP/archive/2006/09/05/67802.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 05 Sep 2006 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/09/05/67802.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/67802.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/09/05/67802.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/67802.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/67802.html</trackback:ping><description><![CDATA[<p>Replacing JARs on the Build Path  -- Eclipse 技巧</p>
		<p>from:<a class="author" href="http://www.eclipsezone.com/forums/profile.jspa?userID=58312">R.J. Lorimer</a>  </p>
		<p>在维护项目的一个普通的任务就是升级库文件,例如, 你在使用 <a href="http://jakarta.apache.org/commons/collections/"><code>commons-collections </code></a>在你的项目中,现在使用的是3.1,但是现在 3.2 发布了, 你想使用它. 所以你需要使用新的jar来替换旧的jar库文件.在eclipse3.2发布以前你需要做下面的几步来完成它.: </p>
		<p>
		</p>
		<ol>
				<li>Copy 新的jar文件到你的项目lib目录中 
</li>
				<li>通过 操作<code>[right-click project]-&gt;Properties...-&gt;Java Build Path-&gt;Libraries (tab)来删除类路径中的旧jar文件</code></li>
				<li>添加新的jar文件到上面的路径中  
</li>
				<li>如果需要的话还要 重新命名类文件 or 更新文件引用</li>
		</ol>
		<p>
		</p>
		<p>这样做是很郁闷的. 尤其是你使用一个使用很多第三方jar文件的工具时(如 <a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a>,spring) 当你升级这些项目时,你要做很多上面的改动. 是不是很无趣呢.?</p>
		<p>来看看Eclipse 3.2 给我们带来了什么吧.有一个新的特性叫 'Migrate JAR File',用来升级jar文件.要使用该功能,在要替换的jar文件上右击,进入 <code>Build Path </code>子菜单选择 'Migrate JAR file': </p>
		<p>
				<img src="http://www.eclipsezone.com/team/rj/tnt/eclipse_replace_jar/1.jpg" />
		</p>
		<p>你会看到下面的对话框: </p>
		<p>
				<img src="http://www.eclipsezone.com/team/rj/tnt/eclipse_replace_jar/2.jpg" />
		</p>
		<p>如果你不走运也要根改jar文件名的话(保持原来的名字不变)你可以选中那个复选框..</p>
		<p>然后点击finish, 你将看到你的jar文件已经升级了.</p>
		<p>
				<img src="http://www.eclipsezone.com/team/rj/tnt/eclipse_replace_jar/3.jpg" />
		</p>
		<p>尽情享受吧! <a href="http://bbs.hexiao.cn/">http://bbs.hexiao.cn/</a> </p><img src ="http://www.blogjava.net/51AOP/aggbug/67802.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-09-05 14:38 <a href="http://www.blogjava.net/51AOP/archive/2006/09/05/67802.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSF组件 : Rss4JSF - show Rss content in JSF pages</title><link>http://www.blogjava.net/51AOP/archive/2006/08/25/65861.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 25 Aug 2006 13:25:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/25/65861.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/65861.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/25/65861.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/65861.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/65861.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/51AOP/archive/2006/08/25/65861.html'>阅读全文</a><img src ="http://www.blogjava.net/51AOP/aggbug/65861.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-25 21:25 <a href="http://www.blogjava.net/51AOP/archive/2006/08/25/65861.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于apache poi 抽取word文本的问题,</title><link>http://www.blogjava.net/51AOP/archive/2006/08/25/65840.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 25 Aug 2006 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/25/65840.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/65840.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/25/65840.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/65840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/65840.html</trackback:ping><description><![CDATA[用如下的方法<br /><br /><span class="tpc_content">   WordDocument wd = new WordDocument(is);<br />  StringWriter docTextWriter = new StringWriter();<br />  wd.writeAllText(new PrintWriter(docTextWriter));<br />  docTextWriter.close();<br />  bodyText = docTextWriter.toString();   <br />    // bodyText = new WordExtractor().extractText(is);<br />  System.out.println(bodyText);<br /><br /><br /><br />抽取不出所有的文件, 好像有字数限制, 只能抽取前面部分字符. 是不是bug啊, <br /><br /><br /><br />使用过poi的, 有没有遇到这种问题啊, 有没有好的办法呢, 路过的给点建议. 谢谢</span><img src ="http://www.blogjava.net/51AOP/aggbug/65840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-25 18:05 <a href="http://www.blogjava.net/51AOP/archive/2006/08/25/65840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  Ajax4JSF子项目 G4jsf 发布</title><link>http://www.blogjava.net/51AOP/archive/2006/08/20/64599.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Sun, 20 Aug 2006 04:10:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/20/64599.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/64599.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/20/64599.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/64599.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/64599.html</trackback:ping><description><![CDATA[<p>G4jsf is new open source subproject under Ajax4jsf. The subproject's purpose is to maintain an integration library for the Google Widget Toolkit (GWT) and JavaServer Faces (JSF) that wraps Google widgets into JSF components to fully leverage both technologies. G4jsf CDK is a component development kit for making these components.<br /><br />下载: <a href="https://ajax4jsf.dev.java.net/downloads/gwt/g4jsf-cdk-binary.zip" target="_blank">https://ajax4jsf.dev.java.net/downloads/gwt/g4jsf-cdk-binary.zip</a><br /><br />This zip file contains the latest version of G4jsf CDK. <br />Download and unzip it to your local disk. <br />It requires the Google Web Toolkit SDK. Google does not allow the distribution of the Google Web Toolkit SDK, so, if you don't have it, you need to download it directly from: <a href="http://code.google.com/webtoolkit/download.html" target="_blank">http://code.google.com/webtoolkit/download.html</a> and unzip it to your local disk. <br />Rename the build.properties.sample file from the g4jsf-cdk-binary.zip archive to be called build.properties and open it for editing. <br />In this file, set gwt.home to the location of the GWT SDK. For example, if you have your copy of Google Web Toolkit SDK installed into D:/gwt-windows-1.1.0 , then you would set gwt.home this way: <br />gwt.home=D:/gwt-windows-1.1.0Save build.properties <br /><br />附: <strong>Ajax4JSF User Guide中文完全版<br /><br /><a href="http://bbs.hexiao.cn/read.php?fid=3&amp;tid=17&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=3&amp;tid=17&amp;fpage=1</a></strong></p><img src ="http://www.blogjava.net/51AOP/aggbug/64599.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-20 12:10 <a href="http://www.blogjava.net/51AOP/archive/2006/08/20/64599.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用netbeans来监控Http 通讯</title><link>http://www.blogjava.net/51AOP/archive/2006/08/15/63598.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 15 Aug 2006 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/15/63598.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/63598.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/15/63598.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/63598.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/63598.html</trackback:ping><description><![CDATA[<p>
				<font face="Arial" size="3">
						<font face="Times New Roman">在</font>Roumen的blog上,给我们提供了一个使用netbeans的小技巧, 用来监控http通信,</font>
		</p>
		<p>
				<font face="Arial">刚好最近几天做的一个东西要知道通信的细节, 用的都是httpwatch, 没有和ide集成起来,感觉不是很爽. 现在试试这个功能吧. 呵呵</font>
		</p>
		<p>Did you know that you can use NetBeans to monitor all communication of your web application - between the web browser and the web server? Indeed, you can see all the requests, read the headers, see the request parameters, etc. But not only that, you can actually save these requests and replay them. <br /><br />This becomes very handy when testing your web application. For example you want to open a page with different parameters so you replay the request with modified (or even new) parameters. <br /><br /></p>
		<div align="center">
				<img style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" src="http://blogs.sun.com/roller/resources/roumen/http_monitor.jpg" />
				<br />HTTP Monitor in NetBeans</div>
		<p>
				<br />HTTP monitor becomes really handy when working with AJAX. You can see every individual request and response, even though the form wasn't submitted - so you can actually monitor how javascript code requests new XML documents as the user goes through the page. It is quite amazing how much communication there can be between the webpage and server in some AJAX apps. So HTTP monitor can also help you see if you are not doing too many requests to the server. <br /><br />HTTP monitor is accessible via Window | HTTP monitor. In case of Tomcat the monitor is enabled by default, but in case of Sun appserver it needs to be activated in Server Manager. I do not know about the other servers... please add a comment if you know how you can monitor requests to other appservers.</p><img src ="http://www.blogjava.net/51AOP/aggbug/63598.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-15 09:29 <a href="http://www.blogjava.net/51AOP/archive/2006/08/15/63598.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax4jsf User Guide 中文翻译 -- 在JSF中使用AJAX</title><link>http://www.blogjava.net/51AOP/archive/2006/08/11/63094.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 11 Aug 2006 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/11/63094.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/63094.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/11/63094.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/63094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/63094.html</trackback:ping><description><![CDATA[<strong>Ajax4jsf User Guide 中文翻译<br /></strong>
		<span class="tpc_content">翻译专贴: <a href="http://bbs.hexiao.cn/read.php?fid=3&amp;tid=13&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=3&amp;tid=13&amp;fpage=1</a><br /><br />序言<br /><br />Ajax4JSF是一个很容易使用的框架, 在其User Guide中详细介绍了如何使用其功能,找时间学习一下,并翻译出来 以加深理解和方便更多的Java爱好者使用Ajax4jsf 框架.<br /><br />翻译进度和问题可以在论坛讨论. <a href="http://bbs.hexiao.cn/">http://bbs.hexiao.cn/</a><br /><br /><br /><br />第二章是一个简单的入门程序,看完这一章你就可以建立基本的Ajax程序了.<br />Chapter 2. Getting Started with Ajax4jsf<br /><br /><br />环境要求<br />要使用Ajax4JSF 框架你仅仅需要JDK1.4或者更高,任何JSF实现,和你最喜欢的Servlet容器.在下一章我们将给你提供详细的环境信息. <br />Ajax4jsf 被设计为一个容易使用的框架.仅仅有一点简单的设置步骤就可以在你的JSF程序中使用Ajax功能了. <br /><br /><br />下载 Ajax4jsf<br />最新的Ajax4jsf 发布版在这里 <br /><a href="https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html" target="_blank"><br /><font color="#003399">https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html</font><br /></a><br />下载. <br />安装<br />解压 ajax4jsf.zip 文件. <br />复制 ajax4jsf.jar and oscache-2.2.jar 到程序的 WEB-INF/lib 文件夹下. <br />把下面的内容添加到你的程序的 WEB-INF/web.xml 文件中:<br /><div class="section" lang="en"><div class="itemizedlist"><ul type="disc"><li><pre class="programlisting"> &lt;filter&gt;
          &lt;display-name&gt;Ajax4jsf Filter&lt;/display-name&gt;
          &lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
          &lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
          &lt;/filter&gt;
          &lt;filter-mapping&gt;
          &lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
          &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
          &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
          &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
          &lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
          &lt;/filter-mapping&gt;
        </pre><p>注意. 你可以复制和粘贴上面的内容在 README.txt 文件中.</p></li><li><p>添加下面的内容:</p><pre class="programlisting">  &lt;%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%&gt;
        </pre><p>到你每个使用Ajax功能的JSP页面中.</p></li></ul></div></div><div class="section" lang="en"><div class="titlepage"><div><div><h2 class="title" style="CLEAR: both"><a name="d0e99"></a>简单的 AJAX Echo 项目 </h2></div></div></div><p>让我们来看一个简单的JSF项目. 我们仅仅需要一个JSP页面,里面包含一个Form和一些JSF标签: &lt;h:inputText&gt; 和 &lt;h:outputText&gt;. </p><p>我们这个简单的程序应该可以让我们输入一些文字到&lt;h:inputText&gt;中, 然后发送数据到Server,并在 &lt;h:outputText&gt;中显示Server的响应(给我们一个Echo信息). </p><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e106"></a>JSP 页面</h3></div></div></div><p>下面是一个我们需要的页面代码 (echo.jsp) :</p><pre class="programlisting">    &lt;%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%&gt;
    &lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%&gt;
    &lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%&gt;
    &lt;html&gt;
      &lt;head&gt;
        &lt;title&gt;repeater &lt;/title&gt; 
      &lt;/head&gt;
      &lt;body&gt;
        &lt;f:view&gt;
          &lt;h:form&gt;
            &lt;h:inputText size="50" value="#{bean.text}" &gt; 
              &lt;a4j:support event="onkeyup" reRender="rep"/&gt;
            &lt;/h:inputText&gt;
            &lt;h:outputText value="#{bean.text}" id="rep"/&gt;
          &lt;/h:form&gt;
        &lt;/f:view&gt;
      &lt;/body&gt;
    &lt;/html&gt;
      </pre><p>就如你看到的,唯一一行于常给JSF页面代码不同的就是下面的一行</p><pre class="programlisting">    &lt;a4j:support event="onkeyup" reRender="rep"/&gt;
      </pre><p>在这里我们在父标签(&lt;h:inputText&gt;)中添加了一个AJAX 支持. 该支持绑定了JavaScript事件“onkeyup” .因此, 每一次该事件发布给父标签时,我们的程序将发送一个AJAX请求到Server.这意味着我们的受管理的bean将包含该“text” 域中我们输入的最新数据. </p><p>&lt;a4j:support&gt; 标签的“reRender” 属性(attribute)定义我们的页面的哪一部分被更新. 在这里,该页面唯一被更新的部位是 &lt;h:outputText&gt; 标签,因为他的ID值和“reRender” 的属性值向匹配. 在一个页面中更新多个元素(elements)也是很简单的:仅仅把他们的IDs放在 “reRender” 属性中就可以了. </p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e121"></a>数据 Bean</h3></div></div></div><p>当然了,为了运行这个程序我们还需要一个受管理的bean</p><pre class="programlisting">        package demo;
        public class Bean {
        private String text;
        
        public Bean() {
        }
        
        public String getText() {
        return text;
        }
        
        public void setText(String text) {
        this.text = text;
        }
        }       
      </pre></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e128"></a>faces-config.xml</h3></div></div></div><p>下一步, 我们需要在faces-config.xml 中注册上面的bean:</p><pre class="programlisting">    &lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD 	JavaServer Faces Config 1.1//EN"
    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"&gt;
    &lt;faces-config&gt;
      &lt;managed-bean&gt;
        &lt;managed-bean-name&gt;bean&lt;/managed-bean-name&gt;
        &lt;managed-bean-class&gt;demo.Bean&lt;/managed-bean-class&gt;
        &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;
        &lt;managed-property&gt;
          &lt;property-name&gt;text&lt;/property-name&gt;
          &lt;value/&gt;
        &lt;/managed-property&gt;
      &lt;/managed-bean&gt;
    &lt;/faces-config&gt;
      </pre><p>注意:这里没有任何东西直接和Ajax4jsf 有关联.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e137"></a>Web.xml</h3></div></div></div><p>最后,不要忘了添加jar文件和更改 web.xml 文件: </p><pre class="programlisting">    &lt;?xml version="1.0"?&gt;
    &lt;web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
      
      &lt;display-name&gt;a4jEchoText&lt;/display-name&gt;
      &lt;context-param&gt;
        &lt;param-name&gt;javax.faces.STATE_SAVING_METHOD&lt;/param-name&gt;
        &lt;param-value&gt;server&lt;/param-value&gt;
      &lt;/context-param&gt;
      &lt;filter&gt;
        &lt;display-name&gt;Ajax4jsf Filter&lt;/display-name&gt;
        &lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
        &lt;filter-class&gt;org.ajax4jsf.Filter&lt;/filter-class&gt;
      &lt;/filter&gt;
      &lt;filter-mapping&gt;
        &lt;filter-name&gt;ajax4jsf&lt;/filter-name&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;
        &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;
        &lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;
      &lt;/filter-mapping&gt;
      &lt;listener&gt;
        &lt;listener-class&gt;
          com.sun.faces.config.ConfigureListener
        &lt;/listener-class&gt;
      &lt;/listener&gt;
      
      &lt;!-- Faces Servlet --&gt;
      &lt;servlet&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;
          javax.faces.webapp.FacesServlet
        &lt;/servlet-class&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
      &lt;/servlet&gt;
      
      &lt;!-- Faces Servlet Mapping --&gt;
      &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt;
      &lt;/servlet-mapping&gt;
      &lt;login-config&gt;
        &lt;auth-method&gt;BASIC&lt;/auth-method&gt;
      &lt;/login-config&gt;
    &lt;/web-app&gt;
      </pre><p>就这样了, 现在你的程序应该可以工作了.</p></div><div class="section" lang="en"><div class="titlepage"><div><div><h3 class="title"><a name="d0e146"></a>部署</h3></div></div></div><p>最终,你可以在Servlet容器中部署你的程序了. 在你喜欢的容器中部署,然后在你的浏览器中输入: http://localhost:8080/a4jEchoText/echo.jsf </p></div></div><br /><br />第三章 under way................<br /></span><img src ="http://www.blogjava.net/51AOP/aggbug/63094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-11 21:31 <a href="http://www.blogjava.net/51AOP/archive/2006/08/11/63094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Wicket 教程4:如何使用Form 和form组件</title><link>http://www.blogjava.net/51AOP/archive/2006/08/09/62503.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Wed, 09 Aug 2006 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/09/62503.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/62503.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/09/62503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/62503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/62503.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed;" align="center" cellpadding="4" cellspacing="0" height="100%" width="99%">
				<tbody>
						<tr>
								<td colspan="5" bgcolor="#ffffff" valign="top" width="91%">
										<span class="tpc_content">Form大概是动态web中使用最多的吧,在wicket中提供了灵活的form处理和呈现. 可以实现强大的功能,同时使用起来也是很简单的. 看几个示例就知道如何使用了, 下面是一个基本form的示例:<br />代码下载: <a href="http://bbs.hexiao.cn/read.php?fid=9&amp;tid=16&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=9&amp;tid=16&amp;fpage=1</a><br />所需库文件下载: http://bbs.hexiao.cn/read.php?fid=9&amp;tid=12&amp;fpage=1 <br /><font color="seagreen"><b>java code:</b></font><br />// Add a FeedbackPanel for displaying our messages<br />              FeedbackPanel feedbackPanel = new FeedbackPanel("feedback");<br />              add(feedbackPanel);<br /><br />              // Add a form with an onSubmit implementation that sets a message<br />              add(new Form("form") {<br />                     protected void onSubmit() {<br />                            info("the form was submitted!");<br />                     }<br />              });<br /><br />              // 测试button form<br />              Form buttonForm = new Form("buttonForm") {<br />                     protected void onSubmit() {<br />                            info("点击了buttonForm.");<br />                     }<br />              };<br /><br />              Button button1 = new Button("button1") {<br />                     protected void onSubmit() {<br />                            info("button1.onSubmit 被点击了");<br />                     }<br />              };<br />              buttonForm.add(button1);<br /><br />              Button button2 = new Button("button2") {<br />                     protected void onSubmit() {<br />                            info("button2.onSubmit 被点击了");<br />                     }<br />              };<br />              button2.setDefaultFormProcessing(false);<br />              buttonForm.add(button2);<br /><br />              add(buttonForm);<br />              // 测试 Submit link in form<br />              Form submitForm = new Form("submitForm") {<br />                     protected void onSubmit() {<br />                            info("Form onsubmit");<br />                     }<br />              };<br />              add(submitForm);<br />              SubmitLink internal = new SubmitLink("internal") {<br />                     protected void onSubmit() {<br />                            info("internal onsubmit");<br />                     };<br />              };<br />              submitForm.add(internal);<br /><br />              SubmitLink external = new SubmitLink("external", submitForm) {<br />                     protected void onSubmit() {<br />                            info("external onsubmit");<br />                     };<br />              };<br />              add(external);<br /><br />              // 测试TextField And TextArea<br />              final Input input = new Input();<br />              Form textForm = new Form("textForm", new CompoundPropertyModel(input)) {<br />                     protected void onSubmit() {<br />                            info("input :" + input);<br />                            if (input.bool.booleanValue()) {<br />                                   info("Ok, ok... we'll check it");<br />                            } else {<br />                                   info("So you don't want it checked huh?");<br />                            }<br />                     }<br />              };<br />              add(textForm);<br />              textForm.add(new TextField("textField"));<br />              textForm.add(new TextField("integer", Integer.class));<br />              textForm.add(new TextArea("textArea"));<br />              textForm.add(new CheckBox("bool"));<br /><br /><font color="seagreen"><b>Html code:</b></font><br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml%22" target="_blank">http://www.w3.org/1999/xhtml"</a> &gt;<br />&lt;head&gt;<br />    &lt;title&gt;Wicket Examples - component reference&lt;/title&gt;<br />    &lt;link rel="stylesheet" type="text/css" href="style.css"/&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;wicket:link&gt;&lt;a href="CheckAndRadio.html"&gt;[go to the CheckAndRadio]&lt;/a&gt;&lt;/wicket:link&gt;<br /> &lt;h2&gt; Feed back info &lt;/h2&gt;<br />         &lt;span wicket:id="feedback"&gt;feedbackmessages will be put here&lt;/span&gt;<br />       &lt;h1&gt;wicket.markup.html.form.Form&lt;/h1&gt;<br /><br />       &lt;p&gt;<br />       A Form is a component that has special interaction with nested form components.<br />       Form components are components that extend from wicket.markup.html.form.FormComponent,<br />       and which are called controls in the HTML specification. Examples of such controls<br />       are textfields, checkboxes and radio buttons.<br />       Users generally "complete" a form by modifying its controls (entering text,<br />       selecting menu items, etc.), before submitting the form usually by clicking on<br />       a submit button. On a form submit, the form normally goes through a processing cycle of<br />       validation, model updating of the nested controls, possibly persisting (with cookies)<br />       the model values of the controls and calling the form's onSubmit method.<br />       &lt;/p&gt;<br />       &lt;p&gt;<br />       This example shows you the basic Form itself. It has no nested controls, but it does<br />       have an implementation of onSubmit, which sets a feedback message, and it works together<br />       with a feeback panel (a panel that lists any feedback messages that were set).<br />       &lt;/p&gt;<br />       &lt;p&gt;<br />        &lt;form wicket:id="form"&gt;<br />         &lt;input type="submit" value="click me to submit the form and display a message" /&gt;<br />        &lt;/form&gt;<br />        <br />        &lt;h1&gt; button form &lt;/h1&gt;<br />        &lt;form wicket:id="buttonForm"&gt;<br />               &lt;input type="submit" value="non wicket submit button"/&gt;<br />               &lt;input wicket:id="button1" type="submit" value="default wicket button" /&gt;<br />                &lt;input wicket:id="button2" type="submit" value="wicket button with immediate == true" /&gt;<br />        &lt;/form&gt;<br />        <br />        &lt;h1&gt; Submit Link Form&lt;/h1&gt;<br />        &lt;form wicket:id="submitForm"&gt;<br />         &lt;a wicket:id="internal"&gt;Internal SubmitLink&lt;/a&gt;<br />        &lt;/form&gt;<br />         &lt;a wicket:id="external"&gt;External SubmitLink&lt;/a&gt;<br />       &lt;/p&gt;<br />       &lt;h1&gt;TextArea and TextField form&lt;/h1&gt;<br />       &lt;form wicket:id="textForm"&gt;<br /><br />              &lt;table style="border: 2px dotted #fc0; width: 300px; padding: 5px;"&gt;<br />               &lt;tr&gt;<br />                &lt;td&gt;some plain text&lt;/td&gt;<br />                &lt;td&gt;&lt;input type="text" wicket:id="textField" /&gt;&lt;/td&gt;<br />               &lt;/tr&gt;<br />               &lt;tr&gt;<br />                &lt;td&gt;an integer value&lt;/td&gt;<br />                &lt;td&gt;&lt;input type="text" wicket:id="integer" /&gt;&lt;/td&gt;<br />               &lt;/tr&gt;<br />               &lt;tr&gt;<br />                &lt;td&gt;text Area&lt;/td&gt;<br />                &lt;td&gt;&lt;textarea wicket:id="textArea" rows="2" cols="15"&gt;Input comes here&lt;/textarea&gt;&lt;/td&gt;<br />               &lt;/tr&gt;<br />                &lt;tr&gt;<br />                &lt;td valign="top"&gt;I want it checked!&lt;/td&gt;<br />                &lt;td&gt;<br />                &lt;input type="checkbox" wicket:id="bool" /&gt;<br />                &lt;/td&gt;<br />               &lt;/tr&gt;<br />               &lt;tr&gt;<br />                &lt;td colspan="2" align="center"&gt;<br />                 &lt;input type="submit" value="submit" /&gt;<br />                &lt;/td&gt;<br />               &lt;/tr&gt;<br />              &lt;/table&gt;<br /><br />        &lt;/form&gt;<br />        <br />       <br />&lt;/body&gt;<br />&lt;/html&gt;<br /><br /><br /><font color="seagreen"><b>截图:</b></font><br /><img src="http://www.blogjava.net/images/blogjava_net/51aop/13894/r_quickstart5_form1.jpg" /><br /></span>
								</td>
						</tr>
						<form method="post">
						</form>
						<tr bgcolor="#ffffff" valign="bottom">
								<td colspan="5">
										<br />
								</td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/51AOP/aggbug/62503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-09 09:34 <a href="http://www.blogjava.net/51AOP/archive/2006/08/09/62503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  Wicket 教程4:如何使用 Include,Panel,Fragment,Link</title><link>http://www.blogjava.net/51AOP/archive/2006/08/08/62287.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 08 Aug 2006 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/08/62287.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/62287.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/08/62287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/62287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/62287.html</trackback:ping><description><![CDATA[<p>
				<a id="include_panel_fragment_link" name="include_panel_fragment_link">
				</a>
				<span class="entrytitle">Wicket 教程4:如何使用 Include,Panel,Fragment,Link</span>
		</p>
		<p>前面我没看到了如何使用一些基本的markup,和几个示例</p>
		<p>( <a href="http://www.hexiao.cn/blog/index.php?job=art&amp;articleid=a_20060807_153301">http://www.hexiao.cn/blog/index.php?job=art&amp;articleid=a_20060807_153301</a>  ), 这次再来看看几个复杂一点的markup. </p>
		<p>下次来看看 Form 及其相关的markup的使用.</p>
		<p>[b]Include [/b]是一个和JSP中的include指令功能差不多的markup,用来导入一个文件.</p>
		<p>可以使用绝对和相对路径来导入文件, 该类的使用是很简单的.<br />Java code:<br /> ...<br />  add(new Include("header", "header.html"));<br />  add(new Include("footer", "footer.html"));<br />    ...<br />and Html Code:</p>
		<p>   ...<br />  &lt;div&gt;<br />   &lt;div wicket:id="header"&gt;header comes here&lt;/div&gt;<br />   &lt;div&gt;I am the body!&lt;/div&gt;<br />   &lt;div wicket:id="footer"&gt;footer comes here&lt;/div&gt;<br />  &lt;/div&gt;<br />   ...<br /> <br />上面就可以实现一个简单的布局框架.</p>
		<p>
				<br />[b]Panel: [/b]panel有点类似于swing中的panel,用来放置其他markup, panel的使用也</p>
		<p>是很简单的, 如下:<br />创建一个mypanel类:<br />class MyPanel extends Panel {<br /> <br /> public MyPanel(String id) {<br />  super(id);<br />  add(new Label("label", "yep, this is from a component </p>
		<p>proper"));<br />  add(new AnotherPanel("otherPanel"));<br /> }<br />}</p>
		<p>该类继承与Panel,里面添加了两个markup,一个Label,另外一个Panel(Panel可以</p>
		<p>无限嵌套). 然后编写对应的html文件. MyPanel.html</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>" &gt;<br />&lt;head&gt;<br />    &lt;title&gt;Wicket Examples - sample panel&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br /> &lt;wicket:panel&gt;<br />  &lt;p style="border: 2px dotted #fc0; padding: 5px;"&gt;<br />   Here are some panel contents for ya.&lt;br /&gt;<br />   Put arbitrairy Wicket components in your Panels,<br />   like this label: &lt;span wicket:id="label" style="background-</p>
		<p>color: aqua" &gt;to be replaced&lt;/span&gt;, or&lt;br /&gt;<br />   even another panel: &lt;span wicket:id="otherPanel"  </p>
		<p>style="background-color: aqua"&gt;also to be replaced&lt;/span&gt;.&lt;br /&gt;<br />   You can nest panels any deep you want.<br />  &lt;/p&gt;<br /> &lt;/wicket:panel&gt;</p>
		<p>&lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>下面是使用上面的panel的代码,<br />Java code:<br />...<br /> add(new MyPanel("panel"));<br />...<br />Html code:<br />    &lt;span wicket:id="panel"&gt;panel contents come here&lt;/span&gt;</p>
		<p>[b]Fragment:[/b] 当有很多小段信息要组织的时候,使用很多panel可能是不雅观的,这时</p>
		<p>就可以使用Fragment了.<br />示例如下:<br />Java code:<br />...<br />    add(new Fragment("myPanel1", "frag2"));<br />...</p>
		<p>Html code:<br />...<br />&lt;span wicket:id="myPanel"&gt;Example input (will be removed)&lt;/span&gt;<br />            <br />             &lt;wicket:fragment wicket:id="frag1"&gt;panel </p>
		<p>1&lt;/wicket:fragment&gt;<br />             &lt;wicket:fragment wicket:id="frag2"&gt;panel </p>
		<p>2&lt;/wicket:fragment&gt;<br />...</p>
		<p>
				<br />[b]Link:[/b] link就是web页面中的连接了, 这里的link可以是一切连接,如 常用的&lt;a/&gt; </p>
		<p>, button... 这里的link 和JSF中的link所拥有的功能一样强大. <br />下面来看几个示例:<br />普通的link: <br />Java code:<br />...<br /> add(new Link("link1"));<br />...<br />Html code:<br />...<br />&lt;a href="#" wicket:id="link1"&gt;this link is clicked &lt;span </p>
		<p>wicket:id="linkLabel1"&gt;n&lt;/span&gt; times&lt;/a&gt;<br />...<br />使用不同的html 可以显示为不同的样式,如:<br />button样式的按钮:<br />Html code:<br />&lt;button wicket:id="link2"&gt;this button is clicked &lt;span </p>
		<p>wicket:id="linkLabel2"&gt;n&lt;/span&gt; times&lt;/button&gt;</p>
		<p>or:<br />&lt;input type="button" wicket:id="link3" value="this button is clicked n </p>
		<p>times" /&gt;</p>
		<p>[b]ExternalLink:[/b] 是link的一种, 特别用来连接到该站点以外的资源, 示例:<br />Java code:<br />...<br />//   add a link that goes to javalobby<br />add(new ExternalLink("externalLink1", "<a href="http://www.javalobby.org/">http://www.javalobby.org</a>", "To </p>
		<p>JavaLobby"));<br />...</p>
		<p>Html code:<br />...<br /> &lt;a href="#" target="_new" wicket:id="externalLink1"&gt;this body </p>
		<p>will be replaced&lt;/a&gt; <br />...</p>
		<p>[b]PageLink:[/b] 也是link的一种,实现页面之间的跳转: 示例:<br />Java code:<br />...<br /> // 可以有多种方法使用该类,下面是一种推荐的方法<br />  add(new PageLink("pageLink", new IPageLink(){<br />   public Page getPage(){<br />    return new NonBookmarkablePage</p>
		<p>(QuickStart4.this);<br />   }</p>
		<p>   public Class getPageIdentity(){<br />    return NonBookmarkablePage.class;<br />   }<br />  }));</p>
		<p> ...<br />Html code:<br />...<br /> &lt;a wicket:id="pageLink"&gt;go to our private/ non bookmarkable </p>
		<p>page&lt;/a&gt;<br />....</p>
		<p>[b]BookmarkablePageLink:[/b] 也是link的一种,实现一种可以作为书签收藏的连接,也</p>
		<p>就是无状态的连接. 可以带参数也可以不带参数: 示例:</p>
		<p>Java  code :<br />...<br />  add(new BookmarkablePageLink("pageLinkNoArgs", </p>
		<p>BookmarkablePage.class));</p>
		<p>
				<br />  PageParameters parameters = new PageParameters();<br />  parameters.put("message", "This message was passed as a </p>
		<p>page parameter argument");<br />  add(new BookmarkablePageLink("pageLinkWithArgs", </p>
		<p>BookmarkablePage.class, parameters));</p>
		<p>....</p>
		<p>Html code:</p>
		<p>...<br />&lt;p&gt;<br /> &lt;a wicket:id="pageLinkNoArgs"&gt;go to our bookmarkable page </p>
		<p>without passing any arguments&lt;/a&gt;<br /> &lt;/p&gt;</p>
		<p> &lt;p&gt;<br /> &lt;a wicket:id="pageLinkWithArgs"&gt;go to our bookmarkable page </p>
		<p>passing a message argument&lt;/a&gt;<br /> &lt;/p&gt;<br />...</p>
		<p>讨论: <a href="http://bbs.hexiao.cn/thread.php?fid=9">http://bbs.hexiao.cn/thread.php?fid=9</a></p>
		<p>代码下载: <a href="http://bbs.hexiao.cn/read.php?fid=9&amp;tid=15&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=9&amp;tid=15&amp;fpage=1</a> <br />允许所需要的类库,到这里下载: <a href="http://bbs.hexiao.cn/read.php?fid=9&amp;tid=12&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=9&amp;tid=12&amp;fpage=1</a></p><img src ="http://www.blogjava.net/51AOP/aggbug/62287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-08 09:25 <a href="http://www.blogjava.net/51AOP/archive/2006/08/08/62287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Wicket 教程3:使用 PageView 来调试页面</title><link>http://www.blogjava.net/51AOP/archive/2006/08/08/62286.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 08 Aug 2006 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/08/62286.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/62286.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/08/62286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/62286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/62286.html</trackback:ping><description><![CDATA[使用 PageView 来调试页面.<br /><br />Wicket中提供了一个PageView类,顾名思义 就是查看当前page的信息, 使用该类可以显示当前页面的所有组件. <br />使用方法很简单在page中加上一个markup:   &lt;span wicket:id="componentTree"/&gt;<br />然后 添加一下代码到page的构造函数中.<br /><br /><br />add(new PageView("componentTree", this));<br /><br />对于 Wicket教程2 的输出信息如下:<br /><br /><br />[Page class = wicket.quickstart.Index, id = 2]:<br />#<br />Path<br />Size<br />Type<br />Model Object<br />1   <br />_   <br />423 bytes   <br />wicket.markup.html.internal.HtmlBodyContainer   <br />  <br />2   <br />border   <br />980 bytes   <br />wicket.quickstart.MyBorder   <br />  <br />3   <br />border:label   <br />458 bytes   <br />wicket.markup.html.basic.Label   <br />This is a label.   <br />4   <br />border:label2   <br />465 bytes   <br />wicket.markup.html.basic.Label   <br />This is another label.   <br />5   <br />boxBorder   <br />1.2K   <br />wicket.markup.html.border.BoxBorder   <br />  <br />6   <br />boxBorder:inBoxBorder   <br />468 bytes   <br />wicket.markup.html.basic.Label   <br />This is a Box Border   <br />7   <br />boxBorder:multiLineLabel2InBoxBorder   <br />645 bytes   <br />wicket.markup.html.basic.MultiLineLabel   <br />MultiLineLabel shows text that spans multiple lines by inserting line breaks (BR tags) for newlines and paragraph markers (P tags) for sequences of more than one newline.   <br />8   <br />multiLineLabel   <br />633 bytes   <br />wicket.markup.html.basic.MultiLineLabel   <br />MultiLineLabel shows text that spans multiple lines by inserting line breaks (BR tags) for newlines and paragraph markers (P tags) for sequences of more than one newline.   <br />9   <br />name   <br />N/A   <br />wicket.markup.html.basic.Label   <br />Icess   <br />10   <br />test   <br />454 bytes   <br />wicket.markup.html.basic.Label   <br />Hello World!  <br /><img src ="http://www.blogjava.net/51AOP/aggbug/62286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-08 09:22 <a href="http://www.blogjava.net/51AOP/archive/2006/08/08/62286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Wicket 教程2: 如何使用Label,MultiLineLabel,Border,BoxBorder</title><link>http://www.blogjava.net/51AOP/archive/2006/08/07/62193.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Mon, 07 Aug 2006 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/07/62193.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/62193.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/07/62193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/62193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/62193.html</trackback:ping><description><![CDATA[上次介绍了一个wicket的一个HelloWorld入门示例, 今天来看看几个基本的Html Markup的使用: <br />label是用来显示文本信息的(类似于JSF中的outputText),要显示的信息可以从PropertyModel中加载,也就是可以显示动态信息.<br /><br />MultiLineLabel 是分行显示信息(在信息中有分行表示\n), 使用br表示分行,并在多行中用段p组织.<br /><br />Border 是一个方便从用的Layout,类似于swing中的layout, 使用<br />&lt;wicket:border&gt;和&lt;wicket:body&gt;来显示border和内容:如下<br />      &lt;wicket:border&gt;<br />            First &lt;wicket:body/&gt; Last<br />          &lt;/wicket:border&gt;<br /><br />内容显示在&lt;wicket:body&gt;标签处.如: <br />        &lt;span wicket:id = "myBorder"&gt;<br />            Middle<br />          &lt;/span&gt;<br /><br />BoxBorder是在文章周围添加一个黑线框的简单Border.<br /><br />则输出结果为:<br />        &lt;body&gt;<br />            First Middle Last<br />        &lt;/body&gt;<br /><br />示例图片如下:<br />附件包含源代码,<br />使用方法,下载代码,copy到quickstart1中相应包中即可.<br />代码下载: <a href="http://bbs.hexiao.cn/read.php?fid=9&amp;tid=13&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=9&amp;tid=13&amp;fpage=1</a><img src ="http://www.blogjava.net/51AOP/aggbug/62193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-07 15:29 <a href="http://www.blogjava.net/51AOP/archive/2006/08/07/62193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Wicket 入门示例 :Hello World.</title><link>http://www.blogjava.net/51AOP/archive/2006/08/05/61909.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Sat, 05 Aug 2006 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/05/61909.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/61909.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/05/61909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/61909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/61909.html</trackback:ping><description><![CDATA[<span class="tpc_content">Wicket http://wicketframework.org/  是一个借鉴了 Echo 和Tapestry
两个web框架的优点的基础上开发的一个新的web框架, 基于组件是的开发web页面, 类似于开发java中的swing程序,
通过这种方式来开发web框架是中不错的思想. 最近 看看 wicket 感觉还比较简单, 与jsf比起来感觉首先是没有了xml配置文件.
写一个Hello World的入门程序还是比较简单的.下面我们就来看看如何写吧. <br /><br />在附件中的程序是来自于 wicket
quickstart中的一个示例, 我简单的做了一下修改,添加了一个Wicket中 的 Label 标签用来显示 Hello World.
另外是从eclipse中直接导出的.包含了 项目配置文件. 下载附件直接运行 里面的start.java
就可以启动里面自带的Jetty服务器了,然后在浏览器中输入 <br /><a href="http://localhost:8081/quickstart/app" target="_blank">http://localhost:8081/quickstart/app</a><br />  就可以访问到我们的hello world 程序了, <br />now, download the files (Visit here : <a href="http://bbs.hexiao.cn/read.php?fid=9&amp;tid=12&amp;fpage=1">http://bbs.hexiao.cn/read.php?fid=9&amp;tid=12&amp;fpage=1</a> ) ,and enjoy it.</span><img src ="http://www.blogjava.net/51AOP/aggbug/61909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-05 10:38 <a href="http://www.blogjava.net/51AOP/archive/2006/08/05/61909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>decode javascript.encode using java</title><link>http://www.blogjava.net/51AOP/archive/2006/08/01/61178.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 01 Aug 2006 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/08/01/61178.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/61178.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/08/01/61178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/61178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/61178.html</trackback:ping><description><![CDATA[<p>在前面一篇文章(<a href="http://www.hexiao.cn/blog/index.php?job=art&amp;articleid=a_20060730_130422">http://www.hexiao.cn/blog/index.php?job=art&amp;articleid=a_20060730_130422</a>)中, 提到了 关于IE中的 js.edcode的加密问题. 由于要使用这些加密后的信息,就要解密,在网络上找了一个js版本的解密程序, 由于要在java中使用,就把他转化为java代码了, 解密js.encode的java代码如下:</p>
		<p> </p>
		<p>//import java.util.regex.Matcher;<br />//import java.util.regex.Pattern;<br />/**<br /> * Decode encode <br /> * @author icess<br /> * @blog <a href="http://blog.matrix.org.cn/page/icess">http://blog.matrix.org.cn/page/icess</a><br /> */<br />public class EncodeDecode {<br /> final int STATE_COPY_INPUT = 100;</p>
		<p> final int STATE_READLEN = 101;</p>
		<p> final int STATE_DECODE = 102;</p>
		<p> final int STATE_UNESCAPE = 103;</p>
		<p> int[] digits = new int[128];</p>
		<p> int[][] transformed = new int[3][128];</p>
		<p> int[] pick_encoding = { 1, 2, 0, 1, 2, 0, 2, 0, 0, 2, 0, 2, 1, 0, 2, 0, 1,<br />   0, 2, 0, 1, 1, 2, 0, 0, 2, 1, 0, 2, 0, 0, 2, 1, 1, 0, 2, 0, 2, 0,<br />   1, 0, 1, 1, 2, 0, 1, 0, 2, 1, 0, 2, 0, 1, 1, 2, 0, 0, 1, 1, 2, 0,<br />   1, 0, 2 };</p>
		<p> int[] rawData = { 0x64, 0x37, 0x69, 0x50, 0x7E, 0x2C, 0x22, 0x5A, 0x65,<br />   0x4A, 0x45, 0x72, 0x61, 0x3A, 0x5B, 0x5E, 0x79, 0x66, 0x5D, 0x59,<br />   0x75, 0x5B, 0x27, 0x4C, 0x42, 0x76, 0x45, 0x60, 0x63, 0x76, 0x23,<br />   0x62, 0x2A, 0x65, 0x4D, 0x43, 0x5F, 0x51, 0x33, 0x7E, 0x53, 0x42,<br />   0x4F, 0x52, 0x20, 0x52, 0x20, 0x63, 0x7A, 0x26, 0x4A, 0x21, 0x54,<br />   0x5A, 0x46, 0x71, 0x38, 0x20, 0x2B, 0x79, 0x26, 0x66, 0x32, 0x63,<br />   0x2A, 0x57, 0x2A, 0x58, 0x6C, 0x76, 0x7F, 0x2B, 0x47, 0x7B, 0x46,<br />   0x25, 0x30, 0x52, 0x2C, 0x31, 0x4F, 0x29, 0x6C, 0x3D, 0x69, 0x49,<br />   0x70, 0x3F, 0x3F, 0x3F, 0x27, 0x78, 0x7B, 0x3F, 0x3F, 0x3F, 0x67,<br />   0x5F, 0x51, 0x3F, 0x3F, 0x3F, 0x62, 0x29, 0x7A, 0x41, 0x24, 0x7E,<br />   0x5A, 0x2F, 0x3B, 0x66, 0x39, 0x47, 0x32, 0x33, 0x41, 0x73, 0x6F,<br />   0x77, 0x4D, 0x21, 0x56, 0x43, 0x75, 0x5F, 0x71, 0x28, 0x26, 0x39,<br />   0x42, 0x78, 0x7C, 0x46, 0x6E, 0x53, 0x4A, 0x64, 0x48, 0x5C, 0x74,<br />   0x31, 0x48, 0x67, 0x72, 0x36, 0x7D, 0x6E, 0x4B, 0x68, 0x70, 0x7D,<br />   0x35, 0x49, 0x5D, 0x22, 0x3F, 0x6A, 0x55, 0x4B, 0x50, 0x3A, 0x6A,<br />   0x69, 0x60, 0x2E, 0x23, 0x6A, 0x7F, 0x09, 0x71, 0x28, 0x70, 0x6F,<br />   0x35, 0x65, 0x49, 0x7D, 0x74, 0x5C, 0x24, 0x2C, 0x5D, 0x2D, 0x77,<br />   0x27, 0x54, 0x44, 0x59, 0x37, 0x3F, 0x25, 0x7B, 0x6D, 0x7C, 0x3D,<br />   0x7C, 0x23, 0x6C, 0x43, 0x6D, 0x34, 0x38, 0x28, 0x6D, 0x5E, 0x31,<br />   0x4E, 0x5B, 0x39, 0x2B, 0x6E, 0x7F, 0x30, 0x57, 0x36, 0x6F, 0x4C,<br />   0x54, 0x74, 0x34, 0x34, 0x6B, 0x72, 0x62, 0x4C, 0x25, 0x4E, 0x33,<br />   0x56, 0x30, 0x56, 0x73, 0x5E, 0x3A, 0x68, 0x73, 0x78, 0x55, 0x09,<br />   0x57, 0x47, 0x4B, 0x77, 0x32, 0x61, 0x3B, 0x35, 0x24, 0x44, 0x2E,<br />   0x4D, 0x2F, 0x64, 0x6B, 0x59, 0x4F, 0x44, 0x45, 0x3B, 0x21, 0x5C,<br />   0x2D, 0x37, 0x68, 0x41, 0x53, 0x36, 0x61, 0x58, 0x58, 0x7A, 0x48,<br />   0x79, 0x22, 0x2E, 0x09, 0x60, 0x50, 0x75, 0x6B, 0x2D, 0x38, 0x4E,<br />   0x29, 0x55, 0x3D, 0x3F };</p>
		<p> public EncodeDecode() {<br />//  System.out.println(rawData[0]);<br />  init();<br /> }</p>
		<p> public String decode(String encodingString) {<br />//  System.out.println("encodingString  :  " + encodingString);<br />  String marker = "#@~^";<br />  String at;<br />  String encodingLable = null;<br />  String unEncodingString = "";<br />  int stringIndex = 0;<br />  int scriptIndex = -1;<br />  int unEncodingIndex = 0;<br />  int unEncodinglength = 0;<br />  int state = STATE_COPY_INPUT;<br />  // int statePos = 0;</p>
		<p>  while (state != 0) {<br />   // System.out.println("in the Swith statePos is :" + statePos +<br />   // "State:" +state);<br />   switch (state) {<br />   case (STATE_COPY_INPUT):<br />    scriptIndex = encodingString.indexOf(marker, stringIndex);<br />    // System.out.println("scriptIndex1"+scriptIndex);<br />    if (scriptIndex != -1) {<br />     unEncodingString += encodingString.substring(stringIndex,<br />       stringIndex + scriptIndex);<br />     scriptIndex += marker.length();<br />     state = STATE_READLEN;<br />    } else {<br />     stringIndex = stringIndex == 0 ? 0 : stringIndex;<br />     unEncodingString += encodingString.substring(stringIndex,<br />       encodingString.length());<br />     state = 0;<br />    }<br />    break;</p>
		<p>   case (STATE_READLEN):<br />    // System.out.println("scriptIndex"+scriptIndex);<br />    encodingLable = encodingString.substring(scriptIndex,<br />      scriptIndex + 6);<br />    unEncodinglength = decodeBase64(encodingLable);<br />    scriptIndex += (6 + "==".length());<br />    state = STATE_DECODE;<br />    break;</p>
		<p>   case (STATE_DECODE):<br />    if (unEncodinglength == 0) {<br />     stringIndex = scriptIndex + "<a href="mailto:DQgAAA==^#~@&quot;.length">DQgAAA==^#~@".length</a>();<br />     unEncodingIndex = 0;<br />     state = STATE_COPY_INPUT;<br />     break;<br />    }<br />    at = encodingString.substring(scriptIndex, scriptIndex + 1);<br />    if (at == "@")<br />     state = STATE_UNESCAPE;<br />    else {<br />     if (at.codePointAt(0) &lt; 0xFF) {<br />      unEncodingString += String<br />        .valueOf((char) transformed[pick_encoding[unEncodingIndex % 64]][at<br />          .codePointAt(0)]);<br />      unEncodingIndex++;<br />     } else {<br />      unEncodingString += at;<br />     }<br />     scriptIndex++;<br />     unEncodinglength--;<br />     break;<br />    }</p>
		<p>   case STATE_UNESCAPE:<br />    unEncodingString += unescape(encodingString.substring(<br />      ++scriptIndex, scriptIndex + 1));<br />    scriptIndex++;<br />    unEncodinglength -= 2;<br />    unEncodingIndex++;<br />    state = STATE_DECODE;<br />    break;<br />   }<br />  }</p>
		<p>  // System.out.println("unEncodingString : " + unEncodingString);<br />  // Pattern pattern = Pattern.compile("JScript.Encode");<br />  // Matcher matcher = pattern.matcher(unEncodingString);<br />  // if(matcher.find()) {<br />  // System.out.println("unEncodingString 1: " + unEncodingString);<br />  // unEncodingString = unEncodingString.substring(0, matcher.start()) +<br />  // matcher.group() + unEncodingString.substring(matcher.end());<br />  // }</p>
		<p>//  System.out.println("EncodeDecode.decode : unEncodingString  :  " + unEncodingString);<br />  return unEncodingString;<br /> }</p>
		<p> public int decodeBase64(String string) {<br />  int val = 0;<br />  val += (digits[string.codePointAt(0)] &lt;&lt; 2);<br />  val += (digits[string.codePointAt(1)] &gt;&gt; 4);<br />  val += (digits[string.codePointAt(1)] &amp; 0xf) &lt;&lt; 12;<br />  val += ((digits[string.codePointAt(2)] &gt;&gt; 2) &lt;&lt; 8);<br />  val += ((digits[string.codePointAt(2)] &amp; 0x3) &lt;&lt; 22);<br />  val += (digits[string.codePointAt(3)] &lt;&lt; 16);<br />  return val;<br /> }</p>
		<p> public String unescape(String ch) { // no used, and no test<br />  // System.out.println("dddd");<br />  String escapes = "#&amp;!*$";<br />  String escaped = "\r\n&lt;&gt;@";</p>
		<p>  if (ch.codePointAt(0) &gt; 126)<br />   return ch;<br />  int index = escapes.indexOf(ch);<br />  if (index != -1)<br />   return escaped.substring(index, index + 1);<br />  return "?";<br /> }</p>
		<p> public void init() {<br />  for (int i = 31; i &lt;= 126; i++)<br />   for (int j = 0; j &lt; 3; j++)<br />    transformed[j][rawData[(i - 31) * 3 + j]] = (i == 31) ? 9 : i;</p>
		<p>  for (int i = 0; i &lt; 26; i++) {<br />   digits['A' + i] = i;<br />   digits['a' + i] = i + 26;<br />  }<br />  for (int i = 0; i &lt; 10; i++)<br />   digits['0' + i] = i + 52;<br />  digits[0x2b] = 62;<br />  digits[0x2f] = 63;<br /> }</p>
		<p> /**<br />  * @param args<br />  */<br /> public static void main(String[] args) {<br />  // new EncodeDecode().decode("&lt;script<br />  // language='JScript.Encode'&gt;#@~^SwAAAA==-mD~DK'B8vZfF~!0FyF/TFFFZXFR!F8)TvZc82qsq98,TfZ+!wF{T;F&amp;q*Z2T!Z1ZAqZFl!bEiyRAAAA==^#~@&lt;/script&gt;");<br />  String plantext = new EncodeDecode()<br />    .decode("<a href="mailto:#@~^SwAAAA==-mD~DK'B8vZfF~!0FyF/TFFFZXFR!F8)TvZc82qsq98,TfZ+!wF{T;F&amp;q*Z2T!Z1ZAqZFl!bEiyRAAAA">#@~^SwAAAA==-mD~DK'B8vZfF~!0FyF/TFFFZXFR!F8)TvZc82qsq98,TfZ+!wF{T;F&amp;q*Z2T!Z1ZAqZFl!bEiyRAAAA</a>==^#~@");<br />  System.out<br />    .println(plantext<br />      .equals("var ero='16031B08121C07110518011A06041E1F1D190D020F170C13140E00090B10150A';"));<br />  System.out.println("0".codePointAt(0) + " " + (int) 'a' + " "<br />    + (int) 'A');<br />  <br />  System.out.println("ididgigggi".indexOf("i", 1));<br /> }</p>
		<p>}<br /></p>
		<p>现在可以得到需要的信息了. 呵呵</p><img src ="http://www.blogjava.net/51AOP/aggbug/61178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-08-01 13:18 <a href="http://www.blogjava.net/51AOP/archive/2006/08/01/61178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lucene 索引常见格式的文件代码</title><link>http://www.blogjava.net/51AOP/archive/2006/07/25/59991.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Tue, 25 Jul 2006 06:07:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/07/25/59991.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/59991.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/07/25/59991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/59991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/59991.html</trackback:ping><description><![CDATA[<br />LiA上的处理框架, 不错.<br /> <a href="http://bbs.hexiao.cn/read.php?fid=7&amp;tid=17&amp;fpage=1">Lucene搜索富文本文件之六 -- 处理各种常见文件的框架</a>  <br /><br /><br />  <a href="http://bbs.hexiao.cn/read.php?fid=7&amp;tid=16&amp;fpage=1">Lucene搜索富文本文件之五 -- HTML</a>  <br /><br /><br /><a href="http://bbs.hexiao.cn/read.php?fid=7&amp;tid=15&amp;fpage=1">Lucene搜索富文本文件之四 --  XML</a><br /><br /><br /> <a href="http://bbs.hexiao.cn/read.php?fid=7&amp;tid=14&amp;fpage=1">Lucene搜索富文本文件之三 -- RTF</a> <br /><br /><br />  <a href="http://bbs.hexiao.cn/read.php?fid=7&amp;tid=13&amp;fpage=1">Lucene搜索富文本文件之二 -- MS word</a>  <br /><br /><br />  <a href="http://bbs.hexiao.cn/read.php?fid=7&amp;tid=12&amp;fpage=1">Lucene搜索富文本文件之一 -- pdf</a><img src ="http://www.blogjava.net/51AOP/aggbug/59991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-07-25 14:07 <a href="http://www.blogjava.net/51AOP/archive/2006/07/25/59991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Callisto 终于可以下载了.</title><link>http://www.blogjava.net/51AOP/archive/2006/07/01/56061.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 30 Jun 2006 20:47:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/07/01/56061.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/56061.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/07/01/56061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/56061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/56061.html</trackback:ping><description><![CDATA[<p designtimesp="20924">Callisto 终于可以下载了.</p>
		<p>Eclipse 3.2下载: <a href="http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.2-200606291905/eclipse-SDK-3.2-win32.zip">http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops/R-3.2-200606291905/eclipse-SDK-3.2-win32.zip</a>页面</p>
		<p>Callisto到主页下载: <a href="http://www.eclipse.org/callisto/">http://www.eclipse.org/callisto/</a> <br /><br /><br />Eclipse 3.2 - New and Noteworthy<br /><a href="http://download2.eclipse.org/eclipse/downloads/drops/R-3.2-200606291905/new_noteworthy/eclipse-news.html">http://download2.eclipse.org/eclipse/downloads/drops/R-3.2-200606291905/new_noteworthy/eclipse-news.html</a></p><img src ="http://www.blogjava.net/51AOP/aggbug/56061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-07-01 04:47 <a href="http://www.blogjava.net/51AOP/archive/2006/07/01/56061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>callisto(Eclipse 3.2) 迟到了  ? </title><link>http://www.blogjava.net/51AOP/archive/2006/06/30/56055.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 30 Jun 2006 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/06/30/56055.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/56055.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/06/30/56055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/56055.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/56055.html</trackback:ping><description><![CDATA[<p>在今天早些时候访问 callisto 的主页(<a href="http://www.eclipse.org/callisto/">http://www.eclipse.org/callisto/</a> ) 还可以看到一个发布倒计时, 现在发布时间到了, 倒计时的钟表也不见了, 还是没有发布, 只是留下一句话:  Callisto is coming soon</p>
		<p> </p>
		<p>呵呵, 可能是在做一些后期处理工作给耽搁了吧. 看看wiki上的时间表(<a href="http://wiki.eclipse.org/index.php/Callisto_Final_Daze">http://wiki.eclipse.org/index.php/Callisto_Final_Daze</a> ), 如下:</p>
		<p> </p>
		<h2>
				<font size="4">Friday 6/30</font>
		</h2>
		<div class="editsection" style="FLOAT: right; MARGIN-LEFT: 5px">
		</div>
		<a name="09:00_EDT">
		</a>
		<h3>09:00 EDT</h3>
		<ul>
				<li>Denis to do a mirror-site sanity check. How many? Are they all done? Assuming all is well, </li>
		</ul>
		<ol>
				<li>(re)enable cluster sync 
</li>
				<li>All confirmed "go" with note to cross-project, committers lists 
</li>
				<li>Put web pages live, make announcements </li>
		</ol>
		<div class="editsection" style="FLOAT: right; MARGIN-LEFT: 5px">
		</div>
		<a name="09:30">
		</a>
		<h3>09:30</h3>
		<p>watch <a class="external text" title="https://dev.eclipse.org/committers/help/status.php" href="https://dev.eclipse.org/committers/help/status.php" rel="nofollow">eclipse.org servers glow red</a>, especially build server </p>
		<a name="13:00">
		</a>
		<h3>13:00</h3>
		<p>go have a beer -- to celebrate, if all is well, else, to cry in :) </p>
		<p> </p>
		<p>哎, 不知道今天可以看到发布不. </p><img src ="http://www.blogjava.net/51AOP/aggbug/56055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-06-30 23:04 <a href="http://www.blogjava.net/51AOP/archive/2006/06/30/56055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析 Hibernate Validator </title><link>http://www.blogjava.net/51AOP/archive/2006/05/18/46824.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Thu, 18 May 2006 07:17:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/05/18/46824.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/46824.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/05/18/46824.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/46824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/46824.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 任何获得Matrix授权的网站，转载请保留以下作者信息和链接：				作者：icess(作者的blog:http://blog.matrix.org.cn/page/icess)关键字：Hibernate Validator		在前一篇文章 &lt; Hibernate Validator 简介 &gt; http://www.matrix.org.cn/resource/article/...&nbsp;&nbsp;<a href='http://www.blogjava.net/51AOP/archive/2006/05/18/46824.html'>阅读全文</a><img src ="http://www.blogjava.net/51AOP/aggbug/46824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-05-18 15:17 <a href="http://www.blogjava.net/51AOP/archive/2006/05/18/46824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Validator 简介</title><link>http://www.blogjava.net/51AOP/archive/2006/05/17/46563.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Wed, 17 May 2006 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2006/05/17/46563.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/46563.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2006/05/17/46563.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/46563.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/46563.html</trackback:ping><description><![CDATA[<p>
				<font size="6"><a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> <b>Validator </b>简介</font>
		</p>
		<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 target="_new" href="http://blog.matrix.org.cn/page/icess">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-family: 'Courier New',Courier; font-size: 10pt;">
						<font color="#3f7f5f">Person.java 类</font>
				</code>
		</p>
		<p align="left">
				<code style="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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-family: 'Courier New',Courier; font-size: 10pt;">
						<font color="#3f7f5f">Address.java 类</font>
				</code>
		</p>
		<p align="left">
				<code style="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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-family: 'Courier New',Courier; font-size: 10pt;">
			TestValidator.java 类</code>
				</font>
		</p>
		<p align="left">
				<code style="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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"></font></p>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 必须大于等于 1 . 
			PropertyPath 是:age .</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">PropertyName 是: age. Value 是: 0 Bean 是: 
			test.annotation.validator.Person@dd87b2</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">BeanClass 是:class 
			test.annotation.validator.Person</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 长度必须介于 4 与 
			2147483647 之间 . PropertyPath 是:name .</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">PropertyName 是: name. Value 是: ice Bean 是: 
			test.annotation.validator.Person@dd87b2</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">BeanClass 是:class 
			test.annotation.validator.Person</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 必须大于等于 1 . 
			PropertyPath 是:address.num .</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">PropertyName 是: num. Value 是: 0 Bean 是: 
			test.annotation.validator.Address@197d257</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">BeanClass 是:class 
			test.annotation.validator.Address</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">InvalidValue 的长度是:4 . 验证消息是: 长度必须介于 3 与 8 
			之间 . PropertyPath 是:address.street .</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">PropertyName 是: street. Value 是: 1 Bean 是: 
			test.annotation.validator.Address@197d257</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">BeanClass 是:class 
			test.annotation.validator.Address</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">可以看出不满足约束的值都被指出了.</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">同时该句:
			<code style="font-family: 'Courier New',Courier; font-size: 10pt;"><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></font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">我们只验证了 Person. 在Person里面的Address的属性 由于有<code style="font-family: 'Courier New',Courier; font-size: 10pt;"><font color="#ff0000">@Valid 
			Annotations </font>所以 Address的相关属性也被机联验证了 .</code></font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<code>
						<span style="font-family: 'Courier New',Courier;">
								<font size="2">如果 把</font>
						</span>
				</code>
				<code style="font-family: 'Courier New',Courier; font-size: 10pt;">
						<font size="2">
								<font color="#ff0000">@Valid 
			Annotations </font>去掉,结果如下:</font>
				</code>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">InvalidValue 的长度是:2 . 验证消息是: 必须大于等于 1 . 
			PropertyPath 是:age .</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">PropertyName 是: age. Value 是: 0 Bean 是: 
			test.annotation.validator.Person@18fef3d</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">BeanClass 是:class 
			test.annotation.validator.Person</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">InvalidValue 的长度是:2 . 验证消息是: 长度必须介于 4 与 
			2147483647 之间 . PropertyPath 是:name .</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">PropertyName 是: name. Value 是: ice Bean 是: 
			test.annotation.validator.Person@18fef3d</font>
				</font>
		</p>
		<font size="2">
		</font>
		<p align="left">
				<font size="2">
						<font color="#ff00ff">BeanClass 是:class 
			test.annotation.validator.Person</font>
				</font>
		</p>
		<font size="2">
		</font>
		<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 color="#ff0000" face="Courier New, Courier">
			InvalidValue[] validMessages = 
			classValidator.getInvalidValues(p,"age"); /</font>
						<font color="#0000ff" face="Courier New, Courier">/只验证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;">怎么样 
			,很简单吧. 关于 <a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> 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="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
								<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-family: 'Courier New',Courier; font-size: 10pt;">
								<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-family: 'Courier New',Courier; font-size: 10pt;">
								<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-family: 'Courier New',Courier; font-size: 10pt;"><font color="#000000">SerializabilityValidator.java 
			如下:</font></code></font></p>
		<p align="left">
				<code style="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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="margin: 0px; font-family: 'Courier New',Courier; font-size: 10pt;">
						<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-family: 'Courier New',Courier; font-size: 10pt;"><font color="#000000">Serializability  
			就可以约束一个类实现</font></code></font><code style="font-family: 'Courier New',Courier; font-size: 10pt;">Serializable 
			接口了. 如下:</code></p>
		<p align="left">在我们的Person.java类 添加@<font size="2"><code style="font-family: 'Courier New',Courier; font-size: 10pt;"><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 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-family: 'Courier New',Courier; font-size: 10pt;">
								<font color="#000000">Serializability  
			中的message 改为以{}扩住的 属性文件的Key就可以了 </font>
						</code>
				</font>
		</p>
		<p align="left">
				<font size="2">
						<code style="font-family: 'Courier New',Courier; font-size: 10pt;">
								<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;">
			然后编辑资料文件. 注意 该资源文件中要包括 <a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> 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-family: 'Courier New',Courier; font-size: 10pt;">
								<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 color="#ff0000" face="Courier New, Courier" size="2">
			#下面是 <a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> 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">这样就可以了 .  当然 
			你还可以 更改 <a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> 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><a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> 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 到此 我们的 <a title="Hibernate Annotation 中文文档" href="http://icess.my.china.com/hibernate/a/ref/index.htm" target="_blank">Hibernate</a> Validator 之旅就要先告一段落了 . 希望这是令你心旷神怡的一次寒冬之旅,</p>
		<p align="left">
			把你学到的应用到你的项目中吧,一定会提高你的生产率的. 相信我 ,没错的  ^_^ !</p><img src ="http://www.blogjava.net/51AOP/aggbug/46563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2006-05-17 10:35 <a href="http://www.blogjava.net/51AOP/archive/2006/05/17/46563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>