【问题标题】:Value saving in session会话中的价值节省
【发布时间】:2013-01-17 15:49:58
【问题描述】:

我想要一个链接,当用户点击它时,它应该执行以下操作:

  • 将密钥保存到会话中
  • 用另一个 JSF 页面打开一个新窗口
  • 不应重新加载当前页面

我不知道如何解决这个问题。
当我保存密钥并打开新窗口时,密钥为空。
也许保存密钥的过程太慢了?
以及如何防止页面重新加载?

这是我当前的代码:

JavaScript

function openWin2(url)
{
     var w = 800;
     var h = window.innerHeight - 100;
     var left = ((screen.width-w)/2);
     var top = ((screen.height-h)/2);
     window.open(url, 'Tax', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
}

xhtml

<ui:repeat value="#{main.list}" var="items">
    <h:commandLink action="#{main.setClickedId(items.itemId)}">
        <table onclick="openWin2('immobilie.xhtml')"><tr><td>Hello</td></tr></table>
    </h:commandLink>
</ui:repeat>

ManagedBean
保存

public void setClickedId(String clickedId) {
    this.clickedId = clickedId;

    FacesContext context = FacesContext.getCurrentInstance();
    Map<String, Object> map = context.getExternalContext().getSessionMap();
    if(map.containsKey("id")){map.remove("id");}
    map.put("id", clickedId);
}

加载

FacesContext context = FacesContext.getCurrentInstance();
immoId = context.getExternalContext().getSessionMap().get("id").toString();

【问题讨论】:

    标签: java jsf session-variables


    【解决方案1】:

    我自己发现了失败。
    问题是,JSF 页面没有解析 JSF 标签。
    来自:

    <h:outputText value="#{items.itemId" />
    

    我没有任何输出。
    这就是为什么我认为 JSF 页面调用方法失败的原因。
    但这不是问题所在。问题是我的网址。这是我打开第二页的代码:

    openWin2('immobilie.xhtml')
    

    但那是错误的。必须是

    openWin2('faces/immobilie.xhtml')
    

    我从here得到了解决方案。


    Luiggi Mendoza 非常感谢您对我的帮助!你帮了我很大的忙!


    【讨论】:

    • 如果您的 Faces Servlet 的 servlet 映射是 *.xhtml 而不是 /faces/,那么您早就可以解决问题。此外,这是问题中未说明的问题的解决方案。无论如何,不​​客气。
    【解决方案2】:

    当我保存密钥并打开新窗口时,密钥是空的。可能是保存密钥的过程太慢了?

    这里的问题是 JavaScript 和服务器端方法运行在不同的地方:

    • JavaScript 代码在客户端浏览器中运行,就像在您的电脑中本地执行代码一样。

    • 服务器端代码在服务器上运行。浏览器必须向服务器发出请求,服务器将完成其工作并执行您的&lt;h:commandLink&gt;action 中定义的方法,然后向浏览器返回响应。浏览器将处理响应。注意:这是一个非常基本的解释,有关 JSF 请求的更多信息请阅读JSF Lifecycle and Custom components

    知道这一点,不是方法执行太慢,而是在不同的时间执行。

    以及如何防止页面重新加载?

    简而言之,您必须向服务器发出 ajax 请求,而不是完整的请求。为此,JSF 2 为您提供了&lt;f:ajax&gt;,它将简单的请求转换为 ajax 请求,并且浏览器不会刷新页面。

    解决方案应该是一个两步过程:

    1. 执行服务器操作,将会话中的数据保存为 ajax 请求。

    2. 处理完 ajax 请求后,您应该使用 JavaScript 打开窗口。

    &lt;f:ajax&gt; 组件本质上不提供oncomplete javascript 方法,但您可以在完成ajax 请求后利用onevent 方法的强大功能执行javascript 代码。该示例基于JSF 2.0 javascript onload/oncomplete

    <h:commandLink action="#{main.setClickedId(items.itemId)}" value="Hello">
        <f:ajax onevent="handleOnComplete" />
    </h:commandLink>
    
    <h:outputScript>
        function handleOnComplete(e) {
            if (e.status == 'success') {
                openWin2();
            }
        }
    </h:outputScript>
    

    另一种方法是使用第三方库,例如来自 RichFaces 的 &lt;a4j:commandLink&gt; 或来自 PrimeFaces 的 &lt;p:commandLink&gt;。我将使用 PrimeFaces 代码发布示例:

    <p:commandLink action="#{main.setClickedId(items.itemId)}" value="Hello"
        oncomplete="openWin2()" />
    

    【讨论】:

    • 我用 尝试了这个东西,但没有成功。它只是将我重定向到相同的 URL,最后带有一个 # 。而且我必须为 设置一个名称。我可以设置一个随机名称还是正确命名?
    • @SamuelBrand 您可以将&lt;h:outputScript&gt; 替换为&lt;script type="text/javascript"&gt;
    • 打开新窗口可以正常工作:) 但似乎密钥没有保存在会话中
    • @SamuelBrand 我的错误,event="action"&lt;f:ajax&gt; 上,因此无需添加event 属性。我已经更新了我的答案。
    • 窗口正在打开。密钥未保存:(也许我的 bean 有问题?
    【解决方案3】:

    我建议使用a4j:ajax 标签(RichFaces 中提供,文档here)。那么xhtml中的标记应该是这样的:

    <h:commandLink action="#{main.setClickedId(items.itemId)}">
        <table><tr><td>Hello</td></tr></table>
        <a4j:ajax oncomplete="openWin2('immobilie.xhtml')" />
    </h:commandLink>
    

    这段代码会向服务器发送一个AJAX请求,服务器会执行setClickedId方法,当响应返回浏览器时,会调用openWin2函数。

    【讨论】:

    • 作为建议,既然您要添加 RichFaces,请不要将&lt;h:commandLink&gt;&lt;a4j:ajax&gt; 结合使用,最好使用&lt;a4j:commandLink&gt;
    • @Struchu 这似乎也不起作用。我认为问题可能出在我的保存和加载代码中。 ://
    • @Struchu UPDATE 解决我的问题后,此代码有效。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 2021-09-21
    • 2013-07-30
    相关资源
    最近更新 更多