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);
}
}
分享到:
相关推荐
< artifactId>spring-gwtrpc</ artifactId> < version>1.0.0</ version></ dependency>特征派遣到Spring BeanSpring GWT-RPC提供了一个简单的Servlet,它扩展了RemoteServiceServlet以将RPC请求分派到所需的Spring ...
GWT-RPC允许调用服务器端的方法,传递数据,处理结果并返回到客户端,所有这些都是透明的。 - **Spring的Service层**: 定义业务逻辑,通常使用Hibernate来处理数据库操作。Spring的依赖注入可以帮助管理这些服务的...
4. **部署Spring应用上下文**:确保在Web应用的`web.xml`中配置了Spring的DispatcherServlet,以便处理HTTP请求并将它们路由到正确的Spring beans。 5. **安全集成**:整合GWT和Spring时,还要考虑安全问题。可以...
总之,这个资源将帮助你全面理解GWT RPC的工作流程,包括环境配置、服务接口定义、服务代理使用以及如何处理异步响应。通过实践例子和文档,你将能够熟练掌握GWT中RPC调用的技巧,从而提升你的Web应用开发能力。
此外,我们还定义了一个`servlet-mapping`,将所有`.rpc`请求映射到`GWTSpring`,这是GWT远程服务调用的URL模式。 细心的读者会发现,原始的GWT模板URL模式是`/*`,但在实际配置中,我将它修改为`/static/*`。这样...
GWT-RPC采用异步调用的方式,因此在客户端需要定义回调类来处理服务器端方法调用的结果。回调类通常包含两个方法:`onSuccess()`用于处理成功响应,`onFailure()`用于处理失败情况。 ### 示例 #### 获取简单数据 ...
本文将深入探讨如何将这两个强大的技术进行集成,以便利用Spring的强大功能来管理和控制GWT应用程序的后端逻辑。 **一、Spring框架简介** Spring是一个全面的Java企业级应用开发框架,它提供了依赖注入(Dependency...
总的来说,这个项目演示了如何将GWT的客户端优势与Spring的后端强大功能结合,通过Maven进行项目管理和构建,实现一个完整的Ajax应用。学习这个示例,可以帮助开发者掌握GWT和Spring的集成技巧,以及如何使用Maven...
6. 在服务器端,使用Spring的DispatcherServlet接收GWT的RPC请求,并路由到相应的服务方法。 这样的整合方案提供了强大的开发能力和灵活性,可以构建出高效、可扩展的ria应用系统。对于开发者来说,理解GWT的Widget...
- **Content-Type头**:如果你使用`RemoteServiceServlet`或`RPCServletUtils`处理POST请求,必须设置`Content-Type`头为`"text/x-gwt-rpc; charset=utf-8"`。通常,应在`setRequestData()`之前设置。 对于乱码问题...
标题 "gwt spring整合资源下载" 暗示了这个压缩包包含的是一些关于将Google Web Toolkit (GWT) 和Spring框架整合的资源。GWT是一个用于构建高性能、交互式JavaScript应用程序的Java开发框架,而Spring是一个广泛使用...
本项目"smartGwt、spring、Mybatis整合"就是一个很好的例子,它将三种流行的技术——SmartGWT、Spring和Mybatis融合在一起,创建了一个包含登录功能和分页查询功能的应用。以下是关于这三个技术及其整合方式的详细...
总的来说,这个项目展示了如何使用SmartGWT构建富客户端界面,通过Spring实现松耦合的架构,并利用Hibernate处理数据持久化。对于初学者,这是一个很好的学习案例,可以帮助理解如何将这三个强大工具结合在一起,...
1. GWT-RPC与Spring:GWT-RPC是GWT内部的通信机制,Spring4可以通过AOP进行拦截,实现服务端的事务管理和权限控制。同时,Spring4的Service层可以作为GWT-RPC的服务端,提供远程调用的接口。 2. Spring Security与...
Spring4GWT是将Spring框架与Google Web Toolkit (GWT) 结合的一种技术,它旨在帮助开发者在GWT应用中更好地实现服务层管理和依赖注入,从而提升开发效率和代码的可维护性。以下是对Spring4GWT技术的详细说明: 1. *...
**基于GWTRPC的通讯软件** GWTRPC(Google Web Toolkit Remote Procedure Call)是一种由Google Web Toolkit(GWT)提供的远程过程调用机制,用于在客户端JavaScript与服务器端Java之间进行高效、安全的数据通信。...
根据提供的文件信息,我们可以深入探讨GWT-RPC的相关知识点,主要围绕其概念、开发流程以及部署等几个方面展开。 ### GWT-RPC:基础知识与概念 #### RPC:远程过程调用 RPC(Remote Procedure Call)是一种协议,...
在开发过程中,GWT和Spring之间的通信通常通过远程服务调用(RPC)实现,GWT客户端发送请求到Spring管理的服务器端服务,然后由Hibernate处理数据库操作,最后将结果返回给客户端。 在这个实例中,可能包括以下几个...
总结来说,`gwt-servlet-2.3.0.jar`是GWT应用服务器端的核心组件,它负责处理客户端的RPC请求,实现业务逻辑,并确保与客户端的通信安全高效。开发者在构建基于GWT的应用时,必须正确配置和使用这个库,以充分利用其...
在这样的例子中,通常会有一个GWT的Service接口,对应于Spring的一个Bean,这个Bean处理客户端的请求,并通过GWT的RPC机制返回结果。 综上所述,结合GWT和Spring,开发者可以构建出既具有丰富用户体验又具备强大...