Проблема с навигацией в потоке задач

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

При входе в систему при нажатии кнопки "Отправить" я вызываю управляемый компонент bean "checkInput", который проверяет данные пользователя и переходит на указанную страницу jspx, т.е. метод возвращает соответствующее значение "admin" или "user" для перехода к следующему представлению в потоке задач. пока это не работает нормально.

Моя ситуация заключается в том, что я не хочу нажимать какие-либо кнопки, после ввода значения в текстовом поле и нажатия "Ввод" я хочу перейти к следующему представлению. Для этого я создал clientListener и serverListener и смог вызвать метод serverListener, и я реализовал поток навигация двумя способами

1) Вызов обработчика навигации, как описано ниже, как описано в ссылке: http://adfpractice-fedor.blogspot.in/2012/02/handling-key-modifiers-for-client.html

    public void checkEnterEvent(ClientEvent clientEvent) {
    HandleNavigation(clientEvent.getParameters().get("fvalue").toString());<-- passing parameter here
    //  HandleNavigation("admin");     <--even i hardcoded here for once
    }

    private  void HandleNavigation(String outcome) {  
     System.out.println("IN HandleNavigation");
      FacesContext context = FacesContext.getCurrentInstance();
       NavigationHandler nh = context.getApplication().getNavigationHandler();
         System.out.println(outcome);
         nh.handleNavigation(context, null, outcome);
    }

Это не сработало, а также это решение обходит жизненный цикл jsf, поэтому я реализовал это:

2) второстепенный путь:

  public void checkEnterEvent(ClientEvent clientEvent) {
    navigateByQueueAction();  
  }

  private void navigateByQueueAction() {
   FacesContext fctx = FacesContext.getCurrentInstance();
   UIViewRoot root = fctx.getViewRoot();
   //client Id of button includes naming container like id of region. 
   RichCommandButton button = 
       (RichCommandButton) root.findComponent("cb6");
   ActionEvent actionEvent = new ActionEvent(button);
   actionEvent.queue();
   }

где "cb6" - это идентификатор командной кнопки в файле jspx <af:commandButton text="submit" action="check" id="cb6" visible="false">

но никто из них не работает.

Может кто-нибудь сказать, что не так с моим кодом?

1 ответ

Решение

В описанных выше сценариях я проигнорировал первый, поскольку он имеет недостатки, такие как обход жизненного цикла JSF. Переходя ко второму, я могу вызвать второе окно, нажав ввод на входном тексте, ставя в очередь действие кнопки программно. Теоретически я не знаю, как это решило проблему, и я уверен, что энтузиасты SO(ADF) будут рады услышать от экспертов ADF.

Как вы можете видеть (комментарий справа) в коде javascript в файле jspx, я изменил "немедленный" атрибут метода AdfCustomEvent.queue() на true, это решает мою проблему.

<af:resource type="javascript">
function handleEnterEvent(evt) {        
              var _keyCode = evt.getKeyCode();
              //check for Enter Key
             if (_keyCode == AdfKeyStroke.ENTER_KEY ){          
                var comp = evt.getSource();
                var id=AdfPage.PAGE.findComponentByAbsoluteId('d1');
                AdfCustomEvent.queue(id, "EnterEvent",{fvalue:comp.getSubmittedValue()},true); <-- changed from false to true.
                evt.cancel();
         }
      }
</af:resource>

<af:serverListener type="keyboardToServerNotify"
                     method="#{backingBeanScope.JJS.handleKeyboardEvent}"/>

PS: я открыт для предложений.

Спасибо

Другие вопросы по тегам