您可能需要考虑使用已经朝着这个方向发展的 javascript 解决方案,例如history.js angular.js或backbone.js
对于您的解决方案,您必须考虑:
--> 我认为1、4是最有问题的部分:
1:网址
- URL 会发生什么?考虑到书签和浏览器的后退按钮,这一点很重要。
window.location.hash
因此你应该用#-values重写url(jQuery 可以很容易地做到这一点)。
- 例如,您不应该保留
your-domain.com/app
所有子页面,而是将 URL 更改为your-domain.com/app#sub-page-1
- 加载页面时,您可以解析 #-value 并直接加载与该 url 相关的内容。
这对于良好的用户体验很重要。重新加载页面并返回主页很糟糕!没有那个共享链接是不可能的。
2:数据和模板
在您的情况下<ui:include src="#{navigationBean.currentPage}" />
,将在您的主页中加载另一个 jsf 页面。因此,您正在通过 ajax 加载模板 + 数据。
另一种可能的方法是从服务器加载数据并使用 JavaScript 将数据和模板放在一起。这种技术现在很流行。(像 angular.js 这样的 JavaScript 框架会这样做。)这也有缺点,因为您的页面将非常依赖 JavaScript,并且您几乎会因此而放弃 JSF。
3:加载 JavaScript 和 CSS
如果您有带有附加 CSS 或 JavaScript 文件的子页面,您应该检查是否可以通过 ajax 加载它们(通常可以,但需要一些工作)。如果没有,您必须在页面的第一次请求时加载所有相关文件,这会使初始加载速度变慢。
4:将当前页面存储在bean中
我认为没有必要,如果您使用1. 使用bean(SessionScoped?)存储当前页面,这有一些缺点:
- 如果您在子页面上并输入 URL 以访问主页,它将加载旧的子页面。
- 如果您使用 2 个或更多选项卡浏览您的网站,这将导致冲突。
结论
写完之后,我觉得将当前页面存储在一个bean中并不是一个好主意。因为它会引起冲突。我建议在 url 中“存储”当前页面。
像这样的东西:
<div id="nav">
<a href="javascript:void(0)" id="sub-page-1">sub-page-1</a>
</div>
<div id="main"></div>
带有 jQuery 的 JavaScript 将是这样的:
$(function() {
$('#sub-page-1').click(function() {
$.ajax({
...
url: '/sub-page-1' // could be jsf page
success: function (data) {
// set the hash of this page
window.location.hash = 'sub-page-1';
// set the content on the main div
$('#main').html(data);
}
});
})
});