Поиск…


Вступление

Это руководство содержит различные способы, которыми портлет может координировать или связывать друг с другом и различные сценарии, для которых используется конкретный подход.

замечания

Рекомендации:

  1. Параметр public render
  2. Спецификации JSR 286
  3. Сеанс портлета

Использование параметра Public render

Этот подход был введен в JSR 286.

В JSR 168 параметры визуализации, установленные в processAction портлета, были доступны только в этом портлете. С помощью функции Public Render Parameters параметры рендеринга, установленные в processAction одного портлета, будут доступны и в рендеринге других портлетов. Для настройки это, для всех портлетов, поддерживающих это:

Добавьте <supported-public-render-parameter> непосредственно перед тегом портлета в portlet.xml

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

Добавьте <public-render-parameter> непосредственно перед тегом <portlet-app>

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

В методе processAction значение параметра должно быть задано в ответе

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

Сообщение, которое мы выполнили с настройкой этого для всего необходимого портлета, после выполнения фазы действия соответствующего портлета, должен быть доступен в фазе рендеринга для всех поддерживающих портлетов на странице, независимо от того, что они являются частью одного или другого приложения (война ).

Использование сеанса портлета

Это один из подходов, который существует с JSR 168. Он позволяет обмениваться атрибутами с помощью сеанса портлета. Сеанс портлета может иметь разные типы областей:

  1. Область портлета (атрибуты доступны только в портлете)
  2. Область применения (атрибуты доступны в пределах всего приложения [войны])

Чтобы использовать этот подход, нам не нужно делать какие-либо записи в конфигурации портлета, поскольку сеанс портлета легко доступен в запросе портлета:

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>

для всех портлетов, где атрибуты установлены и извлечены.

Использование функции eventing

Механизм событий - это расширенная версия public render param, с добавочной функцией для передачи пользовательских объектов другим портлетам, но с накладными расходами фазы события.

Для этого этот механизм состоит из

  1. Портлет издателя
  2. Портлет (потребитель), где оба могут быть частью различных приложений портлета.

Начать с,

Добавьте <supported-publishing-event> в портлет издателя в portlet.xml

    <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>

Добавьте <supported-processing-event> в портлет процессора в portlet.xml

<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 в portlet.xml

<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