﻿<?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-Ryan's Java world!</title><link>http://www.blogjava.net/51AOP/</link><description>something about Java and opensource!</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 16:48:39 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 16:48:39 GMT</pubDate><ttl>60</ttl><item><title>I'm Back !</title><link>http://www.blogjava.net/51AOP/archive/2010/05/31/322378.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Mon, 31 May 2010 10:42:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2010/05/31/322378.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/322378.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2010/05/31/322378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/322378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/322378.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是当前博客比较流行的时候在大学使用的博客账号, 毕业后就一直没使用过了, 最近整理邮箱中的资料, 居然又找到这里了, blogjava.net在国内还是一个很好的Java技术文章分享平台, 以后有关Java的技术文章也会在这里更新!&nbsp;&nbsp;<a href='http://www.blogjava.net/51AOP/archive/2010/05/31/322378.html'>阅读全文</a><img src ="http://www.blogjava.net/51AOP/aggbug/322378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2010-05-31 18:42 <a href="http://www.blogjava.net/51AOP/archive/2010/05/31/322378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK 6 探秘之二: 自定义国际化(I18N)服务</title><link>http://www.blogjava.net/51AOP/archive/2007/04/20/112168.html</link><dc:creator>冰雨</dc:creator><author>冰雨</author><pubDate>Fri, 20 Apr 2007 04:50:00 GMT</pubDate><guid>http://www.blogjava.net/51AOP/archive/2007/04/20/112168.html</guid><wfw:comment>http://www.blogjava.net/51AOP/comments/112168.html</wfw:comment><comments>http://www.blogjava.net/51AOP/archive/2007/04/20/112168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/51AOP/comments/commentRss/112168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/51AOP/services/trackbacks/112168.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在JDK 6 中, 利用其提供的service provider interfaces (SPI) 可以做到很好的国际化处理, 以前你只能使用标准的时区和各种符号, 如果你所在的地区不幸不再这些标志时区中, 或者货币符号也不在其中, 那么你就无能为力了, 现在有了JDK 6 ,我们可以自定义这些服务的提供者了.&nbsp;&nbsp;<a href='http://www.blogjava.net/51AOP/archive/2007/04/20/112168.html'>阅读全文</a><img src ="http://www.blogjava.net/51AOP/aggbug/112168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/51AOP/" target="_blank">冰雨</a> 2007-04-20 12:50 <a href="http://www.blogjava.net/51AOP/archive/2007/04/20/112168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><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>3</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>6</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>1</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></channel></rss>