1

我目前正在开发一个集成向导/工作流的 Struts2 应用程序,以产生所需的结果。为了更清楚,有一个业务对象在三个不同的页面上发生了变化(主要是通过 AJAX 调用)。目前,我正在使用 ModelDriven 操作(通过使用同一业务对象的所有操作进行扩展)以及 Scope 拦截器。虽然如果用户一次只处理一个业务对象的数据,这可以正常工作,但如果用户在多个选项卡中打开不同对象的向导(当我们想要更快地完成事情时,我们都会这样做)一切都会变得混乱,主要是因为我在会话中只存储了一个业务对象。

我已经阅读了几篇关于使用对话作用域拦截器(主要文章)和关于使用作用域插件(这里)的文章。但是,这两种方法似乎都有问题:

  • 对话范围拦截器不会自动使对话过期,也不会与 Struts2 正确集成;
  • Scope 插件缺乏适当的文档,最后一次构建是在 2007 年(实际上包括 Mark Menard 在定义他的 Conversation Scope Interceptor 时编写的一些想法,尽管它不使用相同的代码)。

Spring 的 WebFlow 插件目前似乎有点过于复杂,无法使用。我目前正在寻找可以在几个小时内实施的东西,但我不介意你是否可以根据需要提出一些可行的建议,即使它需要的时间比我现在想要花的时间多.

那么,经验丰富的 Struts2 开发人员,您有什么建议?我应该如何实现这个?

4

2 回答 2

1

好吧,这不是一个完全成熟的想法。但鉴于没有其他人提供任何东西,这就是我要开始的。

1)看看你是否可以将整个流程移动到一个页面中。我非常相信更少的页面是更好的方法。它根本不会降低应用程序的复杂性,但用户通常会发现界面更加直观。解决此问题的最简单方法之一是使用 json 插件和对 json 服务的大量 ajax 调用。

2)如果您必须在页面之间进行转换(或者只是认为实现#1 的客户端工作太多),那么我会查看 s:token 标记。启动流程的第一个页面将使用此标签,这将在每次调用时创建一个唯一值。您将在模型对象会话中存储地图。需要通过从会话中查找模型来为操作提供模型。

#2 有几个挑战。一、如何防止会话获得过多的域对象?a) 没关系,如果会话设置为六个小时,您可以确定一夜之间他们会被清理干净。b) 提供了一个自我管理界面,可以在会话中获取/设置/列出对象。这可能是你一开始想到的,但它会让一个工人做一定的量,然后停下来做另一个。如果工作单元有一些有意义的名称(发票编号或其他),它可能会非常有用。

更复杂一点的是将模型对象移出会话并进入服务层。在插入时,您将设置插入时间。您可能需要一个管理器来保存每种类型的模型对象,并且每个管理器都有一个守护线程,它会定期扫描域对象的映射并清除过期的对象。

您可以通过使用令牌启动流程然后在每个页面上使用另一个令牌来找出更复杂的系统。分别为“flowId”和“currentPageId”,然后您可以绘制允许的转换。

请注意,此时 spring web flow 开始看起来不错。

于 2011-09-07T21:21:41.210 回答
0

现在有一个用于 Struts2 的对话插件,开发人员只需很少的工作即可实现所有这些目标: http ://code.google.com/p/struts2-conversation/

它有: - 嵌套对话 - 死对话的清理 - 带有注释和命名约定的配置约定 - 继承的对话 - 与 Struts2 完全集成 - Spring IoC 容器管理的 bean 也可以使用对话范围

希望它可以帮助某人。

于 2012-02-14T00:29:47.380 回答