## レスポンス

レスポンスにはHTMLページ、データ、フォワード、リダイレクトがあります。

### HTMLページ

テンプレートのHTMLファイルをビュークラス内で変化させてクライアントに返します。featではJSPなどを使わず、HTMLをパースしたドキュメントツリーをJavaコードから直接操作します。

    <view name="message" class="hello.MessageView" />
    <page name="hello" template="simple.html" view="message(message, こんにちは)" />

#### テンプレート

テンプレートはごく普通のHTMLファイルです。プログラムから操作するための目印として要素にid属性を付けておくと便利ですが、必須ではありません。ビュークラスはidやXPathでHTMLの要素を検索して新しい要素を追加したりテキストを書き換えたりできます。

#### ビュークラス

ビューはページに含まれるコンポーネントで、HTMLテンプレートに中にデータを表現します。Viewクラスを継承する必要があります。

    public class MessageView extends View {

        public HTMLTagNode format(HTMLTagNode template, String[] params, ContextAccessor acc) {
            // パラメータが２つ以上あったらタイトルとメッセージを変更する
            if ( params.length >= 2 ) {
    	        template.findTag("/html/head/title").setText(params[1]);
    	        template.findTagById(params[0]).setText(params[1]);
            }
            return template;
        }

    }

formatメソッドのパラメータparamsはpage要素のview属性で指定されたパラメータが渡されます。ビュークラスは設定ファイルからのパラメータ、セッションやレスポンスオブジェクトの属性を使ってテンプレートをフォーマットします。

上記の例のsimple.htmlは下のように変化します。

テンプレート | 出力
--- | ---
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>

    <head>
    <meta http-equiv="Content-Type"
          content="text/html;charset=Windows-31J">
    <title>タイトル</title>
    </head>

    <body>

    <div id="errorlist"><!-- ここにエラーを表示 --></div>

    <div id="message">
    </div>

    </body>

    </html>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
    <html>

    <head>
    <meta http-equiv="Content-Type"
          content="text/html;charset=Windows-31J">
    <title>こんにちは</title>
    </head>

    <body>

    <div id="errorlist"><!-- ここにエラーを表示 --></div>

    <div id="message">こんにちは</div>

    </body>

    </html>

### データ

HTML以外の形式のレスポンスはデータクラスで出力します。データクラスはResponseインタフェースを実装する必要があります。outputメソッドでContextAccessorからHttpServletResponseオブジェクトを取得してOutputStreamに内容を出力します。画像やXMLなどストリームに出力できるデータなら何でもレスポンスとして返すことができます。

### フォワード

リクエストをフォワードします。

### リダイレクト

クライアントにリダイレクトを返します。

$Id: response.html 220 2007-07-16 10:32:15Z sugimotokenichi $