| ## Teeda Extensionの機能について このドキュメントではTeeda Extensionの機能について説明します． 初期化(initialize)メソッド 描画前(prerender)メソッド doメソッド previousViewId ポストバック リダイレクト DynamicProperty WindowIdとnewwindowクエリストリング レイアウト 動的なバリデーション ファイルアップロード ### ■初期化(initialize)メソッド 初期化(initialize)メソッドとは、他のページから遷移されたタイミングで1度だけ呼び出されるライフサイクルメソッドです．同じページからポストバックされた場合には呼び出されません． Pageクラスに[initialize]というメソッドを定義しておくと，他のページから遷移されたタイミングでTeedaが呼び出してくれます． `initialize()`メソッドの戻り値の型としては`Class/String/void`のどれかを選ぶことが出来ます． 戻り値の型がClass/String型で，戻り値がnull以外を返した場合は，`prerender()`メソッドが呼び出されることなく，指定されたページに画面遷移 (リダイレクト) します．戻り値型がvoidまたはClass/String型でnullを返した場合は，(もしあれば) 続けてprerender()メソッドが呼び出されます． 戻り値の型の選択は`initialize()`メソッドで遷移先がある場合はClass型、無い場合はvoidをお奨めします．
[ initializeメソッドの戻り値型一覧 ]
戻り値の型 | 説明
--- | ---
Class型 | 遷移先Pageクラスを記述する．
String型 | 遷移先HTML名を記述する．
void型 | 遷移する可能性が無い場合に使用する．
### ■描画前(prerender)メソッド 描画前(prerender)メソッドとは、あるPageが描画される直前で毎回呼び出されるライフサイクルメソッドです． Pageクラスに[prerender]というメソッドを定義しておくと描画される直前にTeedaが呼び出してくれます． `prerender()`メソッドの戻り値の型としては`Class/String/void`のどれかを選ぶことが出来ます． 戻り値の型がClass/String型で，戻り値がnull以外を返した場合は，指定されたページに画面遷移 (リダイレクト) します．戻り値型がvoidまたはClass/String型でnullを返した場合は自画面が表示されます． 戻り値の型の選択は`prerender()`メソッドで遷移先がある場合はClass型、無い場合はvoidをお奨めします．
[ prerenderメソッドの戻り値型一覧 ]
戻り値の型 | 説明
--- | ---
Class型 | 遷移先Pageクラスを記述する．
String型 | 遷移先HTML名を記述する．
void型 | 遷移する可能性が無い場合に使用する．
### ■doメソッド doメソッドとは，あるPageのフォームがサブミットされると呼び出されるライフサイクルメソッドです． Pageクラスに[do]で始まるメソッドを定義しておくと，フォームがサブミットされた際にTeedaが呼び出してくれます． `do`メソッドの名前はフォームのsubmitボタンのidと一致させます． `do`メソッドの戻り値の型としては`Class/String/void`のどれかを選ぶことが出来ます． 戻り値の型がClass/String型で，戻り値がnull以外を返した場合は，指定されたページに画面遷移 (リダイレクト) します．戻り値型がvoidまたはClass/String型でnullを返した場合は，(もしあれば) 続けて`prerender()`メソッドが呼び出されます．
[ doメソッドの戻り値型一覧 ]
戻り値の型 | 説明
--- | ---
Class型 | 遷移先Pageクラスを記述する．
String型 | 遷移先HTML名を記述する．
void型 | 遷移する可能性が無い場合に使用する．
### ■previousViewId previousViewId(プレビアスビューアイディ)とは、あるPageが以前にどこのPageから遷移してきたかを判別する機能です． Pageクラスに[previousViewId]というString型のプロパティを定義しておくと、Teedaが自動的に設定してくれます． previousViewIdには、/view/hoge/foo.htmlのような形式のHTMLまでのパスが設定されます．
    public class NextPage {
        private String previousViewId;

        public String prerender() {
            System.out.println(previousViewId);
            return null;
        }

        public String getPreviousViewId() {
            return previousViewId;
        }

        public void setPreviousViewId(String previousViewId) {
            this.previousViewId = previousViewId;
        }
    }
### ■ポストバック postback(ポストバック)とは、ある画面でフォームがサブミットされたときに、そのPOSTリクエストの送り先が同一のページである事を指します． Pageクラスに[postback]というboolean/Boolean型のプロパティを定義しておくと、そのPageへのアクセスが初回起動時なのか postbackされてきたものかを判定することが出来ます．
    public class HogePage {
        private boolean postback;

        public boolean isPostback() {
            return postback;
        }
        public void setPostback(boolean postback) {
            this.postback = postback;
        }
        public String prerender() {
            if(isPostback()) {
                //postback時のロジックを記述
            } else {
                //初回起動時のロジックを記述
            }
        }
    }
### ■リダイレクト ポストバックの後，別画面へ遷移する場合はリダイレクトが使われます．これはPRG (Post-Redirect-Get) パターンと呼ばれます． リダイレクトする際のURLは，ポストバックされたURLに基づいて同じプロトコル・同じホスト・同じポート番号で組み立てられます (「リダイレクトについて」も参照してください)． 異なるプロトコルまたはポート番号でリダイレクト (画面遷移) したい場合は，アノテーションで指定することが出来ます． #### Tigerアノテーション
    @Redirect(protocol=ProtocolType.HTTPS)
    public Class doSomething() {
        ...
    }
#### 定数アノテーション
    public static final String doSomething_REDIRECT = "protocol=https";

    public Class doSomething() {
        ...
    }
#### Redirectアノテーションで指定可能な属性
[ Redirectアノテーションの属性一覧 ]
属性 | デフォルト | 説明
--- | --- | ---
protocol | NA (必須) | リダイレクトするURLのプロトコルです． httpまたはhttpsを指定することが出来ます．
port | -1 | リダイレクトするURLのポート番号です． -1の場合，リダイレクトURLにポート番号は含まれません．
### ■DynamicProperty(ダイナミックプロパティ) DynamicProperty(ダイナミックプロパティ)とは、Pageクラス側で動的にHTMLの属性値を変更できる機能です． この機能は、例えば動的にCSSなどを切り替えたりする場合に有効な機能です． DynamicPropertyで指定するメソッドは，get＋id＋属性名という名称でPageクラスに定義されます． idがハイフンつきの場合は、ハイフンを取り除いて先頭大文字にした形式で記述されます． 例えばidがarg1の入力項目のstyle属性を動的に変更する場合を考えてみましょう． その場合には、PageクラスにgetArg1Style()というメソッドを定義しておくと実行時に呼ばれます． 下記にDynamicPropertyの規約をまとめます．
[ DynamicPropertyの規約一覧 ]
HTMLのid | 属性 | PageクラスのDynamicPropertyメソッド名
--- | --- | ---
hoge | style | getHogeStyle()
hoge-foo | onclick | getHogeFooOnclick()
### ■windowIdとnewwindowクエリストリング Teeda内部で管理しているスコープとviewIdは全てwindowId別に管理されています． windowIdはTeedaによって各画面ごとに割り振られるidです． ただしリンクでの新規WindowオープンやJavaScriptによる Windowオープンの場合はこの限りではありません．このような場合に明示的にTeedaに新規windowIdを割り当ててもらう機能が newwindowクエリストリングです．newwindow=trueのようなクエリストリングをURLにくっつけると、 Teeda側でwindowIdを新たに採番し、スコープも別管理になります． 通常の場合は、
    <a id="goAddInput" href="../add/addInput.html" target="_blank">足し算による入力サンプル(新規Windowが開く)</a>
のようにtargetを_blank指定すると、newwindowクエリストリングは自動的に割り当てられます． この機能はFormタグ、Aタグにて使用することができます． ### ■レイアウト Teedaでは簡単に使えるレイアウト機能を提供しています． view/layout/layout.htmlにファイルを置いておくと自動的に個々のページに適用されます． layout.htmlでheader.htmlなどの他のレイアウトのパーツを読み込む場合は、
    <te:include te:src="/layout/header.html"/>
のように記述します．詳しくは、includeタグを参照してください． レイアウトを適用するHTMLの中身を読み込むには、
    <te:includeChildBody/>
のように記述します．詳しくは、includeChildBodyタグを参照してください． 各Pageでpublic String getLayout() {...}を定義し、戻り値で/aaa/bbb.htmlのように指定するとbbb.htmlをレイアウトにすることもできます． getLayout()の値は動的に変えることもできます．layout.htmlのボディのサンプルは次のようになります．
    <table border="0" cellspacing="5">
    <tr>
      <td colspan="2"><te:include te:src="/layout/header.html"/></td>
    </tr>
    <tr>
      <td width="140" valign="top">
        <te:include te:src="/layout/menu.html"/>
      </td>
      <td valign="top" align="left">
        <te:includeChildBody/>
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <hr/>
      </td>
    </tr>
    <tr>
      <td colspan="2">
        <te:include te:src="/layout/footer.html"/>
      </td>
    </tr>
    </table>
### ■動的なバリデーション バリデーションを動的に変化させるには、get + id + Validatorという名前のメソッドを定義します． 例えば、aaaというidのタグのバリデーションを動的に変える場合は次のようなメソッドを用意します．
    public Validator getAaaValidator() {
        TLengthValidator validator = new TLengthValidator();
        if (...) {
            validator.setMinimum(3);
        } else {
            validator.setMinimum(5);
        }
        return validator;
    }
複数のValidatorを返す場合には、ValidatorChainを使います．
    public Validator getAaaValidator() {
        ValidatorChain chain = new ValidatorChain();
        chain.add(new TRequiredValidator());
        TLengthValidator validator = new TLengthValidator();
        if (...) {
            validator.setMinimum(3);
        } else {
            validator.setMinimum(5);
        }
        chain.add(validator);
        return chain;
    }
### ファイルアップロード #### web.xml ファイルアップロードを利用するには，`web.xml`に`MultipartFormDataFilter`を設定します．`MultipartFormDataFilter`の設定は，Seasar2の`EncodingFilter`と`S2ContainerFilter`の間に記述してください．
    <filter>
      <filter-name>multipartFilter</filter-name>
      <filter-class>
        org.seasar.teeda.extension.filter.MultipartFormDataFilter
      </filter-class>
      <init-param>
        <param-name>uploadMaxSize</param-name>
        <param-value>100m</param-value>
      </init-param>
      <init-param>
        <param-name>uploadMaxFileSize</param-name>
        <param-value>100m</param-value>
      </init-param>
      <init-param>
        <param-name>uploadThresholdSize</param-name>
        <param-value>100k</param-value>
      </init-param>
      <!-- OS固有の設定 -->
      <init-param>
        <param-name>uploadRepositoryPath</param-name>
        <param-value>C:/temp/</param-value>
      </init-param>
    </filter>
    <filter-mapping>
      <filter-name>multipartFilter</filter-name>
      <url-pattern>*.html</url-pattern>
    </filter-mapping>
`<filter>`要素では以下の初期化パラメータを設定します．
パラメータ | 説明
--- | ---
`uploadMaxSize` | アップロードすることのできるリクエスト全体の最大サイズです． 数値の後にk(キロ)，m(メガ)，g（ギガ）を指定することができます．
`uploadMaxFileSize` | アップロードすることのできるファイルの最大サイズです． 数値の後にk(キロ)，m(メガ)，g（ギガ）を指定することができます．
`uploadThresholdSize` | アップロードされたファイルをサーバ側のファイルシステムに保存するかしないかの閾値です．指定されたサイズより大きなファイルはサーバ側のファイルシステム上に保存されます． 数値の後にk(キロ)，m(メガ)，g（ギガ）を指定することができます．
`uploadRepositoryPath` | アップロードされたファイルを保存するディレクトリです．
#### portlet.xml(ポートレットを利用する場合のみ) ポートレット環境で利用する場合には，`portlet.xml`のポートレットの定義ににポートレット用の`MultipartFormDataFilter`を設定します．
    <portlet-app id="teeda-html-example" version="1.0">
      <portlet id="TeedaHtmlExample">
        <portlet-name>TeedaHtmlExample</portlet-name>
        <display-name>Teeda HTML Example</display-name>
        <description>This is an example portlet for Teeda.</description>
        <portlet-class>org.apache.portals.bridges.portletfilter.FilterPortlet</portlet-class>
        <init-param>
          <name>portlet-class</name>
          <value>org.seasar.teeda.core.portlet.FacesPortlet</value>
        </init-param>
        <init-param>
          <name>portlet-filters</name>
          <value>
            org.seasar.portlet.filter.S2PortletFilter,
            org.seasar.portlet.filter.HotdeployPortletFilter,
            org.seasar.teeda.extension.portlet.MultipartFormDataFilter
          </value><!-- 実際には空白や改行を入れずに記述する -->
        </init-param>
        <init-param>
          <name>org.seasar.teeda.extension.portlet.MultipartFormDataFilter:encoding</name>
          <value>UTF-8</value>
        </init-param>
        <init-param>
          <name>org.seasar.teeda.extension.portlet.MultipartFormDataFilter:uploadMaxSize</name>
          <value>100m</value>
        </init-param>
        <init-param>
          <name>org.seasar.teeda.extension.portlet.MultipartFormDataFilter:uploadMaxFileSize</name>
          <value>100m</value>
        </init-param>
        <init-param>
          <name>org.seasar.teeda.extension.portlet.MultipartFormDataFilter:uploadThresholdSize</name>
          <value>100k</value>
        </init-param>
        <!-- OS固有の設定 -->
        <init-param>
          <name>org.seasar.teeda.extension.portlet.MultipartFormDataFilter:uploadRepositoryPath</name>
          <value>C:/temp/</value>
        </init-param>
ポートレット環境では，`web.xml`で指定した値ではなく，`portlet.xml`で指定した値が有効になります． #### テンプレートHTML `<form>`要素に`enctype="multipart/form-data"`を指定します．
    <form id="form" enctype="multipart/form-data">
通常のXHTMLと同じように`<input type="file">`要素を記述し，id属性を付与します．
    <input type="file" id="uploadedFile" />
#### ページクラス ページクラスには，次の型のプロパティを定義します．プロパティ名はテンプレートHTMLのid属性値と一致させます． `org.seasar.teeda.extension.util.UploadedFile`
    public UploadedFile uploadedFile;
#### `UploadedFile` UploadedFileクラスには以下のメソッドがあります． `String getName()` アップロードされたファイルのクライアント側ファイルシステム上のベースファイル名を返します． 返されるベースファイル名にパスは含まれません． `String getOriginalName()` アップロードされたファイルのクライアント側ファイルシステム上のファイル名を返します． ブラウザによっては，返されるファイル名にはパスが含まれる場合があります． `String getContentType()` アップロードされたファイルのコンテントタイプを返します． `long getSize()` アップロードされたファイルのサイズを返します． `boolean isInMemory()` アップロードされたファイルがメモリ上にある場合は`true`を返します． `byte[] get()` アップロードされたファイルの内容を含むバイト配列を返します． `String getString()` アップロードされたファイルの内容を文字列として返します． アップロードされたファイルのコンテントタイプにエンコーディングが含まれていればそれが使われます．コンテントタイプにエンコーディングが含まれていない場合はISO-8859-1が使われます． `String getString(String encoding) throws UnsupportedEncodingException` アップロードされたファイルの内容を指定のエンコーディングによる文字列として返します． `InputStream getInputStream() throws IOException` アップロードされたファイルの内容を読み込むための入力ストリームを返します． 返された入力ストリームは呼び出し側でクローズする必要があります． `void write(File file) throws Exception` アップロードされたファイルの内容を指定のファイルに書き込みます． `File getStoreLocation()` アップロードされたファイルを保存したサーバ側ファイルシステム上の`File`を返します． `isInMemory()`が`true`の場合， このメソッドは`null`を返します． `void delete()` アップロードされたファイルがサーバ側のファイルシステムに保存されている場合、それを削除します． #### コンバータ コンバータを使用するとプロパティの型を`UploadedFile`以外の型にすることができます．
コンバータ | プロパティの型 | 説明
--- | --- | ---
`TUploadedFileBytesConverter` | `byte[]` | アップロードされたファイルの内容をバイト列に変換します．
`TUploadedFileStringConverter` | `String` | アップロードされたファイルの内容を文字列に変換します． encoding属性でエンコーディングを指定することもできます．省略するとアップロードされたファイルのコンテントタイプにエンコーディングが含まれていればそれが使われます．コンテントタイプにエンコーディングが含まれていない場合はISO-8859-1が使われます．
`TUploadedFileInputStreamConverter` | `java.io.InputStream` | アップロードされたファイルの内容を読み込むための入力ストリームに変換します． 返された入力ストリームは呼び出し側でクローズする必要があります．
`TUploadedFileFileConverter` | `java.io.File` | アップロードされたファイルを保存したサーバ側ファイルシステム上の`File`に変換します． アップロードされたファイルがサーバ側ファイルシステム上に保存されていない場合、プロパティは`null`に設定されます．
| Copyright© 2005-2006, The Seasar Foundation and the others. All rights reserved.