- 浏览: 318366 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
完善自我:
支持一下!
揭秘IT人才特点:中美印日四国程序员比较 -
悲剧了:
好文,看玩thinking in java的提到的异常处理,看 ...
高效的Java异常处理框架(转) -
yin_bp:
开源框架bbossgroups页支持组件异步方法调用哦,详情请 ...
Spring 3中异步方法调用 -
flyjava:
sun的悲哀
Apache怒了,威胁说要离开JCP
DWR provides a convenient mechanism to execute server side java classes from javascript running in the browser. We use it extensively while developing Dekoh applications. Recently I noticed that when we use DWR, there are many requests to java-script files from the browser. It appeared that some DWR scripts are not being cached by the browser. I fired up
firefox live http headers
and noticed that inded some scripts were being downloaded with every page. We use DWR version 1.1.4. The headers for the repeat downloads looked like: Notice that in the response headers, there is no Last-Modified header. This is the reason why the browser is reloading the script on every page load. This script is a DWR interface script. When you expose java methods using DWR (through a create tag in the dwr-*.xml), DWR creates an interface javascript. This file implements javascript methods which invoke the remote java methods (using DWREngine._execute). The interface script does not change unless the methods exposed in the dwr-*.xml are changed and the application is restarted. Hence the script should have been cacheable. These scripts are generated by DefaultInterfaceProcessor in DWR. To enable caching, we need to change the InterfaceProcessor to add the Last-Modified header in the response and read the If-Modified-Since header in the request. DWR provides a nice mechanism to plugin custom implementation of processors. So instead of chaging the DefaultInterfaceProcessor (which is shipped with DWR), I subclassed the default implementation to support these new headers and plugged it in to our runtime. The code for custom interface processor looks like: To plugin this new Interface Processor, we need to add init parameter for DWRServlet in web.xml. The snippet from web.xml would look like: After adding the custom inerface processor following are the headers for the dwr interface request. Notice that now for the first request, DWR is sending the Last-Modfied header. When we make the second request, the browser sends an “If-Modified-Since” header and DWR now sends a 304 NOT_MODIFIED response. Thus, by plugging in a custom interface processor, we can enable caching of interface java-scripts in DWR.GET /dekohportal/dwr/interface/locationchooser.js HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en,as;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cache-Control: max-age=0
HTTP/1.x 200 OK
Server: Pramati Server/5.0SP3 [Servlet/2.4 JSP/2.0]
Date: Tue, 24 Jul 2007 05:29:20 GMT
Transfer-Encoding: chunked
Connection: Keep-Alive
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import uk.ltd.getahead.dwr.impl.DefaultInterfaceProcessor;
import uk.ltd.getahead.dwr.impl.HtmlConstants;
/**
* This class is the InterfaceProcessor for DWRHandler which
* will add the functionality to add las modified header and
* check if modified since header.
* @author <a href="mailto:venkat@pramati.com" mce_href="mailto:venkat@pramati.com">Venkat Gunnu</a>
* @since Jul 19, 2007
*/
public class HttpCachingInterfaceProcessor
extends DefaultInterfaceProcessor
{
//Store the application startup time. This will be the time we will set
//as the Last-Modified time for all the interface scripts
private final long lastUpdatedTime = (System.currentTimeMillis() / 1000) * 1000;
public void handle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
long ifModifiedSince = req.getDateHeader(HtmlConstants.HEADER_IF_MODIFIED);
if (ifModifiedSince < lastUpdatedTime) {
//If the browser does not have the script in the cache or the cached copy is stale
//set the Last-Modified date header and send the new script file
//Note: If the browser does not have the script in its cache ifModifiedSince will be -1
resp.setDateHeader(HtmlConstants.HEADER_LAST_MODIFIED, lastUpdatedTime);
super.handle(req, resp);
} else {
//If the browser has current version of the file, dont send the script. Just say it has not changed
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
}
<servlet><servlet-name>dwr-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>interface</param-name>
<param-value>util.dwr.HttpCachingInterfaceProcessor</param-value>
</init-param>
...
</servlet>
GET /dekohportal/dwr/interface/locationchooser.js HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en,as;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-aliveHTTP/1.x 200 OK
Server: Pramati Server/5.0SP3 [Servlet/2.4 JSP/2.0]
Date: Tue, 24 Jul 2007 05:49:43 GMT
Last-Modified: Tue, 24 Jul 2007 05:49:33 GMT
Transfer-Encoding: chunked
Connection: Keep-Alive
GET /dekohportal/dwr/interface/locationchooser.js HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: en,as;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
If-Modified-Since: Tue, 24 Jul 2007 05:49:33 GMT
HTTP/1.x 304 NOT_MODIFIED
Server: Pramati Server/5.0SP3 [Servlet/2.4 JSP/2.0]
Date: Tue, 24 Jul 2007 05:50:42 GMT
Content-Length: 0
Connection: Keep-Alive
原文:http://blogs.dekoh.com/dev/2007/07/24/caching-dwr-interface-java-script-files/
发表评论
-
Web编程是函数式编程
2010-11-30 13:44 1074任何一位在两个领域里 ... -
如何开发Web应用程序
2010-11-30 13:41 1140这是一个经常被问到的 ... -
设计Web应用程序时要注意可伸缩性
2010-11-26 09:19 954Max Indelicato是一位软件 ... -
Web 2.0应用客户端性能问题十大根源
2010-11-25 20:19 1046Web 2.0应用的推广为用户带来了全新的体验,同时也让开 ... -
HTML压缩(JSP的GZIP实现)
2010-11-24 22:31 4944HTTP 压缩可以大大提高浏览网站的速度,它的 ... -
浏览器加载和渲染html的顺序
2010-11-22 09:45 25951.浏览器加载和渲染html的顺序 1、IE下载的顺序是从上到 ... -
在服务端合并和压缩JavaScript和CSS文件
2010-11-22 09:16 1163Web性能优化最佳实践中最重要的一条是减少HTTP请求 ... -
用 YUI Compressor 压缩和混淆 JS 和 CSS
2010-11-22 09:05 2401一、简介: 目前开发Web应用Javas ... -
HTTP状态一览
2010-11-17 22:43 781在网站建设的实际应用中,容易出现很多小小的失误,就像m ... -
两款HTTP流量分析工具的比较:HTTP Watch,Fiddler
2010-11-17 17:26 0做Web开发或者Web分析经常需要查看Http通讯的过程, ... -
了解CSS的查找匹配原理,让CSS更简洁、高效
2010-11-17 16:49 0用了这么多年的CSS,现在才明白CSS的真正匹配原理,不知 ... -
高性能WEB开发 - flush让页面分块,逐步呈现
2010-11-17 16:47 0在处理比较耗时的请求的时候,我们总希望先让用户先 ... -
WEB高性能开发 - 疯狂的HTML压缩
2010-11-17 16:46 0前言: ... -
该如何加载google-analytics(或其他第三方)的JS
2010-11-17 16:44 0很多网站为了获取用户访问网站的统计信息,使用了go ... -
高性能WEB开发 - 页面呈现、重绘、回流。
2010-11-17 15:57 0页面呈现流程 在讨论页面重绘、回流之前。需要 ... -
高性能WEB开发 - JS、CSS的合并、压缩、缓存管理
2010-11-17 15:54 0本篇文章主要讨论下目前JS,CSS 合并、压缩、缓存 ... -
高性能WEB开发- 减少请求,响应的数据量
2010-11-17 15:49 0上一篇中我们说 ... -
高性能WEB开发 - 为什么要减少请求数,如何减少请求数!
2010-11-17 15:42 0http请求头的数据量 我们先分析下 ... -
高性能web开发 - 如何加载JS,JS应该放在什么位置?
2010-11-17 15:39 0外部JS的阻塞下载 所有浏览器在下载JS的时候, ... -
Web缓存教程
2010-11-17 15:08 1461原文(英文)地址: http://www.mnot.n ...
相关推荐
在本主题中,我们将深入探讨如何使用DWR生成目录树,这在构建动态的、交互性强的Web应用时尤其有用。 目录树是一种数据结构,通常用于表示文件系统或组织层次结构。在Web应用中,用户可能需要浏览多级目录结构,...
5. **在HTML/JavaScript中使用DWR**:在客户端页面中引入DWR生成的JavaScript文件,并在JavaScript代码中调用对应的方法。 6. **测试和调试**:使用浏览器和开发工具测试DWR调用是否正常工作,如果遇到问题,查看...
5. **前端集成**:在HTML页面中引入DWR生成的JavaScript文件,并使用这些接口进行AJAX通信。 总的来说,DWR是一个强大的工具,简化了AJAX应用的开发,通过其丰富的特性,可以构建出交互性强、用户体验良好的Web应用...
- **在JavaScript中调用**:在HTML或JavaScript文件中引入生成的JavaScript接口,即可像调用本地函数一样调用服务器端的方法。 4. **安全性**:DWR提供了一些安全特性,如IP白名单、方法签名验证等,以防止未授权...
`util.js` 和 `engine.js` 是DWR的核心JavaScript库。`util.js` 提供了一系列实用工具函数,用于辅助JavaScript编程,例如类型检查、对象遍历等。`engine.js` 是DWR引擎的核心,负责处理与服务器的通信,包括请求的...
- **生成JavaScript接口**:DWR自动生成对应的JavaScript接口,使得客户端可以直接调用。 - **客户端使用**:在HTML页面中引入DWR的JavaScript库,并使用生成的接口进行Ajax调用。 3. **DWR的安全性** - **白...
4. **编写JavaScript代码**:在HTML或JS文件中,引入DWR生成的JavaScript库,并调用服务器端的方法。 5. **测试与运行**:启动服务器,通过浏览器访问应用,测试DWR功能是否正常工作。 ### 4. DWR的主要特性 - **...
5. **编写前端代码**:在HTML或JS文件中,引入DWR生成的JavaScript库,然后调用对应的接口方法。 6. **测试运行**:运行HTML页面,查看DWR是否能正确地与服务器通信。 **四、DWR示例** 在`dwrTest`这个示例中,...
- **在HTML/JavaScript中使用**:在客户端的JavaScript代码中引入DWR生成的JavaScript文件,然后就可以直接调用服务器端的方法。 4. **安全性与优化**:DWR提供了多种安全机制,如白名单、IP过滤等,以防止未授权...
- 在HTML页面中,引入DWR生成的JavaScript文件,例如`dwr.engine.js`和相关的接口文件。 - 使用DWR的API,如`DWRUtil`或`RemoteObject`,来调用服务器端的方法。 7. **安全性和权限控制**: - DWR提供了安全机制...
例如,如果你有一个名为`MyService`的Java类,其中有一个`sayHello()`方法,DWR会自动生成一个`myService`对象,你可以直接在JavaScript中调用`myService.sayHello()`。 **4. 示例** 假设你已经有了一个`MyService...
5. **编写HTML与JavaScript**:在HTML页面中引入DWR生成的JavaScript文件,并使用生成的接口进行AJAX调用。 6. **测试与调试**:通过浏览器运行HTML页面,检查JavaScript日志或使用开发者工具查看网络请求,确保DWR...
- **JavaScript调用**:在HTML页面中,引入DWR生成的JavaScript文件,然后就可以像调用本地函数一样调用服务器端的方法。 - **事件处理**:可以将DWR方法绑定到DOM元素的事件,实现异步更新。 - **安全考虑**:...
- `*.js`: 生成的JavaScript文件,包含了调用Java方法的代码。 6. **学习与实践** 对于初学者,这个项目实例提供了很好的学习素材。通过阅读源代码,可以理解DWR如何将Java方法暴露给JavaScript,以及如何处理...
2. **JavaScript接口**:在客户端,DWR会自动生成对应的JavaScript接口。例如,如果服务器有`executeTask`方法,那么在JavaScript中可以直接调用`MyService.executeTask(param1, param2)`。 3. **DWR推送(Push)**...
3. **生成JavaScript接口**: DWR自动生成JavaScript接口,开发者只需调用这些接口即可执行服务器端的方法。 4. **调用服务器方法**: 在JavaScript代码中,像调用本地函数一样调用这些接口。 5. **处理回调**: ...
这包括在`web.xml`中添加DWR的Servlet配置,以及创建一个`dwr-engine.js`和`dwr-config.xml`文件来定义可暴露给JavaScript的Java类和方法。 3. **DWR的使用** - **创建Java Bean**:在服务器端,我们需要创建一个...
3. **使用DWR生成的JavaScript API**:DWR自动生成JavaScript接口,使得前端可以直接调用服务器端的方法。文档会介绍如何使用这些接口,以及如何定义和调用远程Java类和方法。 4. **安全与权限控制**:DWR提供了...
5. **实例化与调用**:在HTML页面中,你需要引入DWR生成的JavaScript文件,并实例化相应的对象来调用Java方法。例如,`<script src="/dwr/interface/YourJavaClass.js"></script>`,然后就可以通过`YourJavaClass....
3. **资源传输**:DWR引擎通过Servlet响应客户端请求,将`engine.js`、`util.js`等必需的JavaScript文件发送到客户端。如果客户端已经有这些文件的缓存,并且文件内容没有改变,DWR会避免重复发送,以优化性能。 4....