jsf集成spring_Spring和JSF集成:导航

jsf集成spring

我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”,因此,如果您签出代码,请注意它是一个不断变化的目标。 期待一些粗糙的边缘,如果有时会断裂,不要感到惊讶。

您已经可以很轻松地将Spring与JSF结合使用,Spring可以管理bean,而JSF可以处理屏幕。 Spring Web Flow中还对JSF提供了一些非常好的支持,如果您正在做任何基于流的应用程序,那么您确实应该使用Web Flow。 Web Flow还提供org.springframework.faces.mvc. JsfView类,使您可以从Spring MVC呈现JSF页面。 不幸的是, JsfView仅呈现瞬态(无状态)视图,如果您想处理回发,则JsfView走运。

允许Spring MVC渲染可以处理回发的JSF视图一直是我启动该项目的主要动力。 得益于MVC和JSF的灵活性,完全可以集成这些技术(尽管关于如何最好地保存其他帖子的确切细节)。 我想在本文的其余部分中讨论如何创建非常好的JSF导航。

如果您使用了标准的JSF导航,则可能已经习惯了faces-config.xml的以下类型的事情:

<navigation-rule>
    <from-view-id>/pages/list.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>select</from-outcome>
        <to-view-id>/pages/details.xhtml</to-view-id>
        <redirect/>
    </navigation-case>
</navigation-rule>

虽然很容易理解,但是对于标准方法来说,标准方法存在一些明显的缺点,因为它非常冗长。 大多数时候,我想重定向我的用户,而不是让他们对URL为什么显示与当前页面不同的东西感到困惑。 实际上在每个元素上都需要<redirect/>确实很烦人。 XML的数量显然使JSF的开发人员感到不安,幸运的是,JSF 2.0引入了隐式导航的概念。 这是我们稍后将使用的东西。 如果您想阅读有关JSF导航的非常好的文章,请使用Dan Allen撰写的JSF 2中Fluent Navigation

导航实际上与目的地有关,将某人重定向到404 page not found错误没有多大意义。 对于JSF而言,创建漂亮的可读URL目标始终是一件艰苦的事情。 现在,在不开发自己的代码的情况下,创建可读URL的最佳选择可能是使用PrettyFaces 。 当然,通过将JSF和Spring很好地集成在一起,您无需使用@RequestMapping注释以外的任何其他方法来创建可读的URL。 下面的示例演示如何映射一个可读的URL,以显示ID中的酒店详细信息。

@Controller
public class HotelsController {
  @RequestMapping(value = "/hotels/{id}", method = RequestMethod.GET)
  public String show(@PathVariable Long id, Model model) {
    model.addAttribute(bookingService.findHotelById(id));
    return "hotels/show";
  }
}

有了@RequestMapping批注,我们可以再次考虑导航。 通常, <h:commandButton><h:button><h:commandLink><h:link>组件将用于触发导航,例如:

<h:commandButton value="Go" action="select">

在此,当用户单击"Go"按钮时, "select"动作开始,并且导航规则用于查找目的地。 当我们要远离定义导航XML时,我们需要一种替代方法来查找MVC目标。 稍微颠覆JSF对隐式导航的支持为我们提供了一种很好的方法。 通过一些集成代码,我们可以支持特殊的"spring:"前缀,该前缀告诉JSF使用Spring MVC解析目标。

<h:commandButton value="Go" action="spring:redirect:/spring/hotels/123"/>

上面的示例将使用在Spring MVC中注册的ViewResolver来解析"redirect:/spring/hotel/123" 。 在这种情况下, UrlBasedViewResolver将选择"redirect:"并将使用RedirectView
很好,但是将酒店ID "123"硬编码到视图名称中并不实际。 幸运的是有一个答案:

<h:commandButton value="Go" action="spring:redirect:/spring/hotels/{id}">
    <f:param name="id" value="#{resultItem.id}/>
</h:commandButton>

commandButton所有<f:param>子标记将用于构造MVC视图的模型。 在这种情况下,我们得到一个包含“ id=#{resultItem.id} ”的模型。 EL值表达式#{resultItem.id}将在呈现视图之前解析。 Spring 3.1中的RedirectView类将处理URL模板变量,因此“ /spring/hotels/{id} ”将选择“ id ”以呈现完整的URL。

使用上述方法的一点烦恼是您需要在XHTML文件以及@RequestMapping批注中定义URL。 作为替代方案,您可以使用特殊的“ @bean.method ”符号表示您要导航到指定控制器bean方法上的@RequestMapping的值:

<h:commandButton value="Go" action="spring:@hotelsController.show">
    <f:param name="id" value="#{resultItem.id}/>
</h:commandButton>

如果在控制器bean上有多个@RequestMapping方法,则可以使用甚至更短的语法“ @method ”(此处假定该bean是当前处理程序)在它们之间进行导航。 当然,并非每种类型的@RequestMapping都可以反向转换为URL,例如,如果您使用通配符,则此操作将无效。 建议是使您的映射尽可能简单。
这种方法的最后一个好处是,我们还可以逆转DataBinder过程。 例如:

public class SearchCriteria implements Serializable {
  private String searchString;
  private int page;
  // ... getters / setters
}
@RequestMapping(value = "/hotels")
public String list(SearchCriteria criteria, Model model) {
  // ...
}
<h:link outcome="spring:@list">
    <f:param name="sc" value="#{searchCriteria}"/>
</h:link>

假设#{searchCriteria} EL表达式解析为包含字符串"California"SearchCriteria对象,并且所构建的URL的整数10将为"/spring/hotels?searchString=California&page=10"

如果您想查看该项目的代码,可以在http://github.com/philwebb/springfaces上找到它。 如文章顶部所述,此代码尚在开发中,因此请注意一些问题。 路线图上的下一个任务是支持@NavigationMapping批注,该批注将允许以编程方式进行导航。

参考: 集成Spring和JavaServer Faces: JCG合作伙伴 Phillip Webb的 导航  Phil Webb的Blog上


翻译自: https://www.javacodegeeks.com/2012/03/spring-jsf-integration-navigation.html

jsf集成spring

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值