Liferay Spring MVC Portlet

Step 1. Liferay Portlet project 생성

Step 2. Portlet class를 Spring MVC로 변경

// portlet.xml
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>

Step 3. Spring Apllication Context 파일 생성

// first-spring-mvc-portlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
 <context:annotation-config />
 <bean
  class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
</beans>

// <context:annotation-config />와 DefaultAnnotationHandlerMapping bean은 controller에서 annotation을 이용하는 데에 필요

Step 4. Portlet.xml 파일에 Spring Application Context를 등록

portlet.xml에 DispatcherPortlet을 portlet class로 등록하였다. 앞으로 DispatcherPortlet은 central(Front) 컨트롤러가 되었고, 이 컨트롤러에 우리의 application context 파일이 어디있는지 정의해야한다.

// portlet.xml
<portlet-name>first-spring-mvc</portlet-name>
<display-name>First Spring Mvc</display-name>
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
 <init-param>
  <name>contextConfigLocation</name>
  <value>/WEB-INF/first-spring-mvc-portlet.xml</value>
 </init-param>
 <init-param>
  <name>view-jsp</name>
  <value>/view.jsp</value>
 </init-param>

Step 5. Spring dependency 임포트

liferay-plugin-package.properties의 Portal dependency Jars에서 Spring 관련 라이브러리를 모두 임포트.

spring-web-servlet.jar
spring-web-portlet.jar
spring-web.jar
spring-transaction.jar
spring-jdbc.jar
spring-expression.jar
spring-core.jar
spring-context.jar
spring-beans.jar
spring-asm.jar
spring-aop.jar
spring-aspects.jar
spring-context-support.jar
spring-jms.jar
spring-orm.jar
spring-oxm.jar
spring-web-struts.jar
commons-beanutils.jar
commons-collections.jar
commons-fileupload.jar
commons-io.jar
commons-lang.jar
jstl-api.jar
jstl-impl.jar

Step 6. web.xml 파일에 ViewRenderServlet Entry 넣기

ViewRenderServlet 덕분에 Spring 웹 MVC는 Portlet context에서도 모든 기능을 지원한다. 즉, Spring 웹 MVC와 Spring Portlet MVC사이의 다리 역할을 한다. Spring 웹 MVC가 포털 환경에서도 잘 작동하도록 PortletRequest를 ServletRequest로 변환해준다.

// web.xml
<servlet>
  <servlet-name>view-servlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>view-servlet</servlet-name>
  <url-pattern>/WEB-INF/servlet/view</url-pattern>
</servlet-mapping>

Step 7. View 구성 (ViewResolver 등록)

Spring MVC 프레임워크는 JSP, Freemarker, Velocity 등 많은 View 기술들을 지원한다. DispatcherPortlet이 ViewResolver의 도움을 받아 view를 구성한다. 그래서 우리는 ViewResolver를 이용하여 Spring application context 파일에서 뷰를 구성해야한다.

// first-spring-mvc-portlet.xml
<bean id="jspViewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 <property name="viewClass"
   value="org.springframework.web.servlet.view.InternalResourceView" />
 <property name="prefix" value="/WEB-INF/jsp/" />
 <property name="suffix" value=".jsp" />
 <property name="order" value="1" />
</bean>

Step 8. JSP 만들기

WEB-INF 폴더 밑에 JSP 파일 생성 (이름 : defaultRender.jsp)

Step 9. Request Handler (Controller) 만들기

Front Controller (DispatcherPortlet)은 request를 적절한 request handler에 전달해주는 역할을 한다. 실제 Job은 이 request handler (controller)가 처리한다.

이 스텝에선 Request handler를 구현한다.

  1. Package 생성 후(com.liferay.test.portlet) MyFirstSpringMVCPortlet class 생성
  2. Portlet은 View, Edit, Help 모드가 있는데 각각에 대해서 Controller를 만들어야한다. (DispatcherPortlet에 어떤 모드가 Controller에 의해 지원되는지 명시적으로 설정해야 한다.)
  3. 명시적 설정은 annotation을 통해서!
package com.liferay.test.portlet;

import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.bind.annotation.RenderMapping;

@Controller(value = "MyFirstSpringMVCPortlet")
@RequestMapping("VIEW")
public class MyFirstSpringMVCPortlet{


}

// @Controller annotation을 통해 이것이 컨트롤러임을 명시. value값은 class 이름과 동일
// @RequestMapping("VIEW")는 DispatcherPortlet에게 이 컨트롤러는 VIEW 모드를 지원함을 명시적으로 알림
  1. 다음 Method 추가
@RenderMapping
 public String handleRenderRequest(RenderRequest request,RenderResponse response,Model model){

  return "defaultRender";
 }

// @RenderMapping annotation은 default render method임을 명시.
// @RenderMapping에서 action value를 이용하여 여러 개의 renderm method call 가능
// Method 명은 마음대로 지을 수 있음
// Parameter로 받은 Model 객체는 JSP에서 접근이 가능하다
// Step 7에서 prefix로 "/WEB-INF/jsp/"를, suffix로 ".jsp"를 선언했으므로
// defaultRender 라는 return 값은 /WEB-INF/jsp/defaultRender.jsp로 변경된다.
// DispatcherPortlet은 이 jsp path를 찾아 render 한다.

Step 10. Request Handler를 Spring Application Context 에 등록하기

xml 파일에 작성한 컨트롤러를 등록하는 스텝이다.

// first-spring-mvc-portlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:util="http://www.springframework.org/schema/util"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/util
        http://www.springframework.org/schema/util/spring-util-3.0.xsd">

 <context:annotation-config />
 <bean
  class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping" />

 <bean class="com.liferay.test.portlet.MyFirstSpringMVCPortlet" />

 <bean id="jspViewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass"
   value="org.springframework.web.servlet.view.InternalResourceView" />
  <property name="prefix" value="/WEB-INF/jsp/" />
  <property name="suffix" value=".jsp" />
  <property name="order" value="1" />
 </bean>
</beans>

컨트롤러 클래스 (MyFirstSpringMVCPortlet)을 bean으로 등록하였다.

이 포틀릿을 배포하면 Liferay 페이지에서 defaultRender jsp파일의 내용이 나올 것이다.

이 포틀릿은 단일 Render method만 예제로 하였는데 multi render, multi action method도 가능하고, 그것은 이 링크를 참조하면 된다.

results matching ""

    No results matching ""