Gwt-Ext学习笔记之进级篇

Gwt-Ext学习笔记之进级篇,第1张

概述转帖:http://www.javaeye.com/topic/191819   一、 定义服务 GWT过程调用大部分在两个类进行。在服务器端,定义一个 RemoteServiceServlet子类 RegisterActionImpl.java(远程服务实现类)。在这个类中,将 *** 作数据库并将值返回给客户机。在客户端,定义一个实现 AsyncCallback接口的类 Register.java(客

转帖:http://www.javaeye.com/topic/191819

一、 定义服务

GWT过程调用大部分在两个类进行。在服务器端,定义一个 RemoteServiceServlet子类 RegisteractionImpl.java(远程服务实现类)。在这个类中,将 *** 作数据库并将值返回给客户机。在客户端,定义一个实现 AsyncCallback接口的类 Register.java(客户端实现类),在这个类中,定义服务器 *** 作完成时客户机页面如何处理数据(或异常)。除了这两个类之外,必须编写一些绑定代码使 GWT-Ext 可以将客户端类和服务器端类绑定在一起,绑定代码包含 Registeraction.java(远程接口)和 RegisteractionAsync.java(远程异步接口)两个不同的接口外加一些客户端代码以及一两个设置。

a. gwtext项目上点击右键,选择 New—Other—Remote Service,创建名为 Registeraction的远程服务接口。

b. Postgresql数据库的 JDBC postgresql-8.2-505.jdbc3.jar加入到项目中(其他数据库,加入相应的 JDBC包)。

c. 远程服务的实现类,在 RegisteractionImpl.java中加入如下代码:

Java代码 /** *@author七月天 * */ publicclassRegisteractionImplextendsRemoteServiceServletimplementsRegisteraction{ privatestaticfinallongserialVersionUID=1L; publicvoIDsaveData(MapformData){ Connectionconn=null; try{ Class.forname("org.postgresql.Driver"); StringconnString="jdbc:postgresql://127.0.0.1:5432/gwtext"; conn=DriverManager.getConnection(connString,"julycn","julycn"); StringBuffersqlquery=newStringBuffer("insertintoperson(username,password,email,phone)"); sqlquery.append("values(?,?,?)"); PreparedStatementstmt=conn.prepareStatement(sqlquery.toString()); stmt.setString(1,URLDecoder.decode(formData.get("username").toString(),"UTF-8")); stmt.setString(2,URLDecoder.decode(formData.get("password").toString(),"UTF-8")); stmt.setString(3,URLDecoder.decode(formData.get("email").toString(),"UTF-8")); stmt.setString(4,URLDecoder.decode(formData.get("phone").toString(),"UTF-8")); stmt.execute(); }catch(Exceptione){ e.printstacktrace(); }finally{ if(conn!=null){ try{ conn.close(); }catch(sqlExceptione){ e.printstacktrace(); } } } } }
/** * @author 七月天 * */public class RegisteractionImpl extends RemoteServiceServlet implements Registeraction {	private static final long serialVersionUID = 1L;	public voID saveData(Map formData) {		Connection conn=null;		try {			Class.forname("org.postgresql.Driver");			String connString="jdbc:postgresql://127.0.0.1:5432/gwtext";			conn=DriverManager.getConnection(connString,"julycn","julycn");			StringBuffer sqlquery=new StringBuffer("insert into person (username,phone) ");			sqlquery.append("values(?,?)");			PreparedStatement stmt=conn.prepareStatement(sqlquery.toString());			stmt.setString(1,URLDecoder.decode(formData.get("username").toString(),"UTF-8"));			stmt.setString(2,URLDecoder.decode(formData.get("password").toString(),"UTF-8"));			stmt.setString(3,URLDecoder.decode(formData.get("email").toString(),"UTF-8"));			stmt.setString(4,URLDecoder.decode(formData.get("phone").toString(),"UTF-8"));			stmt.execute();		} catch (Exception e) {			e.printstacktrace();		}finally{			if(conn!=null){				try {					conn.close();				} catch (sqlException e) {					e.printstacktrace();				}			}		}			}}

@H_231_403@

d. GWT-Ext远程服务的要求很简单,它必须扩展 RemoteServiceServlet并实现一个接口。

二、 绑定代码

a. 要使新程序可用于客户端应用程序,必须定义两个接口。

b. 定义一个远程接口类 Registeraction.java,代码如下

Java代码 /** *@author七月天 * */ publicinterfaceRegisteractionextendsRemoteService{ publicstaticfinalStringSERVICE_URI="/Registeraction"; publicstaticclassUtil{ publicstaticRegisteractionAsyncgetInstance(){ RegisteractionAsyncinstance=(RegisteractionAsync)GWT .create(Registeraction.class); ServiceDefTargettarget=(ServiceDefTarget)instance; target.setServiceEntryPoint(GWT.getModuleBaseURL()+SERVICE_URI); returninstance; } } publicvoIDsaveData(MapformData); }
/** * @author 七月天 * */public interface Registeraction extends RemoteService {	public static final String SERVICE_URI = "/Registeraction";	public static class Util {		public static RegisteractionAsync getInstance() {			RegisteractionAsync instance = (RegisteractionAsync) GWT					.create(Registeraction.class);			ServiceDefTarget target = (ServiceDefTarget) instance;			target.setServiceEntryPoint(GWT.getModuleBaseURL() + SERVICE_URI);			return instance;		}	}	public voID saveData(Map formData);}

@H_231_403@

c. 在这里完成的所有 *** 作是获得用于实际的具体类中方法的同一个签名。这里的主要限制是接口必须扩展 com.Google.gwt.user.clIEnt.rpc.RemoteService;。此外,参数和返回值必须属于 GWT 可以序列化的类型 (见备注 )

d. 定义远程异步接口 RegisteractionAsync.java ,代码如下:

Java代码 /** *@author七月天 * */ publicinterfaceRegisteractionAsync{ publicvoIDsaveData(MapformData,AsyncCallbackcallback); }
/** * @author 七月天 * */public interface RegisteractionAsync {	public voID saveData(Map formData,AsyncCallback callback);}

e. 远程异步类的服务接口是从上面描述的远程服务类中派生出来的。两个类必须位于同一个包中,并且该包必须对 GWT-EXT 客户机代码可见。远程异步类中的类名必须是远程服务接口的名称且末尾附加字符串 Async。对于远程服务接口中的每个方法,远程异步类必须有一个返回类型更改为 voID 的匹配方法和一个 AsyncCallback 类型的附加参数。客户端代码将使用 AsyncCallback 作用于服务器响应上。

f. 注册服务器代码,将下面的一行加入到 Register.gwt.xml

Java代码 <servletclass="com.gwtext.julycn.server.RegisteractionImpl"path="/Registeraction"/>
<servlet  path="/Registeraction" />

三、 执行客户端调用

a. 完成服务器端 *** 作以后,现在应该让客户机执行过程调用了。在这里基本的想法是慎重地告诉 GWT 系统正在调用的是哪个远程服务。然后将 AsyncCallback 对象发送出去;最后, GWT 将其送回,您可对结果进行 *** 作。修改模型文件 Register.java,代码如下:

Java代码 /** *@author七月天 * */ publicclassRegisterimplementsEntryPoint,AsyncCallback{ publicvoIDonModuleLoad(){ createComponents(); } privatevoIDcreateComponents(){ finalFormPanelfrm=newFormPanel(); frm.setDraggable(true); frm.setWIDth(300); frm.setTitle("用户注册"); frm.setpaddings(25); TextFIEldtxtUsername=newTextFIEld("用户名","username"); TextFIEldtxtPassword=newTextFIEld("密码","password"); TextFIEldtxtEmail=newTextFIEld("邮箱","email"); TextFIEldtxtPhone=newTextFIEld("电话","phone"); txtUsername.setRegex("^[a-zA-Z]*$"); txtUsername.setRegexText("用户名必须为字母!"); txtUsername.setAllowBlank(false); txtPassword.setPassword(true); txtPassword.setRegex("^[a-zA-Z]*$"); txtPassword.setRegexText("密码必须为字母!"); txtPassword.setAllowBlank(false); txtEmail.setVtype(VType.EMAIL); txtEmail.setVtypeText("请输入合法的邮箱地址!"); txtEmail.setAllowBlank(false); txtPhone.setRegex("^//d*$"); txtPhone.setRegexText("电话必须为数字!"); txtPhone.setAllowBlank(false); frm.add(txtUsername); frm.add(txtPassword); frm.add(txtEmail); frm.add(txtPhone); PanelbuttonPanel=newPanel(); buttonPanel.setLayout(newHorizontalLayout(10)); finalAsyncCallbackcallback=this; buttonbtnSave=newbutton("保存"); btnSave.addListener(newbuttonListenerAdapter(){ publicvoIDonClick(buttonbutton,EventObjecte){ if(frm.getForm().isValID()){ RegisteractionAsyncaction=Registeraction.Util.getInstance(); MapformData=getFormDataAsMap(frm.getForm()); action.saveData(formData,callback); }else{ MessageBox.alert("错误","请验证输入的信息是否正确!"); } } }); buttonbtnClear=newbutton("取消"); btnClear.addListener(newbuttonListenerAdapter(){ publicvoIDonClick(buttonbutton,EventObjecte){ MessageBox.alert("取消","注册信息保存失败!"); } }); buttonPanel.add(btnSave); buttonPanel.add(btnClear); frm.add(buttonPanel); RootPanel.get().add(frm); } publicMapgetFormDataAsMap(Formform){ StringformValues=form.getValues(); MapformData=newHashMap(); String[]nameValuePairs=formValues.split("&"); for(inti=0;i<nameValuePairs.length;++i){ String[]oneItem=nameValuePairs[i].split("="); formData.put(oneItem[0],oneItem[1]); } returnformData; } publicvoIDonFailure(Throwablecaught){ MessageBox.alert("失败","数据保存失败!"); } publicvoIDonSuccess(Objectresult){ MessageBox.alert("成功","数据保存成功!"); } }
/** * @author 七月天 * */public class Register implements EntryPoint,AsyncCallback {	public voID onModuleLoad() {		createComponents();	}	private voID createComponents() {		final FormPanel frm = new FormPanel();		frm.setDraggable(true);		frm.setWIDth(300);		frm.setTitle("用户注册");		frm.setpaddings(25);		TextFIEld txtUsername = new TextFIEld("用户名","username");		TextFIEld txtPassword = new TextFIEld("密码","password");		TextFIEld txtEmail = new TextFIEld("邮箱","email");		TextFIEld txtPhone = new TextFIEld("电话","phone");		txtUsername.setRegex("^[a-zA-Z]*$");		txtUsername.setRegexText("用户名必须为字母!");		txtUsername.setAllowBlank(false);		txtPassword.setPassword(true);		txtPassword.setRegex("^[a-zA-Z]*$");		txtPassword.setRegexText("密码必须为字母!");		txtPassword.setAllowBlank(false);		txtEmail.setVtype(VType.EMAIL);		txtEmail.setVtypeText("请输入合法的邮箱地址!");		txtEmail.setAllowBlank(false);		txtPhone.setRegex("^//d*$");		txtPhone.setRegexText("电话必须为数字!");		txtPhone.setAllowBlank(false);		frm.add(txtUsername);		frm.add(txtPassword);		frm.add(txtEmail);		frm.add(txtPhone);		Panel buttonPanel = new Panel();		buttonPanel.setLayout(new HorizontalLayout(10));		final AsyncCallback callback=this;				button btnSave = new button("保存");		btnSave.addListener(new buttonListenerAdapter() {			public voID onClick(button button,EventObject e) {				if (frm.getForm().isValID()) {					RegisteractionAsync action=Registeraction.Util.getInstance();					Map formData=getFormDataAsMap(frm.getForm());					action.saveData(formData,callback);				} else {					MessageBox.alert("错误","请验证输入的信息是否正确!");				}			}		});		button btnClear = new button("取消");		btnClear.addListener(new buttonListenerAdapter() {			public voID onClick(button button,EventObject e) {				MessageBox.alert("取消","注册信息保存失败!");			}		});		buttonPanel.add(btnSave);		buttonPanel.add(btnClear);		frm.add(buttonPanel);		RootPanel.get().add(frm);	}		public Map getFormDataAsMap(Form form){				String formValues=form.getValues();		Map formData=new HashMap();		String[] nameValuePairs=formValues.split("&");				for(int i=0;i<nameValuePairs.length;++i){			String[] oneItem=nameValuePairs[i].split("=");			formData.put(oneItem[0],oneItem[1]);		}				return formData;	}	public voID onFailure(Throwable caught) {		MessageBox.alert("失败","数据保存失败!");	}	public voID onSuccess(Object result) {		MessageBox.alert("成功","数据保存成功!");	}}

@H_231_403@

b. AsyncCallback 接口定义了两个方法: onSuccess(Object result) onFailure(Throwable caught)。必须定义一个可以实现这两个方法的类。当执行远程调用时,模型类的实例并将其传递给异步服务方法。最后,服务器端资源完成,然后调用代码中两个方法之一。成功方法的参数是接口和实现中的调用的返回值。

c. 运行一下,看看效果吧! ^o^

备注: @H_231_403@

怎样的字段才是可序列化字段?首先,该字段可属于一个实现了 @H_231_403@ com.Google.gwt.user.clIEnt.rpc.IsSerializable 的类型,或者具有一个实现了 @H_231_403@ IsSerializable 的超类。或者,该字段可以是基本类型之一,其中包括 @H_231_403@ Java 原语,所有原语包装类, @H_231_403@Date @H_231_403@ String 。序列化类型的数组或集合也是序列化的。但是,如果要将一个 @H_231_403@ Collection @H_231_403@ List 序列化, @H_231_403@GWT 希望您用一个指定实际类型的 @H_231_403@ Javadoc 注释对其评注,以便编译器可以使其最优化。

总结

以上是内存溢出为你收集整理的Gwt-Ext学习笔记之进级篇全部内容,希望文章能够帮你解决Gwt-Ext学习笔记之进级篇所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1180578.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存