【问题标题】:calling alert box from code behind java in jsf从jsf中java后面的代码调用警报框
【发布时间】:2011-04-12 12:32:56
【问题描述】:

我需要根据用户在 jsf 页面中提供的输入来更新属性文件。更新文件后,用户会话应被清除,警告框应显示“设置已更新”,页面应导航到登录页面。

我不知道如何从 java 代码中调用警报框。我发现这在 asp.net 中是可能的。 google了一下,没找到解决办法

我怎样才能做到这一点?

欢迎所有可能的解决方案。提前致谢。

更新 @balusc 感谢您的指点。我正在使用 JSF RI 1.2 和 Richfaces 3.3.2

【问题讨论】:

  • 根据您的问题历史记录,您使用的是 RichFaces。您对 RichFaces 的针对性答案持开放态度吗?在未来的 JSF 相关问题中,您应该提及 JSF impl/version 以及使用的任何 JSF 组件库。
  • 我对 Richfaces 有针对性的答案以及其他人持开放态度。
  • 好的,请记住,混合各种“主要”组件库,如 RichFaces + IceFaces + PrimeFaces + OpenFaces + 等并不总是一个好主意。一个可能会与另一个发生碰撞。 RichFaces必须有这种功能,但由于我不使用它,我无法从头顶上判断。
  • 哦!感谢您的指点。我首先从 Richfaces 开始搜索。由于我找不到它,我认为其他库会有所帮助。好的,我将专注于基于 Richfaces 的解决方案。

标签: java javascript jsf alert


【解决方案1】:

我设法通过在 a4j 命令按钮中使用“oncomplete”属性来解决这个问题。 'oncomplete' 属性用于在服务器端进程完成后调用 javascript 函数。

完成服务器端进程后,我调用了一个javascript函数,该函数调用了一个警告框并使用

document.location="../login.jsf";

我导航到登录页面。

欢迎对此解决方案提出任何建议。

感谢大家的回答和cmets。

【讨论】:

    【解决方案2】:

    您可以使用PrimeFaces 对话框。

    PrimeFaces 是一个开源组件,可增强 GUI 和开发。

    对话框在按钮上具有动作监听器,因此当用户批准阅读对话框时,您可以将他重定向到您需要的任何页面。

    【讨论】:

    • 感谢您的回复。我会调查并回复你。
    • 请纠正我,如果我错了。完成服务器端进程后,我需要显示对话框,当用户批准时,我需要使用 javascript 导航到其他页面对吗?
    • @mvg - 不使用 javascript。使用服务器端代码导航:
    【解决方案3】:

    为了显示警报框,您可以在 bean 中使用以下代码:

    JavascriptContext.addJavascriptCall(facesContext, "alert('Setting has been updated');");
    

    清除会话:

    HttpSession session = (HttpSession)FacesContext.getCurrentInstance().getExternalContext().getSession(false);
    session.invalidate();
    

    【讨论】:

    • 如果我没记错的话,这是 IceFaces 特有的。您应该这样提及。
    • 感谢您的回答。 JavascriptContext 是否仅在 IceFaces 可用?
    • 抱歉,它是 IceFaces 特有的,但用于显示模态警报框的 可能会对您有所帮助。
    • 据我所知, 无法从托管 bean 调用。如果我错了,请纠正我
    • @mvg 但我认为它可以通过托管 bean 呈现。需要时渲染为真,验证时渲染为假。此链接可能对您有所帮助livedemo.exadel.com/richfaces-demo/richfaces/modalPanel.jsf#
    【解决方案4】:

    使用 rich:modalPanel 并将 showWhenRendered 属性设置为托管 bean 的布尔属性。然后在您调用后重新渲染模态面板的父级。

    List of attributes for modal panel

    例如:

    <a4j:outputPanel id="modalParent">
       <rich:modalPanel showWhenRendered="#{bean.someBooleanValue}">
    
       </rich:modalPanel>
    </a4j:outputPanel>
    

    你的按钮/链接将有reRender="modalParent"

    【讨论】:

    • 感谢您的回复。我会处理它并回复你。
    • 我按照您的建议尝试了 showwhenrendered,但没有成功。如果此属性的 showwhenrendered 值为“true”,则在页面加载时默认打开模式面板。服务器端进程完成后它不会打开。如果我错了,请纠正我
    • 你需要把modalPanel放到另一个组件里面,然后重新渲染外面的组件。
    【解决方案5】:

    类似this

    <%
    
    ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext();
    HttpServletResponse response = (HttpServletResponse)ectx.getResponse();
    HttpSession session = (HttpSession)ectx.getSession(false);
    session.invalidate(); 
    %>
    <script type="text/javascript">
    alert('Setting has been updated');
    location.replace('/index.jsp');
    </script>
    

    【讨论】:

    • 感谢您的快速回复。不使用scriptlet可以实现吗?
    • 什么意思?如果您希望提醒用户,您需要使用 javascript。如果您只想在页面上放置一个框并重定向,您可以只显示 html 并使用元标记。也许更好的解决方案是重定向到主页并让主页检测原因并显示消息。这是关于重定向forums.sun.com/thread.jspa?threadID=530461的讨论
    • 对不起,如果我的问题听起来不太清楚。清除会话不是问题。我想知道 JSF 中是否有类似于 stackoverflow.com/questions/1679218/… 的可能性。如果我的问题不清楚,再次抱歉
    • @mplugjan:Scriptlet 与 Javascript 不同。 Scriptlet 是那些老式的&lt;% %&gt; 东西,十多年来一直不鼓励使用。 Mvg 只是询问如果没有它们是否可能(确实如此)。
    • 啊,我明白了 - 以前从未使用过名称 scriplet。我把 放在那里以显示 javascript 的位置以及 java 的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2019-07-23
    • 2015-06-13
    相关资源
    最近更新 更多