포틀릿에서 Action Phase 수행후 Render Phase로 정보들 어떻게 전달 될 수 있는지 알아보자
Action 에서 Render Phase로 정보전달 방식
- render parameters를 통한 정보 전달 : REQUEST SCOPE
> Action Phase
processAction 안에서 actionResponse.setRenderParameter("parameter-name", "value"); 값을 설정
> Render Phase
renderRequest.getParameter("parameter-name"); 호출하여 값을 얻어옴
> 단, action phase에서는 only read 이므로 set이 가능하려면 portlet.xml 에 다음 설정을 한다. 해당 설정을 하게되면 action phase parameters 가 render phase parameters로 복사된다.
<init-param>
<name>copy-request-parameters</name>
<value>true</value>
</init-param>
> action parameter를 render parameter로 전달하게 되면 action phase이후 모든 포틀릿의 render phase가 호출되는 것임을 유의
- 세션 방식의 전달 : SESSION SCOPE
> actionRequest에 설정하고 JSP가 읽는다. 해당 설정값은 JSP에 딱 한번 사용되고 자동으로 삭제한다
//SessionMessages 사용 경우
package com.liferay.samples;
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.util.bridges.mvc.MVCPortlet;
public class MyGreetingPortlet extends MVCPortlet {
public void setGreeting(
ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException, PortletException {
PortletPreferences prefs = actionRequest.getPreferences();
String greeting = actionRequest.getParameter("greeting");
if (greeting != null) {
try {
prefs.setValue("greeting", greeting);
prefs.store();
SessionMessages.add(actionRequest, "success");
}
catch(Exception e) {
SessionErrors.add(actionRequest, "error");
}
}
}
}
// view.jsp 에서 sucess / error 사용
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet" %>
<%@ taglib uri="http://liferay.com/tld/ui" prefix="liferay-ui" %>
<%@ page import="javax.portlet.PortletPreferences" %>
<portlet:defineObjects />
<liferay-ui:success key="success" message="Greeting saved successfully!"/>
<liferay-ui:error key="error" message="Sorry, an error prevented savingyour greeting" />
<% PortletPreferences prefs = renderRequest.getPreferences(); String
greeting = (String)prefs.getValue(
"greeting", "Hello! Welcome to our portal."); %>
<p><%= greeting %></p>
<portlet:renderURL var="editGreetingURL">
<portlet:param name="mvcPath" value="/edit.jsp" />
</portlet:renderURL>
<p><a href="<%= editGreetingURL %>">Edit greeting</a></p>
- Liferay Portal 은 multi parameters들을 포틀릿에 전달하므로 namespace 구분을 하는게 중요하다
<portlet:namespace /> 를 사용하면 포틀릿별 유니크한 네임스페이스를 가질 수 있다
예) submitForm(document.<portlet:namespace />fm); form에 대한 것
Liferay는 namespaced 파라미터만 포틀릿에 접근할 수 있다. 그러나 third-part 에서 unamespaced parameter가 존재하면
liferay-portal.xml 에서 기능을 꺼주어야 한다.
<requires-namespaced-parameters>false</requires-namespaced-parameters>
Multi Action 추가
- 포틀릿에 원하는 Action만큼 추가할 수 있다
1) 메소드 명칭은 사용자 정의 & 두개의 파라미터 받음
public void setGreeting(ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException, PortletException {...
}
public void sendEmail(ActionRequest actionRequest, ActionResponse actionResponse)
throws IOException, PortletException {
// Add code here to send an email
}
2) setGreeting 명칭은 JSP에서 actionURL의 name과 일치해야 한다
<portlet:actionURL var="editGreetingURL" name="setGreeting">
<portlet:param name="mvcPath" value="/edit.jsp" />
</portlet:actionURL>
포틀릿 URL Mapping을 친숙한 방법으로 전환
- v6 부터 human readable 하게 url을 만들 수 있다.
> 원래 보이는 형태
http://localhost:8080/web/guest/home?p_p_id=mygreeting_WAR_mygreetingportlet
&p_p_lifecycle=0&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1
&p_p_col_count=2&_mygreeting_WAR_mygreetingportlet_mvcPath=%2Fedit.jsp
> friendly url 변환
http://localhost:8080/web/guest/home/-/my-greeting/edit
- liferay-portlet.xml 에서 </icon> 이후 <instanceable> 바로 전에 하기 설정을 넣음
1) liferay-portlet.xml 설정 내역
<liferay-portlet-app>
<portlet>
<portlet-name>mobiconsoft_greeting</portlet-name>
<icon>/icon.png</icon>
<friendly-url-mapper-class>com.liferay.portal.kernel.portlet.DefaultFriendlyURLMapper</friendly-url-mapper-class>
<friendly-url-mapping>mobiconsoft_greeting</friendly-url-mapping>
<friendly-url-routes>mobiconsoft/greeting/mobiconsoft-greeting-friendly-url-routes.xml</friendly-url-routes>
<instanceable>false</instanceable>
<header-portlet-css>/css/main.css</header-portlet-css>
<footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
</portlet>
2) src/main/resources/폴더 밑의 monbiconsoft/greeting/ 폴더 밑으로 mobiconsoft-greeting-friendly-url-routes.xml 생성 및 입력
<?xml version="1.0"?>
<!DOCTYPE routes PUBLIC "-//Liferay//DTD Friendly URL Routes 6.2.0//EN"
"http://www.liferay.com/dtd/liferay-friendly-url-routes_6_2_0.dtd">
<routes>
<route>
<pattern>/{mvcPathName}</pattern>
<generated-parameter name="mvcPath">/{mvcPathName}.jsp</generated-parameter>
</route>
</routes>
3) eclipse의 context menu에서 "Liferay" -> "Maven" -> "deploy"를 선택하면 war파일 생성됨
4) eclipse에서 테스트 서버 수행하면 deploy 폴더의 war 파일들이 자동배포된다. test@liferay.com (패스워드 : test) 로그인
로그인후 우측 상단의 "+" 를 클릭하고 Sample 메뉴에서 mobiconsoft_greeting을 추가하면 하기 무한루프 오류가 발생함
(추후 오류현상 추적필요)
시도하고 시도해 보고 실패에서 배워보자. 다음엔 포틀릿를 좀 더 고도화 해보자
<참조>
'Study Frameworks > Liferay Portal' 카테고리의 다른 글
[Liferay Portal] Portlet개발 (Template 공유) - 4 (0) | 2014.05.27 |
---|---|
[Liferay Portal] Portlet개발 (기존 Portlet Plugin 확장) - 3 (0) | 2014.05.27 |
[Liferay Portal] Portlet개발 (포틀릿 생성하기) - 1 (0) | 2014.05.06 |
[Liferay Portal] 개발환경구성 (Maven Build 환경) - 6 (0) | 2014.05.05 |
[Liferay Portal] 개발환경구성 (Service Builder, Plugins SDK) - 5 (0) | 2014.05.02 |