`
harry
  • 浏览: 184527 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用一个servlet来分配所有的gwt service

    博客分类:
  • Java
阅读更多
GWT中默认一个service对应一个servlet,这样会使web.xml要配置很多servlet, 不是很方便。我这里通过一个Dispatch servlet来分配service, 这样每个service都成了pojo,使得配置更加方便,也容易测试。

1. Server code

Configure web.xml like

       <servlet>
                <servlet-name>gwt-dispatch</servlet-name>
                <servlet-class>
                        com.xxxxx.gwt.GwtRpcServiceDispatch
                </servlet-class>
                <init-param>
                        <param-name>prefix</param-name>
                        <param-value>/gsvc</param-value>
                </init-param>
        </servlet>
        <servlet-mapping>
                <servlet-name>gwt-dispatch</servlet-name>
                <url-pattern>/gsvc/*</url-pattern>
        </servlet-mapping>

prefix参数表示service访问url的根路径

Why it works: Let's see the code of GwtRpcServiceDispatch.java
   1 /**
   2  * @author xwang
   3  * Dispatch the gwt services
   4  */
   5 public class GwtRpcServiceDispatch extends RemoteServiceServlet {
   6     private static final long serialVersionUID = -2797202947611240618L;
   7
   8     private Injector injector;
   9
  10     private int beginIndexOfClassName;
  11
  12     @Override
  13     public void init(ServletConfig config) throws ServletException {
  14         super.init(config);
  15         // get guice injector, it init by ServletContextListener
  16         injector = InjectorHolder.getInjector();
  17         if (injector == null) {
  18             throw new UnavailableException("Guice Injector not found (did you forget to register a "
  19                     + this.getClass().getSimpleName() + "?)");
  20         }
  21
  22         // set prefix of service url
  23         String prefix = config.getInitParameter("prefix");
  24         if (prefix == null || prefix.length() == 0) {
  25             beginIndexOfClassName = 1;
  26         } else if (prefix.startsWith("/")) {
  27             beginIndexOfClassName = prefix.length() + 1;
  28         } else {
  29             beginIndexOfClassName = prefix.length() + 2;
  30         }
  31     }

这里先要设置Guice Injector, 应为我们的service中用到了guice. 其次设置prefix的长度.

接着就可以根据URL来实例化RomteService,如下:

   1 /**
   2      * get service implement class's instance
   3      * @return service implement class's instance
   4      */
   5     protected Object getCurrentHandler() {
   6         String classPath = getThreadLocalRequest().getRequestURI();
   7         // /gsvc/com/xxxxx/bus/domain/service/LandmarkService => com.xxxxx.bus.domain.service.LandmarkService
   8         String className = classPath.substring(beginIndexOfClassName);
   9         if (className.endsWith("/")) {
  10             className = className.substring(0, className.length() - 1);
  11         }
  12         className = className.replaceAll("/", ".");
  13
  14         Class<?> clazz = null;
  15         try {
  16             clazz = Class.forName(className);
  17         } catch (ClassNotFoundException e) {
  18             e.printStackTrace();
  19             throw new IllegalStateException(e.getMessage());
  20         }
  21
  22         return injector.getInstance(clazz);
  23     }

当然我们需要重新定义RemoteServiceServlet的主处理方法:

   1     // this is the main method of RemoteServiceServlet to process request
   2     @Override
   3     public String processCall(String payload) throws SerializationException {
   4         Object serviceHandler = getCurrentHandler(); //get instance of RemoteService
   5
   6         try {
   7             RPCRequest rpcRequest = RPC.decodeRequest(payload, serviceHandler.getClass(), this);
   8             return RPC.invokeAndEncodeResponse(serviceHandler, rpcRequest.getMethod(), rpcRequest.getParameters(), rpcRequest
   9                     .getSerializationPolicy());
  10         } catch (IncompatibleRemoteServiceException ex) {
  11             getServletContext().log("An IncompatibleRemoteServiceException was thrown while processing this call.", ex);
  12             return RPC.encodeResponseForFailure(null, ex);
  13         }
  14     }

还要重新定义support方法:

   1     // RemoteServiceServlet use this judge the instance
   2     public boolean supports(Object handler) {
   3         return handler instanceof RemoteService;
   4     }

现在我们的RemoteService就成为了一个pojo如:

   1 public interface LandmarkService extends RemoteService {
   2 ...........
   3 }
   4
   5 public class LandmarkServiceImpl implements LandmarkService {
   6 ...........
   7 }

2. Client code

gwt client这边需要用

   1 ServiceHelper.registerServiceEntryPoint(instance);

获取访问URL.

why it works:
   1      /**
   2      * register service url
   3      * @param svcObj service object
   4      * com.xxxxx.bus.domain.service.LandmarkService => /gsvc/com/xxxxx/bus/domain/service/LandmarkService
   5      */
   6     public static void registerServiceEntryPoint(Object svcObj) {
   7         ServiceDefTarget endpoint = (ServiceDefTarget) svcObj;
   8         String endpointText = GWT.getTypeName(svcObj);
   9         endpointText = endpointText.substring(0, endpointText.indexOf("_Proxy"));
  10         endpointText = endpointText.replace('.', '/');
  11         endpoint.setServiceEntryPoint("/gsvc/" + endpointText);
  12     }

GWT.getTypeName can get the class name of service object

你可以使用如下代码的方式构造你的service
   1 public interface LandmarkService extends RemoteService {
   2     public static class Initer {
   3         private static LandmarkServiceAsync instance;
   4         public static LandmarkServiceAsync getInstance(){
   5             if (instance == null) {
   6                 instance = (LandmarkServiceAsync) GWT.create(LandmarkService.class);
   7                 ServiceHelper.registerServiceEntryPoint(instance);
   8             }
   9            
  10             return instance;
  11         }
  12     }
  13 ........
分享到:
评论
1 楼 liwei 2008-07-15  
楼主能谈谈具体的优势在哪个地方啊

相关推荐

    gwt-servlet-2.3.0.jar

    GWT(Google Web Toolkit)是一个开源的Java开发框架,它允许开发者使用Java语言来编写客户端的Web应用程序。GWT-Servlet是GWT框架的一部分,主要负责处理服务器端的交互。`gwt-servlet-2.3.0.jar`是GWT 2.3.0版本的...

    gwt-servlet.jar

    gwt-servlet.jar 最新版,由于文件太大、不可以上传、有需要可以留言、整包分享给你、

    使用GWT实现文件上传功能

    5. 在服务器端,你需要创建一个Servlet来接收和处理上传的文件。这里使用了Java Servlet API,特别是`HttpServletRequest`和`HttpServletResponse`接口。为了处理文件,推荐使用Apache Commons FileUpload库,它可以...

    GWT安装和使用

    为了更好地理解如何使用 GWT 进行 UI 开发,下面通过一个具体的示例来展示整个过程: **步骤一:环境搭建** - **GWT 下载**:首先从 Google 官方网站下载适用于 Windows 平台的 GWT 安装包,当前版本为 1.0.21。 - ...

    gwt 练习 gwt学习

    2. **模块化(GWT Module)**:每个GWT项目都始于一个`.gwt.xml`模块文件,它定义了项目的配置信息,包括使用的库、本地化设置、主题等。 3. **Java到JavaScript编译**:GWT的编译过程将Java源代码转化为优化的...

    一个简单的GWT示例

    对于初学者,这是一个很好的机会来了解GWT的工作原理,如何创建UI,以及如何与服务器进行通信。通过查找并修复这个BUG,可以提高对GWT框架的理解,并且提升解决实际问题的能力。建议先阅读GWT的官方文档,理解基本...

    GWT入门 GWT中文教程

    总的来说,这个压缩包提供了一个全面的GWT学习路径,从基础的GWT使用到EXT-GWT的组件开发,再到快速开发技巧,覆盖了GWT开发的各个方面。通过深入学习和实践其中的内容,开发者可以有效地掌握GWT技术,开发出高性能...

    java教程GWT开发

    该教程将指导读者如何使用 GWT 和熟悉的 Java 工具,例如 Apache Ant,Tomcat 5.0 servlet 容器和 IntelliJ IDEA 集成开发环境,来开发一个简单的 Ajax 应用程序。 标签解释 标签是 "java",表示该教程的主要内容是...

    部署一个简单GWT应用到Google App Engine

    标题 "部署一个简单GWT应用到Google App Engine" 涉及到的技术点主要包括Google Web Toolkit (GWT) 和 Google App Engine (GAE),这两者都是Google提供的开发和托管Web应用的重要工具。以下是对这些技术及其相关知识...

    gwt-servlet-1.4.61.jar

    gwt-servlet-1.4.61.jar

    GWT一个页面包含多个模块时出现的问题

    标题 "GWT一个页面包含多个模块时出现的问题" 指的是在使用Google Web Toolkit (GWT) 开发Web应用时,遇到的当一个页面需要加载多个模块时可能产生的技术挑战。GWT是一种用于构建高性能JavaScript应用程序的Java框架...

    GWT整合Hibernate的一个小实例

    标题中的" GWT整合Hibernate的一个小实例 "是指将Google Web Toolkit(一种用于创建富客户端Web应用的Java开发框架)与Hibernate(一个流行的对象关系映射(ORM)框架)结合使用,以便在GWT应用中执行数据库交互。...

    gwt和tomcat整合

    GWT是一个开源的Java框架,用于开发在浏览器上运行的富互联网应用程序(RIA),而Tomcat是一款流行的、开源的Java Servlet容器。以下是关于这个主题的详细知识点: 1. **Google Web Toolkit (GWT)**: - GWT是Google...

    GWT快速开发(GWT) 是一个Java软件开发框架用于开发类似于Google Maps和Gmail的AJAX应用程序。GWT的设计参考Java AWT包设计,类命名规则、接口设计、事件监听等。你可以用Java编程语言开发你的界面,然后用GWT编译器将Java类转换成适合浏览器执行的...

    通过以上介绍可以看出,GWT提供了一个强大而灵活的开发框架,使得开发者能够使用Java语言构建出高质量的AJAX应用程序。无论是对于初学者还是有经验的开发者来说,掌握GWT的基本原理和开发流程都是非常有价值的。随着...

    Gwt连接数据库的案例

    因此,你需要在服务端创建一个Servlet或RPC服务,这个服务负责处理来自GWT客户端的请求,执行数据库查询,然后将结果返回给客户端。 1. **GWT RPC机制**:GWT Remote Procedure Call (RPC) 是一种用于客户端和...

    GWT

    标题 "GWT" 指的是 Google Web Toolkit,这是一个开源的Java开发框架,主要用于构建高性能、跨浏览器的富互联网应用程序(Rich Internet Applications,简称RIA)。GWT通过将Java代码编译为JavaScript,使得开发者...

Global site tag (gtag.js) - Google Analytics