수색…


소개

이 매뉴얼에는 포틀릿이 서로간에 조정하거나 통신 할 수있는 다양한 방법과 특정 접근법이 사용되는 다양한 시나리오가 포함되어 있습니다.

비고

참고 문헌 :

  1. Public render param
  2. JSR 286 사양
  3. 포틀릿 세션

공용 렌더링 매개 변수 사용

이 접근법은 JSR 286에서 소개되었습니다.

JSR 168에서 portlet의 processAction 에 설정된 렌더링 매개 변수는 해당 포틀릿에서만 사용할 수있었습니다. Public Render Parameters 기능을 사용하면 다른 포틀릿의 렌더링에서도 한 portlet의 processAction 에 설정된 렌더링 매개 변수를 사용할 수 있습니다. 이를 지원하는 모든 포틀릿에 대해

portlet.xml 에서 포틀릿 태그가 끝나기 직전에 <supported-public-render-parameter> 태그를 추가하십시오.

<security-role-ref>
    <role-name>user</role-name>
</security-role-ref>
<supported-public-render-parameter>{param-name}</supported-public-render-parameter>
</portlet>

<portlet-app> 태그가 끝나기 바로 전에 <public-render-parameter> 태그를 추가하십시오.

  <public-render-parameter>
    <identifier>{param-name}</identifier>
    <qname xmlns:x="localhost">x:{param-name}</qname>
  </public-render-parameter>
</portlet-app>

processAction 메소드에서 param 값을 응답에 설정해야합니다.

res.setRenderParameter({param-name},{param-value});

관련 포틀릿의 조치 단계를 실행 한 후에 필요한 모든 포틀릿에 대해이 작업을 수행하면 완료되었으므로 동일하거나 다른 애플리케이션의 일부인 것과 관계없이 페이지의 모든 지원 포틀릿에 대한 매개 변수가 렌더링 단계에서 사용 가능해야합니다 (전쟁 ).

포틀릿 세션 사용

이것은 JSR 168 이후에 존재해온 하나의 접근 방식입니다. 포틀릿 세션을 사용하여 속성을 공유 할 수 있습니다. 포틀릿 세션은 다양한 유형의 범위를 가질 수 있습니다.

  1. 포틀릿 범위 (포틀릿에서만 사용할 수있는 특성)
  2. 애플리케이션 범위 (전체 애플리케이션 [war] 내에서 사용 가능한 속성)

이 방법을 사용하려면 포틀릿 요청에서 포틀릿 세션을 쉽게 사용할 수 있으므로 포틀릿 구성에 항목을 작성할 필요가 없습니다.

PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.APPLICATION_SCOPE);

또는

PortletSession session = renderRequest.getPortletSession();
session.setAttribute("attribute-name","attribute-value", PortletSession.PORTLET_SCOPE);

이 속성은 해당 범위에서만 검색 할 수 있습니다. 포틀릿 범위에서 설정된 속성과 마찬가지로 다음을 사용하여 가져와야합니다.

PortletSession session = renderRequest.getPortletSession();
String attributeValue = (String) session.getAttribute("attribute-name", PortletSession.PORTLET_SCOPE);

이 접근법의 가장 큰 한계는 애플리케이션 범위 밖에서 다른 포틀릿 간 공유가 부족하다는 점입니다.이를 극복하기 위해 <private-session-attributes >를 liferay-portlet.xml 에 추가하는 평생 특별한 방법이 있습니다

    <private-session-attributes>false</private-session-attributes>
    <header-portlet-css>/css/main.css</header-portlet-css>
    <footer-portlet-javascript>/js/main.js</footer-portlet-javascript>
    <css-class-wrapper>{portlet-name}</css-class-wrapper>
</portlet>

속성이 설정되고 검색되는 모든 포틀릿에 대해

이벤트 기능 사용

이벤트 메커니즘은 사용자 정의 오브젝트를 다른 포틀릿에 전달하는 추가 기능이 있지만 이벤트 단계의 오버 헤드가있는 공용 렌더링 매개 변수의 확장 버전입니다.

이를 달성하기 위해이 메커니즘은

  1. 게시자 포틀릿
  2. 프로세서 (소비자) 포틀릿, 둘 다 다른 포틀릿 애플리케이션의 일부일 수 있습니다.

시작하기,

portlet.xml 의 게시자 포틀릿에 <supported-publishing-event> 태그를 추가하십시오.

    <security-role-ref>
        <role-name>user</role-name>
    </security-role-ref>
    <supported-publishing-event>
         <qname xmlns:x="http:sun.com/events">x:Employee</qname>
    </supported-publishing-event>
  </portlet>

portlet.xml 의 프로세서 포틀릿에 <supported-processing-event> 태그를 추가하십시오.

<security-role-ref>
        <role-name>user</role-name>
    </security-role-ref>
    <supported-processing-event>
        <qname xmlns:x="http:sun.com/events">x:Employee</qname>
     </supported-processing-event>
</portlet>

두 개의 포틀릿에 <event-definition> 태그를 추가하고 portlet.xml 에서 event-name 및 type을 정의합니다.

<event-definition>   
  <qname xmlns:x="http:sun.com/events">x:Employee</qname>
  <value-type>com.sun.portal.portlet.users.Employee</value-type>
</event-definition>
   </portlet-app>

다음으로 이벤트 유형에 대한 클래스를 작성해야합니다 (사용자 정의 유형의 경우).

public class Employee implements Serializable {
  public Employee() {
  }
  private String name;
  private int userId; 

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getUserId() {
    return userId;
  }
  public void setUserId(int id)
  {
    this.userId = id;
  }

}

이제 게시자 포틀릿에서 이벤트를 작업 단계에 게시해야합니다.

    QName qname = new QName("http:sun.com/events" , "Employee");
    Employee emp = new Employee();
    emp.setName("Rahul");
    emp.setUserId(4567);
    res.setEvent(qname, emp);

이벤트를 게시 한 후에 이벤트 단계에서 게시자 포틀릿에 의해 처리되어야합니다.

이벤트 단계는 JSR 286에서 도입되었으며 적용 가능한 경우 포틀릿의 렌더링 단계 전에 실행됩니다

@ProcessEvent(qname = "{http:sun.com/events}Employee")
public void processEvent(EventRequest request, EventResponse response) {

    Event event = request.getEvent();
    if(event.getName().equals("Employee")){
      Employee payload = (Employee)event.getValue();
      response.setRenderParameter("EmpName",
      payload.getName());
    }

}

그런 다음 렌더 요청을 통해 렌더 매개 변수에서 검색 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow