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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于 asp.net 点击确定按钮 获取不到新值问题

点击事件内&#xff0c;可以使用request.form[" kk"] 获取到值&#xff0c;但是this.txt.Text 确实旧值&#xff0c; 尼玛&#xff0c;居然没加isPostBack重新加载了数据 &#xff0c;request 并没有更改&#xff0c;就是这样。转载于:https://www.cnblogs.com/yZDn/…

孙叫兽CSDN社区云----WebIT已创建,欢迎大家前端全栈小伙伴踊跃加入

目录 社区云是什么&#xff1f; 创建CSDN社区云WebIT的目的 推荐分享的技术点&#xff08;如下图所示&#xff09; 社区成员权益 版主权益 管理员权益 WebIT社区云积分规则 WebIT优质版主及管理员可以申请直播分享前端技术 WebIT社区云将为社区运营者提供&#xff1a; …

navicat for mysql服务_使用Navicat for MySQL数据库连接服务器中的MySQL服务

本文主要向大家介绍了使用Navicat for MySQL数据库连接服务器中的MySQL服务&#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。第一步&#xff1a;登录mysql服务器&#xff0c;新建一个用户。在mysql安装中&#xff0c;默认的有root用户&am…

迭代器设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

noip2013 花匠

P1970 花匠 338通过834提交题目提供者该用户不存在标签动态规划2013NOIp提高组难度普及/提高-提交该题 讨论 题解 记录 最新讨论 一个问题均分&#xff1a; 126.3题目描述 花匠栋栋种了一排花&#xff0c;每株花都有自己的高度。花儿越长越大&#xff0c;也越来越挤。栋栋决定 …

mysql 触发器示例_MySQL触发器示例

触发器是与表有关的数据库对象&#xff0c;在满足定义条件时触发&#xff0c;并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。创建触发器CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_s…

文件系统、mkdir、touch、nano、cp笔记

文件系统&#xff1a;rootfs: 根文件系统FHS&#xff1a;Linux发行版目录层级遵循协议/boot: 系统启动相关的文件&#xff0c;如内核、initrd&#xff0c;以及grub(bootloader)引导加载器/dev: 设备文件 设备文件&#xff1a; 块设备&#xff1a;随机访问&#xff0c…

uibinder表单提交_使用UIBinder的GWT自定义按钮

uibinder表单提交这是一个有关如何在GWT上使用UIBinder创建自定义按钮的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandl…

Java 实现常见排序算法

Java 实现常见排序算法 1. 综述 复习常见排序算法&#xff0c;用Java实现。 2. 代码 1 package cn.edu.tju.scs;2 3 public class Sort {4 public static void main(String [] args){5 6 int[] intArray {3, 5, 1, 4, 7, 9, 8, 2, 6};7 System.ou…

python用import xlwt出现红字_如何用python处理excel

最近看到有很多的python课程是教人怎么用python处理excel,我看了一下价格收费还贼高...这么初级毫无水平的操作我的粉丝们就不要花钱去报课程了..我免费教你们怎么做.首先我们先要安装两个模块,一个叫做xlrd,一个是xlwt.安装如下:打开cmd输入pip install xlrd等待安装成功,成功…

什么是升职率?

我确实相信您熟悉彼得原则 。 一般而言&#xff0c;该原则是一种观察&#xff0c;即晋升可能并且将导致晋升人员不再符合该职位的条件。 对于JVM&#xff0c;存在类似的问题。 太快地提升对象可能会对性能产生重大影响。 在这篇文章中&#xff0c;我们将探讨提升率的概念&…

mysql自增id用完了_MySQL表自增id用完了该怎么办?

我们知道MySQL表可以定义一个自增长的id&#xff0c;如果我们的表没有指定主键字段&#xff0c;那MySQL会给我们的表创建一个不可见的&#xff0c;长度为6个自己的row_id&#xff0c;然后不停地往上加步长&#xff0c;虽然生活中自然数是没有上限的&#xff0c;但是在计算机里&…

jmeter插件监控cpu小节点

JMeter使用plugins插件进行服务器性能监控 性能测试时&#xff0c;我们的关注点有两部分 1 服务本身&#xff1a;并发响应时间 QPS 2 服务器的资源使用情况&#xff1a;cpu memory I/O disk等 JMeter的plugins插件可以实现对"二"的监控&#xff0c;具体操作步骤如下(…

mysql写入监控_zabbix监控mysql操作

说明&#xff1a;配置zabbix自带Mysql模板# 创建目录mkdir /var/lib/zabbix# 创建连接数据库文件touch /var/lib/zabbix/.my.cnf# 写入数据连接信息[client]host 192.168.0.148user rootpassword 123dffsdfs# 创建监控项文件touch /etc/zabbix/zabbix_agentd.conf.d/userpar…

openshift_云上的播放框架变得简单:Openshift模块

openshift仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等问题了&#xff0c;这简直就是科幻小说。 去年…

json数据格式了解

json数据格式介绍&#xff1a; https://en.wikipedia.org/wiki/JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 json语法是JavaScript对象表示法语法的子集&#xff1a; 键值对逗号分隔花括号保存对象方括号数据json的键(字段名)是字符串(双引号) json的值…

xclock 不出来界面_macOS 使用 XQuartz 支持 X11 实现 Linux 图形化界面显示

更多奇技淫巧欢迎订阅博客&#xff1a;https://fuckcloudnative.io前言在 Windows 中相信大家已经很熟悉使用 Xmanager(Xshell), MobaXterm, SecureCRT 通过 X11 实现 Linux 图形化界面显示&#xff0c;我的需求是在 macOS 下使用 iTerm2 作为 Terminal 实现 X11 图形化界面显示…

命令设计模式示例

本文是我们名为“ Java设计模式 ”的学院课程的一部分。 在本课程中&#xff0c;您将深入研究大量的设计模式&#xff0c;并了解如何在Java中实现和利用它们。 您将了解模式如此重要的原因&#xff0c;并了解何时以及如何应用模式中的每一个。 在这里查看 &#xff01; 目录 …

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试 原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试第一篇、GP降雨量等值线建模、发布及测试在水利、气象等行业中&#xff0c;要在WebGIS中实现空间分析功能&#xff0c;如绘制等…

win10企业版更新和安全中没有 “恢复”这个选项_通知:微软已强制对Windows 10更新升级...

最近&#xff0c;微软发布了Windows10的强制升级。从本月开始&#xff0c;如果您的个人电脑、笔记本电脑和其他设备没有手动升级&#xff0c;微软将强制部分用户升级到Windows10 1909或2004版本。原因很简单。微软已经停止支持Windows10 1903版&#xff08;包括家庭版和专业版&…