`
alienj
  • 浏览: 77414 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

第26章. Seam和Google网页工具

阅读更多
第26章. Seam和Google网页工具 对那些喜欢使用Google Web Toolkit (GWT) 开发动态AJAX 应用程序的人而言, Seam 提供了一个集成层,允许GWT窗口小部件直接与Seam组件交互。 对使用GWT,我们假定你已经熟悉了GWT工具—— 大部分信息可以在http://code.google.com/webtoolkit/找到。本节不打算解释GWT如何工作或使用。 26.1. 配置 在Seam应用程序中使用GWT工具不需要特殊配置,然而必然安装Seam资源servlet。详情见29章“配置Seam和打包Seam应用程序。 26.2. 准备你的组件 准备通过GWT调用Seam组件的第一步,是为你希望调用的方法创建同步和异步服务接口。这两个接口应该继承GWT接口 com.google.gwt.user.client.rpc.RemoteService: public interface MyService extends RemoteService { public String askIt(String question); } 异步接口应该是相同的,只是它声明的每个方法中包含另外一个AsyncCallback 参数: public interface MyServiceAsync extends RemoteService { public void askIt(String question, AsyncCallback callback); } 异步接口,在本例 MyServiceAsync中,会被GWT实现,并且绝不应该直接实现。 下一步,是创建一个实现了同步接口的Seam组件: @Name("org.jboss.seam.example.remoting.gwt.client.MyService") public class ServiceImpl implements MyService { @WebRemote public String askIt(String question) { if (!validate(question)) { throw new IllegalStateException("Hey, this shouldn't happen, I checked on the client, "+"but its always good to double check."); } return "42. Its the real question that you seek now."; } public boolean validate(String q) { ValidationUtility util = new ValidationUtility(); return util.isValid(q); } } Seam组件名必须与GWT客户端接口的全限定名相匹配(如上面显示的),否则当一个客户端产生一个GWT调用时,Seam资源servlet将不能找到它。通过GWT可以访问的方法也必须用@WebRemote进行注释。 26.3. 连接GWT窗口小部件到Seam组件 下一步,是编写返回同步接口给组件的一个方法。这个方法可以被放在widget 类的内部,并且widget用它来获取同步客户端存根的一个引用: private MyServiceAsync getService() { String endpointURL = GWT.getModuleBaseURL() + "seam/resource/gwt"; MyServiceAsync svc = (MyServiceAsync) GWT.create(MyService.class); ((ServiceDefTarget) svc).setServiceEntryPoint(endpointURL); return svc; } 最后一步是编写widget代码,调用在客户端存根上的方法。 下面例子创建了一个简单的用户界面,带有一个标签、一个文本输入框和一个按钮: public class AskQuestionWidget extends Composite { private AbsolutePanel panel = new AbsolutePanel(); public AskQuestionWidget() { Label lbl = new Label("OK, what do you want to know?"); panel.add(lbl); final TextBox box = new TextBox(); box.setText("What is the meaning of life?"); panel.add(box); Button ok = new Button("Ask"); ok.addClickListener(new ClickListener() { public void onClick(Widget w) { ValidationUtility valid = new ValidationUtility(); if (!valid.isValid(box.getText())) { Window.alert("A question has to end with a '?'"); } else { askServer(box.getText()); } } }); panel.add(ok); initWidget(panel); } private void askServer(String text) { getService().askIt(text, new AsyncCallback() { public void onFailure(Throwable t) { Window.alert(t.getMessage()); } public void onSuccess(Object data) { Window.alert((String) data); } }); } ... 当点击按钮时,用文本输入框的内容为参数调用askServer()方法(在本例中,也执行校验,确保输入的是一个有效的问题)。askServer()方法获得异步客户端存根的一个引用(用getService()方法返回),并调用askIt() 方法。结果(或错误消息,如果调用失败)显示在一个警报窗口中 这个例子的所有代码可以在Seam发行版的examples/remoting/gwt目录中找到。 26.4. GWT Ant目标 对GWT应用程序的部署,有一个编译到Javascript(compile-to-Javascript)的步骤(它压缩和“混淆”代码)。有一个ant实用程序,它可以被用来代替GWT提供的命令行和GUI实用程序。为使用它,你将需要在你的ant类路径内有ant任务jar包和下载的GWT(反正,本地模式你需要它们)。 然后,在你的ant文件,设置 (在你的Ant文件顶部附近): <taskdef uri="antlib:de.samaflost.gwttasks" resource="de/samaflost/gwttasks/antlib.xml" classpath="./lib/gwttasks.jar"></taskdef><property file="build.properties"></property> 创建 build.properties 文件,它有这样的内容: gwt.home=/gwt_home_dir 它当然指向安装了GWT的目录。然后使用它,创建一个target: <target name="gwt-compile"><delete><fileset dir="view"></fileset></delete><compile outdir="build/gwt" gwthome="${gwt.home}" classbase="${gwt.module.name}" sourceclasspath="src"></compile><copy todir="view"><fileset dir="build/gwt/${gwt.module.name}"></fileset></copy></target> 在调用这个target时,将编译GWT应用程序,并且拷贝它到指定的目录(它会在你的war的webapp部分中——记住GWT产生HTML和Javascript制品)。你绝不要编辑gwt-compile产生的结果代码——你终始应在GWT源目录中编辑。 记住GWT配备了一个本地模式浏览器—— 如果你用GWT进行开发,你应用使用它。如果你没有用本地模式浏览器,而只是每次编译它,你就没有利用最有效的工具包 (实际上,如果你不能或不愿使用本地模式浏览器,我认为你一点也没有利用GWT——它真得很有用!).
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics