Spring和JSF集成:导航
您已经可以很轻松地使用带有JSF的Spring,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
Spring和JSF集成:导航相关推荐
- Spring和JSF集成:转换器
使用任何Web框架时,都不可避免地需要将用户输入的数据从String为其他类型. 尽管Spring和JSF在设计和功能上确实有很大的不同,但它们都具有转换器策略来处理此问题. 让我们从春天开始. Sp ...
- Spring和JSF集成:MVC螺母和螺栓
过去,我曾尝试将JSF与Spring MVC集成在一起,尽管我的第一次尝试成功了,但这远非理想. 这次,我决定做出一些关键决定来帮助我集中精力: 向后兼容. 支持JSF 1.2涉及的工作太多,而Spr ...
- Spring和JSF集成:动态导航
通常,您的JSF应用程序将需要超越基本的静态导航并开始做出动态导航决策. 例如,您可能想根据用户的年龄重定向他们. 大多数JSF教程建议通过将命令的action属性绑定到支持bean来实现动态导航: ...
- Spring和JSF集成:异常处理
大多数JSF开发人员都会熟悉"发生错误"页面,当在他们的代码某处引发意外异常时,该页面就会显示. 该页面在开发时确实很有用,但对于生产应用程序通常不是您想要的. 通常,在用库存JS ...
- Spring和JSF集成:分页
处理大型数据集时,通常需要以分页格式显示数据. 分页是一个有趣的问题,因为它倾向于跨越应用程序的所有层,从视图层通过应用程序服务一直到对数据库的原始调用. 在获取分页数据时,有一些非常好的解决方案. ...
- Spring和JSF集成:选择项目
使用JSF,要使用组合框,列表框和复选框,您需要了解javax.faces.model.SelectItem类. SelectItem表示单个可选选项. 它既包含渲染所需的信息,又包含选择该项目时应绑 ...
- Spring和JSF集成:国际化和本地化
如果您正在开发针对多种语言的JSF应用程序,那么您可能很熟悉<f:loadBundle>标记. 即使您的应用程序不支持使用消息包的国际化仍然是一个好主意. 在<f:loadBundl ...
- jsf集成spring_Spring JSF集成
jsf集成spring Welcome to Spring JSF integration tutorial. JSF is a component based framework with grea ...
- jsf集成spring_Spring和JSF集成:动态导航
jsf集成spring 通常,您的JSF应用程序将需要超越基本的静态导航并开始做出动态导航决策. 例如,您可能想根据用户的年龄重定向他们. 大多数JSF教程建议通过将命令的action属性绑定到支持b ...
最新文章
- 第七篇 JVM核心机制之JVM运行和类加载全过程(二)
- tsp问题 python_ortools tsp问题
- pearson相关系数_三个相关系数的注意事项
- STL之hashtable源代码剖析
- 概率统计笔记:高斯威沙特分布
- linux mysql 1366_Linux MySQl 5.7.17 MySQL ERROR 1366(HY000):Incorrect string value 解决方法
- 个人开发者接入支付宝,Android开发接入支付宝支付...
- PyInstaller库的安装、使用
- plsql中文乱码 显示问号
- LeetCode 996. 正方形数组的数目(回溯+剪枝)
- cd-rom门锁定什么意思_CD-ROM XA的完整格式是什么?
- 常用的sublime text 3插件
- 趣头条确认总编辑肖厚君离职:对现有业务没有任何影响
- 《HBase权威指南》读书笔记(二)
- Pr视频剪辑软件使用小结
- 操作系统——信号量机制(PV操作)
- 留言系统php课程设计,PHP课程设计网络留言板
- FPGA开发板学习(1)
- 内存卡误删除文件怎么恢复
- 有关获取android唯一识别号IMEI的问题
热门文章
- ISO语言代码和国家代码+Locale常量+ISO货币符号
- RabbitMQ--topic
- 谷歌 recaptcha_在Spring Boot应用程序中使用Google reCaptcha
- java 枚举内嵌枚举_高度有用的Java ChronoUnit枚举
- mfc 弹簧_弹簧和线程:异步
- java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势
- akka 消息发送接收_Akka型演员:探索接收器模式
- 成为Java流大师–第5部分:将联接的数据库表转换为流
- 不知所措:您是否真的需要为您的API提供客户端库?
- 使用JUnit 5进行更清洁的参数化测试