action
属性绑定到支持bean来实现动态导航: <h:commandButton action="#{bean.actionBasedOnAge}"/>
public String actionBasedOnAge() {if(age < 12) {return "fetchadult";} else {return "ok"}
}
上面的示例显示了十二岁以下的人如何被定向到'fetchadult'
而不是通常的'ok'
。 'fetchadult'
和'ok'
结果都需要在faces-config.xml
定义导航规则,以便JSF知道要显示的实际页面。
使用Spring MVC时,将导航逻辑包含在@Controller
bean中通常更为自然。 为了解决这个问题,从MVC渲染JSF时,隐式的'controller'
和'handler'
变量可用。 'controller'
变量提供对映射到原始请求的控制器bean的访问,并提供对基础MVC处理程序的'handler'
变量的访问。 在Spring 3.0中, 'controller'
和'handler'
通常是同一对象。 但是,在Spring 3.1中,底层的MVC体系结构正在发生变化 , 'handler'
通常是org.springframework.web.method.HandlerMethod
实例。
这是一个引用@Controller
的someNavigation()
方法的提交按钮:
<h:commandButton action="#{controller.someNavigation"/>
虽然访问控制器bean很有用,但它不是理想的解决方案。 我更喜欢在我的JSF页面中使用逻辑名并映射那些Java方法。 我还想要一种简单的方法来从基础模型中获取数据。
@NavigationMapping
批注提供了另一种更灵活的导航方法。 它的工作方式与@RequestMappings
非常相似。 注释可以放在@Controller
任何公共方法上,以将导航结果映射到目的地。
<h:commandButton action="submit"/>
@NavigationMapping
public String onSubmit() {return "redirect:http://www.springsource.org";
}
如果您需要访问支持bean,则可以使用标准的Spring @Value
注释。 页面可以解析的任何EL表达式也可以在导航方法参数上使用。
@NavigationMapping
public String onSubmit(@Value("#{person.age}") int age) {
...
}
访问模型元素甚至更加容易。 只要您只有一个要在模型中访问的类型的对象,并且它不是简单类型(int,String等),就不需要任何注释:
@NavigationMapping
public String onSubmit(Person p) {
...
}
也可以使用其他参数类型(有关完整列表,请参见JavaDoc)。 例如,这是一个导航映射,处理'submit'
, 'cancel'
和'save'
结果。 注入的参数告诉我们单击了三个结果中的哪个,并提供了对源UIComponent
访问。
@NavigationMapping('submit','cancel','save')
public String handleNavigation(String outcome, UIComponent source) {
...
}
返回类型也同样灵活。 您可以返回视图名称作为String
S,你也可以使用相同的"@hotelsController.show"
符号,我以前的博客上讲述 。 您也可以直接返回View object
,或者如果要包含隐式模型项,则可以使用NavigationOutcome
。
最后,如果只想呈现即时响应,则可以使用@ResponseBody
批注或返回HttpEntity
。 它的工作方式与Spring完全相同。
参考: 集成Spring和JavaServer Faces:来自Phil Webb博客博客中的JCG合作伙伴 Phillip Webb的动态导航 。
翻译自: https://www.javacodegeeks.com/2012/05/spring-jsf-integration-dynamic.html