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

在JSF2.0中,如何在facelets中写出cookies?,jsf,cookies,jsf-2,el,Jsf,Cookies,Jsf 2,El,我知道如何从facelets中写出各个cookies: JSF: 产出: 麦考基值 我已经能够写出map,但是输出的不是值,而是对值的引用 JSF: 输出: {DEFAULTUSERNAME=javax.servlet.http。Cookie@36a236a2, TESTCOOKIE=javax.servlet.http。Cookie@36b436b4, JSESSIONID=javax.servlet.http。Cookie@36d836d8} 映射有一个values()方法,该方法

我知道如何从facelets中写出各个cookies:

JSF:


产出:

麦考基值

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

JSF:


输出:

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

映射有一个
values()
方法,该方法返回所有元素的集合。我认为您需要一个比getter之外的默认方法调用更强大的EL引擎来实现这一点,比如jbossel或JUEL(我强烈建议任何javaee6项目都使用这两种引擎)

另一种方法是在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>

#{cookie.name}:#{cookie.value

尚未尝试此操作,但类似的操作也可以。您可能必须用列表替换集合,但不确定ui:repeat是否支持集合

编辑:根据下面的评论,您可以尝试以下操作:

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

#{cookie.name}:#{cookie.value


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

因此,以下代码:

<h:outputText value="#{cookie['TESTCOOKIE'].value}" />
然后像这样使用它

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

#{ck.name}:{ck.value}

澄清:这是因为
标记将只在其
属性中接受
java.util.List
,否则它将创建自己的
列表模型
,其中只有一个元素。此外,
值()
java.util.Map
中的
方法不是
java.util.List
而是
java.util.Set
,因此,
标记使用该集合作为其自身列表模型的唯一元素,在迭代该列表模型时,元素的数量只有一个,并且没有一个是真正的cookie。

标准java EE 6EL 2.2附带的已支持显式方法调用。答案是两件事将抛出一个例外。首先需要在#{cookie.value之后添加“}”。其次,由于“.values()”,我将得到一个TagAttributeException。我将其更改为“.values”。它将运行,但不输出任何内容。我得到一个带有“.values()”的TagAttributeException。当我删除对“.values”的更改时,没有异常。但它没有显示任何内容。
<h:outputText value="#{cookie['TESTCOOKIE'].value}" />
<h:outputText value="#{facesContext.externalContext.requestCookieMap['TESTCOOKIE'].value}" />
@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>