ナイトリービルドの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>
<%@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に入れて欲しかった。機能そのものは変わっていないわけで。JPAやEJBはアノテーション多用によって敷居を下げてたのにJSFは1.1の改良程度でこれだけJ2EE時代に取り残されてる感じが強かったから。