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

Jef*_*Jak 2 cookies jsf el jsf-2

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

JSF:

<h:outputText value="#{facesContext.externalContext.requestCookieMap['TESTCOOKIE'].value}" />
Run Code Online (Sandbox Code Playgroud)

输出:

MyCookieValue

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

JSF:

<h:outputText value="#{facesContext.externalContext.requestCookieMap}" />
Run Code Online (Sandbox Code Playgroud)

输出:

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

Alo*_*uez 5

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

所以,遵循以下代码:

<h:outputText value="#{cookie['TESTCOOKIE'].value}" />
Run Code Online (Sandbox Code Playgroud)

应该输出相同的:

<h:outputText value="#{facesContext.externalContext.requestCookieMap['TESTCOOKIE'].value}" />
Run Code Online (Sandbox Code Playgroud)

现在,如果你想迭代所有这些,我的建议是使用支持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());
    }

}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它

<ui:repeat value="#{triky.cookies}" var="ck">
    #{ck.name}: #{ck.value}<br/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

澄清:这是因为<ui:repeat />标签只接受java.util.Listvalue属性,否则它将ListModel只用一个元素内部创建它自己.此外,由默认实现给定的集合values()中的方法java.util.Map不是一个java.util.List而是一个java.util.Set,那么,<ui:repeat/>标签使用的是一套作为自己的列表模型中的唯一元素,并通过该列表的模型元素的数量只是迭代时其中一个,实际上都不是饼干.