JeffJak
JeffJak

Reputation: 2068

In JSF2.0, how do I write out cookies in facelets?

I know how to write out individual cookies from facelets:

JSF:

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

Outputs:

MyCookieValue

I have been able to write out map, but the output is not the values but a reference to the value.

JSF:

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

Output:

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

Upvotes: 2

Views: 3545

Answers (2)

Alonso Dominguez
Alonso Dominguez

Reputation: 7858

You don't need such a long value expression to access your cookies in JSF 2.0, there is an implicit object named cookie which references the cookie map and it's equivalent to facesContext.externalContext.requestCookieMap.

So, following code:

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

should output the same as:

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

Now, if you want to iterate through all of them, my recommendation is to use 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());
    }

}

And then use it like this

<ui:repeat value="#{triky.cookies}" var="ck">
    #{ck.name}: #{ck.value}<br/>
</ui:repeat>

Clarification: This comes from the fact that the <ui:repeat /> tag will only accept java.util.List in its value attribute, otherwise it will create its own ListModel with just one element inside. Besides, the collection given by the default implementation of the values() method in a java.util.Map is not a java.util.List but a java.util.Set, so, the <ui:repeat/> tag was using that set as the only element of its own list model and when iterating through that list model the number of elements was just one and none of them were actually cookies.

Upvotes: 5

Rasmus Franke
Rasmus Franke

Reputation: 4524

Maps have a values() method that returns a collection of all elements. I think you need a stronger EL engine than the default to do method invocation outside of getters to do that though, like JBoss EL or JUEL (both of which i strongly recommend for any java ee 6 project).

The alternative is doing method invocation in java and supplying a getter like this:

myBean.java

public Collection getCookies(){
    return FacesContext.getCurrentInstance().getExternalContext().getRequestCookieMap().values();
}

And iterating over the collection in your markup

<ui:repeat value="#{myBean.cookies}" var="cookie">
    <p>#{cookie.name}: #{cookie.value</p>
</ui:repeat>

Haven't tried this out but something similar will work. You might have to replace the Collection with a List, not sure if ui:repeat supports Collections.

EDIT: as per the comment below, you could try this:

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

Upvotes: 1

Related Questions