时间:2015-01-27 17:52 来源: 我爱IT技术网 编辑:52微风
GWT默认的RPC是一个RPC对应一个Servlet,如果需要实现增删改查功能,至少就得做4个servlet,每个servlet实现一个功能,然后还得在web.xml里注册这组servlet。
gwt-dispatch用比较简单的办法实现了更简单的办法。
下面做一个小例子,实现了两个RPC功能。
功能1:根据输入的名字,前面加hello字样然后输出。
功能2:根据输入的字符,直接输出输入的字符。
里面有下面几个概念,理解了就不难了
ActionHandler:gwt-disptach RPC的处理器,每个功能都要有一个ActionHandler的子类,通过ActionHandler来处理业务功能。
Action:相当与ActionHandler的传入参数对象,所有参数都通过Action传入给ActionHandler来处理。
Result:相当与处理后的返回结果,ActionHandler处理后,要用对象的方式返回Result的实例。
环境:
os:ubuntu 11.10
jdk:Linux jim-laptop 3.0.0-17-generic #30-Ubuntu SMP Thu Mar 8 20:45:39 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
gwt:2.4.0
gwt-disptach:1.2.0
顶级包目录:com.demo
ok,别的不说了,上代码
com.demo.Gwt_guice_dispatcher_demo1.gwt.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE module PUBLIC "//gwt-module/" "http://google-web-toolkit.googlecode.com/svn/tags/1.6.2/distro-source/core/src/gwt-module.dtd"> <module rename-to='gwt_guice_dispatcher_demo1'> <inherits name='com.google.gwt.user.User'/> <inherits name='com.google.gwt.user.theme.clean.Clean'/> <inherits name='net.customware.gwt.dispatch.Dispatch' /> <source path='client'/> <source path='shared'/> <entry-point class="com.demo.client.MainEntry" /> </module>
MainDispatchServletModule.java
package com.demo.server; import net.customware.gwt.dispatch.server.guice.GuiceStandardDispatchServlet; import com.google.inject.servlet.ServletModule; public class MainDispatchServletModule extends ServletModule { @Override protected void configureServlets() { //gwt_guice_dispatcher_demo1必须和gwt.xml中rename-to的名字一样 serve("/gwt_guice_dispatcher_demo1/dispatch").with(GuiceStandardDispatchServlet.class); } }
Hello处理的几个类
HelloAction.java
package com.demo.shared; import net.customware.gwt.dispatch.shared.Action; public class EchoAction implements Action{ private String message; public EchoAction() { this.message = ""; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
HelloResult.java
package com.demo.shared; import net.customware.gwt.dispatch.shared.Result; public class EchoResult implements Result { private String message; public EchoResult() { } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
HelloHandler.java
package com.demo.server.handler; import com.demo.shared.HelloAction; import com.demo.shared.HelloResult; import net.customware.gwt.dispatch.server.ActionHandler; import net.customware.gwt.dispatch.server.ExecutionContext; import net.customware.gwt.dispatch.shared.ActionException; public class HelloHandler implements ActionHandler{ @Override public HelloResult execute(HelloAction action, ExecutionContext context) throws ActionException { HelloResult result = new HelloResult(); result.setMessage("你好 " + action.getName()); return result; } @Override public Class getActionType() { return HelloAction.class; //返回Action类的类型 } @Override public void rollback(HelloAction action, HelloResult result, ExecutionContext context) throws ActionException { // } }
和Echo有关的三个类
EchoAction.java
package com.demo.shared; import net.customware.gwt.dispatch.shared.Action; /** * Action相当于RPC调用所需的入参 * @author jim * */ public class HelloAction implements Action{ private static final long serialVersionUID = 1054848714093248343L; private String name; public HelloAction() { //必须有默认构造,否则无法序列化 } public String getName() { return name; } public void setName(String name) { this.name = name; } }
EchoResult.java
package com.demo.shared; import net.customware.gwt.dispatch.shared.Result; /** * Action相当于RPC调用后的返回值 * @author jim * */ public class HelloResult implements Result { private static final long serialVersionUID = -2469468297641898770L; private String message; public HelloResult(){ //必须有默认构造,否则无法序列化 } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
EchoHandler.java
package com.demo.server.handler; import com.demo.shared.EchoAction; import com.demo.shared.EchoResult; import net.customware.gwt.dispatch.server.ActionHandler; import net.customware.gwt.dispatch.server.ExecutionContext; import net.customware.gwt.dispatch.shared.DispatchException; public class EchoHandler implements ActionHandler{ @Override public EchoResult execute(EchoAction action, ExecutionContext context) throws DispatchException { EchoResult result = new EchoResult(); result.setMessage(action.getMessage()); return result; } @Override public Class getActionType() { return EchoAction.class; } @Override public void rollback(EchoAction action, EchoResult result, ExecutionContext context) throws DispatchException { // } }
和Guice有关的Listener
GWTDispatcherServletContextListener.java
package com.demo.server; import net.customware.gwt.dispatch.server.guice.ActionHandlerModule; import net.customware.gwt.dispatch.server.guice.ServerDispatchModule; import com.demo.server.handler.EchoHandler; import com.demo.server.handler.HelloHandler; import com.demo.shared.EchoAction; import com.demo.shared.HelloAction; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.servlet.GuiceServletContextListener; public class GWTDispatcherServletContextListener extends GuiceServletContextListener { @Override protected Injector getInjector() { return Guice.createInjector(new ServerDispatchModule(), new MainDispatchServletModule(), new ActionHandlerModule() { @Override protected void configureHandlers() { bindHandler(HelloAction.class, HelloHandler.class); bindHandler(EchoAction.class, EchoHandler.class); } }); } }
web.xml
<pre class="xml"> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> <filter> <filter-name>guiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> <filter-mapping> <filter-name>guiceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>com.demo.server.GWTDispatcherServletContextListener</listener-class> </listener> <welcome-file-list> <welcome-file>Gwt_guice_dispatcher_demo1.html</welcome-file> </welcome-file-list> </web-app>
Gwt_guice_dispatcher_demo1.html
<!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link type="text/css" rel="stylesheet" href="Gwt_guice_dispatcher_demo1.css"> <title>gwt_guice_dispatcher_demo1</title> <script type="text/javascript" language="javascript" src="gwt_guice_dispatcher_demo1/gwt_guice_dispatcher_demo1.nocache.js"></script> </head> <body> </body> </html>
Gwt_guice_dispatcher_demo1.css 就不贴了,内容是google gwt plugin自动生成的,就算不要也不影响应用
主程序 EntryPoint MainEntry.java
package com.demo.client; import net.customware.gwt.dispatch.client.DefaultExceptionHandler; import net.customware.gwt.dispatch.client.DispatchAsync; import net.customware.gwt.dispatch.client.standard.StandardDispatchAsync; import com.demo.shared.EchoAction; import com.demo.shared.EchoResult; import com.demo.shared.HelloAction; import com.demo.shared.HelloResult; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextBox; public class MainEntry implements EntryPoint { private final DispatchAsync dispatch = new StandardDispatchAsync(new DefaultExceptionHandler()); @Override public void onModuleLoad() { RootPanel.get().clear(); final TextBox txtName = new TextBox(); RootPanel.get().add(txtName); Button btnHello = new Button("按钮1"); RootPanel.get().add(btnHello); btnHello.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { HelloAction action = new HelloAction(); action.setName(txtName.getText()); dispatch.execute(action, new AsyncCallback() { @Override public void onSuccess(HelloResult result) { Window.alert(result.getMessage()); } @Override public void onFailure(Throwable caught) { } }); } }); Button btnEcho = new Button("Echo"); btnEcho.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { EchoAction action = new EchoAction(); action.setMessage(txtName.getText()); dispatch.execute(action, new AsyncCallback () { @Override public void onFailure(Throwable caught) { // } @Override public void onSuccess(EchoResult result) { Window.alert(result.getMessage()); } }); } }); RootPanel.get().add(btnEcho); } }
ok,好了,就这些了。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
