我的应用程序广泛使用分层数据选择(分类法选择),例如(但不完全是):
Country
=> State
=> City
=> Street
因此用户选择第一级选项,JS AJAX 加载第二级,用户选择 AJAX 加载第三级后,依此类推...
我认为加速应用程序的一种方法是将整个层次结构加载为 JS 文件并直接使用来自 JavaScript 的数据利用 If-Modified-Since/*Last-Modified* 和 304 响应代码缓存如此大(50 KiB,gzip
之后 12)和耗时(从 DB 获取 300 毫秒)数据。
我不执行害怕发明轮子这样的技术。如果我尝试实现,我会使用以下技术...
现在支持Spring Last-Modified HTTP 1.1 header :
@RequestMapping
public String myHandleMethod(WebRequest webRequest, Model model) {
long lastModified = // 1. application-specific calculation
if (request.checkNotModified(lastModified)) {
// 2. shortcut exit - no further processing necessary
return null;
}
// 3. or otherwise further request processing, actually preparing content
model.addAttribute(...);
return "myViewName";
}
Oracle 允许通过 ALL_TAB_MODIFICATIONS/USER_TAB_MODIFICATIONS 快速检查表更改:
select timestamps from all_tab_modifications where table_name = 'COUNTRY';
select timestamps from all_tab_modifications where table_name = 'STATE';
...
在使用分层数据的 JSP 页面上,我包含 js 文件:
<script src="<c:url value='js/db/units.js'/>"></script>
具有完整层次结构数据的形式(像这样 Java DWR ):
uniqPrefix.units = {
"USA": {
"Alabama": {
"Montgomery": ["Street 1", "Street 2"],
"Birmingham": ["Street 3", "Street 4"],
}, ...
"UK": { ... }
}
所以 HTML <select>
由 js/db/units.js
中的 JavaScript 代码填充的标签没有任何 Ajax 查询...
并且在服务器端我们不重新生成js/db/units.js
如果Country
, State
, City
, Street
表格未从用户上次访问我们的网站时修改...
通过利用浏览器 If-Modified-Since 请求参数和 304 HTTP 服务器响应从应用程序服务器缓存数据在 JavaScript 中是否正常,或者这根本就是错误的方法?
最佳答案
与任何其他 HTTP 客户端相比,Javascript 驱动的 HTTP 客户端没有什么特别之处,您所描述的正是 304 响应的设计目的。如果数据未更改,您的应用程序应该避免重新加载数据。
关于java - Java应用服务器利用304 HTTP响应将数据缓存到JavaScript中是否正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15784822/