gxt、gwt与spring结合使用

本文参考了yongyuan.jiang列子和网上一些有关文章。
这几天开始研究GXT与Spring结合,不在乎两种方式:
1、使用第三方类库:gwt-widgets-server
2、写一个继承自com.google.gwt.user.server.rpc.RemoteServiceServlet的servlet,结合spring复写其中的一些方法。
第一种方法,我没有试,我觉得第二种方法实现起来更简单,不依赖于任务第三方类库。我实践了第二种方式,把其中的过程式写下来,供大家参考学习,大家如果有什么更好的结合方式,也请多多指教。

一、建立项目工程
建立java project,这个比较简单,大家都会,在此略过。
二、实现RemoteServiceServlet,复写其的相关方法
MyGWTServer 代码:
[quote]
public class MyGWTServer extends RemoteServiceServlet {
private final ThreadLocal<HttpServletRequest> perThreadRequest = new ThreadLocal<HttpServletRequest>();
private final ThreadLocal<HttpServletResponse> perThreadResponse = new ThreadLocal<HttpServletResponse>();

private WebApplicationContext springContext;

@Override
public void init(ServletConfig Config) throws ServletException {
super.init(Config);
springContext = (WebApplicationContext) Config.getServletContext().getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

if (springContext == null) {
throw new RuntimeException("Check Your Web.Xml Setting, No Spring Context Configured");
}

}

@Override
protected SerializationPolicy doGetSerializationPolicy(HttpServletRequest request, String moduleBaseURL,
String strongName) {
return super.doGetSerializationPolicy((HttpServletRequest) perThreadRequest.get(), moduleBaseURL, strongName);
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
try {

perThreadRequest.set(req);
perThreadResponse.set(resp);

String requestURI = req.getRequestURI();
String beanname = requestURI.substring(requestURI.lastIndexOf("/") + 1,requestURI.lastIndexOf("[color=red].gwt[/color]"));
RemoteService service = (RemoteService) springContext.getBean(beanname);

String requestPayload = readPayloadAsUtf8(req);

// Let subclasses see the serialized request.
//
onBeforeRequestDeserialized(requestPayload);

// Invoke the core dispatching logic, which returns the serialized
// result.
//
String responsePayload = processCall(service, requestPayload);

// Let subclasses see the serialized response.
//
onAfterResponseSerialized(responsePayload);

// Write the response.
//
writeResponse(req, resp, responsePayload);
} catch (Throwable e) {
// Give a subclass a chance to either handle the exception or
// rethrow it
//
doUnexpectedFailure(e);
} finally {
// HttpRequestContext.ThreadLocalHttpRequestContext.remove();
perThreadRequest.set(null);
perThreadResponse.set(null);
}
}

/**
* rewrite processCall
*
* @param bean
* @param payload
* @return
* @throws SerializationException
*/
public String processCall(RemoteService bean, String payload) throws SerializationException {
try {
RPCRequest rpcRequest = RPC.decodeRequest(payload, bean.getClass(), this);
return RPC.invokeAndEncodeResponse(bean, 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);
}
}

private String readPayloadAsUtf8(HttpServletRequest request) throws IOException, ServletException {
return RPCServletUtils.readContentAsUtf8(request, true);
}

private void writeResponse(HttpServletRequest request, HttpServletResponse response, String responsePayload)
throws IOException {
boolean gzipEncode = RPCServletUtils.acceptsGzipEncoding(request)
&& shouldCompressResponse(request, response, responsePayload);
RPCServletUtils.writeResponse(getServletContext(), response, responsePayload, gzipEncode);
}
}
[/quote]

MyGWTServer继承RemoteServiceServlet,做了三件事
1.init时获得spring web context
2.service时解析请求字符,如/service/calculatorService,获得calculatorService名,对应spring bean id
3.重写processCall方法,通过calculatorService,在springContext中获得注册了的calculatorService,提供调用
4.对应的web.xml配置:
[quote]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>springgxt</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>MyGWTServer</servlet-name> <servlet-class>org.sundoctor.caculator.server.MyGWTServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyGWTServer</servlet-name>
<url-pattern>[color=red]*.gwt[/color]</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>Caculator.html</welcome-file>
</welcome-file-list>
</web-app>
[/quote]

MyGWTServerTest java代码:
[quote]
public class MyGWTServerTest extends RemoteServiceServlet {
…
}
[/quote]
MyGWTServerTest详细看附件中的源码。
MyGWTServerTest与MyGWTServer只有其中的init实现上不同,MyGWTServer是从web context 获取 spring的WebApplicationContext,MyGWTServerTest是直接读取applicationContext.xml文件初始化spring bean。
MyGWTServerTest主要用于开发阶段,用于java调试。如*.gwt.xml的配置:
[quote]
<?xml version="1.0" encoding="UTF-8" standalone="no"?><module>
<inherits name="com.google.gwt.user.User"/>
<inherits name="com.extjs.gxt.ui.GXT"/>
<entry-point class="org.sundoctor.caculator.client.Caculator"/>

<inherits name="com.google.gwt.user.theme.standard.Standard"/>
<servlet class="org.sundoctor.caculator.server.MyGWTServerTest" path="/calculatorService[color=red].gwt[/color]"/>
<servlet class="org.sundoctor.caculator.server.MyGWTServerTest" path="/others[color=red].gwt[/color]"/>
</module>
[/quote]

三、业务类实现
业务接口代码:
[quote]
@RemoteServiceRelativePath("calculatorService[color=red].gwt[/color]")
public interface CalculatorService extends RemoteService {

double add(double a, double b);

double sub(double a, double b);

double mul(double a, double b);

double div(double a, double b);

public static class Util {
private static CalculatorServiceAsync instance;
private static String moduleRelativeURL;

public static CalculatorServiceAsync getInstance() {
if (instance == null) {
instance = GWT.create(CalculatorService.class);
}
return instance;
}

public static String getModuleRelativeURL() {
if (moduleRelativeURL == null || moduleRelativeURL.equals("")) {
moduleRelativeURL = GWT.getModuleBaseURL()+"calculatorService[color=red].gwt[/color]";
}
return moduleRelativeURL;
}
}
}
[/quote]
在CalculatorService中注意[color=red].gwt[/color]其与第二步中相同的红色地方。

业务实现类代码:
[quote]
public class CalculatorServiceImpl implements CalculatorService {

public double add(double a, double b) {
return a + b;
}

public double div(double a, double b) {
return a / b;
}

public double mul(double a, double b) {
return a * b;
}

public double sub(double a, double b) {
return a - b;
}

}
[/quote]
在CalculatorServiceImpl 中不用实现任务GWT类或接口,可以不依赖于GWT。
applicationContext.xml配置:
[quote]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="calculatorService" class="org.sundoctor.caculator.server.CalculatorServiceImpl"/>
</beans>
[/quote]

四、工程源码:
查看附件。源码中没包括任何相关jar包,请自己补全:
commons-logging-1.0.4.jar
commons-lang-2.1.jar
gwt-user.jar 版本1.5.3
gwt-servlet.jar 版本1.5.3
gxt.jar 版本1.2.3
gxt-servlet.jar 版本1.2.3
spring.jar 版本2.5.6
9 HAL库驱动框架简述(STM32HAL库) HAL库外设的使用步骤总结如下:1、定义并填充xxx外设句柄结构体。2、如果遵循HAL库规范,通过HAL_xxx_MspInit()函数,实现外设底层资源的初始化,包括但不限于GPIO、时钟、DMA、中断等资源的初始化。3、调用HAL库的对应外设初始化函数,形如:HAL_xxx_Init()。4、初始化完成,开始使用外设。5、使用方法具体查看对应外设的HAL库驱动包中的说明:补充:HAL库使用主线外设初始化外设使用。 阅读详情

相关推荐

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 387

建立自己的GWT Spring Maven原型

大家好, 在观看Justin撰写的有关Spring和GWT的非常有趣的文章时,我认为展示如何构建自己的自定义Maven原型非常有用。我们将展示的原型基于Justin的上一个项目,并包括各种技术,例如Spring , GWT , AspectJ , HornetQ和Infinispan 。 聊够了,现在让我们动手吧。 准备原型。 首先,您必须有一个用于构建原型的模板项目。在我们...

最佳 Java 编程 206

SAP 运费处理方式

从直接的处理方式上看,情况1/2/3可以将运费记账到物料成本中,但情况4/5/6是直接记账到成本对象中,具体是要体现在损益表中,还是要结转到物料成本中,可依据业务要求进行好处理。如果体现在损益表中,不需要多过多额外的操作,如果要体现在物料成本中心,则需要再进行一系列的处理,最终将金额结转到物料成本中。因为在创建采购订单时不知道具体运费,可以不维护运费,只需要维护材料价格。:创建采购订单时,运费是由供应商承担,很多时候是包含在材料报价中,这种情况不需要专门针对运费进行处理,材料价格中已包含运费。

weixin_44506537的博客 3371

gwt spring 完美整合

1.3版本前整合gwt spring,用到了第三方类,如cglib扩展类具备gwt servlet的功能,随着1.4版本的发布(发布很久了T_T '),整合有了新的方式,闲话不说,看看整合后的servlet如何调用服务: java 代码 /**    * GWTRemoteServiceServlet act as a dispatch servlet for all GWT servic...

永源blog 404

华为S7700交换机Console密码重置全流程详解

本文详细解析了华为S7700交换机Console密码丢失后的重置全流程。通过进入BootROM菜单清除密码,并涵盖单/双主控场景操作、必备工具连接、常见问题排查及重置后的安全配置建议,帮助网络工程师掌握核心交换机的关键应急恢复技能,确保运维安全。

resnet7explorer的博客 539

Mac OS X 工具技巧:一文搞定个性化命令行窗口(iTerm2 + zsh + oh-my-zsh 配置Powerline风格)

本不想写这篇文章的,因为在Linux下已经配置过很多次,想着mac应该找篇文章一次就搞定了,结果还是踩坑,看了很多文章,不是某一点没不清楚,就是截图有问题或者命令有问题,官网又难得找等等……花了3个多小时才搞定,所以,还是来总结一篇文章就能够搞定的教程。 为什么要用zsh?用了这么多年的bash,不能说bash不好,不过当我用了zsh后发现,什么叫更好用。 配置过程稍微有点繁琐,但是你看过效果...

mickjoust的技术小屋 1万+

GWT以及GXT使用经验总结

一.Spring的整合 刚开始就遇到这个问题。怎么把goolge RPC Service 的服务器端交给Spring管理?找到个现成的开源项目做了这件事情-gwt-widget(http://gwt-widget.sourceforge.net/ )的子项目gwt-sl(GWT Server Library)。 GWT的server端其实就是servlet,不过必须继承自RemoteServ...

hxun96 508

Tesseract OCR 字库训练教程:提高识别率进阶版

通过 Tesseract 字库训练,你可以提高 OCR 对特定文本或字体的识别能力。训练过程包括准备训练数据、生成标签文件、运行训练工具,以及将训练结果集成到实际项目中。虽然训练过程需要一些时间和精力,但对于需要高精度文本识别的场景来说,字库训练是非常有效的提升识别率的方法。

小蜗牛的珍贵百宝箱 1867

浅谈使用GWT + GXT开发项目的感受

GWT+GXT开发大型项目感受 一.项目环境: 前端:  GWT2.4    + GXT2.2.5 后端: Rest  ,  Mule ESB 3.0,   Mybatis , Spring 3.0 二、使用工具:     1.设计思想:         以面向服务的设计模式;    前端:        1.公司有成熟的界面设计器, 类似于C#界

yuii000000的专栏 1937

浮点数加法器设计

一.设计内容及其要求 内容 根据浮点数的运算规则和IEEE754标准,实现浮点数的加法运算器。 要求: 浮点数格式:符号位1位,阶码8位,尾数23位 要求该实验能完整的体现浮点数的运算的五个步骤:对阶、尾数求和、规格化、舍入(要求使用对偶舍入)、溢出判断。 二.基本要素 浮点数 浮点数即实数,实数是所有有理数和无理数的集合。它之所以被称作浮点数,是因为小数点在数中的位置并不是固定的。一个浮点数值分为两部分存储:数值以及小数点在数值中的位置。 计算机中的浮点运算的计算结果一般是不确定的,一块芯片的浮点运算

Phoenix_ZengHao的博客 1万+

告别手动读摘要!爬虫+大模型做学术助手:爬知网论文,10秒生成摘要+关键词(附完整代码)

知网的官方摘要往往冗长(200-300字),关键词可能不够精准,用大模型提炼“100字精简摘要”和“3-5个核心关键词”,更适合快速筛选文献。这套学术助手的核心价值,是把“找论文、读摘要、提关键词”这些重复劳动,交给爬虫和大模型自动化完成,让科研人从繁琐的文献整理中解放出来,把时间花在实验设计、数据分析等核心工作上。需要注意的是:爬取知网论文仅用于个人科研和学习,不得用于商业用途,遵守知网的用户协议和版权规定;大模型生成的摘要和关键词需后续核对原文,确保准确性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1942

浅谈GXT的一些基本用法

各位前辈好,本人新人一枚,刚刚学习gxt所以就上传一点心得,本文是基于spring+hibernate+gxt开发的项目的一点介绍;首先 你要理解GXT就是前端你后台用什么完全是没有关系的。 首先,先教大家怎么开始gxt。1.下载gwt 2.加入gxt的jar包 这里我用的是gxt2.0版本,版本很重要,因为现在3.0和2.0差距还是比较大的。gxt和其他前端框架不一样的地方; 我感觉有两...

litianqwe的专栏 2510

OP-TEE虚拟化支持详解

OP-TEE虚拟化支持解析 OP-TEE提供实验性虚拟化方案,支持多虚拟机共享安全执行环境。核心特性包括: 配置选项:CFG_VIRTUALIZATION启用虚拟化,CFG_VIRT_GUEST_COUNT限制虚拟机数量并分配均等内存资源; Hypervisor协作:需实现虚拟机生命周期通知、SMC参数转换、内存固定等关键协议; 当前限制:仅支持Armv8架构,硬件资源共享有限,采用静态内存配额机制; 架构实现:通过MMU分区切换和扩展内存分配器实现多租户隔离,Nexus核心层管理虚拟机上下文。该方案适用于

Linux内核架构师 109

gwt api_使用RequestFactory API进行Spring GWT集成

gwt api 从GWT 2.4开始,将RequestFactory API与后端的Spring服务集成很容易,您需要做的就是在服务器上创建一个自定义ServiceLocator,GWT将使用它来正确定位被调用的服务: public class SpringServiceLocator implements ServiceLocator { public Object getInstanc...

最佳 Java 编程 187

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

使用RequestFactory API进行Spring GWT集成

从GWT 2.4开始,轻松地将RequestFactory API与后端的Spring服务集成在一起,您需要做的就是在服务器上创建一个自定义ServiceLocator,GWT将使用该ServiceLocator来正确定位被调用的服务: public class SpringServiceLocator implements ServiceLocator { public Object ...

最佳 Java 编程 231

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

搭建简单的EXT-GWT(GXT)的开发环境(一)

随便写着玩玩.不要太认真哦^^ 这里就不废话了,假设你的 eclipse 以及 Google Plugin for Eclipse 都安装好了 下载地址:http://code.google.com/intl/zh-CN/webtoolkit/download.html 这里强调下就是说GWT Designer其实没必要安装.. 然后就是 gxt的下载地址(2.2.4是在g...

sz_147258的博客 401

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring+SpringMVC+OpenJPA整合使用心得

刚写了篇Spring3.1+ JpaDaoSupport被deprecated后的研究 ,其中我提到现在使用的时Spring+SpringMVC+OpenJPA(SSO我定义的嘿嘿),有人建议也说说这方面整合的经验。今天放假最后一天,休息体力的同时就花点时间把之前写的东西整理一下,也希望大家多提意见。   首先是Spring,这个貌似不需要太多的介绍,这方面的文章实在太多了。   ===...

simen_net 281

gxt CURD ,数据库增删改查简单例子(Spring + Hibernate)

<br />一、创建项目工程<br />用eclispe 3.4创建一个Dynamic web project工程,命名为gxtcurd<br /><br /> <br />二、添加如下依赖类库到WEB-INF/lib下引用<br />antlr-2.7.6.jar <br />aspectjrt-1.5.2a.jar <br />aspectjweaver-1.5.2a.jar <br />c3p0-0.9.0.4.jar <br />cglib-nodep-2.1_3.jar <br />commons

天行健,君子以自强不息!~ 3944

基于Ext-GWT(GXT)+OpenJPA+SpingMVC的综合WEB平台研究开发

    身体原因休息了大半年的时间,前段时间仔细的研究了一下GWT的开发过程,尝试做了一套综合管理平台,该平台以Struts2+Spring2.5+Hibernate3(JPA)+ExtJS3基本后台 为蓝本,使用Ext-GWT(GXT)+OpenJPA+SpingMVC完成,希望能给他家提供一套新的思路。       按照惯例,在我会把整个研究开发的过程完整的记录到博文中,暂时也不会提供源...

simen_net 279

EXT-GWT入门

Preparation: read the document of GWT and understand the basic knowledge of GWT: http://code.google.com/webtoolkit/doc/1.6/tutorial/index.html   Setup (BY eclipse plugin): 1.  install gwt ecl...

starfeng 228

GWT开发札记一

之前的一些架子就不多说了,简单简述下目前正在维护框架 eg见http://tongtech.3322.org:41888/webos/ 该框架采用 GXT+SPRING+JPA+MYSQL实现 框架下 有若干工程 chiron_core:框架核心工程,该工程只依赖gxt_lib,核心处理desktop实现,其他的框架的加载,权限控制, chiron_m...

weixin_34290000的博客 112

搭建简单的EXT-GWT(GXT)的开发环境(二)添加spring进行servlet拦截

随便写着玩玩.不要太认真哦^^ 关于一大堆的理论就不讲了,什么MVC之类的,老人不削一看,新人又看不懂 总结一下其实是我也不清楚.^^哈哈. 再我看来,添加spring进来就是为了简化RPC的服务端代码,然后在其中注入dao比较方便..没其他的了~ 1.首先把spring2.5中的spring.jar,spring-webmvc.jar,aspectjrt.jar等等ja...

sz_147258的博客 239

GXT2.2+GWT2.4+Struts2+Hibernate3.X+Spring2.5整合完成!!

以后写 先睡觉 纪念一下哈哈哈....................

码龙008 1791
下一篇: gxt CURD ,数据库增删改查简单例子
sundoctor
博客等级 码龄23年 2粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值