liferay
Liferay의 후크
수색…
비고
이것은 Liferay Portal 버전 6.2까지 작동합니다.
JSP 훅
JSP 훅은 핵심 포틀릿 jsp-s를 수정할 수있는 특별한 liferay 플러그인이며, Welcome in my custom login! 을 표시하는 로그인 포틀릿을 수정하려고한다고 가정 해 Welcome in my custom login! .
Hook Plugin의 최소 구조는 다음과 같습니다.
[project-name]-hook/
└── docroot/
├── WEB-INF/
│ ├── src/
│ ├── lib/
│ ├── liferay-hook.xml
│ ├── liferay-plugin-package.properties
│ └── web.xml
└── META-INF/
├── custom_jsps/
└── MANIFEST.MF
liferay-hook.xml 은 여러분이 사용하고있는 후킹 유형을 구분하는 파일입니다. 여기에서 후크 태그 내부에 후크에 대한 적절한 매개 변수를 JSP 후크에 대해 정의합니다.
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<custom-jsp-dir>/custom_jsps</custom-jsp-dir>
</hook>
login.jsp 는 Liferay의 /docroot/html/portlet/login/login.jsp 에 /docroot/html/portlet/login/login.jsp , custom_jsps 폴더에 동일한 이름과 경로를 가진 JSP를 추가해야합니다.
후크가 배치되면 Liferay는 liferay-hook.xml 에서 custom-jsp-dir 값을 찾아 모든 포털 JSP를이 디렉토리에있는 JSP로 liferay-hook.xml . 원본 JSP는 이름이 <orginal name>.portal.jsp 로 저장되어 후크 해제 배포시 복원됩니다.
기본 Liferay 플랫폼 버전의 업데이트 또는 업그레이드가 가능하도록 코드를 유지하려면 새 수정 JSP에서 원본 JSP를 호출 할 수도 있습니다. 이렇게하려면 사용자 정의 JSP에서 다음 패턴을 사용하십시오.
<liferay-util:buffer var="contentHtml">
<liferay-util:include page="/html/{ JSP file’s path }" />
</liferay-util:buffer>
이 경우 { JSP file's path } 는 portlet/login/login.portal.jsp 됩니다. 이렇게하는 것은 원본 JSP를 확장하는 것 입니다.
그런 다음 다음과 함께 콘텐츠를 추가 할 수 있습니다.
<%
contentHtml = StringUtil.add("Stuff I'm adding BEFORE the original content", contentHtml,"\n");
contentHtml = StringUtil.add(contentHtml,"Stuff I'm adding AFTER the original content","\n");
%>
<%= contentHtml %>
Struts 액션 후크
훅이 유형의 핵심 포털을 대체하는 데 사용할 수 있습니다 (예 : c/portal/login ) 및 포틀릿 행동 (예 : 스트럿 /login/forgot_password A의 지정)을 Liferay 포털이 작업을 struts-config.xml 의에 파일 WEB-INF 폴더. 작업 무시 :
-
docroot/WEB-INF아래의 hook 플러그인의liferay-hook.xml파일에서 hook 요소 내에struts-action요소를 추가하십시오. -
struts-action요소 안에, 재정의 (override) 할 액션 경로를 지정하는struts-action-path와 사용자 정의 액션 클래스를 지정하는struts-action-impl을 추가하십시오. 다음과 같이 보입니다 :
<struts-action-path>/login/login</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsPortletAction
</struts-action-impl>
</struts-action>
-
BaseStrutsPortletAction을 확장하는 Struts 포틀렛 활동 클래스를 작성하십시오. 이 클래스의 예는 다음과 같습니다.
public class ExampleStrutsPortletAction extends BaseStrutsPortletAction {
public void processAction(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, ActionRequest actionRequest,
ActionResponse actionResponse) throws Exception {
System.out.println("Custom Struts Action");
originalStrutsPortletAction.processAction(originalStrutsPortletAction,
portletConfig, actionRequest, actionResponse);
}
public String render(StrutsPortletAction originalStrutsPortletAction,
PortletConfig portletConfig, RenderRequest renderRequest,
RenderResponse renderResponse) throws Exception {
System.out.println("Custom Struts Action");
return originalStrutsPortletAction.render(null, portletConfig,
renderRequest, renderResponse);
}
}
originalStrutsPortletAction.processAction 과 같이 메서드를 재정의하는 것은 의무 사항은 아니지만 Liferay 포털과 관련하여 작업의 동작을 변경하지 않는 것이 좋습니다. 이 유형의 후크를 사용하여 새로운 Struts 액션을 추가 할 수도 있습니다. 기존 액션을 수정하는 것과 같습니다.이 경우 liferay-hook.xml 은 다음과 같습니다.
<struts-action>
<struts-action-path>/my/custom/path</struts-action-path>
<struts-action-impl>
com.myhook.action.ExampleStrutsAction
</struts-action-impl>
</struts-action>
안녕하세요 사용자 "이름"후크와 함께
이 예는 로그인 후 간단한 "Hello User [name]"을 만드는 방법을 보여줍니다. 이 예제는 후크를 사용하여 사용자 지정 작업 을 수행하는 것을 기반으로합니다.
명령 행 터미널에서 Plugins SDK의 hooks 폴더로 이동하십시오. 후크 프로젝트를 작성하려면 작성 스크립트를 실행해야합니다. 다음은 스크립트를 실행할 때 따르는 형식입니다.
[sh | bat] [project-name] "[Hook Display Name]"을 작성하십시오.
Linux 및 Mac OS X에서는 다음 예제와 비슷한 명령을 입력합니다.
./create.sh Hello 사용자 "Hello User"
Windows에서는 다음 예제와 비슷한 명령을 입력합니다.
create.bat Hello 사용자 "My Hook"
Liferay IDE의 새 프로젝트 마법사와 생성 스크립트는 플러그인 SDK의 후크 폴더에서 후크 프로젝트를 생성합니다. Plugins SDK는 프로젝트 이름에 "-hook"를 자동으로 추가합니다.
Liferay IDE에서 또는 명령 행에서 훅 프로젝트를 만들었을 때, 같은 프로젝트 구조로 끝난다.
- 사용자 지정 작업을 트리거 할 이벤트를 결정합니다. 일치하는 이벤트 특성을 찾으 려면 portal.properties 문서를보십시오. 힌트 : 이벤트 속성의 이름은 .event입니다. portal.properties 문서의 다음 섹션에는 세션, 시작, 종료 및 포털 이벤트 등록 정보가 있습니다. 세션 - 시작 이벤트 - 종료 이벤트 - 포털 이벤트
- 후킹 프로젝트에서 com.liferay.portal.kernel.events.Action 클래스 를 확장하는 Java 클래스를 만듭니다 . Action.run (HttpServletRequest, HttpServletResponse) 메서드를 재정의하십시오.
import com.liferay.portal.kernel.events.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.liferay.portal.model.User;
import com.liferay.portal.util.PortalUtil;
public class HelloUser extends Action {
public void run(HttpServletRequest req, HttpServletResponse res) {
User user = PortalUtil.getUser(req);
System.out.println("Hello User "+user.getScreenName());
}
}
중요 : 당신의 액션이 HttpServletRequest 객체에 접근한다면, com.liferay.portal.kernel.events.Action; 그렇지 않으면 com.liferay.portal.struts.SimpleAction을 확장하십시오.
등록 정보가 훅 프로젝트의 docroot에 / WEB-INF / src 폴더 안에, portal.properties 파일 생성합니다. 그런 다음 조치를 수행하려는 이벤트에 해당하는 포털 이벤트 특성의 이름을 추가하십시오. 조치 클래스의 완전한 이름을 특성 값으로 지정하십시오.
`login.events.post=HelloUser`예를 들어, 사용자의 포털 로깅 직전에 클래스의 조치를 수행하려면 action 클래스를 값으로 사용하여 login.events.pre 등록 정보를 지정하십시오. 이 속성 설정처럼 보일 수 있습니다.
중요 : login.events.pre와 같은 포털 속성은 여러 값을 허용하기 때문에 기존 값에 값을 추가해야합니다. 추가 후크에서 속성을 반복적으로 수정할 수 있습니다.
단일 후크 플러그인에서 단일 값을 허용하는 포털 속성 만 수정하십시오. 여러 플러그인에서 속성 값을 수정하면 Liferay는 사용할 값을 알 수 없습니다.
- docroot / WEB-INF / liferay-hook.xml 파일을 편집하고
후크의 포털 속성 파일 이름을
<portal-properties>...</portal-properties>요소를
후크의<hook>...</hook>요소에 있습니다. 예를 들어, 훅의 특성 파일 이름이 portal.properties 인 경우 , 다음 요소를 지정하십시오.
<portal-properties>portal.properties</portal-properties>
- 후크를
ant clean deploy하고 후크 경로로 이동하여ant clean deploy를 입력하면 dist 폴더에 .war가 표시됩니다.
이제 liferay에 로그인하면 서버 로그에 "Hello user Admin"과 같은 메시지가 표시됩니다.
모델 리스너 훅
배경
Model Listener hook은 모델에서 취한 이벤트를 수신하고 응답으로 코드를 실행하는 Liferay 플러그인 유형입니다. 모델 리스너 후크는 사용자 정의 Struts 액션 후크와 비슷하지만 포털에서 수행 한 작업에 응답합니다. 그러나 Struts 액션이 사용자가 취한 액션에 응답하는 동안 Model Listener는 Liferay 모델과 관련된 이벤트 (전후)에 응답합니다.
차이점
다음은 Struts Actions v Model Listener의 몇 가지 예입니다.
- 스트럿츠 액션
- 사용자 로그인
- 계정 생성
- 세션 확장
- 폴더 이동
- 모델 리스너
- 폴더가 생성 된 후
- 사용자 정보가 업데이트되면
- 북마크가 제거 된 후
- 역할 제휴가 이루어지기 전에
Liferay의 아키텍처를 배우기위한 최상의 리소스는 소스 코드를 사용하는 것입니다. 모든 소스 파일은 GitHub에 있으며 JavaDocs를 통해 볼 수 있습니다. JavaDocs의 모든 핵심 포털 모델과 GitHub의 모든 Struts 작업 을 볼 수 있습니다.
예
이 튜토리얼에서는 모델 리스너를 개발하여 계정이 처음 생성 된 후 사용자에게 전자 메일을 보냅니다. 이를 위해 우리는 Liferay의 BaseModelListener를 확장 할 UserModelListener 라는 클래스를 작성하려고합니다. 우리는 잠깐 후크 생성을 살펴보고 다음 설정 파일에 필요한 수정 사항을 다룰 것입니다.
portal.properties
liferay-hook.xml
시작하기
Model Listener 후크 개발을 시작하려면 먼저 Liferay IDE 또는 Liferay Developer Studio 응용 프로그램을 실행해야합니다.
Liferay IDE와 Liferay Developer Studio는 모두 사용자 정의 Eclipse 개발 환경입니다. 그것들은 놀랍도록 비슷하며 한 방향의 지시만으로 두 환경 모두에 충분해야합니다.
개발 환경에서 다음 단계를 실행하십시오.
- 왼쪽 상단에서 파일을 클릭합니다.
- 마우스를 새 항목 위로 가져갑니다.
- Liferay 플러그인 프로젝트를 클릭하십시오.
이 창을 스폰합니다.
위에 표시된 정보를 입력하십시오.
- 프로젝트 이름 : 사용자 모델 수신기
- 기본 위치 사용을 선택 하십시오.
- 빌드 유형 : Ant
- 플러그인 유형 : 후크
프로젝트가 Liferays Plugins SDK Hook 디렉토리에 있는지 확인하십시오. SDK 와 런타임을 적절하게 선택해야합니다.
패키지 탐색기 Perspective에서 다음 디렉토리 구조를 볼 수 있습니다.
리스너 개발
이제 훅을 만들었 으므로 사용자 정의 UserModelListener 클래스를 만들어야합니다. 이 클래스는 Liferay의 BaseModelListener 클래스를 확장합니다.
Liferay의 BaseModelListener 클래스는 ModelListener 인터페이스를 구현하는 추상 클래스입니다. ModelListener 인터페이스를 직접 구현하지 않으려면 ModelListener 인터페이스를 모두 재정의해야합니다.
ModelListener 인터페이스는 BaseModelListener 추상 클래스를 통해 다음 메소드를 제공합니다.
- onAfterAddAssociation
- onAfterCreate
- onAfterRemove
- onAfterRemoveAssociation
- onAfterUpdate
- onBeforeAddAssociation
- onBeforeCreate
- onBeforeRemove
- onBeforeRemoveAssociation
- onBeforeUpdate
다음 디렉토리에 UserModelListener 클래스를 만듭니다. GUI를 통해 클래스를 생성하려면 다음 명령을 실행하기 만하면됩니다.
- 왼쪽 상단에서 파일 을 클릭하십시오.
- 마우스를 새 항목 위로 가져갑니다.
- 클래스를 클릭하십시오.
docroot/
WEB-INF/
src/
아래에 표시된 정보를 입력하십시오.
UserModelListener 클래스 내에 다음 코드를 붙여 넣습니다.
package com.example.hook;
import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.ModelListenerException;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.BaseModelListener;
import com.liferay.portal.model.User;
import javax.mail.internet.InternetAddress;
public class UserModelListener extends BaseModelListener<User> {
private User user = null;
@Override
public void onAfterCreate(User user) throws ModelListenerException {
this.user = user;
if(isValidEmail()) {
sendEmail("[email protected]", user.getEmailAddress(), "Welcome!", "Your account is created!");
}
}
private boolean isValidEmail() {
return Validator.isNotNull(user.getEmailAddress()) && Validator.isAddress(user.getEmailAddress());
}
private void sendEmail(String from, String to, String subject, String body) {
try {
MailServiceUtil.sendEmail(new MailMessage(new InternetAddress(from), new InternetAddress(to), subject, body, false));
} catch (Exception e) {
System.err.print("E-Mail spawned by User Model Listener failed to " + user.getFullName() + " with message " + e.getMessage());
}
}
}
속성 설정
우리의 커스텀 리스너와 우리 모델 사이의 연관 관계를 설정하기 위해 몇 가지 최종 조정이 필요합니다. 먼저, 다음 디렉토리에 새 portal.properties 파일 을 작성 하십시오 .
docroot/
WEB-INF/
src/
+ portal.properties
파일에 한 줄만 추가하면됩니다.
value.object.listener.com.liferay.portal.model.User = com.example.hook.UserModelListener
Model Listener에 대해 우리가 생성하는 관련 속성 값은 다음과 같은 형식이어야합니다.
value.object.listener.fully.qualified.model.name = fully.qualified.listener.name
다시 말해서 com.example.code 안에 CustomerDLFolderModelListener 클래스를 작성하면 DLFolder 모델에 대해 다음과 같은 속성을 갖게됩니다.
value.object.listener.com.liferay.portal.model.DLFolder = com.example.code.CustomerDLFolderModelListener
마지막으로 liferay-hook.xml 파일을 찾습니다. 소스 보기에서 다음을 작성하십시오.
<?xml version="1.0"?>
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd">
<hook>
<portal-properties>portal.properties</portal-properties>
</hook>
설명
- 첫 번째 줄은 문서 버전과 (경우에 따라) 문자 집합을 지정하는 선택적 프롤로그 입니다.
- 2 행은 정식 DocType 정의 (DTD)로 어떤 요소와 속성이 유효한지를 명시 적으로 정의합니다
- 3 행과 5 행은 부모 Hook 요소 (이 DTD에서 지원하는 유효한 요소 중 하나)로 구성됩니다.
- 4 행은 $ {liferay.home} 의 portal.properties 파일을 무시하고 확장합니다.
이 XML 파일에서 사용할 수있는 다른 요소를 보려면 DocType 정의 에서 URL을 참조하십시오. 이는 DTD 가있는 모든 XML 및 SGML 파일에 대해 표준입니다. DTD 가있는 Liferay XML 파일의 또 다른 예는 service.xml ( Hibernate 기반 Liferay의 ORM 구현)입니다.
빌드 및 배포
후크 빌드 및 배포는 간단한 프로세스입니다. Liferay 플러그인 개발은 다음과 같은 빌드 및 의존성 자동화를 지원합니다.
- 개미
- 여자 이름
- 메이븐
- 요람
이 예제에서는 빌드 자동화를 위해 Ant 를 사용했습니다. build.xml 파일은 빌드 명령 ( Ant의 타겟 )을 포함합니다. 후크를 작성하려면 다음 명령을 실행하십시오.
- build.xml 파일 위치
- IDE에서 build.xml 파일을 Ant 퍼스펙티브로 드래그한다.
- 파일을 확장하고 모든 대상을 실행하십시오.
콘솔 뷰에서 다음과 비슷한 내용을 볼 수 있습니다.
Buildfile: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\build.xml
all:
clean:
[delete] Deleting directory C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
clean-portal-dependencies:
compile:
merge:
compile-import-shared:
[mkdir] Created dir: C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[copy] Copying 5 files to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\lib
compile-java:
[copy] Copied 3 empty directories to 3 empty directories under C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
[javac] Compiling 1 source file to C:\liferay-plugins-sdk-6.2-ee-sp11\hooks\User-Listener-Hook-hook\docroot\WEB-INF\classes
merge:
war:
clean-portal-dependencies:
[zip] Building zip: C:\liferay-plugins-sdk-6.2-ee-sp11\dist\User-Listener-Hook-hook-6.2.10.1.war
deploy:
[copy] Copying 1 file to C:\liferay-portal-6.2-ee-sp11\deploy
BUILD SUCCESSFUL
Total time: 7 seconds
후크가 성공적으로 구축되면 이제 포털을 시작하고 배포 할 차례입니다. 서버를 시작하고 훅을 전개하려면 서버 Perspective를 찾으십시오.
- 서버에서 마우스 오른쪽 버튼을 클릭하고 추가 또는 제거를 클릭 하십시오.
- 사용 가능한 선택에서 사용자 - 수신기 - 훅 찾기
- 강조 표시되면 추가 버튼을 클릭하고 확인을 클릭하십시오.
- Server 퍼스펙티브에서 Play 버튼을 클릭한다.
궁금한 사항, 의견, 우려 사항이 있으면 알려주십시오. 건설적인 의견을 보내 주시면 대단히 감사하겠습니다!




