ひこぽんのーと

覚書と雑記です。

JavaEE 7をやってみよう。 CDI その1

今回は、DIをやります。
これまでは仕事でSpringを少々いじった程度。
あ、Google guiceも触ったか。

とにかく、機能が似てるのに色々作りやがって。
と思いながら、JavaEEのDI機能、CDIを触ってみる。

IText インターフェイス
まず、DIする機能として文字列を出力するクラスを作ります。
手始めにインターフェイスを。
package text;

public interface IText {
    public String getText();
    public void setText(String text);
}
SimpleTextクラス
続いて、実装であるテキストクラスを。
インターフェイスの実装クラスには、
スコープ属性のアノテーションを付加します。
これ重要。
これがないとDIできません。
package text.impl;

import javax.enterprise.context.RequestScoped;

import text.IText;

@RequestScoped
public class SimpleText implements IText {
    private String text;
    
    @Override
    public String getText() {
        return text;
    }

    @Override
    public void setText(String text) {
        this.text = text;
    }
}
・DisplayTextクラス
次にこのクラスを利用するクラスを作ります。
ここではManaged Beanとします。
インジェクションするメンバにInjectアノテーションを付加します。
SpringのResourceアノテーションみたいなものです。
JSFからITextインターフェイスメソッドを呼び出せるように、
IText.getText()を実行するメソッドを作ります。
package manage;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import text.IText;

@Named(value="display")
@RequestScoped
public class DisplayText {
    
    @Inject
    private IText iText;
    
    private String inputText1;
    
    /**
     * inputText1を取得します。
     * @return inputText1
     */
    public String getInputText1() {
        return inputText1;
    }

    /**
     * inputText1を設定します。
     * @param inputText1 inputText1
     */
    public void setInputText1(String inputText1) {
        this.inputText1 = inputText1;
    }
    
    public String getText1() {
        iText.setText(inputText1);
        return iText.getText();
    }
}
・DI.xhtml
テスト用にこのBeanを使うJSFファイルを作ります。
ここでは、先に作ったDisplayTextクラスのgetText1メソッドを呼んで、
文字列を取得する処理を作っています。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <h:outputStylesheet library="css" name="default.css" />
    <title>DIサンプル</title>
</h:head>
<h:body>
    <h:form id="form1">
        <h:outputLabel value="文字を入力するのだ。" /><br />
        <h:inputSecret id="inputText1" value="#{display.inputText1}">
            <f:ajax execute="form1" />
        </h:inputSecret>
        <hr/>
        <h:outputLabel value="ここに入力した文字がでるぞ。" />
        <br />
        <h:outputText id="decoText1" value="#{display.text1}" escape="false" />
        <hr/>
    </h:form>
</h:body>
</html>

実行するとこんな感じで正しくSimpleTextクラスが使われていることがわかります。
f:id:nagamitsu1976:20150801145729p:plain

てなわけでその2へつづく