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

重写gwt的RemoteServiceServlet,将GWT所有RPC的请求拦截下来交给SPRING来处理

 
阅读更多
package com.jme.help.gwt;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.SerializationException;
import com.google.gwt.user.server.rpc.RPC;
import com.google.gwt.user.server.rpc.RPCRequest;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.google.gwt.user.server.rpc.UnexpectedException;
import com.jme.exception.HOMSException;

/**
 * 重写gwt的RemoteServiceServlet,将GWT所有RPC的请求拦截下来交给SPRING来处理
 * @author zhangguangyu
 *
 */
public class SpringGwtRemoteServiceServlet extends RemoteServiceServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private static final Logger LOG = Logger
			.getLogger(SpringGwtRemoteServiceServlet.class);

	public void init() {
		if (LOG.isDebugEnabled())
			LOG.debug("Spring GWT service exporter deployed");
	}

	public String processCall(String payload) throws SerializationException {
		
		try {
			Object handler = getBean(getThreadLocalRequest());
			RPCRequest rpcRequest = RPC.decodeRequest(payload,
					handler.getClass(), this);
			onAfterRequestDeserialized(rpcRequest);
			if (LOG.isDebugEnabled()) {
				LOG.debug("Invoking " + handler.getClass().getName() + "."
						+ rpcRequest.getMethod().getName());
			}
			return RPC.invokeAndEncodeResponse(handler, rpcRequest.getMethod(),
					rpcRequest.getParameters(),
					rpcRequest.getSerializationPolicy());
		}catch(HOMSException e){
			return RPC.encodeResponseForFailure(null, e);
		} catch (IncompatibleRemoteServiceException ex) {
			log("An IncompatibleRemoteServiceException was thrown while processing this call.",
					ex);
			return RPC.encodeResponseForFailure(null, ex);
		}
		
	}

	protected Object getBean(HttpServletRequest request) {
		String service = getService(request);
		Object bean = getBean(service);
		
		BaseRemoteService base=(BaseRemoteService)bean;
		
		base.setThreadLocalRequest(this.getThreadLocalRequest());
		
		base.setThreadLocalResponse(this.getThreadLocalResponse());
		
		base.setServletContext(this.getServletContext());
		
		if (!(bean instanceof RemoteService)) {
			throw new IllegalArgumentException(
					"Spring bean is not a GWT RemoteService: " + service + " ("
							+ bean + ")");
		}
		if (LOG.isDebugEnabled()) {
			LOG.debug("Bean for service " + service + " is " + bean);
		}
		return bean;
	}

	protected String getService(HttpServletRequest request) {
		String url = request.getRequestURI();
		String service = url.substring(url.lastIndexOf("/") + 1);
		if (LOG.isDebugEnabled()) {
			LOG.debug("Service for URL " + url + " is " + service);
		}
		return service;
	}

	protected Object getBean(String name) {
		WebApplicationContext applicationContext = WebApplicationContextUtils
				.getWebApplicationContext(getServletContext());
		
		if (applicationContext == null) {
			throw new IllegalStateException(
					"No Spring web application context found");
		}
		if (!applicationContext.containsBean(name)) {
			throw new IllegalArgumentException("Spring bean not found: " + name);
		}

		return applicationContext.getBean(name);
	}
}
 

 

分享到:
评论

相关推荐

    spring-gwtrpc:GWT RPC服务的Spring集成

    < artifactId>spring-gwtrpc</ artifactId> < version>1.0.0</ version></ dependency>特征派遣到Spring BeanSpring GWT-RPC提供了一个简单的Servlet,它扩展了RemoteServiceServlet以将RPC请求分派到所需的Spring ...

    gwt+spring+hibernate

    GWT-RPC允许调用服务器端的方法,传递数据,处理结果并返回到客户端,所有这些都是透明的。 - **Spring的Service层**: 定义业务逻辑,通常使用Hibernate来处理数据库操作。Spring的依赖注入可以帮助管理这些服务的...

    gwt+spring

    4. **部署Spring应用上下文**:确保在Web应用的`web.xml`中配置了Spring的DispatcherServlet,以便处理HTTP请求并将它们路由到正确的Spring beans。 5. **安全集成**:整合GWT和Spring时,还要考虑安全问题。可以...

    GWT RPC详细例子:代码加文档说明

    总之,这个资源将帮助你全面理解GWT RPC的工作流程,包括环境配置、服务接口定义、服务代理使用以及如何处理异步响应。通过实践例子和文档,你将能够熟练掌握GWT中RPC调用的技巧,从而提升你的Web应用开发能力。

    GWT整合Spring

    此外,我们还定义了一个`servlet-mapping`,将所有`.rpc`请求映射到`GWTSpring`,这是GWT远程服务调用的URL模式。 细心的读者会发现,原始的GWT模板URL模式是`/*`,但在实际配置中,我将它修改为`/static/*`。这样...

    GWT-RPC-1.pdf

    GWT-RPC采用异步调用的方式,因此在客户端需要定义回调类来处理服务器端方法调用的结果。回调类通常包含两个方法:`onSuccess()`用于处理成功响应,`onFailure()`用于处理失败情况。 ### 示例 #### 获取简单数据 ...

    spring集成gwt的办法

    本文将深入探讨如何将这两个强大的技术进行集成,以便利用Spring的强大功能来管理和控制GWT应用程序的后端逻辑。 **一、Spring框架简介** Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(Dependency...

    GWT+Spring demo- springgwt_sudoku

    总的来说,这个项目演示了如何将GWT的客户端优势与Spring的后端强大功能结合,通过Maven进行项目管理和构建,实现一个完整的Ajax应用。学习这个示例,可以帮助开发者掌握GWT和Spring的集成技巧,以及如何使用Maven...

    GWT与Spring整合经典文章

    6. 在服务器端,使用Spring的DispatcherServlet接收GWT的RPC请求,并路由到相应的服务方法。 这样的整合方案提供了强大的开发能力和灵活性,可以构建出高效、可扩展的ria应用系统。对于开发者来说,理解GWT的Widget...

    GWT发送HTTP请求简明教程

    - **Content-Type头**:如果你使用`RemoteServiceServlet`或`RPCServletUtils`处理POST请求,必须设置`Content-Type`头为`"text/x-gwt-rpc; charset=utf-8"`。通常,应在`setRequestData()`之前设置。 对于乱码问题...

    gwt spring整合资源下载

    标题 "gwt spring整合资源下载" 暗示了这个压缩包包含的是一些关于将Google Web Toolkit (GWT) 和Spring框架整合的资源。GWT是一个用于构建高性能、交互式JavaScript应用程序的Java开发框架,而Spring是一个广泛使用...

    smartGwt、spring、Mybatis整合

    本项目"smartGwt、spring、Mybatis整合"就是一个很好的例子,它将三种流行的技术——SmartGWT、Spring和Mybatis融合在一起,创建了一个包含登录功能和分页查询功能的应用。以下是关于这三个技术及其整合方式的详细...

    smartgwt + spring + hibernate

    总的来说,这个项目展示了如何使用SmartGWT构建富客户端界面,通过Spring实现松耦合的架构,并利用Hibernate处理数据持久化。对于初学者,这是一个很好的学习案例,可以帮助理解如何将这三个强大工具结合在一起,...

    基于java的Spring4GWT.zip

    1. GWT-RPC与Spring:GWT-RPC是GWT内部的通信机制,Spring4可以通过AOP进行拦截,实现服务端的事务管理和权限控制。同时,Spring4的Service层可以作为GWT-RPC的服务端,提供远程调用的接口。 2. Spring Security与...

    Spring4GWT技术资料

    Spring4GWT是将Spring框架与Google Web Toolkit (GWT) 结合的一种技术,它旨在帮助开发者在GWT应用中更好地实现服务层管理和依赖注入,从而提升开发效率和代码的可维护性。以下是对Spring4GWT技术的详细说明: 1. *...

    基于GWTRPC的通讯软件

    **基于GWTRPC的通讯软件** GWTRPC(Google Web Toolkit Remote Procedure Call)是一种由Google Web Toolkit(GWT)提供的远程过程调用机制,用于在客户端JavaScript与服务器端Java之间进行高效、安全的数据通信。...

    GWT-RPC.pdf

    根据提供的文件信息,我们可以深入探讨GWT-RPC的相关知识点,主要围绕其概念、开发流程以及部署等几个方面展开。 ### GWT-RPC:基础知识与概念 #### RPC:远程过程调用 RPC(Remote Procedure Call)是一种协议,...

    Ext-Gwt(GWT)开发实例(整合Spring +Hibernate)

    在开发过程中,GWT和Spring之间的通信通常通过远程服务调用(RPC)实现,GWT客户端发送请求到Spring管理的服务器端服务,然后由Hibernate处理数据库操作,最后将结果返回给客户端。 在这个实例中,可能包括以下几个...

    gwt-servlet-2.3.0.jar

    总结来说,`gwt-servlet-2.3.0.jar`是GWT应用服务器端的核心组件,它负责处理客户端的RPC请求,实现业务逻辑,并确保与客户端的通信安全高效。开发者在构建基于GWT的应用时,必须正确配置和使用这个库,以充分利用其...

    gwt(google web toolkit) 和 spring 在一起使用列子

    在这样的例子中,通常会有一个GWT的Service接口,对应于Spring的一个Bean,这个Bean处理客户端的请求,并通过GWT的RPC机制返回结果。 综上所述,结合GWT和Spring,开发者可以构建出既具有丰富用户体验又具备强大...

Global site tag (gtag.js) - Google Analytics