【发布时间】:2011-01-06 05:32:51
【问题描述】:
我想知道,在 JSF 1.2 上用户关闭窗口(点击浏览器的“X”)后,我将如何在 JSF 中执行 session.remove("userBean")。
我想在用户点击浏览器的“X”后弹出一个确认消息,但不太确定如何访问或绑定Ok 按钮到我定义的方法,我有该逻辑来清除作用域 bean .或者有什么更好的方法吗?
任何帮助将不胜感激。
谢谢。
【问题讨论】:
我想知道,在 JSF 1.2 上用户关闭窗口(点击浏览器的“X”)后,我将如何在 JSF 中执行 session.remove("userBean")。
我想在用户点击浏览器的“X”后弹出一个确认消息,但不太确定如何访问或绑定Ok 按钮到我定义的方法,我有该逻辑来清除作用域 bean .或者有什么更好的方法吗?
任何帮助将不胜感激。
谢谢。
【问题讨论】:
我想知道,当用户在 JSF 1.2 上关闭窗口(点击浏览器的“X”)后,我将如何在 JSF 中执行 session.remove("userBean")。
您无需担心。如果会话超时,那么 bean 肯定会被删除。如有必要,您可以在web.xml 中控制<session-config> 中的会话超时时间。如果你真的想钩住会话超时/销毁,那么你可以只实现HttpSessionListener并在sessionDestroyed()上拦截,或者让UserBean实现HttpSessionBindingListener并在valueUnbound()上拦截。
如果你真的坚持要监听浏览器关闭按钮,毕竟这需要更多的工作,那么你所能做的就是使用 Javascript 的beforeunload 事件。没有其他方法。您只应记住,这是一个非标准事件,因此并非所有网络浏览器都支持。例如。 Opera 不支持此事件。简化这项工作是一项艰巨的工作,因为当您执行普通导航或表单提交时也会触发此事件,您需要在每个“正常”链接/按钮上禁止此事件。您还需要触发 Ajaxical 请求以通知服务器关闭,因为您无法再更改页面位置或提交隐藏表单,因为浏览器将要关闭。
【讨论】:
您可以使用MyFaces Orchestra 在自定义conversation.access 和conversation.manual 中定义您的bean。它们将允许您的 bean 在最近被删除,而不是它们存储在会话中。
conversation.access,您的 bean 将在用户请求不再引用它们后立即被删除 - 即对话已经结束。这不适用于您的情况(关闭浏览器),但仍然很高兴知道。对话是属于同一逻辑上下文的用户执行的一系列步骤 - 即整个注册过程是一个对话,尽管它跨越多个页面。
通常,您不必担心用户关闭会话后会话中还剩下什么。它最终会超时并被垃圾收集。您必须担心他浏览时会话中的内容,因为它可能会变得非常大。
【讨论】:
为什么要删除属性。事实上,当会话失效时,无论如何都会进行垃圾收集,因为没有引用。在这种情况下,您可能希望使用较低的超时时间。
如果您想立即使会话无效。您始终可以使用 JavaScript 函数将请求发布到您的服务器,只需单击“确定”按钮即可。这可能不是一件非常可靠的事情,但作为设施不会受到伤害。下面是一个示例代码,
JavaScript 函数
function show_confirm()
{
var r=confirm("Are you sure you want to abort the session?");
if (r==true) {
// set an appropriate form action and
document.form.submit();
}
}
HTML
<input type="button" onclick="show_confirm()" value="Show confirm box" />
[在您的 cmets 之后编辑]
因此,您想将按钮绑定到您的 bean 方法,您必须使用 CSS 和 JavaScript 进行自定义操作。查看this tutorial,它将为您提供一些有关如何创建自定义弹出窗口的见解。因为它只是一个普通的<div>,所以你可以像任何其他按钮一样进行操作,这里没有火箭科学,只需将你的按钮代码放入 <div>。
【讨论】:
在 JSF 中,您将制作类似的东西
JSF 页面:
<h:commandButton id="closeBtn"
type="submit" value="Close" onclick="return showConfirmClose();"
actionListener="#{backBean.cleanUpMethod}"
</h:commandButton>
Javascript:
//in case the user clicked No, this method should return false,
//preventing the action from being submitted, but double check all the return values first
function showConfirmClose(){
var c = confirm("Are you sure?");
return c;
}
BackBean:
public void cleanUpMethod(ActionEvent event){
//do cleaning here
}
【讨论】: