使用JSF作为Spring MVC的视图技术

Posted

技术标签:

【中文标题】使用JSF作为Spring MVC的视图技术【英文标题】:Using JSF as view technology of Spring MVC 【发布时间】:2013-09-15 16:44:09 【问题描述】:

我目前正在实现一个小型 Spring MVC PoC,我想使用 JSF 作为视图技术,因为我公司中的大多数人都习惯了带有 Primefaces 环境的 J2EE。

Spring MVC 3 是支持 JSF 还是只支持 JSP?我已经阅读了多篇将两者混合的文章。

我的需要是创建一个吸引人的 UI。有没有一种简单的方法来使用 Spring MVC 和 JSP 作为视图技术?

我们的应用程序在多个页面中使用时间表/日历。它基本上是一个时间管理APP

【问题讨论】:

【参考方案1】:

你犯了一个概念上的错误。 JSF 不是一种视图技术。 JSF 是一个 MVC 框架。就像 Spring MVC 一样,尽管它们都有不同的意识形态; JSF 是基于组件的 MVC,而 Spring MVC 是基于请求的 MVC。因此,他们是完全的竞争对手。你不能混合它们。您应该选择其中之一。相反,JSP 和 Facelets 是真正的视图技术。自 Java EE 6(2009 年 12 月)以来,JSP 为 deprecated 并被 Facelets (Xhtml) 取代,作为 JSF 的默认视图技术。

您可以将 Spring MVC 与 JSP view technology 一起使用。您还可以将 Spring MVC 与 Facelets view technology(和 many others)一起使用。但是您不能将 Spring MVC 与 JSF 组件一起使用,更不用说与 PrimeFaces 之类的 JSF 组件库一起使用了。 JSF 输出组件可能工作,但 JSF 输入组件根本不能工作。 Spring MVC 已经有自己的<form:xxx> 标签用于输入。即使您混合使用它们,您最终也会在一个混合且令人困惑的代码库中获得两个框架的一半功能。这没有任何意义。如果您只想使用与 PrimeFaces 相同的 UI,只需获取 jQuery UI。这也正是 PrimeFaces 在幕后使用的。 PrimeFaces 是一个基于 jQuery 的 JSF 组件库。

另一方面,您将 Spring IoC/DI 与 Spring MVC 混淆也是非常好的。 Spring IoC/DI 又是usable 和 JSF。您可以将 JSF 托管 bean 工具(@ManagedBean 和朋友)替换为 Spring 托管 bean 工具(@Component 和朋友),通常唯一的目的是为了在 JSF 支持 bean 中使用@Autowired。但就是这样。 JSF MVC 框架生命周期、JSF 组件和视图技术保持不变。与之等效的标准 Java EE 将使用CDI(和EJB)。

同样的故事也适用于 Spring Security。您可以将它与 JSF 一起使用,但是您不应该遵循 Spring Security + Spring MVC 目标文档/示例来配置它,而只能遵循 Spring Security + JSF 的。请注意,仅当您将 JSF 托管 bean 设施替换为 Spring 托管 bean 设施时,Spring Security 对业务操作的约束才有效。所以这仍然需要如前一段所述的“在 JSF 中集成 Spring”。这一切的标准 Java EE 等价物将通过 web.xml 中的 <security-constraint> 条目使用 container managed security (JAAS/JASPIC)。

同样的故事也适用于 Spring WebFlow。您只需要确保您使用的是最新版本的 Spring WebFlow,因为旧版本在与多个 JSF 组件库一起使用时会导致 conflicts。此外,从 JSF 2.2 开始,新的 Faces Flows 特性作为标准 Java EE API 的一部分被引入,从而基本上使 Spring WebFlow 变得多余。

然后是 Spring Boot。这在 Java EE 中没有直接的等价物。 Spring Boot 基本上使您能够使用带有main() 方法的普通Java 应用程序类“以简单和抽象的方式”执行Java EE 应用程序。如果没有 Spring Boot,它肯定是可能的(否则 Spring Boot 永远不会存在),配置方面只需要多做一些工作,因为您必须根据其文档考虑特定于服务器的详细信息。例如:Undertow 和 Jetty。

回到 JSF 和 Spring MVC,如果确实有必要,您可以在同一个 Web 应用程序中安全地相邻运行 Spring MVC 和 JSF,但它们不会在服务器端互操作。它们将完全独立运行。如果 JSF 生成的 HTML 页面中的某些 javascript 碰巧在同一个 Web 应用程序中调用基于 Spring 的 REST Web 服务调用,它们最多会在客户端相互接触。但是那个 Spring Web 服务将不需要/必须知道任何关于 JSF 的信息来做出相应的响应。该 Spring REST Web 服务的标准 Java EE 等效项是 JAX-RS。

即将推出的 Java EE 8 将带有一个新的基于请求的 MVC 框架,命名为“MVC”,它基于 JSF 和 Spring MVC 的经验教训,从而取代 Spring MVC 并提供 JSF 的标准替代方案。

另见:

What exactly is Java EE? Difference between Request MVC and Component MVC What are the main disadvantages of Java Server Faces 2.0? What is the need of JSF, when UI can be achieved from CSS, HTML, JavaScript, jQuery? When is it necessary or convenient to use Spring or EJB3 or all of them together? Spring JSF integration: how to inject a Spring component/service in JSF managed bean? Why Facelets is preferred over JSP as the view definition language from JSF2.0 onwards?

【讨论】:

过去我曾将 JSF 与 Primefaces 一起使用。我读了几篇混合了两者的文章。我需要的是一种快速而干净的方式来拥有一个带有漂亮 UI 的应用程序。你会选择使用带有 jQ​​uery 的 facelets 还是使用组件库并从 Spring MVC 转移到使用 JSF? 对不起,我不能。我对你一无所知。只要选择一个你认为/觉得最适合你自己的知识、具体功能需求和时间空间/截止日期等的。如果是我,我会选择 JSF 并在一周内准备好。原因很简单,因为我从未真正使用过 Spring + Spring MVC,并且需要几个月的时间才能正确学习/掌握它。你的情况当然不一样。你不能问别人一个个人/主观的问题,你自己可以回答得最好。顺便说一句,Stack Overflow 是错误的征求意见的地方。 确实,只是想获得专家的建议。以前只用过JSF,想以后还会继续用,放弃Spring MVC。我只是没有时间学习它,而是我会使用 JSF,但我的经验也很有限,几个月,只有一个很小的项目。 @BalusC 阅读所有链接(初始)的完整答案需要一整天。但它消除了所有的疑虑。非常感谢!! 哇,这篇文章消除了很多关于 spring + JSF 组合的疑虑,还有很多其他问题!谢谢。【参考方案2】:

Spring MVC 和 JSF 并没有真正混合。您可以将 JSF 用于与视图相关的内容,并让 Spring 管理和连接支持的(服务、daos 等)。但是尝试将@Controllers 与JSF 页面相匹配并不是一件很好的事情(除此之外,两者都是基于组件的不同堆栈请求)。

要将 Spring 与 JSF 集成,您需要将 SpringBeanFacesELResolver 添加到 faces-config.xml 中。这将从 Springs 应用程序上下文中查找 bean。为此,您必须使用纯 JSF 注释,而不是基于 CDI 的注释。

【讨论】:

我的想法是基于这篇文章itcuties.com/j2ee/jsf-2-spring-3-example-the-registration-app 但是我会使用 JSF 的唯一原因是因为它是像 Primefaces 这样的组件库,我怎样才能使用纯 Spring MVC 做同样的事情? 找到一些 JavaScript 库并为日历创建一些客户端组件。但如前所述,您仍然可以在 Spring 之上使用 JSF,但不能拥有 Spring MVC。 确实我混淆了这两个概念。感谢您的回复!【参考方案3】:

Spring Webflow 可以在这里提供帮助。查看此示例项目。 https://github.com/spring-projects/spring-webflow-samples/tree/master/primefaces-showcase

【讨论】:

你的问题倒过来了。此外,JSF 2.2 已经为此提供了@FlowScoped

以上是关于使用JSF作为Spring MVC的视图技术的主要内容,如果未能解决你的问题,请参考以下文章

关于 JSF Postback 的评论与 JSP 作为视图定义技术的混淆

将 JSF 理解为 MVC 框架

xml 如果使用JSF作为MVC框架,则使请求和会话范围spring bean可用

在 Spring MVC 中使用 Twirl

如何在 Spring MVC 中使用 AJAX 渲染视图

如何在 Spring-MVC 中将数据从视图传递到控制器?