【问题标题】:In JSF2.0, how do I write out cookies in facelets?在 JSF2.0 中,如何在 facelets 中写出 cookie?
【发布时间】:2012-08-10 21:30:40
【问题描述】:

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

JSF:

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

输出:

我的Cookie值

我已经能够写出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 cookies jsf-2 el


    【解决方案1】:

    在 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>
    

    澄清:这是因为&lt;ui:repeat /&gt; 标签在其value 属性中只接受java.util.List,否则它将创建自己的ListModel,其中只有一个元素.此外,java.util.Mapvalues() 方法的默认实现给出的集合不是java.util.List,而是java.util.Set,因此,&lt;ui:repeat/&gt; 标记使用该集合作为它自己的唯一元素列表模型,当迭代该列表模型时,元素的数量只有一个,并且它们都不是真正的 cookie。

    【讨论】:

    • 我得到一个带有“.values()”的 TagAttributeException。当我删除对“.values”的更改时也不例外。但它什么也没显示。
    【解决方案2】:

    地图有一个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>
    

    尚未尝试过,但类似的方法也可以。您可能必须将 Collection 替换为 List,不确定 ui:repeat 是否支持 Collections。

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

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

    【讨论】:

    • EL 2.2 附带的标准 Java EE 6 已经支持显式方法调用。
    • 答案有两件事会引发异常。首先需要在#{cookie.value 后面加上“}”。其次,由于“.values()”,我会得到一个 TagAttributeException。我将其更改为“.values”。它会运行,但不会输出任何内容。
    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多