Ответ Олафа дает вам хорошее начало. Просто поместите файл с именем 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 без каких-либо изменений в коде (просто Конфигурация должна быть адаптирована).