2

我知道如何从 facelets 中写出单个 cookie:

JSF:

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

输出:

我的饼干价值

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

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}

4

2 回答 2

5

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

所以,下面的代码:

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

应输出与以下内容相同:

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

现在,如果你想遍历所有这些,我的建议是使用 backing 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,里面只有一个元素。values()此外,a 中方法的默认实现给出的集合java.util.Map不是 ajava.util.List而是 a java.util.Set,因此,<ui:repeat/>标签使用该集合作为其自己的列表模型的唯一元素,并且在迭代该列表模型时,元素的数量只是其中一个实际上都不是饼干。

于 2012-08-14T15:32:44.400 回答
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>

还没有尝试过,但类似的东西会起作用。您可能必须用列表替换集合,不确定 ui:repeat 是否支持集合。

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

<ui:repeat value="#{facesContext.externalContext.requestCookieMap.values()}" var="cookie">
    <p>#{cookie.name}: #{cookie.value</p>
</ui:repeat>
于 2012-08-14T14:53:27.923 回答