JSF2.0をさらに触る

今日もビシバシいくぜ!

今回は追加されたメソッドについて。


JSF2.0のメソッドを見るとどうやらサーブレットAPI経由で使っていたものが「ExternalContext」ですぐに触れるようになっているようだ。これはやっぱり便利。

さらに、ポストバックしたかどうかもわかる「isPostback」メソッドが追加された。これは正直JSF1.0で実装すべきだろうというメソッドだったのだが、これが標準化された。VisualWebJSFでは「isPostback」はすでにPageBeanに実装されていたため、特に問題はなかったが素のJSFを使う場合は真っ先に自分で実装しなくてはならないメソッドだった。


というわけでそれらを使うように改良したコード。

まず、下記のエントリをすでに打ち込んで動いているものとする。
http://d.hatena.ne.jp/shin/20081023/p3

hoge.jspを以下のようにアクションボタンを追加。

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <f:view>
            <h3><h:outputText value="#{requestBean.message}" /></h3>
            <h3><h:outputText value="#{requestBean.message}" /></h3>
            <h3><h:outputText value="#{noneBean.message}" /></h3>
            <h3><h:outputText value="#{noneBean.message}" /></h3>
            <h3><h:outputText value="#{sessionBean.message}" /></h3>
            <h:form>
                <h:commandButton value="さぶみっと" action="#{noneBean.action}"/>
            </h:form>
        </f:view>
    </body>
</html>

NoneBean.javaを以下のように修正。

package jsf20test;

import java.util.HashMap;
import java.util.Map;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.ManagedBean;

@ManagedBean(name="noneBean" ,scope="none")
public class NoneBean {
    
    
    public String getMessage(){
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();


        return "スコープなし/"+this+
                " , isPostback=" + fc.isPostback() +
                " , path=" + ec.getRequestScheme()+"://"+
                ec.getRequestServerName()+":"+
                ec.getRequestServerPort()+
                ec.getRequestContextPath()+
                ec.getRequestServletPath()+
                ec.getRequestPathInfo();
    }
    public String  action(){

        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();


        Map<String,Object> params = new HashMap<String, Object>();
        params.put("maxAge", 60);//1分間有効なCookie

        ec.addResponseCookie("testCookie", "JSF2.0test", params);
        return null;
    }
}


実行してみる。
1度目

リクエストスコープ/jsf20test.RequestBean@483edb | セッションスコープ /jsf20test.SessionBean@18f22f3
リクエストスコープ/jsf20test.RequestBean@483edb | セッションスコープ /jsf20test.SessionBean@18f22f3
スコープなし/jsf20test.NoneBean@1da5d7 , isPostback=false , path=http://localhost:8084/JSF2.0Test/faces/hoge.jsp
スコープなし/jsf20test.NoneBean@72f580 , isPostback=false , path=http://localhost:8084/JSF2.0Test/faces/hoge.jsp
セッションスコープ /jsf20test.SessionBean@18f22f3

2度目

リクエストスコープ/jsf20test.RequestBean@38160a | セッションスコープ /jsf20test.SessionBean@18f22f3
リクエストスコープ/jsf20test.RequestBean@38160a | セッションスコープ /jsf20test.SessionBean@18f22f3
スコープなし/jsf20test.NoneBean@2ef2d7 , isPostback=true , path=http://localhost:8084/JSF2.0Test/faces/hoge.jsp
スコープなし/jsf20test.NoneBean@492b68 , isPostback=true , path=http://localhost:8084/JSF2.0Test/faces/hoge.jsp
セッションスコープ /jsf20test.SessionBean@18f22f3

あとはHTTPモニタを見るとクッキーが保存されているのがわかる。