Навигация по портлетам Faces — WebSphere Portal — JSR 286

В нашем проекте мы меняем версию JSR (со 168 на 286) проектов портлетов. Все портлеты являются портлетами Faces, а используемая версия jsf — jsf1.2. У нас есть несколько модулей, но структура почти одинакова. Это портлеты с левой стороны, они действуют как левая навигация для пользователей. С правой стороны у нас есть основные портлеты, в которых размещены различные функции приложения. IPC используется для отправки этих выбранных значений из левого портлета в правый портлет, и соответственно представление устанавливается для правого портлета.

В методе processEvent портлетов представление целевого портлета задается на основе полученных значений. Пример метода processEvent выглядит следующим образом:

public void processEvent(EventRequest request, EventResponse response) throws PortletException, java.io.IOException 
    {   
        super.processEvent(request, response);
        Event sampleEvent = request.getEvent();
        if(sampleEvent.getName().toString().equals("ProcessEvent")) {
            Object sampleProcessObject = sampleEvent.getValue();
            System.out.println("Message Received : " + sampleProcessObject.toString());
            TargetPortletView obj = (TargetPortletView) request.getPortletSession().getAttribute("pc_TargetPortletView"); // Managed Bean associated with the target Page
            obj.setMessage(sampleProcessObject.toString());
            request.getPortletSession().setAttribute("com.ibm.faces.portlet.page.view","/TargetPortletView.jsp");//Target JSP is set
        }
    }

Но если в целевом jsp происходит навигация по некоторым лицам, и представление перенаправляется на другой jsp (например, A.jsp->B.jsp->C.jsp). Затем снова если выбор сделан из левого портлета, вид правого портлета остается прежним и не обновляется, хотя IPC происходит правильно. Пожалуйста, дайте мне знать, если потребуются какие-либо другие подробности. Заранее спасибо.


person Debarshi DasGupta    schedule 31.05.2013    source источник


Ответы (2)


Справка Rational Application Developer v9.0 содержит запись Переход на другую страницу в портлете JSF, что объясняет аналогичный сценарий.

person mgrosze    schedule 31.07.2013

Вам необходимо сбросить представление целевого портлета с помощью NavigationHandler. Используйте что-то вроде следующего кода. Там, где xxxxxxxxxx, замените его на строку, которую вы определили как результат лиц, который сопоставляется со страницей лиц, которую вы хотите загрузить (см. правило навигации ниже — измените соответствующим образом).

 // Reset view
FacesContext facesContex = FacesContext.getCurrentInstance();
NavigationHandler nav = facesContext.getApplication().getNavigationHandler(); nav.handleNavigation(facesContext, null, **xxxxxxxxxxx**);
                    facesContext.renderResponse();
                    super.saveViewState(facesContext);

                    facesContext.release();

-----------
in faces-config:

    <navigation-rule> 
        <from-view-id>/pages/*</from-view-id> 
        <navigation-case> 
          <from-outcome>reset</from-outcome> 
          <to-view-id>/TargetPortletView.jsp</to-view-id> 
        </navigation-case> 
     </navigation-rule> 
person zargarf    schedule 03.06.2013
comment
zarfarf-Спасибо за ответ. Я понял подход, который вы разделили. Но проблема в том, что у нас нет фиксированной целевой страницы (например, /TargetPortletView.jsp), поэтому to-view-id будет варьироваться от одного сценария к другому. Поэтому нам нужен механизм для динамической установки идентификатора целевого представления из метода processEvent на основе входных данных, которые мы получаем через IPC. - person Debarshi DasGupta; 03.06.2013