`

gwt spring 完美整合

    博客分类:
  • gwt
阅读更多

1.3版本前整合gwt spring,用到了第三方类,如cglib扩展类具备gwt servlet的功能,随着1.4版本的发布(发布很久了T_T '),整合有了新的方式,闲话不说,看看整合后的servlet如何调用服务:

java 代码
  1. /**  
  2.  * GWTRemoteServiceServlet act as a dispatch servlet for all GWT services  
  3.  *   
  4.  * in your web.xml, mapping all request /gwtrpc/ to this servlet  
  5.  *   
  6.  */  
  7. public class GWTRemoteServiceServlet extends RemoteServiceServlet {   
  8.   
  9.     private WebApplicationContext springContext;   
  10.   
  11.     @Override  
  12.     public void init(ServletConfig config) throws ServletException {   
  13.            
  14.         super.init(config);   
  15.            
  16.         springContext = (WebApplicationContext) config   
  17.                 .getServletContext()   
  18.                 .getAttribute(   
  19.                         WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);   
  20.   
  21.         if (springContext == null) {   
  22.             throw new RuntimeException(   
  23.                     "Check your web.xml setting, no Spring context configured");   
  24.         }   
  25.   
  26.     }   
  27.   
  28.     @Override  
  29.     protected void service(HttpServletRequest req, HttpServletResponse resp)   
  30.             throws ServletException, IOException {   
  31.         try {   
  32.             HttpRequestContext context = new HttpRequestContext(req, resp, this  
  33.                     .getServletConfig());   
  34.   
  35.             HttpRequestContext.ThreadLocalHttpRequestContext.set(context);   
  36.   
  37.             ServletContext servletContext = getServletContext();   
  38.   
  39.             perThreadRequest.set(req);   
  40.             perThreadResponse.set(resp);   
  41.   
  42.             String pathInfo = req.getPathInfo();   
  43.             if (pathInfo.startsWith("/")) {   
  44.                 pathInfo = pathInfo.substring(1);   
  45.             }   
  46.   
  47.             RemoteService service = (RemoteService) springContext.getBean(pathInfo);   
  48.   
  49.             String requestPayload = readPayloadAsUtf8(req);   
  50.   
  51.             // Let subclasses see the serialized request.   
  52.             //   
  53.             onBeforeRequestDeserialized(requestPayload);   
  54.   
  55.             // Invoke the core dispatching logic, which returns the serialized   
  56.             // result.   
  57.             //   
  58.             String responsePayload = processCall(service, requestPayload);   
  59.   
  60.             // Let subclasses see the serialized response.   
  61.             //   
  62.             onAfterResponseSerialized(responsePayload);   
  63.   
  64.             // Write the response.   
  65.             //   
  66.             writeResponse(req, resp, responsePayload);   
  67.         } catch (Throwable e) {   
  68.             // Give a subclass a chance to either handle the exception or   
  69.             // rethrow it   
  70.             //   
  71.             doUnexpectedFailure(e);   
  72.         } finally {   
  73.             HttpRequestContext.ThreadLocalHttpRequestContext.remove();   
  74.         }   
  75.     }   
  76.   
  77.     /**  
  78.      * rewrite processCall  
  79.      *   
  80.      * @param bean  
  81.      * @param payload  
  82.      * @return  
  83.      * @throws SerializationException  
  84.      */  
  85.     public String processCall(RemoteService bean, String payload)   
  86.             throws SerializationException {   
  87.         try {   
  88.             RPCRequest rpcRequest = RPC.decodeRequest(payload, bean.getClass(),   
  89.                     this);   
  90.             return RPC.invokeAndEncodeResponse(bean, rpcRequest.getMethod(),   
  91.                     rpcRequest.getParameters(), rpcRequest   
  92.                             .getSerializationPolicy());   
  93.         } catch (IncompatibleRemoteServiceException ex) {   
  94.             getServletContext()   
  95.                     .log(   
  96.                             "An IncompatibleRemoteServiceException was thrown while processing this call.",   
  97.                             ex);   
  98.             return RPC.encodeResponseForFailure(null, ex);   
  99.         }   
  100.     }   
  101. }   

 xml代码:

  1. <bean id="bookservice" class="com.service.BookService" />  
java 代码
  1. class BookService implements IBookService{   
  2. }   
  3.   
  4. interface IBookService extends RemoteService{   
  5. }  

ok,该servlet继承RemoteServiceServlet,做了三件事

1.init时获得spring webContext

2.service时解析请求字符,如/service/bookservice,获得bookservice名,对应spring bean id

3.重写processCall方法,通过bookservice,在springContext中获得注册了的bookservice,提供调用

分享到:
评论
14 楼 jiangmin 2008-11-20  
GWT+SPRING真的让人弄的很郁闷啊,LZ是否能指点一下啊,根据你这样做了以后,掉用时出现以下错误 貌似那个GWTRemoteServiceServlet 就没调用到:
[WARN] Resource not found: login; (could a file be missing from the public path or a <servlet> tag misconfigured in module org.fungchoi.WebPMC.gwt.xml ?)

13 楼 yongyuan.jiang 2008-06-14  
gwt前端定义一个异常类
public class ApplicationException extends SerializableException implements
IsSerializable {
后台出错抛出这个异常即可
12 楼 angeltping 2008-06-04  
(gwt+spring)我想用aop拦截来判断session超时,但是我怎样才能能像客户端抛异常了让客户端知道我这个掉方法失败的exception是因为session超时了
11 楼 abo 2008-05-14  


博主是javaeye上的gwt第一高人,特别希望博主可以就如何用gwt开发一个伸展性比较好的应用整理出一篇完整的文章,这样大家学习起来也比较方便。
再次谢谢博主。
10 楼 arpenker 2008-05-07  
偶的个神啊。能否给个完整一点的DEMO啊。万分感激。

arpenker@gmail.com
9 楼 arpenker 2008-05-07  
倒。。。搞不懂呢。楼主。真是神啊。。弄个完整点的DEMO来啊。
邮箱:arpenker@gmail.com
thanks.
8 楼 yongyuan.jiang 2008-01-09  
哦,是这样子的。

1 perThreadRequest和perThreadResponse是private的,你这里怎么可以引用?
我把父类的方法全部写成protected了

2 HttpRequestContext这个类是哪里的?
这个类是自己写的一个类,用于存放requestde

3 readPayloadAsUtf8这个方法为什么我引用不到?
这个方法也是在父类当中
7 楼 cloudyofsky 2008-01-02  
yongyuan.jiang,对你的代码我有些疑惑,还请多多指教。
1 perThreadRequest和perThreadResponse是private的,你这里怎么可以引用?
2 HttpRequestContext这个类是哪里的?
3 readPayloadAsUtf8这个方法为什么我引用不到?
谢谢!
6 楼 yongyuan.jiang 2007-12-03  
so good ,唉。我对spring那个ModelAndView 还是不懂
5 楼 gwbasic 2007-11-30  
谢谢yongyuan.jiang,支持aop
另一个版本

delegate 用法参照 org.springframework.web.servlet.mvc.multiaction.MultiActionController

public class GwtRemoteServiceController extends RemoteServiceServlet implements
		Controller, ServletContextAware {
	private static final long serialVersionUID = 8175888785480720736L;

	private Object delegate;

	private ServletContext servletContext;

	@Override
	public void setServletContext(ServletContext servletContext) {
		this.servletContext = servletContext;
	}

	@Override
	public ServletContext getServletContext() {
		return servletContext;
	}

	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		super.doPost(request, response);
		return null;
	}

	@Override
	public String processCall(String payload) throws SerializationException {
		Object delegateToUse = this.delegate;
		if (delegateToUse == null) {
			return super.processCall(payload);
		} else {
			try {
				RPCRequest rpcRequest = RPC.decodeRequest(payload,
						delegateToUse.getClass(), this);
				return RPC.invokeAndEncodeResponse(delegateToUse, rpcRequest
						.getMethod(), rpcRequest.getParameters(), rpcRequest
						.getSerializationPolicy());
			} catch (IncompatibleRemoteServiceException ex) {
				getServletContext()
						.log(
								"An IncompatibleRemoteServiceException was thrown while processing this call.",
								ex);
				return RPC.encodeResponseForFailure(null, ex);
			}
		}
	}

	public Object getDelegate() {
		return delegate;
	}

	public void setDelegate(Object delegate) {
		this.delegate = delegate;
	}
}
4 楼 yongyuan.jiang 2007-11-28  
方便快速强大,不要把简单问题复杂化
3 楼 yongyuan.jiang 2007-11-28  
支持啊,其实就是gwt调用了一个spring服务,而spring服务是一个gwt服务而已
2 楼 gwbasic 2007-11-27  
这样做好像不支持aop
1 楼 yongyuan.jiang 2007-11-26  
新架构优势:
1.没有使用第三方包扩展,更快速、更稳定
2.由一个servlet转发请求,服务类为spring注册的类,无需继承RemoteServlet,服务类不是servlet

相关推荐

    gwt spring整合资源下载

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

    GWT与Spring整合经典文章

    【GWT与Spring整合】是现代企业级应用开发中的一个重要话题。Google Web Toolkit (GWT) 是一个由Google开发的开源工具包,它允许开发者使用Java编写富互联网应用(RIA),然后自动将其编译为高效的JavaScript代码。...

    smartGwt、spring、Mybatis整合

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

    gwt+spring+hibernate

    综上所述,"gwt+spring+hibernate"的整合旨在展示如何在Java Web应用中同时利用GWT的富客户端特性、Spring的架构优势和Hibernate的数据持久化能力。通过这样的整合,开发者可以构建出用户体验良好、业务逻辑清晰且...

    gwt+spring

    首先,整合GWT和Spring的主要目标是利用GWT的客户端功能和Spring的服务器端能力。这通常涉及以下步骤: 1. **配置Spring**:在服务器端,我们需要创建一个Spring配置文件(如`applicationContext.xml`),定义bean...

    smartgwt + spring + hibernate

    为了整合这三个框架,开发者需要配置Spring的ApplicationContext,声明SmartGWT的视图组件和Spring的业务层bean。同时,需要设置Hibernate的SessionFactory,通过Hibernate的Configuration类加载数据库配置,并创建...

    smartgwt+mybatis+spring的整合

    SmartGwt、Mybatis与Spring的整合是企业级Java应用开发中的常见技术栈组合,这三种框架各有其专长,可以高效地构建出强大的后台系统。SmartGwt是一款基于GWT(Google Web Toolkit)的开源UI组件库,提供丰富的用户...

    GSH:spring3.1.0M2+Hibernate3.5+GWT2.4+JPA+Annotation+Spring4gwt0.0.1亲手整合

    GSH:spring3.1.0M2+Hibernate3.5+GWT2.4+JPA+Annotation+Spring4gwt0.0.1亲手整合,也可以上新浪博客去看 http://blog.sina.com.cn/s/blog_687dfecb0100yrmf.html

    GWT+Spring demo- springgwt_sudoku

    【标题】"GWT+Spring demo- springgwt_sudoku" 涉及的主要知识点是Google Web Toolkit (GWT) 和Spring框架的整合应用。这是一个实际的项目示例,展示了如何将GWT的客户端能力与Spring的服务器端功能相结合,以创建一...

    GWT整合Spring

    【GWT整合Spring】是指将Google Web Toolkit (GWT) 应用程序与Spring框架集成,以便利用Spring的强大功能,如依赖注入、事务管理、安全控制等。GWT 是一个用于构建高性能、富客户端Web应用的Java开发工具,而Spring...

    gwt和tomcat整合

    标题中的“gwt和tomcat整合”指的是将Google Web Toolkit (GWT) 应用程序部署到Apache Tomcat服务器的过程。GWT是一个开源的Java框架,用于开发在浏览器上运行的富互联网应用程序(RIA),而Tomcat是一款流行的、开源...

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

    标题 "Ext-Gwt(GWT)开发实例(整合Spring +Hibernate)" 涉及到的是一个实际项目开发的教程,其中结合了三个重要的技术框架:Google Web Toolkit (GWT),Spring 和 Hibernate。这个实例旨在展示如何在Web应用开发中...

    gwt_spring-nolib.zip

    GWT(Google Web Toolkit)和Spring框架的集成是...此外,还可以了解到如何整合数据库操作,以及Spring的依赖注入和事务管理功能。这个例子对于理解GWT和Spring的集成原理,以及实践Web应用开发具有很高的参考价值。

    gwt-spring

    通过深入研究这些文件,我们可以学习到如何在实际项目中整合GWT和Spring,如何设置和配置Spring环境,以及如何在GWT客户端与Spring服务器之间进行通信。这对于那些想要掌握这两种技术结合使用的人来说,是一个宝贵的...

    spring集成gwt的办法

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Google Web Toolkit (GWT) 则是一个用于构建和优化复杂Web应用程序的开源工具。本文将深入探讨如何将这两个强大的技术进行集成,以便利用Spring的强大功能来...

    搭建简单的EXT-GWT(GXT)的开发环境(三)gxt结合spring和hibernate进行数据操作

    本篇文章将聚焦于如何在EXT-GWT中整合Spring框架和Hibernate ORM,以实现高效的数据操作。 首先,让我们了解EXT-GWT(GXT)的核心概念。EXT-GWT是GWT的一个扩展,它提供了大量的UI组件,如表格、树、表单等,以及...

    Spring4GWT技术资料

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

    gxt、gwt与spring结合使用

    将GXT、GWT与Spring结合使用,可以构建出高效、可维护且功能齐全的企业级Web应用。 GXT是Ext JS的一个Java版本,提供了大量的桌面级UI组件,如表格、图表、树形视图等,同时还支持数据绑定和分页功能。GXT的优势...

Global site tag (gtag.js) - Google Analytics