Seasar DI Container with AOP

サンプル解説

teeda-exmapleのプログラムを順に解説します。 実際に動作するサンプルを参考に、teeda coreの使い方を学習しましょう。

  • hello.jsp
  • helloDI.jsp
  • addDI.jsp
  • hello.jsp

    ブラウザで、http://localhost:8080/teeda-example/faces/hello/hello.jspにアクセスしてみましょう。 hello Teeda!と表示されるはずです。このサンプルでは、次のことを学びます。

    • Teedaによる通常のJSFの例。

    それでは、通常のJSFの例のHTMLの中身を見てみましょう。

    01:<%@ page contentType="text/html; charset=UTF-8" %>
    02:<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    03:<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    04:<html>
    05:<head>
    06:<title>hello</title>
    07:</head>
    08:<body>
    09:<f:view>
    10:  <h:outputText value="#{helloBean.hello}"/>
    11:</f:view>
    12:</body>
    13:</html>
    

    10行目のhelloBeanというJavaBeansはWEB-INF/faces-config.xmlで設定されています。 それでは、該当個所を見てみましょう。

    <managed-bean>
    	<managed-bean-name>helloBean</managed-bean-name>
    	<managed-bean-class>examples.teeda.bean.HelloBean</managed-bean-class>
    	<managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    

    これは通常のJSFと同じですね。examples.teeda.bean.HelloBeanクラスをリクエストスコープでhelloBeanという名前で設定しています。

    helloDI.jsp

    ブラウザで、http://localhost:8080/teeda-example/faces/hello/helloDI.jspにアクセスしてみましょう。 hello Teeda x DI!と表示されるはずです。このサンプルでは、次のことを学びます。

    • TeedaによるDIを使用したJSFの例。

    それでは、DIを使用した例のHTMLの中身を見てみましょう。

    01:<%@ page contentType="text/html; charset=UTF-8" %>
    02:<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    03:<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    04:<html>
    05:<head>
    06:<title>hello x DI</title>
    07:</head>
    08:<body>
    09:<f:view>
    10:  <h:outputText value="#{helloDto.hello}"/>
    11:</f:view>
    12:</body>
    13:</html>
    

    これは先ほどのhello.jspとほとんど変わらないと思います。大きな違いは、10行目のhelloDtoがdiconファイルに定義されている部分です。 それでは、helloDtoが定義されているhello.diconを見てみましょう。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
        "http://www.seasar.org/dtd/components24.dtd">
    <components>
        <component name="helloDto" class="examples.teeda.dto.HelloDto"/>
    </components>
    

    examples.teeda.dto.HelloDtoクラスをhelloDtoという名前で設定しています。 Teedaでは、JSFで扱うJavaBeansをS2Containerに管理させる事が可能なのです。

    addDI.jsp

    このサンプルでは、次のことを学びます。

    • 入力値をJavaBeansのプロパティと連動させる方法。
    • ボタンをクリックしたときにJavaBeansのメソッドを呼び出す方法。
    • Actionにsetterメソッドを定義してリクエスト、セッション、S2Containerのオブジェクトをプロパティに自動設定する方法。

    それでは、HTMLの中身を見てみましょう。

    01:<%@ page contentType="text/html; charset=UTF-8" %>
    02:<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
    03:<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
    04:<html>
    05:<head>
    06:  <title>add x DI</title>
    07:</head>
    08:<body>
    09:<f:view>
    10:  <h:form>
    11:    <h:messages globalOnly="false" showDetail="true"/>
    12:    <h:inputText value="#{addDto.arg1}" required="true"/> +
    13:    <h:inputText value="#{addDto.arg2}" required="true"/> =
    14:    <h:outputText value="#{addDto.result}"/>
    15:    <h:commandButton action="#{addAction.calculate}" value="calculate"/>
    16:  </h:form>
    17:</f:view>
    18:</body>
    19:</html>
    

    12行目の<h:inputText value="#{addDto.arg1}" required="true"/>で、 入出力用のタグとJavaBeansのプロパティを連動させています。 入力した値は、バリデーションがOKならJavaBeansのプロパティに格納され、 NGの場合は入力された値がそのままページに表示されることになります。

    addDtoはどこで定義されているのでしょうか。addDtoは、examples/jsf/dicon/add.diconの中で、次のように定義されています。

    <component name="addDto" class="examples.teeda.dto.AddDto" instance="request"/>
    

    instance属性がrequestなので、addDtoはrequestスコープで管理されることになります。 また、add.diconはルートの定義であるapp.diconから次のようにincludeされています。

    <include path="examples/teeda/dicon/add.dicon"/>
    

    15行目の<h:commandButton action="#{addAction.calculate}" value="calculate"/>で、 ボタンがクリックされたときにJavaBeansのメソッドを呼び出す設定をしています。 ボタンやリンクのaction属性で、#{変数名.メソッド名}のように記述することをMethodBindingと呼びます。 MethodBindingで呼び出されるメソッドは、引数がなく、戻り値がStringでなければいけません。 addActionはadd.diconで次のように定義されています。

    <component name="addAction" class="examples.teeda.action.impl.AddActionImpl" instance="request"/>