Использование JSR-268 IPC для портлетов на разных страницах в Liferay - PullRequest
0 голосов
/ 05 января 2012

Я начал разрабатывать приложение на основе портлетов, используя WebSphere Portal, и теперь я переключаю свою среду разработки на Liferay.Я использую систему событий, представленную в JSR-286, для связи между портлетами, пытаясь избежать всех нестандартизированных функций, чтобы обслуживать и WebSphere Portal, и Liferay в качестве поддерживаемых сред.портлет публикации и принимающий портлет находятся на одной странице, но я хотел бы разместить эти портлеты на разных страницах.На WebSphere есть страница конфигурации "Wiring", где можно настроить портлеты для отправки событий определенным портлетам на других страницах, и есть опция для автоматического переключения страницы при возникновении такого события.

Как мнесделать это с помощью Liferay?

Использование: Liferay Portal Community Edition 6.1.0 CE (Paton / Build 6100/15 декабря 2011 г.)

Ответы [ 2 ]

2 голосов
/ 06 января 2012

Есть несколько свойств, которые вы можете установить в portal-ext.properties.Цитирую с комментариями к ним (поскольку они, вероятно, излагают использование лучше, чем я мог бы сделать сам:

##
## Portlet Coordination
##

#
# Set this property to specify how events are distributed. If the value is
# "layout-set", then events will be distributed to all portlets contained in
# a layout set. If the value is "layout", then events will be distributed to
# all portlets that are present in a layout.
#
portlet.event.distribution=layout

#
# Set this property to specify how public render parameters are distributed.
# If the value is "layout-set", then public render parameters will be
# distributed to all portlets contained in a layout set. This will only work
# correctly if the property "layout.default.p_l_reset" is set to false. If
# the value is "layout", then public render parameters will be distributed
# to all portlets that are present in a layout.
#
portlet.public.render.parameter.distribution=layout

.....

#
# Set the default value for the "p_l_reset" parameter. If set to true, then
# render parameters are cleared when different pages are hit. This is not
# the behavior promoted by the portlet specification, but is the one that
# most end users seem to prefer.
#
layout.default.p_l_reset=true

Надеюсь, что помогает

1 голос
/ 09 января 2012

Ответ Олафа дает вам хорошее начало. Просто поместите файл с именем portal-ext.properties в ваш путь к классу с содержанием portlet.event.distribution=ALL. Это гарантирует, что все портлеты, которые занимаются этим событием, получат его, даже если он находится на другой странице.

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

interface Events
{
  public static final String EVENT_NAME_X ="eventX"; // as defined in portlet.xml
  public static final String EVENT_NAME_Y ="eventY";
  public void fireEventX(ActionResponse response, ParamType param);
  public void fireEventY(ActionResponse response, ParamType param);
}

Тогда у вас может быть простая реализация, которая запускает ваши события, которую вы можете использовать с WebSphere:

public class SimpleEvents implements Events
{
    @Override
    public void fireEventX(ActionResponse response, ParamType param)
    {
        response.setEvent(EVENT_NAME_X, param);
    }

    @Override
    public void fireEventY(ActionResponse response, ParamType param)
    {
        response.setEvent(EVENT_NAME_Y, param);
    }
}

Тогда у вас может быть другая реализация для Liferay, которая выглядит следующим образом:

public class RedirectingEvents extends SimpleEvents
{
  private String eventXRedirect;
  private String eventYRedirect;

    @Override
    public void fireEventX(ActionResponse response, ParamType param)
    {
        super.fireEventX(param);
        if (eventXRedirect != null)
          response.sendRedirect(eventXRedirect);
    }

    @Override
    public void fireEventY(ActionResponse response, ParamType param)
    {
        super.fireEventY(param);
        if (eventXRedirect != null)
          response.sendRedirect(eventYRedirect);
    }
    // setters & getters
}

Теперь, если вы используете Spring IoC (что, как мне кажется, известно, что вы это делаете), вы можете настроить реализацию следующим образом в файле application-context.xml:

<bean class="package.RedirectingEvents" primary="true">
  <property name="eventXRedirect" value="/page-after-X-event" />
  <property name="eventYRedirect" value="/page-after-Y-event" />
</bean>

Вот как вы можете получить "value" -часть для этого фрагмента xml:

Откройте целевую страницу в LifeRay, на которую следует перенаправить пользователя после того, как событие было запущено, в то же время входя в систему с соответствующими привилегиями, и щелкните меню в верхней части страницы на странице «Управление» ->. Там вы можете установить «Дружественный URL». Скопируйте тот же URL, который вы ввели в поле Friendly-URL (без неизменяемого префикса) в приведенный выше фрагмент application-context.xml.

В ваших классах, которые запускают события, вы можете просто разрешить автоматическое подключение интерфейса событий и использовать его следующим образом:

@Controller
class Foobar
{
  @Autowired
  private Events portletEvents;
  @ActionMapping
  public void action(ActionRequest request, ActionResponse response)
  {
    portletEvents.fireEventX(someParam);
  }
  @EventMapping(Events.EVENT_NAME_Y)
  public void handleEventRequest(EventRequest request, EventResponse response)
  {
    Object value = request.getEvent().getValue();
    log.info("got Y event! Value is: " + value);
  }
}

Если вы развертываете свое приложение в WebSphere Portal, вы просто заменяете приведенный выше фрагмент xml следующим:

<bean class="package.SimpleEvents" primary="true" />

Теперь у вас есть решение, которое позволяет вам отправлять сообщения JSR-286 по страницам, одновременно переключая страницы, и в то же время иметь возможность развертывать ваше приложение на Liferay и WebSphere Portal без каких-либо изменений в коде (просто Конфигурация должна быть адаптирована).

...