- 浏览: 185260 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
liuweihug:
图说浏览器的缓存原理及缓存方式说明(1) http://www ...
浏览器缓存机制 -
fei33423:
楼主为啥不根据评论改下文章..不然会误导很多人的..
Java5 Concurrent包中的锁机制 -
superscorpio:
根据总结,点击back和forward跟是否缓存无关。这应该是 ...
浏览器缓存机制 -
hzxlb910:
引用详细内容请访问我的新博客地址:http://xiaofen ...
Storm的第一份作业 -
tudopi:
遇到F5和enter刷新效果不一样的问题,看了文章解惑了
浏览器缓存机制
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. 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 ........
发表评论
-
hibernate启动时的一个小问题
2010-01-07 21:39 1354测试时报错但测试可正常运行javax.naming.NoIni ... -
JRobin简介
2009-03-20 10:49 1345做过网络管理的人,对于MRTG应该不算陌生 ... -
Java中assertion的使用
2009-03-18 16:06 2317assertion的使用是一个复杂的问题,因为这将 ... -
监控系统实现设计
2009-03-18 14:37 0做了半年的网络监控系统,研究过一些开源的解决方案(如:Open ... -
JVM调优总结
2009-03-03 10:40 1325堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统 ... -
Java Reference的简单总结
2009-02-18 10:45 1208介绍 J ava 2 平台中引入 java.lang.re ... -
Java5 Concurrent包中的锁机制
2009-02-16 16:19 3241JDK1.5以后加入了concurrent包, ... -
该选择哪个Java Map对象?
2009-01-04 16:48 1271HashMap, Hashtable, LinkedHash ... -
Java编码规范
2008-12-08 11:21 11171 介绍(Introduction) 1.1 为什么要有编码规 ... -
在OSGi中运行Servlet
2008-06-13 10:05 2402这几天在研究OSGi这个东东,稍有成果。 什么是OSGi? 简 ... -
让Tapestry5支持中文
2007-04-17 13:18 2380相信很多使用Tapestry5的人和我一样,碰到中文编码的问题 ... -
Struts开发流程
2007-04-06 14:47 2727开发流程如下:1.收集 ... -
重构原则(Java)
2007-04-06 14:44 25811995,Auer曾在文献[AUER95]中指出: 1.应当根 ... -
使用JACOB控制Powerpoint
2007-04-03 16:52 3227什么是JACOB? JACOB是一个JAVA和COM之间的桥接 ... -
为Java ME程序添加蓝牙文本协议
2007-04-03 16:48 1992这篇文章的副标题是: ... -
使用MIDPLogger进行在机调试
2007-04-03 16:47 1081在进行手机蓝牙远程控制的开发中,需要通过蓝牙控制PC,这个过程 ... -
在测试MIDlet时需要考虑的一些重要方面
2007-04-03 16:45 1186在测试MIDlet时需要考虑的一些重要方面: 即使运行环境 ... -
MIDlet的事件模型
2007-04-03 16:44 1166javax.mircoedition.lcdui包实现了一个同 ... -
Java中实现鼠标模拟与键盘映射
2007-04-03 16:41 2514Java SDK 1.3以后实现了Robot类。此类用于为测试 ... -
学习java要经常看的网站[转]
2007-04-03 16:40 1329http://java.sun.com/developer/b ...
相关推荐
GWT(Google Web Toolkit)是一个开源的Java开发框架,它允许开发者使用Java语言来编写客户端的Web应用程序。GWT-Servlet是GWT框架的一部分,主要负责处理服务器端的交互。`gwt-servlet-2.3.0.jar`是GWT 2.3.0版本的...
gwt-servlet.jar 最新版,由于文件太大、不可以上传、有需要可以留言、整包分享给你、
5. 在服务器端,你需要创建一个Servlet来接收和处理上传的文件。这里使用了Java Servlet API,特别是`HttpServletRequest`和`HttpServletResponse`接口。为了处理文件,推荐使用Apache Commons FileUpload库,它可以...
3. 创建GWT模块:创建一个GWT模块,它相当于一个页面,每个模块都有一个module名.gwt.xml文件,该文件中定义了这个页面需要使用到的所有的资源。 4. 编写GWT代码:使用Java语言编写GWT代码,定义界面和逻辑。 5. ...
为了更好地理解如何使用 GWT 进行 UI 开发,下面通过一个具体的示例来展示整个过程: **步骤一:环境搭建** - **GWT 下载**:首先从 Google 官方网站下载适用于 Windows 平台的 GWT 安装包,当前版本为 1.0.21。 - ...
2. **模块化(GWT Module)**:每个GWT项目都始于一个`.gwt.xml`模块文件,它定义了项目的配置信息,包括使用的库、本地化设置、主题等。 3. **Java到JavaScript编译**:GWT的编译过程将Java源代码转化为优化的...
对于初学者,这是一个很好的机会来了解GWT的工作原理,如何创建UI,以及如何与服务器进行通信。通过查找并修复这个BUG,可以提高对GWT框架的理解,并且提升解决实际问题的能力。建议先阅读GWT的官方文档,理解基本...
总的来说,这个压缩包提供了一个全面的GWT学习路径,从基础的GWT使用到EXT-GWT的组件开发,再到快速开发技巧,覆盖了GWT开发的各个方面。通过深入学习和实践其中的内容,开发者可以有效地掌握GWT技术,开发出高性能...
该教程将指导读者如何使用 GWT 和熟悉的 Java 工具,例如 Apache Ant,Tomcat 5.0 servlet 容器和 IntelliJ IDEA 集成开发环境,来开发一个简单的 Ajax 应用程序。 标签解释 标签是 "java",表示该教程的主要内容是...
标题 "部署一个简单GWT应用到Google App Engine" 涉及到的技术点主要包括Google Web Toolkit (GWT) 和 Google App Engine (GAE),这两者都是Google提供的开发和托管Web应用的重要工具。以下是对这些技术及其相关知识...
gwt-servlet-1.4.61.jar
标题 "GWT一个页面包含多个模块时出现的问题" 指的是在使用Google Web Toolkit (GWT) 开发Web应用时,遇到的当一个页面需要加载多个模块时可能产生的技术挑战。GWT是一种用于构建高性能JavaScript应用程序的Java框架...
标题中的" GWT整合Hibernate的一个小实例 "是指将Google Web Toolkit(一种用于创建富客户端Web应用的Java开发框架)与Hibernate(一个流行的对象关系映射(ORM)框架)结合使用,以便在GWT应用中执行数据库交互。...
GWT是一个开源的Java框架,用于开发在浏览器上运行的富互联网应用程序(RIA),而Tomcat是一款流行的、开源的Java Servlet容器。以下是关于这个主题的详细知识点: 1. **Google Web Toolkit (GWT)**: - GWT是Google...
通过以上介绍可以看出,GWT提供了一个强大而灵活的开发框架,使得开发者能够使用Java语言构建出高质量的AJAX应用程序。无论是对于初学者还是有经验的开发者来说,掌握GWT的基本原理和开发流程都是非常有价值的。随着...
因此,你需要在服务端创建一个Servlet或RPC服务,这个服务负责处理来自GWT客户端的请求,执行数据库查询,然后将结果返回给客户端。 1. **GWT RPC机制**:GWT Remote Procedure Call (RPC) 是一种用于客户端和...
Vaadin是一个现代的Web UI框架,它也支持GWT。检查并更新项目的GWT设置以适应最新的版本和团队的配置。 4. **检查POM.xml**:GWT项目通常依赖于Maven或Gradle进行构建。检查`pom.xml`文件,确保所有依赖和插件都是...
标题 "GWT" 指的是 Google Web Toolkit,这是一个开源的Java开发框架,主要用于构建高性能、跨浏览器的富互联网应用程序(Rich Internet Applications,简称RIA)。GWT通过将Java代码编译为JavaScript,使得开发者...