我知道如何从 facelets 中写出单个 cookies:
JSF:
<h:outputText value="#{facesContext.externalContext.requestCookieMap['TESTCOOKIE'].value}" />
输出:
MyCookieValue
我已经能够写出 map ,但输出的不是值而是对值的引用。
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}
最佳答案
在 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
里面只有一个元素。此外,values()
的默认实现给出的集合java.util.Map
中的方法不是 java.util.List
但是一个java.util.Set
,因此,<ui:repeat/>
标签使用该集合作为它自己的列表模型的唯一元素,并且在遍历该列表模型时,元素的数量只有一个,实际上没有一个是 cookie。
关于jsf - 在JSF2.0中,如何在facelets中写出cookies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11954869/