67

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

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

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

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

4

3 回答 3

158

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

您可以将 Spring MVC 与JSP 视图技术一起使用。您还可以将 Spring MVC 与Facelets 视图技术(以及许多其他技术)一起使用。但是您不能将 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 反过来可以与 JSF 一起使用。@ManagedBean您可以用Spring 托管 bean 工具(和朋友)替换 JSF 托管 bean 工具(@Component和朋友),通常唯一的目的是为了@Autowired在 JSF 支持 bean 中使用。但就是这样。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将通过.<security-constraint>web.xml

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

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

回到 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 的标准替代方案。

也可以看看:

于 2013-09-11T15:25:57.560 回答
14

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

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

于 2013-09-11T15:19:06.187 回答
3

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

于 2015-09-04T09:01:56.677 回答