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

ポートレットアプリケーションを作成してデプロイするには、以下の手順に従ってください。
-
LiferayワークスペースにPortletMVC4Springプロジェクトを作成します。
blade create B7F9Portlet -t spring-mvc-portlet --framework portletmvc4spring --view-type jsp -
モデル用のパッケージにモデルクラスを作成します(例:
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; } -
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属性は、アプリケーション モデルを対象としています。 サンプルテンプレートは、アプリケーションのユーザーモデルを対象としています。 -
ポートレットのスタイルを設定するには、スタイルシートに CSS を追加し (例:
webapp/css/main.scss)、テンプレートをそのスタイルシートにリンクします。<link href="${contextPath}/resources/css/main.css" rel="stylesheet" type="text/css"/> -
ポートレットのメッセージをプロパティファイルで定義します(例:
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} -
ポートレットのリクエストを処理するコントローラークラスを作成します。 以下に例を示します。
@Controller @RequestMapping("VIEW") public class UserController { ... }@Controllerアノテーションは、Spring Controller コンポーネントのステレオタイプを適用します。 Spring Frameworkは、コントローラクラスをスキャンしてコントローラのアノテーションを検出します。@RequestMapping("VIEW")アノテーションは、クラスのパブリック メソッドをポートレットの VIEW モード のリクエスト ハンドラー メソッドとしてマークします。 -
コントローラーで、ポートレットのレンダリング要求を処理するメソッドに
@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メソッドを呼び出します。prepareViewはuserテンプレート (つまり、user.jspxをレンダリングします。@RenderMapping(params = "jakarta.portlet.action=success")アノテーションは、レンダリング要求にパラメータ設定jakarta.portlet.action=successがある場合、showGreetingメソッドを呼び出します。showGreetingはgreetingテンプレート (つまり、greeting.jspxをレンダリングします。 -
コントローラーで、ポートレットのアクションリクエスト処理メソッドに
@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.actionrender パラメータをsuccessに設定します。 前のレンダリングハンドラーメソッドshowGreetingはこのリクエストパラメータに一致します。 -
プロジェクトの記述子ファイルとSpringコンテキストファイルそれぞれに、追加のリソースとBeanを設定します。 (詳細は PortletMVC4Spring設定ファイル を参照してください。)
-
Gradleを使用してプロジェクトのWARファイルをビルドします。
-
WARファイルを
[Liferay-Home]/deployフォルダにコピーしてデプロイします。
Liferayはデプロイメントをログに記録し、ポートレットはLiferayのUIに表示されます。 Add(
) を選択し、ウィジェットと Liferay Bundle Generator に指定したカテゴリ(サンプルはデフォルトのカテゴリです)に移動してポートレットを探します。
PortletMVC4Springポートレットを作成し、デプロイしました。