我知道如何从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}
答案 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>