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

ポートレットの開発 MVC4Springポートレット

PortletMVC4Springは、ポートレットのリクエストをコントローラクラスとメソッドにマッピングするアノテーションを提供することで、Spring WebフレームワークとMVCデザインパターンを補完します。 このサンプルポートレットアプリケーションは、PortletMVC4Spring、Spring、およびJSP/JSPXテンプレートを使用して、その動作方法を示します。

このアーキタイプのサンプルポートレットは、名と姓を入力すると挨拶(例:「こんにちは、ジョー・ブログスさん」)を表示します。

ポートレットアプリケーションを作成してデプロイするには、以下の手順に従ってください。

  1. LiferayワークスペースにPortletMVC4Springプロジェクトを作成します。

    blade create B7F9Portlet -t spring-mvc-portlet --framework portletmvc4spring --view-type jsp
    
  2. モデル用のパッケージにモデルクラスを作成します(例: java/[my-package-path]/dto)。 サンプルモデルクラスは User です。

      public class User implements Serializable {
    
        public String getFirstName() {
          return firstName;
        }
    
        public String getLastName() {
          return lastName;
        }
    
        public void setFirstName(String firstName) {
          this.firstName = firstName;
        }
    
        public void setLastName(String lastName) {
          this.lastName = lastName;
        }
    
        private static final long serialVersionUID = 1113488483222411111L;
    
        @NotBlank
        private String firstName;
    
        @NotBlank
        private String lastName;
    
      }
    
  3. Spring Webがサポートするテンプレートタイプを使用してビューを作成します。 Blade を使用してプロジェクトを生成しなかった場合は、 spring-context/portlet-application-context.xml ポートレット アプリケーション コンテキストでテンプレート タイプの View リゾルバーを指定します。 (詳細は PortletMVC4Spring設定ファイル を参照してください。)

    サンプルテンプレート user.jspx は、ユーザーの姓と名を送信するためのフォームをレンダリングします。

    <?xml version="1.0" encoding="UTF-8"?>
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
    		  xmlns:portlet="http://xmlns.jcp.org/portlet_3_0"
    		  xmlns:spring="http://www.springframework.org/tags"
    		  xmlns:form="http://www.springframework.org/tags/form"
    		  version="2.1">
    	<jsp:directive.page contentType="text/html" pageEncoding="UTF-8" />
    	<portlet:defineObjects/>
    	<link href="${contextPath}/resources/css/main.css" rel="stylesheet" type="text/css"/>
    	<portlet:actionURL var="mainFormActionURL"/>
    	<form:form id="${namespace}mainForm" action="${mainFormActionURL}" class="user-form" method="post" modelAttribute="user">
    		<p class="caption">
    			<spring:message code="personal-information" />
    		</p>
    		<fieldset>
    			<div class="form-group">
    				<form:label for="${namespace}firstName" path="firstName">
    					<spring:message code="first-name" />
    				</form:label>
    				<form:input id="${namespace}firstName" cssClass="form-control" path="firstName"/>
    				<form:errors path="firstName" cssClass="portlet-msg-error"/>
    			</div>
    			<div class="form-group">
    				<form:label for="${namespace}lastName" path="lastName">
    					<spring:message code="last-name" />
    				</form:label>
    				<form:input id="${namespace}lastName" cssClass="form-control" path="lastName"/>
    				<form:errors path="lastName" cssClass="portlet-msg-error"/>
    			</div>
    		</fieldset>
    		<hr />
    		<spring:message code="submit" var="submit" />
    		<input class="btn btn-primary" value="${submit}" type="submit"/>
    	</form:form>
    </jsp:root>
    

    コントローラーでアクションを呼び出すには、アクションURLをテンプレートに関連付けます。 サンプルテンプレートは、アクション URL 変数 mainFormActionURL をフォーム要素に関連付けます。

    <portlet:actionURL var="mainFormActionURL"/>
    <form:form id="${namespace}mainForm" action="${mainFormActionURL}" class="user-form" method="post" modelAttribute="user">
        ...
    

    <form:form/> 要素の modelAttribute 属性は、アプリケーション モデルを対象としています。 サンプルテンプレートは、アプリケーションの ユーザー モデルを対象としています。

  4. ポートレットのスタイルを設定するには、スタイルシートに CSS を追加し (例: webapp/css/main.scss)、テンプレートをそのスタイルシートにリンクします。

    <link href="${contextPath}/resources/css/main.css" rel="stylesheet" type="text/css"/>
    
  5. ポートレットのメッセージをプロパティファイルで定義します(例: src/main/resources/content/Language.properties)。 サンプルテンプレート user.jspx は、これらのプロパティの一部を参照しています。

    first-name=First Name
    greetings=Greetings, {0} {1}!
    jakarta.portlet.display-name=B7F9Portlet
    jakarta.portlet.keywords=B7F9Portlet
    jakarta.portlet.short-title=B7F9Portlet
    jakarta.portlet.title=B7F9Portlet
    last-name=Last Name
    personal-information=Personal Information
    please-correct-the-following-errors=Please correct the following error(s)
    submit=Submit
    todays-date-is=Today''s date is {0}
    
  6. ポートレットのリクエストを処理するコントローラークラスを作成します。 以下に例を示します。

    @Controller
    @RequestMapping("VIEW")
    public class UserController {
        ...
    }
    

    @Controller アノテーションは、Spring Controller コンポーネントのステレオタイプを適用します。 Spring Frameworkは、コントローラクラスをスキャンしてコントローラのアノテーションを検出します。

    @RequestMapping("VIEW") アノテーションは、クラスのパブリック メソッドをポートレットの VIEW モード のリクエスト ハンドラー メソッドとしてマークします。

  7. コントローラーで、ポートレットのレンダリング要求を処理するメソッドに @RenderMapping アノテーションを適用します。 アノテーション com.liferay.portletmvc4spring.bind.annotation.RenderMapping をインポートし、各ハンドラー メソッドがレンダリングするテンプレートの名前と一致する文字列を返すようにしてください。 以下は、サンプルにおけるレンダリング要求ハンドラのメソッドです。

    @RenderMapping
    public String prepareView() {
    	  return "user";
    	 }
    
    	@RenderMapping(params = "jakarta.portlet.action=success")
    	public String showGreeting(ModelMap modelMap) {
    
    		DateFormat dateFormat = new SimpleDateFormat("EEEE, MMMM d, yyyy G");
    
    		Calendar todayCalendar = Calendar.getInstance();
    
    		modelMap.put("todaysDate", dateFormat.format(todayCalendar.getTime()));
    
    		return "greeting";
    	}
    

    @RenderMapping アノテーションは、他のハンドラー メソッドがリクエストに一致しない場合、上記の prepareView メソッドを呼び出します。 prepareViewuser テンプレート (つまり、 user.jspx をレンダリングします。

    @RenderMapping(params = "jakarta.portlet.action=success") アノテーションは、レンダリング要求にパラメータ設定 jakarta.portlet.action=success がある場合、 showGreeting メソッドを呼び出します。 showGreetinggreeting テンプレート (つまり、 greeting.jspx をレンダリングします。

  8. コントローラーで、ポートレットのアクションリクエスト処理メソッドに @ActionMapping アノテーションを適用します。 アノテーション com.liferay.portletmvc4spring.bind.annotation.ActionMapping をインポートします。

    以下のサンプル コントローラのアクション ハンドラ メソッドには、 @ActionMappingという注釈が付けられており、リクエストに一致する他のアクション ハンドラがない場合にデフォルトのアクション ハンドラとして使用されます。 このポートレットにはアクションハンドラが 1 つしかないため、 submitApplicant メソッドがポートレットのすべてのアクション要求を処理します。

    @ActionMapping
    public void submitApplicant(
      @ModelAttribute("user") User user, BindingResult bindingResult,
      ModelMap modelMap, Locale locale, ActionResponse actionResponse,
      SessionStatus sessionStatus) {
    
      _localValidatorFactoryBean.validate(user, bindingResult);
    
      if (!bindingResult.hasErrors()) {
        if (_logger.isDebugEnabled()) {
          _logger.debug("firstName=" + user.getFirstName());
          _logger.debug("lastName=" + user.getLastName());
        }
    
        MutableRenderParameters mutableRenderParameters =
          actionResponse.getRenderParameters();
    
        mutableRenderParameters.setValue("jakarta.portlet.action", "success");
    
        sessionStatus.setComplete();
      }
      else {
        bindingResult.addError(
          new ObjectError(
            "user",
            _messageSource.getMessage(
              "please-correct-the-following-errors", null, locale)));
      }
    }
    

    メソッドパラメーター @ModelAttribute("user") User user@ModelAttribute アノテーションは、ビューの user モデル (名と姓で構成) を、このメソッドに渡される User オブジェクトに関連付けます。

    submitApplicant メソッドは jakarta.portlet.action render パラメータを success に設定します。 前のレンダリングハンドラーメソッド showGreeting はこのリクエストパラメータに一致します。

  9. プロジェクトの記述子ファイルとSpringコンテキストファイルそれぞれに、追加のリソースとBeanを設定します。 (詳細は PortletMVC4Spring設定ファイル を参照してください。)

  10. Gradleを使用してプロジェクトのWARファイルをビルドします。

  11. WARファイルを [Liferay-Home]/deploy フォルダにコピーしてデプロイします。

Liferayはデプロイメントをログに記録し、ポートレットはLiferayのUIに表示されます。 Add(Add) を選択し、ウィジェットと Liferay Bundle Generator に指定したカテゴリ(サンプルはデフォルトのカテゴリです)に移動してポートレットを探します。

  PortletMVC4Springポートレットを作成し、デプロイしました。

PortletMVC4Springプロジェクトの構造

PortletMVC4Springアノテーション

PortletMVC4Spring構成ファイル

PortletMVC4Springへの移行