liferay
Интер-портлетная связь
Поиск…
Вступление
замечания
Рекомендации:
Использование параметра 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. Он позволяет обмениваться атрибутами с помощью сеанса портлета. Сеанс портлета может иметь разные типы областей:
- Область портлета (атрибуты доступны только в портлете)
- Область применения (атрибуты доступны в пределах всего приложения [войны])
Чтобы использовать этот подход, нам не нужно делать какие-либо записи в конфигурации портлета, поскольку сеанс портлета легко доступен в запросе портлета:
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, с добавочной функцией для передачи пользовательских объектов другим портлетам, но с накладными расходами фазы события.
Для этого этот механизм состоит из
- Портлет издателя
- Портлет (потребитель), где оба могут быть частью различных приложений портлета.
Начать с,
Добавьте <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());
}
}
который затем может быть извлечен из параметра рендеринга через запрос визуализации.