1.9.3. RESTful アプリケーションの「プッシュ」型 MVC の使用


RESTful ページの処理にプッシュ型 MVC が使われることがあるため、 Seam では ページアクション という概念を提供しています。 ブログのサンプルはブログの記入ページ entry.xhtml にページアクションを使用しています。

注記

ここでは一例として示すためにプッシュ型を使用していますが、 この特定の機能についてはプル型 MVC を使った実装の方がシンプルです。
entryAction コンポーネントの動作は Struts のような従来のプッシュ型 MVC アクション指向のフレームワークでのアクションクラスの動作とよく似ています。
@Name("entryAction")
@Scope(STATELESS)
public class EntryAction
{
    @In Blog blog;
  
    @Out BlogEntry blogEntry;
  
    public void loadBlogEntry(String id) throws EntryNotFoundException {
        blogEntry = blog.getBlogEntry(id);
        if (blogEntry==null) throw new EntryNotFoundException(id);
    }
   
}
Copy to Clipboard Toggle word wrap
ページアクションは、pages.xml でも宣言されます。
<pages>
  ...

  <page view-id="/entry.xhtml"> 
    <rewrite pattern="/entry/{blogEntryId}" />
    <rewrite pattern="/entry" />
    
    <param name="blogEntryId" 
           value="#{blogEntry.id}"/>
    
    <action execute="#{entryAction.loadBlogEntry(blogEntry.id)}"/>
  </page>
  
  <page view-id="/post.xhtml" login-required="true">
    <rewrite pattern="/post" />
    
    <action execute="#{postAction.post}"
            if="#{validation.succeeded}"/>
    
    <action execute="#{postAction.invalid}"
            if="#{validation.failed}"/>
    
    <navigation from-action="#{postAction.post}">
      <redirect view-id="/index.xhtml"/>
    </navigation>
  </page>

  <page view-id="*">
    <action execute="#{blog.hitCount.hit}"/>
  </page>

</pages>
Copy to Clipboard Toggle word wrap

注記

このサンプルは検証後およびページビューのカウンタにページアクションを使用している点に留意してください。 また、 ページアクションのメソッドバインディングでのパラメータの使い方にも注意してください。 これは標準 JSF EL の機能ではありませんが、 Seam ではページアクションだけでなく JSF メソッドバインディングでも使用することができます。
entry.xhtml ページが要求されると Seam はまずページパラメータ blogEntryId をそのモデルにバインドします。 URL を書き換えているため blogEntryId パラメータ名は URL に表れないことを思い出してください。 次に Seam はページアクションを実行して、 必要なデータ blogEntry を読み出し、 それを Seam イベントコンテキスト内に配置します。 最後に以下を表示させます。
<div class="blogEntry">
  <h3>#{blogEntry.title}</h3>
  <div>
    <s:formattedText value="#{blogEntry.body}"/>
  </div>
  <p>
  [Posted on&#160;
  <h:outputText value="#{blogEntry.date}">
     <f:convertDateTime timeZone="#{blog.timeZone}" locale="#{blog.locale}" type="both"/>
  </h:outputText>]
  </p>
</div>
Copy to Clipboard Toggle word wrap
ブログエントリがデータベースで見つからない場合、 EntryNotFoundException 例外が送出されます。 この例外は 505 エラーではなく 404 エラーにさせたいので例外クラスにアノテーションを付けます。
@ApplicationException(rollback=true)
@HttpError(errorCode=HttpServletResponse.SC_NOT_FOUND)
public class EntryNotFoundException extends Exception {
    EntryNotFoundException(String id) {
        super("entry not found: " + id);
    }
}
Copy to Clipboard Toggle word wrap
メソッドバインディングでパラメータを使用しない別の実装例を示します。
@Name("entryAction")
@Scope(STATELESS)
public class EntryAction {
    @In(create=true) 
        private Blog blog;
  
    @In @Out
    private BlogEntry blogEntry;
  
    public void loadBlogEntry() throws EntryNotFoundException {
        blogEntry = blog.getBlogEntry( blogEntry.getId() );
        if (blogEntry==null) throw new EntryNotFoundException(id);
    }
}
Copy to Clipboard Toggle word wrap
<pages> 
  ... 
  <page view-id="/entry.xhtml" action="#{entryAction.loadBlogEntry}"> 
  <param name="blogEntryId" value="#{blogEntry.id}"/> 
</page> 
  ... 
</pages>
Copy to Clipboard Toggle word wrap
使用する実装はその選択により完全に異なります。
また、 ブログのサンプルでは非常にシンプルなパスワード認証、 ブログへの投稿、 ページの部分的なキャッシング、Atom フィードの生成も示しています。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat