ナイトリービルドのJSF 2.0に触れる

今日が「あさって」の締め切りなので(ぉ


ライブラリは以下あたりからダウンロードする
https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=9814&expandFolder=9814&folderID=10079


faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                  http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
              version="2.0">

</faces-config>

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>
        </f:view>
    </body>
</html>


スコープなしBean

package jsf20test;

import javax.faces.model.ManagedBean;

@ManagedBean(name="noneBean" ,scope="none")
public class NoneBean {
    
    
    public String getMessage(){
        return "スコープなし/"+this;
    }
}

リクエストスコープBean

package jsf20test;

import javax.faces.model.ManagedBean;
import javax.faces.model.ManagedProperty;

@ManagedBean(name="requestBean" ,scope="request")
public class RequestBean {
    
    @ManagedProperty(value="#{sessionBean}" )
    private SessionBean messageBean;

    public void setMessageBean(SessionBean messageBean) {
        this.messageBean = messageBean;
    }
    public String getMessage(){
        return "リクエストスコープ/"+this+"  |  "+messageBean.getMessage();
    }
}


セッションスコープBean

package jsf20test;

import javax.faces.model.ManagedBean;

@ManagedBean(name="sessionBean" ,scope="session")
public class SessionBean {

    public String getMessage(){
        return "セッションスコープ /"+this;
    }
}


結果

リクエストスコープ/jsf20test.RequestBean@1e8b957 | セッションスコープ /jsf20test.SessionBean@1e001c8
リクエストスコープ/jsf20test.RequestBean@1e8b957 | セッションスコープ /jsf20test.SessionBean@1e001c8
スコープなし/jsf20test.NoneBean@1952be0
スコープなし/jsf20test.NoneBean@739474
セッションスコープ /jsf20test.SessionBean@1e001c8

リロード

リクエストスコープ/jsf20test.RequestBean@8f337b | セッションスコープ /jsf20test.SessionBean@1e001c8
リクエストスコープ/jsf20test.RequestBean@8f337b | セッションスコープ /jsf20test.SessionBean@1e001c8
スコープなし/jsf20test.NoneBean@24de67
スコープなし/jsf20test.NoneBean@853e51
セッションスコープ /jsf20test.SessionBean@1e001c8

ポイントはセッションスコープのBeanをリクエストスコープのBeanに注入しているところ。また、xmlは見てのとおり空っぽ。管理Beanはすべてアノテーションで指定している。xmlはページナビゲーションのみになるくさい。

ちなみにスコープの小さいBeanの注入は出来ない。ショートスコープと怒られてしまう。ただし、スコープなしはどのBeanにも注入可能だ。EJBなどを使わないでビジネスロジックを書きたい場合、このスコープなし管理BeanにUserTransactionとEntityManagerやDataSourceをインジェクトするといいのだろう。

注入はフィールドインジェクションかと思ったらまさかのセッターインジェクション。セッターつけないでずっと悩んでいた。JSF1.2から何も変わっていないのね。



しかし、アノテーションで設定できることによってやっとJSFのDIが生かされる事になったという感じ。XMLで注入をいちいち書くのはかなりつらいから事実上使い物にならない機能だった。

でもこの程度のアノテーションだったら正直JSF 1.5とかいう名前でJavaEE 5に入れて欲しかった。機能そのものは変わっていないわけで。JPAEJBアノテーション多用によって敷居を下げてたのにJSFは1.1の改良程度でこれだけJ2EE時代に取り残されてる感じが強かったから。