<?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>リクエストパスとPageクラスのマッピング</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/pathMapping">
    <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>リクエストパスとPageクラスのマッピング</li>
</ul>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.contentPop-1" class="pop org.seasar.kvasir.cms.pop.contentPop">
          <h2 class="title">リクエストパスとPageクラスのマッピング</h2>
          <div class="body">
<ul class="information">
  
  <li>2008-10-21 15:42:01</li>
</ul>
<div class="content"><div class="document">
<p>Ymirではリクエストされたパスの正規表現パターンと処理コンポーネント（Javaクラス）名の対応（パスマッピング）が定義されており、リクエストパスについてパターンにマッチするようなパスマッピングからコンポーネント名やアクション名が組み立てられて処理メソッドの呼び出しが行なわれます。</p>
<div class="section" id="e6a899e6ba96e381aee38391e382b9e3839ee38383e38394e383b3e382b0">
<h3><a name="e6a899e6ba96e381aee38391e382b9e3839ee38383e38394e383b3e382b0">標準のパスマッピング</a></h3>
<p>標準のパスマッピングはmapping.diconで次のように定義されています。</p>
<table border="1" class="docutils">
<colgroup>
<col width="65%" />
<col width="35%" />
</colgroup>
<thead valign="bottom">
<tr>
<th>パターン</th>
<th>Pageコンポーネント名テンプレート</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>（空文字列）</td>
<td>_RootPage</td>
</tr>
<tr>
<td><tt class="docutils literal"><span class="pre">/([a-zA-Z][a-zA-Z0-9]*)\\.html</span></tt></td>
<td>${1}Page</td>
</tr>
<tr>
<td><tt class="docutils literal"><span class="pre">/([a-zA-Z][a-zA-Z0-9]*)</span></tt></td>
<td>${1}__RootPage</td>
</tr>
<tr>
<td><tt class="docutils literal"><span class="pre">/([a-zA-Z][a-zA-Z0-9]*)/([a-zA-Z][a-zA-Z0-9]*).html</span></tt></td>
<td>${1}_${2}Page</td>
</tr>
</tbody>
</table>
<p>「パターン」は、リクエストパス（コンテキストパス相対）の正規表現です（パターンのマッチングはYmir-0.9.xではパスの一部に対して行なわれていましたが、Ymir-1.0.xではパス全体に対して行なわれますのでパターンの前後に「<tt class="docutils literal"><span class="pre">^</span></tt>」「<tt class="docutils literal"><span class="pre">$</span></tt>」は不要です）。マッチングの際には末尾の「<tt class="docutils literal"><span class="pre">/</span></tt>」は無視されます。</p>
<p>例えば空文字列や「<tt class="docutils literal"><span class="pre">/</span></tt>」は1番目のパターンにマッチします。「<tt class="docutils literal"><span class="pre">/path.html</span></tt>」は2番目のパターンにマッチします。「<tt class="docutils literal"><span class="pre">/path</span></tt>」「<tt class="docutils literal"><span class="pre">/path/</span></tt>」は3番目のパターンにマッチします。「<tt class="docutils literal"><span class="pre">/path/sub.html</span></tt>」は4番目のパターンにマッチします。</p>
<p>指定できる正規表現パターンについては<a class="reference" href="http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/regex/Pattern.html">J2SEリファレンス</a>を参照して下さい。</p>
<p>「Pageコンポーネント名テンプレート」は、処理メソッドを持つPageコンポーネントの名前を構築するためのテンプレートです。テンプレートには${...}形式で変数の値を埋め込むことができます。</p>
<table border="1" class="docutils">
<colgroup>
<col width="10%" />
<col width="90%" />
</colgroup>
<thead valign="bottom">
<tr>
<th>変数</th>
<th>意味</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>${数値}</td>
<td>パス文字列のうちパターン中で括弧で囲われている部分にマッチした部分の数値番目のもの</td>
</tr>
<tr>
<td>${数値u}</td>
<td>${数値}を全て大文字にしたもの</td>
</tr>
<tr>
<td>${数値l}</td>
<td>${数値}を全て小文字にしたもの</td>
</tr>
<tr>
<td><tt class="docutils literal"><span class="pre">${`}</span></tt></td>
<td>パス文字列のうちパターンにマッチした部分よりも前の部分</td>
</tr>
<tr>
<td><tt class="docutils literal"><span class="pre">${&amp;}</span></tt></td>
<td>パス文字列のうちパターンにマッチした部分</td>
</tr>
<tr>
<td><tt class="docutils literal"><span class="pre">${'}</span></tt></td>
<td>パス文字列のうちパターンにマッチした部分よりも後ろの部分</td>
</tr>
<tr>
<td>${method}</td>
<td>HTTPメソッド名（全て小文字）</td>
</tr>
<tr>
<td>${Method}</td>
<td>HTTPメソッド名（先頭だけ大文字）</td>
</tr>
<tr>
<td>${METHOD}</td>
<td>HTTPメソッド名（全て大文字）</td>
</tr>
</tbody>
</table>
<p>例えばリクエストパスが「<tt class="docutils literal"><span class="pre">/path.html</span></tt>」である場合は実際のコンポーネント名は「<tt class="docutils literal"><span class="pre">pathPage</span></tt>」となり、Ymirはこの名前を持つコンポーネントをS2Containerから取り出してメソッド呼び出しを行ないます。</p>
<p>PageコンポーネントはS2Containerによって自動登録されます。例えばアプリケーションのルートパッケージ名が<tt class="docutils literal"><span class="pre">com.example.app</span></tt>である場合は<tt class="docutils literal"><span class="pre">com.example.app.web.XyzPage</span></tt>というクラスのインスタンスが<tt class="docutils literal"><span class="pre">xyzPage</span></tt>という名前でコンポーネント登録されます。従って、<tt class="docutils literal"><span class="pre">pathPage</span></tt>コンポーネントであれば<tt class="docutils literal"><span class="pre">com.example.app.web.PathPage</span></tt>クラスということになります。</p>
<p>リクエストパスが空文字列や「<tt class="docutils literal"><span class="pre">/</span></tt>」の場合はコンポーネント名は「<tt class="docutils literal"><span class="pre">_RootPage</span></tt>」で、この名前は<tt class="docutils literal"><span class="pre">com.example.app._RootPage</span></tt>と対応します。</p>
<p>リクエストパスが「<tt class="docutils literal"><span class="pre">/path</span></tt>」「<tt class="docutils literal"><span class="pre">/path/</span></tt>」の場合はコンポーネント名は「<tt class="docutils literal"><span class="pre">path__RootPage」で、この名前は</span></tt>com.example.app.path._RootPage``と対応します。</p>
<p>リクエストパスが「<tt class="docutils literal"><span class="pre">/path/sub.html</span></tt>」の場合はコンポーネント名は「<tt class="docutils literal"><span class="pre">path_subPage」で、この名前は</span></tt>com.example.app.path.SubPage``と対応します。</p>
</div>
<div class="section" id="e38391e382b9e3839ee38383e38394e383b3e382b0e381aee5a489e69bb4">
<h3><a name="e38391e382b9e3839ee38383e38394e383b3e382b0e381aee5a489e69bb4">パスマッピングの変更</a></h3>
<p>パスマッピングを変更するには、アプリケーションプロジェクトのsrc/main/resourcesにmapping+.diconというファイルを作成してパスマッピング定義を記述して下さい。mapping+.diconは標準のmapping.diconよりも優先して使用されます。</p>
<p>diconファイルの中でパスマッピングを定義するための標準クラスである<tt class="docutils literal"><span class="pre">org.seasar.ymir.impl.YmirPathMappingImpl</span></tt>のコンストラクタでは、パターンとPageコンポーネント名テンプレート以外に「直接アクセスの禁止」「アクション名テンプレート」「pathInfoテンプレート」「パラメータテンプレート」「デフォルト返り値テンプレート」を指定することもできます。</p>
<p>「直接アクセスの禁止」とは、直接のリクエストを禁止するかどうかです。例えばあるPageからforwardによって遷移するテンプレートは外部から直接アクセスされたくないかもしれません。その場合は「直接アクセスの禁止」をtrueにして下さい。デフォルトは「<tt class="docutils literal"><span class="pre">false</span></tt>」です。</p>
<p>「アクション名テンプレート」は、呼び出すメソッド（アクション）の名前を構築するためのテンプレートです。例えばリクエストパスが「/path.html」でPOSTメソッドでリクエストがあった場合は実際のアクション名は「_post」となり、YmirはpathPageコンポーネントの_postメソッドの呼び出しを行ないます。デフォルトは「<tt class="docutils literal"><span class="pre">${method}</span></tt>」です。</p>
<p>「pathInfoテンプレート」は、リクエストパスの一部をpathInfo情報として取り出すためのテンプレートです。詳しくは後述します。デフォルトは「<tt class="docutils literal"><span class="pre">null</span></tt>」です。</p>
<p>「パラメータテンプレート」は、パスからパラメータを取り出すためのルールです。詳しくは後述します。デフォルトは「<tt class="docutils literal"><span class="pre">null</span></tt>」です。</p>
<p>「デフォルト返り値テンプレート」は、アクションの返り値から構築したレスポンスオブジェクトのタイプがPASSTHROUGHであった場合に返り値として使われる文字列のテンプレートです。具体的には、このテンプレートから構築された文字列がアクションの返り値であるとみなされます。例えばリクエストパスが「/path/sub.html」でアクションの返り値がPASSTHROUGHタイプのレスポンスであった場合、&quot;redirect:/path.html&quot;が返り値とみなされます。なおデフォルトの返り値がnullである場合はそのままPASSTHROUGHがレスポンスとして使われます。デフォルトは「<tt class="docutils literal"><span class="pre">null</span></tt>」です。</p>
</div>
<div class="section" id="pathinfo">
<h3><a name="pathinfo">pathInfo</a></h3>
<p>パスマッピングのpathInfoTemplateプロパティにpathInfoテンプレートを指定することで、パスの一部をpathInfo情報として取り出すことができます。</p>
<p>pathInfoテンプレートは他のテンプレートと同様、<tt class="docutils literal"><span class="pre">${...}</span></tt>形式の変数が埋め込まれた文字列です。例えばパスのパターンとして「<tt class="docutils literal"><span class="pre">/([^/]+).*</span></tt>」、pathInfoテンプレートとして「<tt class="docutils literal"><span class="pre">${'}</span></tt>」が指定されているケースで、リクエストパスが「/download/file.pdf」である場合、pathInfoは「file.pdf」となります。</p>
<p>pathInfo情報はRequestオブジェクトから取り出した<tt class="docutils literal"><span class="pre">org.seasar.ymir.Dispatch</span></tt>オブジェクトから<tt class="docutils literal"><span class="pre">Dispatch#getPathInfo()</span></tt>で取り出すことができます。</p>
</div>
<div class="section" id="e38391e382b9e3818be38289e381aee38391e383a9e383a1e383bce382bfe381aee58f96e3828ae587bae38197">
<h3><a name="e38391e382b9e3818be38289e381aee38391e383a9e383a1e383bce382bfe381aee58f96e3828ae587bae38197">パスからのパラメータの取り出し</a></h3>
<p>パスマッピングにパラメータテンプレートを指定することで、パス中の任意の部分文字列をパラメータとして取り出すことができます。このパラメータをURIパラメータと呼びます。</p>
<p>パラメータテンプレートは「<tt class="docutils literal"><span class="pre">パラメータ名=${...}</span></tt>」形式の文字列です。パラメータ名を複数並べる場合は「<tt class="docutils literal"><span class="pre">;</span></tt>」で区切ります。同名のパラメータ名を並べることもできます。その場合はパラメータの値が複数になります。</p>
<p>例えばパスのパターンとして「<tt class="docutils literal"><span class="pre">^/article/([^/]+)/([^/]+).html</span></tt>」、パラメータテンプレートとして「<tt class="docutils literal"><span class="pre">category=${1};id=${2}</span></tt>」が指定されているケースで、リクエストパスが「/article/computer/15.html」である場合、パラメータ「category」の値として「computer」、「id」の値として「15」が取り出されます。</p>
<p>URIパラメータは通常のリクエストパラメータとマージされてRequestオブジェクトにセットされます。従って、例えば/index.html?param=aaaというパスにアクセスした場合でURIパラメータとしてparam=bbbが取り出された場合、Request#getParameterValues(&quot;param&quot;)の返り値は&quot;aaa&quot;と&quot;bbb&quot;になります（順序は不定です）。</p>
<p>URIパラメータはリクエストパラメータとマージされますので、リクエストパラメータと同様Pageオブジェクトに自動的にインジェクトされます。</p>
</div>
<div class="section" id="e3839ce382bfe383b3e381a8e382a2e382afe382b7e383a7e383b3e381aee996a2e980a3e4bb98e38191">
<h3><a name="e3839ce382bfe383b3e381a8e382a2e382afe382b7e383a7e383b3e381aee996a2e980a3e4bb98e38191">ボタンとアクションの関連付け</a></h3>
<p>複数submitボタンを持つようなフォームで、押されたボタン毎に呼び出すアクションを変えたい場合があります。そういうケースをうまく扱えるように、標準のマッピングではアクション名の末尾に「<tt class="docutils literal"><span class="pre">_</span></tt>」＋「ボタン名」をつけた名前のメソッドが存在する場合はそのメソッドが呼び出されるようになっています。該当するボタンが複数ある場合はフレームワークが最初に発見した方が呼び出されます。</p>
<p>ボタンが押された際にパラメータを渡すこともできます。例えばPOSTリクエストでボタン名を「<tt class="docutils literal"><span class="pre">search[1][cond]</span></tt>」のように「[]」でパラメータをつけた形にしておくと、パラメータが適宜型変換されてアクションメソッド「<tt class="docutils literal"><span class="pre">_post_search</span></tt>」の引数として渡されます。</p>
</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>
