会话中的价值节省

时间:2013-02-02 11:32:31

标签: java jsf session-variables

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

  • 将密钥保存到会话中
  • 使用其他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();

3 个答案:

答案 0 :(得分:0)

我建议使用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

答案 1 :(得分:0)

  

当我保存密钥并打开新窗口时,密钥为空。也许保存密钥的过程太慢了?

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

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

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

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

  

如何阻止页面重新加载?

简而言之,您必须向服务器发出ajax请求,而不是完整请求。为实现这一目标,JSF 2为您提供<f:ajax>,它将简单的请求转换为ajax请求,浏览器不会刷新页面。

解决方案应分为两个步骤:

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

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

  3. <f:ajax>组件本质上不提供oncomplete javascript方法,但您可以使用onevent方法的强大功能在完成ajax后执行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的<a4j:commandLink>或PrimeFaces的<p:commandLink>。我将使用PrimeFaces代码发布样本:

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

答案 2 :(得分:0)

我自己发现了失败 问题是,JSF Page没有解析JSF标签 从:

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

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

openWin2('immobilie.xhtml')

但那是错的。它必须是

openWin2('faces/immobilie.xhtml')

我从here获得了解决方案。

<小时/> Luiggi Mendoza非常感谢你帮助我!你非常帮助我!