表单使用HTTP提交

表单有两种提交方式,第一种就是传统的HTTP提交。

最直接的步骤就是:

  • 使用FormPanel的setAction()方法,去定义submit的URL
  • 使用FormPanel的isValid()方法,去验证所有的fields是否有正确
  • 如果正确,使用FormPanel的submit()方法提交表单。
  1. setAction("http://www.example.com/submit.php");
  2. final Button btnSave = new Button("Save");
  3. btnSave.setIconStyle("save");
  4. btnSave.addSelectionListener(new SelectionListener<ButtonEvent>()
  5. {
  6. public void componentSelected(ButtonEvent ce) {
  7. if (isValid())
  8. {
  9. submit();
  10. } }
  11. });
  12. addButton(btnSave);
setAction("http://www.example.com/submit.php");
final Button btnSave = new Button("Save");
btnSave.setIconStyle("save");
btnSave.addSelectionListener(new SelectionListener<ButtonEvent>()
{
public void componentSelected(ButtonEvent ce) {
if (isValid())
{
submit();
} }
});
addButton(btnSave);

GWT RPC

表单就拥有了另外一种提交方式——RPC。对于GWT和GXT来说,他不像传统的web应用,在client端我们可以选择存储和操作java类型的数据——不管这些数据是在web前端还是通过GWT RPC或者JSON别的什么方法提交到后端,我们都可以操作他们。

在RSSReader项目里,我们就会使用GWT RPC。

创建一个Feed service

为了能够检索到Feed对象,就必须有唯一的ID。java里有专门用来生成的主键的类——UUID。接下来我们要实现一个功能,就是当在client端所使用Feed的实例对象,是通过RPC从server端返回的,并且已经赋值ID的。因为先前,我们所创建的Feed类,就是为了在client和server两端都可以使用。那么接下来就要创建一个GWT RPC的service去处理Feed实例对象。

  • 创建新包:com.danielvaughan.rssreader.client.services,在此包下,新建一个接口FeedService,继承GWT RemoteService。定义一个方法createNewFeed():
  1. package com.danielvaughan.rssreader.client.services;
  2. import com.danielvaughan.rssreader.shared.model.Feed;
  3. import com.google.gwt.user.client.rpc.RemoteService;
  4. import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
  5. @RemoteServiceRelativePath("feed-service")
  6. public interface FeedService extends RemoteService {
  7. Feed createNewFeed();
  8. }
package com.danielvaughan.rssreader.client.services;

import com.danielvaughan.rssreader.shared.model.Feed;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("feed-service")
public interface FeedService extends RemoteService {
Feed createNewFeed();
}
  • 注意1:@RemoteServiceRelativePath("feed-service") 注解了当前这个service,在web.xml应该配置的url映射地址。也就是说不管哪个类实现了FeedService接口,那么他在web.xml的servlet url映射就应该设置成"feed-service"。
  • 注意2:FeedService接口创建完毕之后,GWT就会自动的提示你去创建与之对应的另外一个接口FeedServiceAsync

  1. package com.danielvaughan.rssreader.client.services;
  2. import com.danielvaughan.rssreader.shared.model.Feed;
  3. import com.google.gwt.user.client.rpc.AsyncCallback;
  4. public interface FeedServiceAsync {
  5. void createNewFeed(AsyncCallback<Feed> callback);
  6. }
package com.danielvaughan.rssreader.client.services;

import com.danielvaughan.rssreader.shared.model.Feed;
import com.google.gwt.user.client.rpc.AsyncCallback; public interface FeedServiceAsync { void createNewFeed(AsyncCallback<Feed> callback); }
  • FeedServiceAsync接口中生成了FeedService接口中的,异步回调的抽象方法。其目的是在createNewFeed()方法执行之后的返回期间会调用FeedServiceAsync接口中的与之对应的createNewFeed(AsyncCallback<Feed> callback)方法,来作为createNewFeed()方法执行情况的反馈。
  • 之前的两个接口都是属于client端的services,具体的实现类就应该属于的server端的services。所以新建包:com.danielvaughan.rssreader.server.services,在此包下创建FeedServiceImpl类实现FeedService,继承RemoteServiceServlet。具体的实现如下代码:
  1. package com.danielvaughan.rssreader.server.services;
  2. import java.io.IOException;
  3. import java.util.UUID;
  4. import com.danielvaughan.rssreader.client.services.FeedService;
  5. import com.danielvaughan.rssreader.shared.model.Feed;
  6. import com.google.gwt.user.server.rpc.RemoteServiceServlet;
  7. @SuppressWarnings("serial")
  8. public class FeedServiceImpl extends RemoteServiceServlet implements
  9. FeedService {
  10. @Override
  11. public Feed createNewFeed() {
  12. UUID uuid = UUID.randomUUID();
  13. return new Feed(uuid.toString());
  14. }
  15. }
package com.danielvaughan.rssreader.server.services;

import java.io.IOException;
import java.util.UUID; import com.danielvaughan.rssreader.client.services.FeedService;
import com.danielvaughan.rssreader.shared.model.Feed;
import com.google.gwt.user.server.rpc.RemoteServiceServlet; @SuppressWarnings("serial")
public class FeedServiceImpl extends RemoteServiceServlet implements
FeedService {
@Override
public Feed createNewFeed() {
UUID uuid = UUID.randomUUID();
return new Feed(uuid.toString());
} }
  • 配置FeedServiceImpl的servlet映射。编辑web.xml
  1. <servlet>
  2. <servlet-name>feedServlet</servlet-name>
  3. <servlet-class>
  4. com.danielvaughan.rssreader.server.services.FeedServiceImpl
  5. </servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8. <servlet-name>feedServlet</servlet-name>
  9. <url-pattern>/rssreader/feed-service</url-pattern>
  10. </servlet-mapping>
<servlet>
<servlet-name>feedServlet</servlet-name>
<servlet-class>
com.danielvaughan.rssreader.server.services.FeedServiceImpl
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>feedServlet</servlet-name>
<url-pattern>/rssreader/feed-service</url-pattern>
</servlet-mapping>
  • 注意:<url-pattern>/rssreader/feed-service</url-pattern>其中的rssreader是小写,这与<script type="text/javascript" language="javascript"
        src="rssreader/rssreader.nocache.js"></script>是一直的。
  • RPC的services已经创建完毕了。只要记住他包括client端和server端代码。client端是接口的定义,server端是具体的实现。web.xml里配置的server端的servlet。

GXT之旅:第三章:表单和窗口(4)——表单的提交和RPC的更多相关文章

  1. Python之旅.第三章.函数4.01/4.02

    一.三元表达式 #普通的判断大小函数def max2(x,y): if x > y: return x else: return yres=max2(10,11)print(res)x=12y= ...

  2. Python之旅.第三章.函数3.30

    一.迭代器 1.什么是迭代?:迭代是一个重复的过程,并且每次重复都是基于上一次的结果而来2.要想了解迭代器到底是什么?必须先了解一个概念,即什么是可迭代的对象?可迭代的对象:在python中,但凡内置 ...

  3. Python之旅.第三章.函数3.29

    一.无参装饰器 1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提 ...

  4. Python之旅.第三章.函数3.28

    一.命名关键字参数: 什么是命名关键字参数?格式:在*后面参数都是命名关键字参数特点:1 必须被传值1 约束函数的调用者必须按照key=value的形式传值2 约束函数的调用者必须用我们指定的key名 ...

  5. Python之旅.第三章.函数3.27

    一.形参与实参 1.形参与实参是什么? 形参(形式参数):指的是 在定义函数时,括号内定义的参数,形参其实就变量名 实参(实际参数),指的是 在调用函数时,括号内传入的值,实参其实就变量的值 x,y是 ...

  6. Python之旅.第三章.函数3.26

    一.函数: 1.为什么要有函数?什么是函数? 1.组织结构不清晰,可读性差 2.代码冗余 3.管理维护的难度极大,扩展性 具备某一个功能的工具就是程序的中函数 事先准备工具的过程---->函数的 ...

  7. Getting Started with Processing 第二,三章总结

    第一章是文化熏陶. 第二章:开始编程 菜单栏中的 Show 的快捷键 Run:进行显示shortcut:可以通过快捷键 cmd + R 执行Present:进行全屏的显示shortcut:可以通过按下 ...

  8. HTML第三章:表单

    第三章:表单 表单标签form:<form></form>//相当于一张记录用户信息的单子    常用属性:method:表单的提交方式,常用的值有两个             ...

  9. 第三章:Web表单

    感谢作者 –> 原文链接 本文翻译自 The Flask Mega-Tutorial Part III: Web Forms 这是Flask Mega-Tutorial系列的第三部分,我将告诉你 ...

随机推荐

  1. C语言头文件书写

    说一下C语言的存储类说明符: 1.Auto       只在块内变量声明中被允许,表示变量具有本地生存期. 2.Extern    出现在顶层或块的外部变量函数与变量声明中,表示声明的对象具有静态生存 ...

  2. JVM 找出最耗 cpu的线程 并打印线程栈

    监控JVM中最占cpu的线程 top -Hp pid JVM中最占cpu的线程ID -o THREAD,tid,time | awk 'BEGIN {count=0; } { if($2>0.3 ...

  3. Jersey的异常处理

    Jersey框架为我们提供了更为通用异常处理方式.通过实现ExceptionMapper接口并使用@Provider注解将其定义为一个Provider,可以实现通用的异常的面向切面处理,而非针对某一个 ...

  4. delphi xe5 android 开发数据访问server端(一)

    第一篇我们破解并安装了xe5 第二篇我们搭建了开发环境 接下来我们开发一个三层的android程序 建立一个webservices  stand-alone vcl application 作为手机访 ...

  5. python 处理cookie简单很多啊 httpclient版本是4.3.3

    模拟登录流程: 1 请求host_url 2 从host_url中解析出 隐藏表单 的值 添加到POST_DATA中 3 添加账户,密码到POST_DATA中 4 编码后,发送POST请求    要点 ...

  6. BZOJ 1574: [Usaco2009 Jan]地震损坏Damage

    Description 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路经都还能使用. FJ的农场有P(1 <= P <= 30,000)个牛棚,编号1.. ...

  7. XMLHttpRequest2的进步之处

    本文参考自:XMLHttpRequest2 新技巧 (重点保留demo,方便自己日后查阅) HTML5是现在web开发中的热点,虽然关于web app和local app一直有争论,但是从技术学习的角 ...

  8. VCC,VDD,VEE,VSS,VPP 表示的意义

    转自VCC,VDD,VEE,VSS,VPP 表示的意义 VCC,VDD,VEE,VSS,VPP 表示的意义 版本一: 简单说来,可以这样理解: 一.解释 VCC:C=circuit 表示电路的意思, ...

  9. Windows编程中的堆管理(过于底层,一般不用关心)

    摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多 ...

  10. 关于Team Leader

    他的生日3.16,结婚是在7月- 我感觉他领会整体架构方案的能力很强,几乎每次都能选择一个最优化的方案,比我这具体干活的想到更多更周全.但缺点是,不懂细活还是只能被下人拿捏.因为计算机环境那么复杂,每 ...