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를 구현한다.
- Package 생성 후(com.liferay.test.portlet) MyFirstSpringMVCPortlet class 생성
- Portlet은 View, Edit, Help 모드가 있는데 각각에 대해서 Controller를 만들어야한다. (DispatcherPortlet에 어떤 모드가 Controller에 의해 지원되는지 명시적으로 설정해야 한다.)
- 명시적 설정은 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 모드를 지원함을 명시적으로 알림
- 다음 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도 가능하고, 그것은 이 링크를 참조하면 된다.