<?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>Ymirとは</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/0.9.x/user/description">
    <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">ドキュメント（1.0.x系）</a>
        
      </li><li>
        <a href="/docs/0.9.x">ドキュメント（0.9.x系）</a>
        
      </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/0.9.x">ドキュメント（0.9.x系）</a></li><li><a href="/docs/0.9.x/user">ユーザマニュアル</a></li><li>Ymirとは</li>
</ul>
</div>
        </div><div id="org.seasar.kvasir.cms.pop.contentPop-1" class="pop org.seasar.kvasir.cms.pop.contentPop">
          <h2 class="title">Ymirとは</h2>
          <div class="body">
<ul class="information">
  
  <li>2007-05-11 15:34:06</li>
</ul>
<div class="content"><div class="document">
<p>Ymir（ユミル）は、フィルタ指向のシンプルなWebアプリケーション構築フレームワークです。</p>
<p>元々はYmirは<a class="reference" href="http://kvasir.sandbox.seasar.org/">Kvasir/Sora</a>や<a class="reference" href="http://tuigwaa.sandbox.seasar.org/">Tuigwaa</a>においてWebアプリケーション的なプラグインを作成するためのフレームワークとして作成されましたが、組み込み用としてだけでなくStrutsのような単独のWebアプリケーション構築フレームワークとしても利用可能です。</p>
<p>Ymirの特徴は以下のとおりです。</p>
<ul>
<li><a class="reference" href="#e38395e382a3e383abe382bfe68c87e59091">フィルタ指向</a></li>
<li><a class="reference" href="#e38387e38395e382a9e383abe38388e381aee38393e383a5e383bce38386e383b3e38397e383ace383bce38388e381afzpt">デフォルトのビューテンプレートはZPT</a>（Zope Page Template）</li>
<li><a class="reference" href="#e382b3e383b3e3839de383bce3838de383b3e38388e7aea1e79086e6a99fe6a78be381a8e38197e381a6seasar2-4e38292e58685e894b5">コンポーネント管理機構としてSeasar2.4を内蔵</a></li>
<li><a class="reference" href="#seasar2-4e381aehot-deploye381abe5afbee5bf9c">Seasar2.4のHOT deployに対応</a></li>
<li><a class="reference" href="#e383aae382afe382a8e382b9e38388e9a786e58b95e381aee887aae58b95e7949fe68890e6a99fe883bd">リクエスト駆動の自動生成機能</a></li>
</ul>
<div class="section" id="e38395e382a3e383abe382bfe68c87e59091">
<h3><a name="e38395e382a3e383abe382bfe68c87e59091">フィルタ指向</a></h3>
<p>Webサーバの基本的な機能は、Webブラウザからのリクエストに応じてコンテンツを返すことです。</p>
<p>JavaのServletAPIを使ったWebアプリケーションでは、リクエストされたURIに対応するコンテンツをサーブレットがレスポンスとして返します。</p>
<p>コンテンツが静的なものであれば、サーブレットは単にURIに対応するファイルの内容をそのままレスポンスとして返します。例えばTomcatでHTMLコンテンツをリクエストした場合は、DefaultServletがリクエストに対応するHTMLファイルの内容を返します。</p>
<p>コンテンツが動的なものであれば、サーブレットはURIに対応するファイルの内容をレンダリングして結果をレスポンスとして返します。例えばTomcatでJSPコンテンツをリクエストした場合は、JspServletがリクエストに対応するJSPファイルの内容をレンダリングして、結果であるHTML等のコンテンツを返します。</p>
<p>ところでJSPやVelocityなどのページテンプレートを使って動的なコンテンツを生成させる場合、テンプレートをレンダリングするために必要なオブジェクトを予めHttpServletRequestの属性等として用意しておく必要があるケースがあります。</p>
<p>例えばStruts+JSPで構築されたWebアプリケーションの場合、JSPをレンダリングするために必要な前処理はStrutsのActionクラスの中で行ないます。</p>
<p>Ymirではページテンプレートのための前処理をより透過的に行なえるよう、サーブレットの処理をサーブレットフィルタでフックする形でJavaオブジェクトのメソッドを呼び出せるようにしています。</p>
<p>具体的には、</p>
<ol>
<li>リクエストを受け取る</li>
<li>サーブレットがページテンプレートをレンダリングしてレスポンスを作成する</li>
<li>レスポンスを返す</li>
</ol>
<p>という処理の流れの中で、2.の直前にJavaオブジェクトのメソッドを呼び出せるようになっています。すなわち、処理の流れは</p>
<ol>
<li>リクエストを受け取る</li>
<li><em>リクエストされたURIに対応するJavaオブジェクトのメソッドを呼び出す</em></li>
<li>サーブレットがページテンプレートをレンダリングしてレスポンスを作成する</li>
<li>レスポンスを返す</li>
</ol>
<p>のようになります。</p>
<p>Ymirがリクエストを受け取ってからレスポンスを返すまでの処理の詳細については、<a class="reference" href="/docs/0.9.x/user/processFlow">Ymirの処理フロー</a>を参照して下さい。</p>
</div>
<div class="section" id="e38387e38395e382a9e383abe38388e381aee38393e383a5e383bce38386e383b3e38397e383ace383bce38388e381afzpt">
<h3><a name="e38387e38395e382a9e383abe38388e381aee38393e383a5e383bce38386e383b3e38397e383ace383bce38388e381afzpt">デフォルトのビューテンプレートはZPT</a></h3>
<p>Ymirの中心的な処理は、MVCアーキテクチャで言うところのコントローラの処理です。ビューの処理、すなわちビューテンプレートをレンダリングして最終的なレスポンス（通常はHTML）を作成する処理については、サーブレットとして動作するテンプレートエンジンによって行なわれます。</p>
<p>YmirはStrutsと同様にさまざまなテンプレートエンジンと組み合わせて利用できるようになっていますが、デフォルトのテンプレートエンジンとしてZPT（Zope Page Template）エンジンを内包しています。</p>
<p>ZPTはPythonで書かれたWebアプリケーションサーバZopeで用いられているテンプレート形式です。ZPTの特徴は次のとおりです。</p>
<ul>
<li>HTMLを壊さない形でレンダリング命令を埋め込めるため、WebアプリケーションサーバにデプロイしなくともWebブラウザでHTMLのデザインを確認できる</li>
<li>命令体系がシンプルである</li>
<li>複数画面のデザインを統一させたり繰り返し利用されるHTML部品を定義したりするためのマクロ機能を持っている</li>
</ul>
<p>ZPTの詳細については「<a class="reference" href="http://www.plope.com/Books/2_7Edition/AppendixC.stx">Zope Page Templates Reference</a>」、「<a class="reference" href="http://www.webcore.co.jp/techinfo/misc/ZopePageTemplateReference.html">Zope Page Template リファレンス</a>」、「<a class="reference" href="http://www.plope.com/Books/2_7Edition/ZPT.stx">Using Zope Page Templates</a>」、「<a class="reference" href="http://www.webcore.co.jp/techinfo/misc/ZopePageTemplate.html">Page Template を使う</a>」等を参照して下さい。また、Ymirで利用できるZPT記述の詳細については「<a class="reference" href="/doc/ref/zptTemplate">ZPTテンプレート</a>」を参照して下さい。</p>
</div>
<div class="section" id="e382b3e383b3e3839de383bce3838de383b3e38388e7aea1e79086e6a99fe6a78be381a8e38197e381a6seasar2-4e38292e58685e894b5">
<h3><a name="e382b3e383b3e3839de383bce3838de383b3e38388e7aea1e79086e6a99fe6a78be381a8e38197e381a6seasar2-4e38292e58685e894b5">コンポーネント管理機構としてSeasar2.4を内蔵</a></h3>
<p>YmirはDI+AOPコンテナであるSeasar2.4を内蔵しています。これによって、Webアプリケーションを構成するJavaオブジェクトのライフサイクル管理を簡単に行なうことができます。</p>
</div>
<div class="section" id="seasar2-4e381aehot-deploye381abe5afbee5bf9c">
<h3><a name="seasar2-4e381aehot-deploye381abe5afbee5bf9c">Seasar2.4のHOT deployに対応</a></h3>
<p>YmirはSeasar2.4のHOT deploy機能に対応しており、アプリケーションのソースコードに適用した変更が動作中のアプリケーションに即座に反映されます。これによってインタラクティブなアプリケーション開発が可能になります。</p>
</div>
<div class="section" id="e383aae382afe382a8e382b9e38388e9a786e58b95e381aee887aae58b95e7949fe68890e6a99fe883bd">
<h3><a name="e383aae382afe382a8e382b9e38388e9a786e58b95e381aee887aae58b95e7949fe68890e6a99fe883bd">リクエスト駆動の自動生成機能</a></h3>
<p>Ymirでは、ビューテンプレートとしてZPTを使った場合、ZPTテンプレートからさまざまなJavaクラスを自動生成することができます。</p>
<p>この自動生成処理は通常リクエスト駆動で行なわれます。すなわち、リクエストされたURIに対応するZPTテンプレートが新規に作成されたか更新されていた場合にテンプレートが解析され、解析結果に基づいてJavaクラスが生成されます。この機能によって、インクリメンタルかつインタラクティブにアプリケーションを開発することが可能になります。</p>
<p>自動生成機能の詳細については「<a class="reference" href="/docs/0.9.x/user/generator">自動生成機能</a>」を参照して下さい。</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>
