<?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/0.9.x/ref/objectScope">
    <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/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>2007-08-21 18:11:54</li>
</ul>
<div class="content"><div class="document">
<p>Webアプリケーションを作成する場合は、オブジェクトの有効範囲（スコープ）を上手に扱うことが重要になってきます。</p>
<p>サーブレットの世界にはスコープとしてrequestスコープ、sessionスコープ、applicationスコープなどがあります。Ymirでもこれらのスコープにオブジェクトをバインドしたりスコープからオブジェクトを取り出したりすることができますが、サーブレットAPIを直接使わずにスコープに関する操作が行なえるようになっています。</p>
<p>具体的には、スコープからオブジェクトを取り出したい場合はorg.seasar.ymir.annotation.Inアノテーションを付与したsetterメソッドを用意します。以下の例は、sessionスコープに「value」というキーでバインドされているオブジェクトを取得するためのコードです。</p>
<pre class="literal-block">
@In(SessionScope.class)
public void setValue(Object value)
{
    value_ = value;
}
</pre>
<p>なお、対応するキーでバインドされているオブジェクトが存在しない場合は通常setterメソッドは呼び出されません。オブジェクトが存在しない場合にもsetterメソッドを呼び出したい場合は@Inアノテーションに「injectWhereNull=true」というプロパティを追加して下さい。</p>
<p>オブジェクトをスコープにバインドしたい場合はorg.seasar.ymir.annotation.Outアノテーションを付与したgetterメソッドをPageクラスに用意します。以下の例は、sessionスコープに「value」という名前でgetterメソッドの返り値をバインドするためのコードです。</p>
<pre class="literal-block">
@Out(SessionScope.class)
public Object getValue()
{
    return value_;
}
</pre>
<p>オブジェクトをスコープからアンバインドしたい場合はgetterメソッドがnullを返すようにして下さい。getterメソッドがnullを返す場合にオブジェクトをスコープからアンバインドしたくない場合は@Outアノテーションに「outjectWhereNull=false」というプロパティを追加して下さい。</p>
<p>@Inアノテーションに従ったオブジェクトの取り出しはPageオブジェクトへのリクエストパラメータのインジェクトの後、制約チェックの前に行なわれます。@Outアノテーションに従ったオブジェクトのバインディングはアクションの呼び出しの後（<tt class="docutils literal"><span class="pre">_render</span></tt>メソッドの呼び出しがあればその後）に行なわれます。</p>
<p>オブジェクトスコープからのオブジェクトの取り出しとオブジェクトスコープへのオブジェクトのバインディングはどのアクション呼び出しに関しても常に行なわれますが、@Inアノテーションや@Outアノテーションに「actionName」プロパティを指定することで、特定のアクションの時だけ行なわせることもできます。</p>
<pre class="literal-block">
@Out(scopeClass = SessionScope.class, actionName = { &quot;_post&quot;, &quot;_post_done&quot; })
public Object getValue()
{
    return value_;
}
</pre>
<p>上の例では、リクエストが<tt class="docutils literal"><span class="pre">_post</span></tt>アクションまたは<tt class="docutils literal"><span class="pre">_post_done</span></tt>アクションを呼び出すケースのみgetValue()の値がセッションスコープにバインドされます。</p>
<p>利用できるScopeクラスには以下のものがあります。</p>
<dl class="docutils">
<dt>org.seasar.ymir.scope.impl.RequestScope</dt>
<dd>requestスコープ。オブジェクトの操作はHttpServletRequest#getAttribute()、HttpServletRequest#setAttribute()、HttpServletRequest#removeAttribute()によって行なわれます。</dd>
<dt>org.seasar.ymir.scope.impl.SessionScope</dt>
<dd>sessionスコープ。オブジェクトの操作はHttpSession#getAttribute()、HttpSession#setAttribute()、HttpSession#removeAttribute()によって行なわれます。オブジェクトをバインドする際にセッションが存在しない場合はセッションを生成してからバインドします。オブジェクトを取り出す際にセッションが存在しない場合は取り出した結果はnullになります。</dd>
<dt>org.seasar.ymir.scope.impl.ApplicationScope</dt>
<dd>applicationスコープ。オブジェクトの操作はServletContext#getAttribute()、ServletContext#setAttribute()、ServletContext#removeAttribute()によって行なわれます。</dd>
<dt>org.seasar.ymir.redirection.impl.RedirectionScope</dt>
<dd>
<p>redirectionスコープ。このスコープに保存されたオブジェクトは一度限りのリダイレクトをまたがって保持されます。</p>
<p>フレーム等を使った、一画面を表示するために複数リクエストを発行するタイプのアプリケーションや、複数ウィンドウを同時に開いたりするタイプのアプリケーションではこの機能が正しく働かないことがあります。その場合は以下の内容のymir-component+redirectionManager.diconファイルを作ってクラスパスに置くようにして下さい:</p>
<pre class="literal-block">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;!DOCTYPE components PUBLIC &quot;-//SEASAR//DTD S2Container 2.4//EN&quot;
  &quot;http://www.seasar.org/dtd/components24.dtd&quot;&gt;
&lt;components&gt;
  &lt;component name=&quot;redirectionManager&quot;
  class=&quot;org.seasar.ymir.redirection.impl.RedirectionManagerImpl&quot;&gt;
    &lt;property name=&quot;addScopeIdAsRequestParameter&quot;&gt;true&lt;/property&gt;
  &lt;/component&gt;
&lt;/components&gt;
</pre>
</dd>
</dl>
<p>オブジェクトをスコープにバインドする際のキーはgetter/setterメソッドが対応するプロパティ名になります。違うキーを指定したい場合はアノテーションのnameプロパティでキー文字列を指定して下さい。</p>
</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>
