JSF: MyFaces CODI, безопасная навигация и f: viewParam - PullRequest
1 голос
/ 05 августа 2011

Я пробую MyFaces CODI с его замечательными функциями. Очень полезная вещь - это безопасная навигация. Я могу указать результат метода действия в моем компоненте контроллера следующим образом:

public Class<? extends ViewConfig> goBack() {
    return Pages.ListView.class;
}

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

Но когда я хочу использовать эту функцию, у меня возникает проблема с передачей viewParameter к следующему представлению. Я должен использовать командную кнопку для вызова этого метода действия, как это:

<h:commandButton id="backButton" value="#{msgs.Button_Back}" 
action="#{viewBean.goBack()}" />

Если я использую эту командную кнопку, я не могу передать параметры. «Обычная» кнопка или ссылка сделают это:

<h:button id="backButton" value="#{msgs.Button_Back}" outcome="siteBefore.xhtml">
   <f:param name="itemId" value="5" />
</h:button>

Недостаток в том, что «обычная» кнопка не использует метод действия, и поэтому я не могу участвовать в преимуществах безопасной навигации по CODI.

Так есть ли возможность объединить эти две функции? (передавая вид и используя безопасную навигацию)

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Они реализовали то, что вы ищете.Смотри https://issues.apache.org/jira/browse/EXTCDI-216

0 голосов
/ 08 августа 2011

@ StevenR

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

https://issues.apache.org/jira/browse/EXTCDI-171

Из истории вопроса вы можете сказать, что они недавно обновили статус (~ 4 недели назад), и он может быть добавлен в ближайшее время. Может быть, кто-то из комиттеров следит за этим постом и может сообщить нам приблизительный график для этой новой функции?

Более того, функция безопасной навигации по типу обсуждалась в спецификации JSF:

http://java.net/jira/browse/JAVASERVERFACES_SPEC_PUBLIC-977

В качестве обходного пути я бы предложил следовать подсказке в вики CODI (см. Часть URL-адреса ниже) и использовать Pages.ListView.class.getName(), где вы можете объединить дополнительные viewParams в методе действия вашего компонента поддержки. Таким образом, ваша навигация будет безопасна, и вы сможете использовать возможности рефакторинга в IDE. Только параметры не будут в этом случае безопасны от типа ...

Я бы посоветовал вам использовать тег <f:attribute/>, чтобы вам не приходилось проходить через это, как этот

String viewParam = "";
for (UIComponent comp : event.getComponent().getChildren()) {
   if (comp instanceof UIParameter ) {
      UIParameter myParameter = (UIParameter) comp;
    if (myParameter.getName().equals("myParameterName")) {
        viewParam = myParameter.getValue());
    }
}
}
// add your viewParam to the navigation string here

Недостатком здесь является жестко закодированное имя параметра где-то глубоко внутри вашего кода. Так что может быть целесообразно провести рефакторинг, когда CODI поставляется с новой функцией

cwiki.apache.org / EXTCDI / JSF-usage.html # JSFUsage-TypesafeNavigation

...