MVCアクションコマンド

MVCアクションコマンド

ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、こちらまでご連絡ください。

LiferayのMVCフレームワークでは、ポートレットの アクションメソッド を個別のクラスに分割できます。 これは、多くのアクションがあるポートレットで非常に役立ちます。 必要に応じて、ポートレットのJSPの各アクションURLが適切なアクションクラスを呼び出します。

最初に、ビューレイヤー を

設定し、 <portlet:actionURL> タグ を使用してJSPにアクションURLを作成します。 たとえば、ブログアプリの edit_entry.jsp ファイル は、ブログエントリを編集するための次のアクションURLを定義します。

<portlet:actionURL name="/blogs/edit_entry" var="editEntryURL" />

name 属性は、ポートレットアクションURLオブジェクトを保持する変数を宣言します。 その変数を、ボタンやアイコンなどのUIコンポーネントに割り当てます。 ユーザーがUIコンポーネントをトリガーすると、アクションURLに一致する * MVCActionCommand クラスがアクション要求と応答を処理します。 MVCActionCommand インターフェース実装するか、 BaseMVCActionCommand クラス拡張して、アクションクラスを作成します。 後者はすでに MVCActionCommand実装しているため、時間を節約できます。

実行するアクションの後に * MVCActionCommand クラスに名前を付けることは良い習慣です。 あなたのアクションクラスは、エントリのいくつかの種類を編集する場合たとえば、あなたはそのクラス名可能性が EditEntryMVCActionCommand。 アプリケーションに複数のMVCコマンドクラスがある場合、このように名前を付けると、それらを区別するのに役立ちます。

* MVCActionCommand クラスには、次の例のように @Component アノテーションも必要です。 プロパティ javax.portlet.name をポートレットの内部IDに設定します。 プロパティ mvc.command.name を、JSPの一致する actionURLname プロパティの値に設定します。 OSGiコンテナー内のコンポーネントを MVCActionCommand サービスとして登録するには、 サービス プロパティを MVCActionCommand.classます。

@Component(
    immediate = true,
    property = {
        "javax.portlet.name=your_portlet_name_YourPortlet",
        "mvc.command.name=/your/jsp/action/url"
    },
    service = MVCActionCommand.class
)

public class YourMVCActionCommand extends BaseMVCActionCommand {
    // implement your action
}

ブログアプリの EditEntryMVCActionCommand クラスは、 * MVCActionCommand クラスの実際の例です。

@Component(
    immediate = true,
    property = {
        "javax.portlet.name=" + BlogsPortletKeys.BLOGS,
        "javax.portlet.name=" + BlogsPortletKeys.BLOGS_ADMIN,
        "javax.portlet.name=" + BlogsPortletKeys.BLOGS_AGGREGATOR,
        "mvc.command.name=/blogs/edit_entry"
    },
    service = MVCActionCommand.class
)
public class EditEntryMVCActionCommand extends BaseMVCActionCommand {

        @Override
        protected void doProcessAction(
                ActionRequest actionRequest, ActionResponse actionResponse)
            throws Exception {

            String cmd = ParamUtil.getString(actionRequest, Constants.CMD);

            try {
                BlogsEntry entry = null;

                UploadException uploadException =
                    (UploadException)actionRequest.getAttribute(
                        WebKeys.UPLOAD_EXCEPTION);

                if (uploadException != null) {
                    Throwable cause = uploadException.getCause();

                    if (uploadException.isExceededFileSizeLimit()) {
                        throw new FileSizeException(cause);
                    }

                    if (uploadException.isExceededLiferayFileItemSizeLimit()) {
                        throw new LiferayFileItemException(cause);
                    }

                    if (uploadException.isExceededUploadRequestSizeLimit()) {
                        throw new UploadRequestSizeException(cause);
                    }

                    throw new PortalException(cause);
                }
                else if (cmd.equals(Constants.ADD) ||
                         cmd.equals(Constants.UPDATE)) {

                    Callable<BlogsEntry> updateEntryCallable =
                        new UpdateEntryCallable(actionRequest);

                    entry = TransactionInvokerUtil.invoke(
                        _transactionConfig, updateEntryCallable);
                }
                else if (cmd.equals(Constants.DELETE)) {
                    deleteEntries(actionRequest, false);
                }
                else if (cmd.equals(Constants.MOVE_TO_TRASH)) {
                    deleteEntries(actionRequest, true);
                }
                else if (cmd.equals(Constants.RESTORE)) {
                    restoreTrashEntries(actionRequest);
                }
                else if (cmd.equals(Constants.SUBSCRIBE)) {
                    subscribe(actionRequest);
                }
                else if (cmd.equals(Constants.UNSUBSCRIBE)) {
                    unsubscribe(actionRequest);
                }

                ... do more action processing
            }

            ... handle exceptions
    }
}

@Componentの複数の javax.portlet.name プロパティ値により、この * MVCActionCommand クラスがそれらのポートレットでサービスコンポーネントとして使用可能になります。 mvc.command.name プロパティ設定 /ブログ/ edit_entry マッチ actionURL 属性が以前示されており、 サービス に対してプロパティセット MVCActionCommand.class クラスを作る MVCActionCommand サービスコンポーネント。

EditEntryMVCActionCommand クラスは BaseMVCActionCommand を拡張し、 doProcessAction メソッドをオーバーライドします。 同様に、 MVCActionCommand 直接実装する * MVCActionCommand クラスは、 processAction メソッドを実装する必要があります。 どちらのメソッドも、それぞれ javax.portlet.ActionRequest および javax.portlet.ActionResponse パラメーターを介してリソース要求と応答を処理します。

EditEntryMVCActionCommanddoProcessAction メソッドは、 ActionRequestから 定数 Constants.CMD という名前のコマンドパラメーターの値を取得します。

String cmd = ParamUtil.getString(actionRequest, Constants.CMD);

次に、 doProcessAction メソッドは、エントリ関連のアップロードが発生したかどうかを確認するか、アップロードがスローする例外を処理します。 アクション要求からアクセスされたコマンド( cmd格納されている)に基づいて、次のアクションのいずれかが実行されます。

  • エントリを追加または更新します
  • エントリーを削除する
  • エントリをごみ箱に移動する
  • ごみ箱からエントリを復元する
  • ユーザーをブログに登録する
  • ブログからユーザーを退会する

EditEntryMVCActionCommanddoProcessAction メソッドはさらに処理を続行し、ポートレットを適切なビューにリダイレクトする準備をします。 これは、ポートレットのアクションを処理するために必要なだけできることを示しています。

LiferayのMVCフレームワークを使用するアプリケーションで、独自のアクションURLと * MVCActionCommand クラスを作成できるようになりました。 * MVCActionCommandは、必要なことは何でもできます。

関連トピック

MVCポートレットの作成

MVCレンダリングコマンド

MVCリソースコマンド

MVCコマンドのオーバーライド

« ポートレットの基本を超えてMVCレンダリングコマンド »
この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています