我的应用程序广泛使用分层数据选择(分类选择),例如(但不完全是):
Country
=> State
=> City
=> Street
所以用户选择第一级选项,JS AJAX加载第二级,用户选择AJAX加载第三级后,依此类推......
我认为加速应用程序的一种方法是将整个层次结构加载为 JS 文件并直接使用来自 JavaScript 的数据,利用If-Modified-Since /* Last-Modified * 和304响应代码来缓存这个大文件(50 KiB,12 之后gzip
)和耗时(从数据库获取 300 毫秒)数据。
我不喷气式飞机实施害怕发明轮子的技术。如果我尝试实现,我会使用以下技术......
Spring 现在支持Last-Modified HTTP 1.1 标头:
@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>
标记由 JavaScript 代码填充,js/db/units.js
无需任何 Ajax 查询......
js/db/units.js
在服务器端,如果Country
, State
, City
,Street
表未从用户上次访问我们的网站时修改,我们不会重新生成...
通过利用浏览器If-Modified-Since请求参数和304 HTTP 服务器响应从应用程序服务器缓存数据是否正常,或者这根本是一种破坏方法?