- 浏览: 81446 次
- 性别:
- 来自: 重庆
-
最新评论
-
禀圣含华:
怎么弄空格呢?___________然后我固定这些空格,怎么弄 ...
第18章. iText PDF 生成 -
super0555:
managed
第13章 Seam 应用程序框架 -
Javakeith:
代码呢?共享下代码呗!
第18章. iText PDF 生成 -
tonyshen277:
同感啊。还在做Win32下的开发,楼主所说的一个都不能少啊。
转自baidu wqqq 给软件开发初学者 -
kdboy:
的确,把人放在宇宙中去看,从上帝的眼中去看,人的确是非常渺小, ...
人生是什么
第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——它真得很有用!).
发表评论
-
第31章. Seam内建组件
2009-05-28 11:51 1495第31章. Seam内建组件 本章描述Seam内建组件 ... -
第30章. Seam注释
2009-05-26 20:21 1632第30章. Seam注释 在你编写一个Seam应用程 ... -
第31章. Seam内建组件
2009-05-26 20:21 1463第31章. Seam内建组件 本章描述Seam内建组件 ... -
第29章. 配置Seam和打包Seam应用程序
2009-05-26 20:19 1577第29章. 配置Seam和打包Seam应用程序 配置 ... -
第28章. Hibernate搜索
2009-05-26 20:17 153428.1. 介绍 如Apache Lucen ... -
第27章. Spring框架集成
2009-05-26 20:16 1439第27章. Spring框架集成 Spring集成 ... -
第25章. 远程
2009-05-26 20:15 1322第25章. 远程 Seam 提供了一个从网页远程访 ... -
第24章. Web服务
2009-05-26 20:15 1708第24章. Web服务 Seam 集成了JBossWS, ... -
第23章. 缓存
2009-05-26 20:14 1460第23章. 缓存 在 ... -
第22章. 异步和消息
2009-05-26 20:12 2164第22章. 异步和消息 Seam 使异步执行来自网页请 ... -
第21章. Email
2009-05-26 20:11 1363现在Seam包含一个用于模板和发送邮件的可选组件。 Emai ... -
第 20章. RSS支持
2009-05-26 20:10 832第 20章. RSS支持 20.1. 安装 20.2. ... -
第19章. 微软的Excel 电子表格应用程序支持
2009-05-26 20:07 1848第19章. 微软的Excel 电子表格应用程序支持 S ... -
第18章. iText PDF 生成
2009-05-26 20:01 6522第18章. iText PDF 生成 18.1. 使用PDF ... -
第17章. Seam文本
2009-05-26 19:59 1036第17章. Seam文本 面向协作站点需要一种更有友好的 ... -
第16章. 国际化、本地化和主题
2009-05-26 19:57 1433第16章. 国际化、本地化和主题 Seam使构建国际化应用程 ... -
第15章 安全(2)
2009-05-26 19:56 939第15章 安全(2) 15.5. 错误消息 安全 ... -
第15章 安全(1)
2009-05-26 19:53 101715.1. 概述 Seam安全API为你基于Seam的 ... -
第14章 Seam 和 JBoss 规则
2009-05-26 19:50 1455第14章 Seam 和 JBoss 规则 Seam使从 ... -
第13章 Seam 应用程序框架
2009-05-26 19:49 1436第13章 Seam 应用程序框架 Seam真正地使通过 ...
相关推荐
1.4. Seam 和jBPM:待办事项列表(todo list)示例..................................................................................................... 32 1.4.1. 理解代码....................................
这是第二部分,两个部分需要一起下载后,放在同一级目录,解压即可。 目录 第1篇 了解开源软件 第1章 开源软件概述 2 1.1 开源软件的理解 2 1.2 开源软件的定义 3 1.3 开源软件定义的意义 5 1.4 开源软件和其他...
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答