【问题标题】:Modernizing Struts 1.x Application现代化 Struts 1.x 应用程序
【发布时间】:2016-09-26 14:43:15
【问题描述】:

我想对我的 Struts 1.x 应用程序进行现代化改造。有不少文章提倡代码迁移,而不是重写整个系统。

我想向已成功对遗留应用程序进行现代化改造的人寻求建议。

我当前的系统使用 struts 1.x 和 JDBC 准备语句作为数据访问层。

我期待通过以下目标改进旧版应用程序:

  1. 网页编码时应考虑到响应式网页设计。
  2. 用 Spring MVC 替换 struts 1.x

我希望将现代化分为以下几个阶段:

  1. 第 1 阶段 - 将所有 jsp 页面更改为 HTML 5 和 CSS 3
  2. 第 2 阶段 - 将所有 DAO 类更改为 Spring JDBC 模板或 Spring JPA 和由 Spring 管理的事务
  3. 第 3 阶段 - 最终,用 Spring MVC 替换 Struts 1.x Action Forms、Actions

在开始更改之前,我想知道是否可以:

  1. 带有 HTML 5 和 CSS 3 的 Struts 1.x?我正在考虑用 HTML 5 和 JSTL/EL 替换所有 struts 1.x html 标签库。
  2. 使用 Spring 3/4 运行 Struts 1.x?是否可以使用 Spring bean 运行非 Spring 管理的 pojo?

我应该注意什么以及如何/有哪些最佳做法来处理这个现代化过程?代码库大约有 50 万个 HTML/JSP 代码和 300 万个 Java 代码。

【问题讨论】:

  • 第 2 和第 3 阶段:您将需要在 Struts 操作中“注入”Spring @Service 类(使用 JDBC 模板或 JPA),如果您掌握了 Spring 应用程序上下文的句柄,就可以做到这一点从 Struts 动作中。为此,您定义了一个 Spring “上下文感知” bean,它设置了一些静态字段,例如myApplicationContext,到链接sujitpal.blogspot.it/2007/03/…中的应用程序上下文。然后,您只需访问此类的静态字段即可获取应用程序上下文和服务。所以看起来你可以这样做。
  • 这意味着我根本不能对带有 Spring 的 Struts 1.x 使用注释?
  • 好吧,首先您使用注解(例如 JPA)来提供服务。 (阶段2)。然后,在第 3 阶段,当您将操作转换为 Spring MVC 时,您将使用 Spring MVC 注释。
  • 是的,检索应用程序上下文的正确方法是@JavierCaselli 在答案中指出的方法,而不是我评论中的链接。
  • 我不同意。这可以是执行升级的系统过程。

标签: spring-mvc struts-1 legacy


【解决方案1】:
  1. 自从我上次使用 Struts 1.x 以来已经有一段时间了,但我认为用 JSTL/EL 替换至少大多数 Struts 标记没有问题。您应该能够使用 Struts 1.x JSP 绘制 HTML5。我记得工作时使用很少或根本不使用 Struts 标签,只使用 JSTL/EL,但这是在 HTML5 之前。

  2. 您可以从任何 Struts ActionForm 或您的 webapp 中的任何类调用 Spring Context。您可能必须手动完成,而不是使用注释,如下所示:

    WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

说了这么多,我可以看出您打算对您的应用程序进行认真的更新,因此我必须问,您对保留 Struts 1.x 持肯定态度吗?如果你想放弃 Struts 标签,使用 Spring 3/4 和 HTML 5,为什么不完全放弃 Struts 并将你的应用程序迁移到 Spring MVC?它非常易于使用、功能强大,而且不用说,它与实现业务逻辑、持久性等的 Spring 组件完美集成。

干杯。

【讨论】:

  • 从管理或用户的角度来看,应用程序运行在什么框架上对他们来说并不重要,最重要的是系统运行良好。我正在寻找逐步减轻任何项目失败或风险的方法
  • 我正在分解各个阶段以尽量减少所涉及的风险。
  • @youcanlearnanything “我正在寻找一种分步方法来减轻任何项目失败或风险”如果您的应用程序不经常使用 javascript,您可以尝试创建一整套 Selenium 测试您当前的应用程序(当应用程序不是 javascript 密集型时,这不是很困难或耗时。一旦您克服了初始阈值),然后针对该套件测试您重新设计的应用程序。当然,最好创建单元测试来测试 JPA 查询是否提供与使用的原始 SQL 查询相同的结果。
  • 遗憾的是,我的应用程序使用了大量的 JavaScript。考虑将这些 JavaScript 转换为 jQuery 或 AngularJS 是否有任何好处?
  • @youcanlearnanything jQuery - 在我看来,AngularJS 绝对不是,因为在我看来它确实改变了应用程序结构。使用 jQuery,您将拥有简单的 ajax 和漂亮的表格/UI 组件。但是通过用 jQuery 替换你原来的 javascript,在我看来很难知道原来的功能是否被保留并且没有被破坏。也许是第 4 阶段?
【解决方案2】:

(不是答案,仅供参考。)

  1. 没有理由不能让 S1 应用程序与 Spring MVC 一起运行。这是一种逐段迁移的合理方法,而不是进行完全替换的较长项目。
  2. 旧版 Spring 直接支持 Struts 1。根据您的时间范围,我可能会考虑使用旧版 Spring,直到您进一步了解为止。
  3. 用纯 HTML/CSS 替换 S1 标签会很痛苦,因为 S1 标签会呈现除输入字段之外的其他内容(例如标签、错误消息等)。这是完全可行的,尤其是如果您编写自己的自定义标签.
  4. jQuery v. (AngularJS | React | 类似) 切换到一个完整的客户端应用程序是一个很大的提升,特别是如果你的后端还没有这样设计。我不会那样做,但是您可以通过将业务逻辑放在它自己的位置并从 Web 层使用它来开始它。那么……
  5. ...您开始使用 jQ 或其他注入现有页面的客户端框架在客户端使用 API 调用。只有到那时我才会开始考虑进行全面的 SPA。

底线是你有一个相当大的应用程序。与其转换整个东西,我会考虑从主线应用程序中删除功能并将其分解为子应用程序,每个子应用程序都可以使用任何看起来合理的技术堆栈。

作为顾问,我做过很多这样的项目:工作繁重,需要广泛的知识和技能,而且很难做到正确。

【讨论】:

  • 您的意思是,在单个 Web 应用程序(war 文件)中,我可以同时拥有 struts 1.x 和 spring mvc 吗?即在war文件中,我在struts 1.x上运行模块A,在spring mvc上运行模块B?
  • 当然,没有理由不这样做。在它们之间移动可能有点让人头疼,因为您通常希望使用单独的扩展或命名空间,但这是唯一的主要问题。
  • “旧 Spring 直接支持 Struts 1” - 我想知道使用旧 Spring(我认为是 2.5 吗?)是否有任何意义,因为那时你必须在某个阶段升级到 Spring 4 + 无论如何,至少在我看来,最好立即升级到 Spring 4。
  • @JohnDonn 很难说。缺乏直接支持并非不可克服,但无论哪种方式,这都是一条学习曲线。我倾向于将它分解成更小的应用程序,考虑到它的大小,这可能是可能的。
  • 我将struts1支持移植到spring5,所以可以从升级spring开始:blog.hackeriet.no/integration-between-struts-1.3-and-spring-5.0
猜你喜欢
  • 2011-08-17
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多