|
1
|
<h:commandButton action="#{bean.actionBasedOnAge}"/> |
|
1
2
3
4
5
6
7
|
public String actionBasedOnAge() { if(age < 12) { return "fetchadult"; } else { return "ok" }} |
В приведенном выше примере показано, как любое лицо младше двенадцати лет направляется на 'fetchadult' вместо обычного 'ok' . Для результатов 'fetchadult' и 'ok' должны быть определены правила навигации в 'fetchadult' faces-config.xml чтобы JSF знал, какую именно страницу отображать.
При работе с Spring MVC часто более естественно иметь логику навигации, содержащуюся в @Controller компоненте @Controller . Чтобы помочь с этим, при рендеринге JSF из MVC доступны неявные переменные 'controller' и 'handler' . Переменная 'controller' предоставляет доступ к bean-компоненту контроллера, который был сопоставлен с исходным запросом, а переменная 'handler' к подчиненному обработчику MVC. В Spring 3.0 'controller' и 'handler' как правило, являются одним и тем же объектом. В Spring 3.1, однако, базовая архитектура MVC изменяется, и 'handler' обычно будет экземпляром org.springframework.web.method.HandlerMethod .
Вот кнопка отправки, которая ссылается на someNavigation() @Controller :
|
1
|
<h:commandButton action="#{controller.someNavigation"/> |
Хотя доступ к компоненту контроллера полезен, это не идеальное решение. Я предпочитаю использовать логические имена на моих страницах JSF и отображать эти методы Java. Я также хочу простой способ вернуться к данным базовой модели.
Аннотация @NavigationMapping предоставляет другой, более гибкий подход к обработке навигации. Он работает очень похоже на @RequestMappings . Аннотация может быть размещена в любом открытом методе вашего @Controller для сопоставления результатов навигации с пунктами назначения.
|
1
|
<h:commandButton action="submit"/> |
|
1
2
3
4
|
Если вам нужен доступ к компоненту @Value можно использовать стандартную аннотацию Spring @Value . Любое выражение EL, которое может разрешить страница, также может использоваться в параметре метода навигации.
|
1
2
3
4
|
@NavigationMappingpublic String onSubmit(@Value("#{person.age}") int age) {...} |
Доступ к элементам модели еще проще. Пока у вас есть только один объект того типа, к которому вы хотите получить доступ в вашей модели, и это не простой тип (int, String и т. Д.), Вам не нужны аннотации:
|
1
2
3
4
|
@NavigationMappingpublic String onSubmit(Person p) {...} |
Также можно использовать другие типы аргументов (полный список см. В JavaDoc). Например, вот навигационное отображение, которое обрабатывает результаты 'submit' , 'cancel' и 'save' . Введенные аргументы сообщают нам, какой из трех результатов был выбран, и предоставляют доступ к исходному UIComponent .
|
1
2
3
4
|
@NavigationMapping('submit','cancel','save')public String handleNavigation(String outcome, UIComponent source) {...} |
Типы возврата также одинаково гибки. Вы можете возвращать имена представлений в виде String , вы также можете использовать ту же нотацию "@hotelsController.show" о которой я ранее писал в блоге . Вы также можете возвращать object View напрямую или использовать NavigationOutcome если хотите включить неявные элементы модели.
И, наконец, если вы просто хотите сделать немедленный ответ, вы можете использовать аннотацию @ResponseBody или вернуть HttpEntity . Это работает точно так же, как Spring.
Ссылка: Интеграция Spring & JavaServer Faces: Динамическая навигация от нашего партнера JCG Филиппа Вебба в блоге Фила Вебба в блоге.