<?xml version="1.0" encoding="UTF-8"?>
<!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" lang="en" xml:lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <title>レスポンス</title>
    <link rel="stylesheet" href="/css/style.css" type="text/css" media="all" />
    
    
  </head>
  <body>
    <div class="header">
      <div id="pane.left-header" class="pane left">
        <div id="org.seasar.kvasir.cms.toolbox.customPop-2" class="pop org.seasar.kvasir.cms.toolbox.customPop">
          <div class="body"><div class="wiki">
<ul>
<li><a href="/" class="pageNotFound">（サイトトップ）</a></li>
<li><a href="/download">ダウンロード</a></li>
<li><a href="/news/" class="pageNotFound">新着情報</a></li>
<li><a href="/docs/" class="pageNotFound">ドキュメント</a></li>
</ul>
</div>
</div>
        </div>
      </div>
      <div id="pane.right-header" class="pane right">
        <div id="org.seasar.kvasir.cms.toolbox.loginPop-1" class="pop org.seasar.kvasir.cms.toolbox.loginPop">
          <div class="body">
<form method="post" action="/plugins/toolbox/login.do/docs/1.0.x/ref/response">
    <div class="row">
      <span class="label">Name</span>
      <span class="textinput"><input type="text" name="name" size="12" value="" /></span>
    </div>
    <div class="row">
      <span class="label">Password</span>
      <span class="textinput"><input type="password" name="password" size="12" value="" /></span>
    </div>
    <div class="row">
      <span class="submit"><input type="submit" value="Login" /></span>
    </div>
</form>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.loginUserPop-1" class="pop org.seasar.kvasir.cms.pop.loginUserPop">
          <div class="body"></div>
        </div>
      </div>
    </div>
    <div class="page-frame">
      <div id="pane.left-sidebar" class="pane sidebar-frame sidebar subcontent">
        <div id="org.seasar.kvasir.cms.toolbox.searchPop-1" class="pop org.seasar.kvasir.cms.toolbox.searchPop">
          <h2 class="title">Search</h2>
          <div class="body"><form class="simple" method="get" action="/plugins/toolbox/search.do">
  <input type="text" name="query" size="12" />
  <input type="submit" value="Go!" />
</form>
</div>
        </div><div id="org.seasar.kvasir.cms.toolbox.customPop-1" class="pop org.seasar.kvasir.cms.toolbox.customPop">
          <h2 class="title">メニュー</h2>
          <div class="body"><ul>
  <li><a href="/" class="pageNotFound">（サイトトップ）</a></li>
  <li><a href="/download">ダウンロード</a></li>
  <li><a href="/news">新着情報</a></li>
  
    
    
      <li>
        <a href="/docs/1.0.x/user">ユーザマニュアル</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/user/description">Ymirとは</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/processFlow">Ymirの処理フロー</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/projectStatus">動作ステータス</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/generator">自動生成機能</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/vili">Eclipseプラグイン「Vili（ヴィリ）」</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/ve">Eclipseプラグイン「Ve（ヴェー）」</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/setUp">セットアップ</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/skeleton">空のアプリケーション</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/example">サンプルアプリケーションの作成</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/development">開発における注意点</a>
            
          </li><li>
            <a href="/docs/1.0.x/user/faq">FAQ</a>
            
          </li>
        </ul>
      </li><li>
        <a href="/docs/1.0.x/ref">リファレンスマニュアル</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/ref/pageClass">Pageクラス</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/pathMapping">リクエストパスとPageクラスのマッピング</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/response">レスポンス</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/fileupload">ファイルアップロード</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/typeConversion">型の自動変換</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/zptTemplate">ZPTテンプレート</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/constraintCheck">制約チェック</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/validation">バリデーション</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/transactionToken">トランザクショントークン</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/permissionCheck">権限チェック</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/objectScope">オブジェクトスコープ</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/i18n">国際化</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/exceptionHandler">例外処理</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/include">インクルード</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/conversation">カンバセーション</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/appProperties">アプリケーションの設定</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/dicon">diconファイルの扱い</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/standardArchitecture">アプリケーションアーキテクチャ標準</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/ymirJson">JSON連携</a>
            
          </li><li>
            <a href="/docs/1.0.x/ref/batch">バッチプログラムの作成</a>
            
          </li>
        </ul>
      </li><li>
        <a href="/docs/1.0.x/dev">Ymir開発者マニュアル</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/dev/build">Ymirのビルド</a>
            
          </li><li>
            <a href="/docs/1.0.x/dev/release">Ymirのリリース</a>
            
          </li><li>
            <a href="/docs/1.0.x/dev/update-ymir-fragment-dbflute">DBFluteフラグメントの更新</a>
            
          </li>
        </ul>
      </li><li>
        <a href="/docs/1.0.x/etc">その他</a>
        
      </li><li>
        <a href="/docs/1.0.x/glossary">用語集</a>
        <ul>
          <li>
            <a href="/docs/1.0.x/glossary/Vili">Vili</a>
            
          </li><li>
            <a href="/docs/1.0.x/glossary/ve">Ve</a>
            
          </li>
        </ul>
      </li>
    
  
  <li><a href="/roadmap">ロードマップ</a></li>
  <li><a href="https://www.seasar.org/issues/browse/YMIR">既知の不具合を閲覧する・不具合を報告する</a></li>
  <li><a href="https://www.seasar.org/svn/ymir/">SVNリポジトリ</a></li>
  <li><a href="http://svn.seasar.org/browse/?root=ymir">SVNリポジトリを閲覧</a></li>
</ul>
</div>
        </div>
      </div>
      <div id="pane.main" class="pane main">
      
        <div id="org.seasar.kvasir.cms.toolbox.breadcrumbsPop-1" class="pop org.seasar.kvasir.cms.toolbox.breadcrumbsPop">
          
          <div class="body"><ul>
  <li class="first"><a href="/">(TOP)</a></li><li><a href="/docs">ドキュメント</a></li><li><a href="/docs/1.0.x">ドキュメント（1.0.x系）</a></li><li><a href="/docs/1.0.x/ref">リファレンスマニュアル</a></li><li>レスポンス</li>
</ul>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.contentPop-1" class="pop org.seasar.kvasir.cms.pop.contentPop">
          <h2 class="title">レスポンス</h2>
          <div class="body">
<ul class="information">
  
  <li>2009-05-10 23:38:03</li>
</ul>
<div class="content"><div class="document">
<p>Pageコンポーネントのアクション呼び出しの後にどのようなHTTPレスポンスがクライアントに返されるかは、アクションの返り値によって決定されます。</p>
<p>具体的には、アクションの返り値型に対応したResponseConstructorのconstructResponseメソッドを呼び出して得られるのResponseオブジェクトからHTTPレスポンスが構築されます。</p>
<div class="section" id="responsee382aae38396e382b8e382a7e382afe38388">
<h3><a name="responsee382aae38396e382b8e382a7e382afe38388">Responseオブジェクト</a></h3>
<p>Responseオブジェクトは、HTTPレスポンスを抽象化したオブジェクトです。</p>
<p>Responseオブジェクトはタイプを持っています。タイプは以下のいずれかです。</p>
<dl class="docutils">
<dt>PASSTHROUGH</dt>
<dd>Ymirは何もせず、次のサーブレットフィルタチェインに処理を委譲する</dd>
<dt>FORWARD</dt>
<dd>Responseオブジェクトが指すパスに処理をフォワードする</dd>
<dt>REDIRECT</dt>
<dd>Responseオブジェクトが指すパスに処理をリダイレクトする</dd>
<dt>SELF_CONTAINED</dt>
<dd>Responseオブジェクトが持つStringまたはInputStreamの内容をそのままレスポンスとして出力する</dd>
<dt>VOID</dt>
<dd>何もしない（次のサーブレットフィルタチェインにも処理を委譲しない）</dd>
</dl>
</div>
<div class="section" id="responseconstructor">
<h3><a name="responseconstructor">ResponseConstructor</a></h3>
<p>ResponseConstructorは、Pageコンポーネントとアクションの返り値からResponseオブジェクトを構築するためのオブジェクトで、アクションの返り値型に関連付けられています。</p>
<p>Pageコンポーネントのアクション呼び出しの後、Ymirはアクションの返り値型に対応したResponseConstructorのconstructResponseメソッドを呼び出してResponseオブジェクトを構築します。</p>
<p>例えばPageコンポーネントの<tt class="docutils literal"><span class="pre">_post</span></tt>メソッドの返り値型がjava.lang.Objectで実際の返り値が&quot;/path/to/page&quot;という文字列である場合、Ymirはjava.lang.Objectに関連付けられているResponseConstructorを検索し、constructResponseメソッドを呼び出します。</p>
<p>Ymirにはデフォルトで以下のResponseConstructorが登録されています。</p>
<table border="1" class="docutils">
<colgroup>
<col width="44%" />
<col width="56%" />
</colgroup>
<thead valign="bottom">
<tr>
<th>返り値型</th>
<th>ResponseConstructor</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>java.io.InputStream</td>
<td>InputStreamResponseConstructor</td>
</tr>
<tr>
<td>java.lang.Object</td>
<td>ObjectResponseConstructor</td>
</tr>
<tr>
<td>org.seasar.ymir.Path</td>
<td>PathResponseConstructor</td>
</tr>
<tr>
<td>org.seasar.ymir.Response</td>
<td>ResponseResponseConstructor</td>
</tr>
<tr>
<td>java.lang.String</td>
<td>StringResponseConstructor</td>
</tr>
<tr>
<td>void</td>
<td>VoidResponseConstructor</td>
</tr>
</tbody>
</table>
<dl class="docutils">
<dt>InputStreamResponseConstructor</dt>
<dd>
<p>アクションの返り値であるInputStreamがそのままHTTPレスポンスとして出力されます。</p>
<p>返り値がnullである場合は何も出力されません。</p>
</dd>
<dt>ObjectResponseConstructor</dt>
<dd>
<p>返り値の実際の型からResponseConstructorが検索され、見つかったものを使ってHTTPレスポンスが構築されます。例えばアクションの返り値型がObjectで実際の返り値がStringの場合はStringResponseConstructorを使ってレスポンスが構築されます。</p>
<p>返り値の実際の型CからResponseConstructorを検索する手順は以下のとおりです。</p>
<ol>
<li>Cに対応するものがあればそれを使う</li>
<li>なければ、Cのスーパークラスに対応するものがあればそれを使う</li>
<li>Cのどのスーパークラスに対応するものもなければ、Cが実装するインタフェースIに対応するものがあればそれを使う。なければ、Iのスーパーインタフェースに対応するものがあればそれを使う</li>
<li>Cが実装するどのインタフェースに対応するものもなければ、Cのスーパークラスが実装するインタフェースI'に対応するものがあればそれを使う。なければ、I'のスーパーインタフェースに対応するものがあればそれを使う</li>
<li>なければ、Stringに関連付けられたものを使う。この時は、返り値についてtoString()を呼び出した結果を返り値とみなしてconstructResponseの呼び出しを行なう</li>
</ol>
</dd>
<dt>PathResponseConstructor</dt>
<dd>
<p>アクションの返り値であるPathオブジェクトが指す先にリダイレクトします。</p>
<p>返り値がnullである場合は何も出力されません。</p>
</dd>
<dt>ResponseResponseConstructor</dt>
<dd>
<p>アクションの返り値であるResponseオブジェクトをそのまま使ってHTTPレスポンスが構築されます。</p>
<p>返り値がnullである場合は何も出力されません。</p>
</dd>
<dt>StringResponseConstructor</dt>
<dd>
<p>アクションの返り値である文字列の内容に従ってHTTPレスポンスが構築されます。処理の詳細は「<a class="reference" href="#e8bf94e3828ae580a4e3818ce69687e5ad97e58897e381aee5a0b4e59088e381aee587a6e79086">返り値が文字列の場合の処理</a>」を参照して下さい。</p>
<p>返り値がnullである場合は何も出力されません。</p>
</dd>
<dt>VoidResponseConstructor</dt>
<dd>
<p>レスポンスの構築処理は次のサーブレットフィルタチェインに委譲されます。</p>
<p><em>[Ymir-1.0.3以降]</em> ただしHttpServletResponse#isCommitted()がtrueの場合は何もしません。</p>
</dd>
</dl>
<div class="section" id="e8bf94e3828ae580a4e3818ce69687e5ad97e58897e381aee5a0b4e59088e381aee587a6e79086">
<h4><a name="e8bf94e3828ae580a4e3818ce69687e5ad97e58897e381aee5a0b4e59088e381aee587a6e79086">返り値が文字列の場合の処理</a></h4>
<p>アクションの返り値が文字列である場合、レスポンスの構築にはStringResponseConstructorが使われます。</p>
<p>StringResponseConstructorでは、まず返り値の文字列を最初に見つかった「<tt class="docutils literal"><span class="pre">:</span></tt>」の前後で分割します。前者を「スキーム」、後者を「パス」と呼びます。レスポンスはスキームに関連付けられたStrategyに従って構築されます。文字列が<tt class="docutils literal"><span class="pre">:</span></tt>を含まない場合は、スキームは「forward」、パスは文字列全体であるとみなされます。スキームの種類と構築されるレスポンスの詳細は以下のとおりです。</p>
<dl class="docutils">
<dt>forward</dt>
<dd>パスがフォワード先のコンテキスト相対パスとみなされ、フォワード処理が行なわれます。</dd>
<dt>passthrough</dt>
<dd>レスポンスの構築処理は次のサーブレットフィルタチェインに委譲されます。パスは無視されます。</dd>
<dt>redirect</dt>
<dd>
<p>パスがリダイレクト先のパスとみなされ、リダイレクト処理が行なわれます。</p>
<p>「<tt class="docutils literal"><span class="pre">/</span></tt>」で始まるパスはコンテキスト相対パスとみなされます。パスからリクエストパラメータ等を除いた部分が空文字列である場合もコンテキスト相対パスとみなされます。</p>
<p>パスからリクエストパラメータ等を除いた部分が「<tt class="docutils literal"><span class="pre">.</span></tt>」である場合は現在リクエストされているパス自身とみなされます。</p>
<p>それ以外はそのままURLとみなされます。</p>
<p>app.propertiesのcore.response.strategy.richPathExpressionAvailableプロパティがtrueであるかこのプロパティの指定がない場合、以下の拡張表現が有効になります。</p>
<ul>
<li>パスの末尾に「<tt class="docutils literal"><span class="pre">(a,b)</span></tt>」のように記述すると、Pageコンポーネントのプロパティaとbの値がリクエストパラメータとして連結されます。例えばプロパティaの値が&quot;A&quot;でプロパティbの値が&quot;B&quot;である場合、<tt class="docutils literal"><span class="pre">/path/to/page(a,b)</span></tt>の実際のパスは<tt class="docutils literal"><span class="pre">/path/to/page?a=A&amp;b=B</span></tt>となります。</li>
<li>リクエストパラメータの部分を「<tt class="docutils literal"><span class="pre">?a=${a}&amp;b=${b}」のように記述すると、</span></tt>${...}``の部分がPageコンポーネントのプロパティの値で置換されます。例えばプロパティaの値が&quot;A&quot;でプロパティbの値が&quot;B&quot;である場合、<tt class="docutils literal"><span class="pre">/path/to/page?a=${a}&amp;b=${b}</span></tt>の実際のパスは<tt class="docutils literal"><span class="pre">/path/to/page?a=A&amp;b=B</span></tt>となります。</li>
<li>リクエストパラメータの部分を「<tt class="docutils literal"><span class="pre">?a&amp;b」のように値をつけずに記述すると、Pageコンポーネントのプロパティの値が埋め込まれます。例えばプロパティaの値が&quot;A&quot;でプロパティbの値が&quot;B&quot;である場合、</span></tt>/path/to/page?a&amp;b``の実際のパスは<tt class="docutils literal"><span class="pre">/path/to/page?a=A&amp;b=B</span></tt>となります。</li>
</ul>
</dd>
<dt>proceed</dt>
<dd>redirectと基本的には同じですが、内部的にはフォワード処理が行なわれます。通常のフォワード処理との違いは、フォワード前のリクエストパラメータがフォワード先に引き継がれないことです。例えば /aaa.html?a=1 というパスの処理の後にproceedによって /bbb.html?b=1 に遷移した場合、BbbPageクラスにはリクエストパラメータとしてbだけが渡され、aは渡されません（ただし、直接HttpServletRequestからリクエストパラメータを取得するとaが取得できます）。また、フォワード後のHTTPメソッドはフォワード前のHTTPメソッドによらずGETと見なされます（ただし、直接HttpServletRequestからHTTPメソッドを取得するとフォワード前のHTTPメソッドが取得できます）。このため、基本的にはリダイレクトの置き換えとして使用することができます。携帯アプリケーションを作成する場合など、Post Redirect Getパターンは使いたいがリダイレクトは極力しないようにしたい場合にはredirectの代わりにproceedを使うと良いでしょう。</dd>
<dt>resource</dt>
<dd>
<p>パスがリソースパスとみなされ、コンテキストクラスローダからリソースが取得されてバイナリデータとして返されます。</p>
<p>リソースのコンテントタイプは、web.xmlに定義されているmime-typeのうちパス名の拡張子に対応するエントリから決定されてレスポンスヘッダに設定されます。なお、コンテントタイプがtextである場合は<tt class="docutils literal"><span class="pre">charset=UTF-8</span></tt>が自動的に付与されますので、テキストリソースの文字エンコーディングはUTF-8である必要があります。</p>
</dd>
<dt>content</dt>
<dd>
<p>パスがコンテンツ文字列とみなされ、そのままレスポンスとして返されます。</p>
<p>コンテントタイプは、デフォルトでは<tt class="docutils literal"><span class="pre">text/html; charset=UTF-8</span></tt>になります。コンテントタイプを明示的に指定したい場合は、コンテンツ文字列の先頭に「:」区切りで指定して下さい。</p>
<p>例:</p>
<pre class="literal-block">
content:text/plain; charset=UTF-8:こんにちは！
</pre>
<p>このように、「:」がコンテントタイプを指定するための区切り文字と認識されますので、誤認識を避けるために、コンテンツ文字列に「:」が含まれるかもしれない場合は明示的にコンテントタイプを指定するようにして下さい。</p>
</dd>
</dl>
</div>
</div>
</div>
</div>
</div>
        </div>
      
    </div>
    </div>
    <div class="footer-delimiter"></div>
    <div id="pane.footer" class="pane footer">
      <div id="org.seasar.kvasir.cms.pop.poweredByPop-1" class="pop org.seasar.kvasir.cms.pop.poweredByPop">
        <div class="body">Powered by Kvasir/Sora</div>
      </div>
    </div>
  </body>
</html>
