2

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}

4

2 に答える 2

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 />のみ受け入れるという事実から来ています。さらに、 a のメソッドのデフォルト実装によって与えられるコレクションは a ではなくaであるため、タグはそのセットを独自のリスト モデルの唯一の要素として使用し、そのリスト モデルを反復処理するとき、要素の数はちょうどそのうちの 1 つは実際には Cookie ではありませんでした。java.util.ListvalueListModelvalues()java.util.Mapjava.util.Listjava.util.Set<ui:repeat/>

于 2012-08-14T15:32:44.400 に答える
1

マップには、values()すべての要素のコレクションを返すメソッドがあります。ただし、JBoss EL や JUEL のように、ゲッターの外部でメソッド呼び出しを行うには、デフォルトよりも強力な EL エンジンが必要だと思います (Java ee 6 プロジェクトにはどちらも強くお勧めします)。

別の方法は、Java でメソッド呼び出しを行い、次のようなゲッターを提供することです。

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>

これを試したことはありませんが、同様のものが機能します。ui:repeat がコレクションをサポートしているかどうかわからない場合は、コレクションをリストに置き換える必要があるかもしれません。

編集:以下のコメントに従って、これを試すことができます:

<ui:repeat value="#{facesContext.externalContext.requestCookieMap.values()}" var="cookie">
    <p>#{cookie.name}: #{cookie.value</p>
</ui:repeat>
于 2012-08-14T14:53:27.923 に答える