JSF:清除会话Scoped Bean

时间:2010-01-18 04:04:09

标签: java session jsf

我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的'X')之后,我将如何在JSF中执行session.remove("userBean")

我想在用户点击浏览器的'X'之后弹出确认弹出但不太确定如何访问或绑定Ok按钮到我定义的方法,我有那个逻辑来清除范围豆。或者有更好的方法吗?

任何帮助都将受到高度赞赏。

感谢。

4 个答案:

答案 0 :(得分:6)

  

我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的'X')之后,我将如何在JSF中执行session.remove(“userBean”)。

您无需担心。如果会话超时,那么肯定会删除bean。如有必要,您可以在<session-config>的{​​{1}}中控制会话超时时间。如果你真的想挂钩会话超时/销毁,那么你可以实现HttpSessionListener并拦截sessionDestroyed(),或让web.xml实现HttpSessionBindingListener并拦截{{} 3}}

如果你真的坚持要听浏览器关闭按钮,这毕竟是更多的工作,那么你所能做的就是使用Javascript的UserBean事件。没有别的办法。您应该记住,这是一个不标准的事件,因此并非所有Web浏览器都支持这一事件。例如。 Opera不支持此事件。简化这项工作是一项非常重要的工作,因为当您进行简单的香草导航或表单提交时,此事件也会被触发,您需要在每个“普通”链接/按钮上禁止此事件。您还需要触发Ajaxical请求以通知服务器关闭,因为您无法更改页面位置或提交隐藏的表单,因为浏览器将被关闭。

答案 1 :(得分:2)

为什么要删除属性。实际上,当会话无效时,无论如何都会进行垃圾收集,因为没有引用。在这种情况下,您可能希望使用低超时。

如果您想立即使会话无效。您可以随时使用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" />

[在您的评论后编辑]

因此,您希望将按钮绑定到bean方法,您必须使用CSS和JavaScript执行自定义操作。查看this tutorial,它将为您提供有关如何创建自定义弹出窗口的一些见解。由于它只是一个普通的<div>,你可以像任何其他按钮那样做,这里没有火箭科学,只需将你的按钮代码放在<div>内。

答案 2 :(得分:2)

您可以使用MyFaces Orchestra在自定义conversation.accessconversation.manual中定义您的bean。与将它们存储在会话中相比,它们最近会允许删除bean。

  • 您可以为会话定义超时,该超时与会话超时不同(且更小)。
  • 如果使用conversation.access,您的bean将在用户请求不再引用后立即删除 - 即会话已结束。这不适用于您的情况(关闭浏览器),但仍然很有用。

对话是由属于相同逻辑上下文的用户执行的步骤序列 - 即整个注册过程是一个对话,尽管它跨越多个页面。

通常,您不必担心用户关闭会话后剩余的内容。它最终将被计时和垃圾收集。你不得不担心他在浏览时会话中的内容,因为它会变得非常大。

答案 3 :(得分:1)

在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
}
相关问题