在JSF2.0中,如何在facelets中写出cookie?

时间:2012-08-14 14:44:09

标签: jsf cookies jsf-2 el

我知道如何从facelets写出单独的cookie:

JSF:

<h:outputText value="#{facesContext.externalContext.requestCookieMap['TESTCOOKIE'].value}" />

输出:

  

MyCookieValue

我已经能够写出地图,但输出不是值,而是对值的引用。

JSF:

<h:outputText value="#{facesContext.externalContext.requestCookieMap}" />

输出:

  

{DEFAULTUSERNAME=javax.servlet.http.Cookie@36a236a2,   TESTCOOKIE=javax.servlet.http.Cookie@36b436b4,   JSESSIONID=javax.servlet.http.Cookie@36d836d8}

2 个答案:

答案 0 :(得分:5)

您不需要这么长的值表达式来访问JSF 2.0中的cookie,有一个名为cookie的隐式对象引用了cookie映射,它等同于facesContext.externalContext.requestCookieMap

所以,请遵循以下代码:

<h:outputText value="#{cookie['TESTCOOKIE'].value}" />

应输出与:

相同的内容
<h:outputText value="#{facesContext.externalContext.requestCookieMap['TESTCOOKIE'].value}" />

现在,如果你想遍历所有这些,我的建议是使用支持bean:

@RequestScoped
@ManagedBean(name = "triky")
public class TrikyBean {

    public List getCookies() {
        FacesContext context = FacesContext.getCurrentInstance();
        Map cookieMap = context.getExternalContext().getRequestCookieMap();
        return new ArrayList(cookieMap.values());
    }

}

然后像这样使用它

<ui:repeat value="#{triky.cookies}" var="ck">
    #{ck.name}: #{ck.value}<br/>
</ui:repeat>

澄清:这是因为<ui:repeat />标记只接受java.util.List属性中的value,否则会创建自己的ListModel 1}}里面只有一个元素。此外,values()java.util.Map方法的默认实现所提供的集合不是java.util.List而是java.util.Set,因此,<ui:repeat/>标记是使用该集合作为其自己的列表模型的唯一元素,并且当遍历该列表模型时,元素的数量只是一个,并且它们实际上都不是cookie。

答案 1 :(得分:1)

地图有values()方法,可返回所有元素的集合。我认为你需要一个比默认更强的EL引擎才能在getter之外进行方法调用,比如JBoss EL或JUEL(我强烈建议任何java ee 6项目)。

另一种方法是在java中进行方法调用并提供这样的getter:

myBean.java

public Collection getCookies(){
    return FacesContext.getCurrentInstance().getExternalContext().getRequestCookieMap().values();
}

迭代标记中的集合

<ui:repeat value="#{myBean.cookies}" var="cookie">
    <p>#{cookie.name}: #{cookie.value</p>
</ui:repeat>

没有试过这个,但类似的东西会起作用。您可能必须使用List替换Collection,不确定ui:repeat是否支持Collections。

编辑:根据下面的评论,你可以试试这个:

<ui:repeat value="#{facesContext.externalContext.requestCookieMap.values()}" var="cookie">
    <p>#{cookie.name}: #{cookie.value</p>
</ui:repeat>