1

背景

我打算用java开发一个新的web应用程序。它不是很大也不是很复杂,我有足够的时间“正式”开始。

我有一些 JSF/Facelets 开发背景(大约半年)。而且我对 JSP+JSTL 也有一些经验。

出于自我教育的目的(也为了找到最佳解决方案),我想使用基于行动的框架之一对新项目进行原型设计。实际上,我会在 Spring MVC 和 Stripes 之间进行选择。

问题

为了获得对基于动作的框架的正确印象(与 JSF 相比),我想确保我正确使用它们(或多或少)。

因此,在这里我列出了一些最常见的任务(至少对我而言)并描述了我如何使用 JSF 解决它们。我想知道应该如何使用基于动作的框架来解决它们(或者如果具体任务有任何区别,则分别使用 Spring MVC 和 Stripes)。

  1. 渲染内容:我可以应用来自标准 jsf 库(核心和 html)或来自 3rd-party 库(如 RichFaces)的现成组件。我可以组合简单的组件,并且可以轻松地创建基于标准组件的自己的组件。
  2. 以正确的格式渲染数据(原始或引用类型):每个组件都允许指定一个转换器,用于以两种方式转换数据(渲染和发送到服务器)。像往常一样,转换器是一个带有 2 个小方法的简单类。
  3. 站点导航:我在 faces-config.xml 中指定了一组导航案例。然后我指定应该匹配一个或多个导航案例的链接(或按钮)的动作属性。最佳匹配由 JSF 选择。
  4. 实现流程(例如多表单向导):我使用的是 JSF 1.2,所以我使用Apache Orchestra作为流程(对话)范围。
  5. 表单处理:我有一个相当标准的 java-bean(JSF 术语中的支持 bean),具有一定的范围。我在这个 bean 属性上“映射”表单字段。如果一切顺利(没有异常并且通过了验证),那么所有这些属性都使用表单字段中的值进行设置。然后我可以调用一个方法(在按钮的action属性中指定)来执行一些逻辑并返回字符串,这应该是我的导航案例之一以进入下一个屏幕。
  6. 表单验证:我可以创建自定义验证器(或从现有的验证器中选择)并将其添加到几乎每个组件中。第 3 方库有一组自定义 ajax 验证器。标准验证器仅在提交页面后才起作用。实际上,我不喜欢 JSF 中的验证是如何工作的。那里的魔法太多了。许多标准组件(或者可能全部)都有预定义的验证,并且不可能禁用它(可能并非总是如此,但我遇到了很多问题)。
  7. Ajax 支持:许多 3rd-party 库(MyFaces、IceFaces、OpenFaces、AnotherPrefixFaces...)都具有强大的 ajax 支持并且运行良好。直到遇到问题。那里的魔法也太多了。如果它不起作用,则很难使它起作用,但是您已经按照手册中的描述做对了。
  8. 用户友好的 URL人们说存在一些库。它也可以通过过滤器来完成。但我从未尝试过。乍一看似乎太复杂了。

提前感谢您解释如何使用基于操作的框架来完成这些项目(或其中一些项目)。

4

2 回答 2

3

我会尽力回答有关Stripes的问题。我过去使用过 Struts 和 JSF,但最近没有使用过,所以充其量我对它们有模糊的概念和感觉。

我们非常熟悉条纹,现在几乎所有东西都使用它,并且真的很喜欢它。它很容易上手,支持许多复杂的场景,但你也可以自由地在它之外工作,这在你想构建自己的 ajax 小部件或与另一个系统或其他东西交谈时非常重要。

如果你走条纹路线,我绝对推荐购买或下载这本书。它是 Stripes 所需一切的一站式商店,实际上是 Stripersist 的唯一文档(非常好的功能,但没有网络文档)。


渲染内容:我可以应用来自标准 jsf 库(核心和 html)或来自 3rd-party 库(如 RichFaces)的现成组件。我可以组合简单的组件,并且可以轻松地创建基于标准组件的自己的组件。

这是相似的。Core、Html、Fmt 等以及您找到的任何自定义标签,公司。显示:标签,包装标签,并创建自己的。但是,显然您现在不是在组件级别处理,而是处理一个标签,该标签确定页面上/发送到服务器或从服务器发送的内容。

以正确的格式呈现数据(原始或引用类型):每个组件都允许指定一个转换器,用于以两种方式转换数据(呈现和发送到服务器)。像往常一样,转换器是一个带有 2 个小方法的简单类。

Stripes 有许多内置转换器,可以轻松为您更复杂的数据类型创建自定义转换器。Stripes 支持轻松映射非常复杂的数据结构。例如,结合Stripersist,我可以将我的模型对象直接放在 ActionBean 上,将一些字段放在表单上,​​Stripersist 将从数据库中水合模型(基于其 PK)并使用我的字段更新它放在表单上——所有这些都是在将 ActionBean 上的控制权释放给我之前完成的。

站点导航:我在 faces-config.xml 中指定了一组导航案例。然后我指定应该匹配一个或多个导航案例的链接(或按钮)的动作属性。最佳匹配由 JSF 选择。

条纹导航最初基于您对 ActionBeans 的命名。没有xml。此外,漂亮的 url是 Stripes 1.5 中 ActionBean 级别的注释,因此您可以执行诸如@UrlBinding("/{$event}/{model}")/view/5您带到viewID/PK 为 5 的模型对象的“”事件处理程序的位置之类的操作。

实现流程(例如多表单向导):我使用的是 JSF 1.2,因此我将 Apache Orchestra 用于流程(对话)范围。

虽然我对对话范围的概念只是模糊地熟悉,但 Stripes 具有向导表单功能,但我没有使用它并且无法真正扩展它。我认为这是一个类似的想法。

表单处理:我有一个相当标准的 java-bean(JSF 术语中的支持 bean),具有一定的范围。我在这个 bean 属性上“映射”表单字段。如果一切顺利(没有异常并且通过了验证),那么所有这些属性都使用表单字段中的值进行设置。然后我可以调用一个方法(在按钮的 action 属性中指定)来执行一些逻辑并返回字符串,这应该是我的导航案例之一以进入下一个屏幕。

没有太大的不同。您现在拥有 Java 或自定义类型,而不是 [action] bean 上的组件。ActionBeans 是根据请求创建并丢弃的,除非您执行诸如将其放入会话、向导或其他任何操作中。这很好,因为所有实例变量都映射到表单中的数据,您使用它,然后将其丢弃,并且不必像 struts 那样处理任何同步问题。处理完数据后,Stripes 允许您发送 ForwardResolution(OK 状态)、重定向或流式处理(JSON、文件等)。Redirect-after-POST 模式很好地实现了闪存范围的想法(页面下方的 3/4)。

表单验证:我可以创建自定义验证器(或从现有验证器中选择)并将其添加到几乎每个组件中。第 3 方库有一组自定义 ajax 验证器。标准验证器仅在提交页面后才起作用。实际上,我不喜欢 JSF 中的验证是如何工作的。那里的魔法太多了。许多标准组件(或者可能全部)具有预定义的验证,并且不可能禁用它(可能并非总是如此,但我遇到了很多问题)。

Stripes 允许在 ActionBean 上的实例变量的注释中进行验证。它们允许一些默认值、必需的、最大长度等,或者您可以随时创建自己的。默认值易于添加且灵活,同时始终可以完全自定义。

Ajax 支持:许多 3rd-party 库(MyFaces、IceFaces、OpenFaces、AnotherPrefixFaces...)都具有强大的 ajax 支持并且运行良好。直到遇到问题。那里的魔法也太多了。如果它不起作用,则很难使它起作用,但是您已经按照手册中的描述做对了。

这是我对 JSF 做事方式的大问题。即使你确实得到了正确的小部件,你仍然被那个小部件困住了。使用 Stripes,您可以使用最新最好的 Jquery 提供的任何东西,并且只要您向服务器发送正确的 GET 或 POST,stripes 就知道如何处理它并且可以轻松地将 JSON 发送回来。我认为组件框架更适合几年前的利基市场,当时 AJAX 还很困难,但 JQ 现在让它变得如此简单。

用户友好的 URL:人们说存在一些库。它也可以通过过滤器来完成。但我从未尝试过。乍一看似乎太复杂了。

@UrlBinding,就这么简单。

于 2010-05-18T17:59:43.463 回答
1

我的答案不是你想听到的:不要从组件框架切换到动作框架

经过多年的行动框架开发,我改变了方向,我再也不会回去了。

在您提到的 8 个用例中,只有一个会想到 Action 框架明显更好的地方,那就是 URL 设计/友好的 URL。它也可以在组件框架中完成,但在 Action Frameworks 中更容易(尤其是在 Stripes 中,您只需使用 url 注释 ActionBean)。

我建议您尝试 wicket,它非常容易学习(比 JSF 容易得多),它还可以让您重用许多现有组件。

于 2010-05-17T20:45:06.983 回答