間違ってたら指摘下さい(^^;
Java EE7が出てLive Webcastをみたとき、CDIで増えたスコープは
- TransactionalScoped
- FlowScoped
と紹介されていて、なんでViewScopedは入らないんだろう…と不思議でした。
自分がJava EE 6を勉強し始めて、管理対象Bean(BackingBean)をどう作るか、具体的には、JSF管理対象を使うか、CDI管理対象を使うか悩んでいたとき(CDI管理対象にすれば色々楽できそうだから使いたいけど、JSFのViewScopedがすごく欲しい、という感じだった…)、以下のサイトがとても有益でした。
で、上記ページ内でも書かれているように、CDIの標準でViewScopedはないため、どうしても欲しい場合は独自に定義するなどが必要でした。
で、今回もないのかーと思っていたら以下のサイトを見つけ
でもこの記事古いんだ…と思いつつ、NetBeans7.3.1を立ち上げて書いてみたら、なんか2つ出てきた!
試しに以下書いてみました。
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
@author
@Named(value = "confirmScopeBean")
@ViewScoped
public class ConfirmScopeBean implements Serializable{
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void countUp(){
count++;
}
public ConfirmScopeBean() {
}
}
ビューは
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelet Title</title>
</h:head>
<h:body>
<h:form>
<h:outputLabel value="#{confirmScopeBean.count}" />
<h:commandButton value="カウント" action="#{confirmScopeBean.countUp()}" />
</h:form>
</h:body>
</html>
ちなみにRequestScopedだとボタンを押して1度カウントされるだけの繰り返しです。
(1回のリクエストごとに消えるから)
で、ViewScopedにすると
ちゃんとカウントアップしてる!
おお、CDI管理対象BeanでViewScopedになってる!!!(っぽい)
※ぽい、とつけたのは、このサンプルでは厳密なViewScopedの確認とは言えないため;
で、Java EE 7のJavaDocをみにいってみると
http://docs.oracle.com/javaee/7/api/
上記はキャプチャの一部なので、実際ページを見るのをおススメしますが、説明読む限りCDIでViewScopedで間違いないかと(^^;
これは超嬉しいです!!
なお試した環境は、NetBeans7.3.1でWebアプリケーションを作成し、Java EE 7,、GlassFish4.0を選んで作ったものです。