搭建SSH时的思考和遇到的几个问题的解决方法
SSH的整合浪潮已经持续很久,无论是在官方的文档还是在互联网上的各种讨论中,都能听到SSH的影子。今天,我有幸闲暇之余,想谈谈我的想法关于这三个流行框架的整合——Struts 1.3.9、Spring 2.5和Hibernate 3.2。我在开发环境中使用的是Eclipse 3.3、MyEclipse 6.0、JBoss 4.2和Tomcat。
当我们使用SSH构建应用时,架构自然而然地分为三层:表现层、逻辑层和持久层。遵循Martin Flower的核心理念,我们追求的是尽可能减少耦合,让下层为上层提供服务。这与Rod在开发Spring时的指导思想不谋而合。我深思的问题便是如何达到最低的耦合度。
参考Spring 2.0官方文档的建议,Spring与Struts 1.x的集成有多种方式,包括代理类方式和ActionSupport方式。我认为这两种方式都存在过强的侵入性和依赖性,与Spring的核心思想产生了一些冲突。
我决定采用AutowiringRequestProcessor来尝试整合。这个类能够自动为你装载所需的Service。根据其Java Doc的描述,它的匹配方式是默认按Type,你也可以选择按Name来匹配。我认为按照Type的方式就已经足够好了。
在这一整合过程中,我们的目标是构建一个更加灵活、解耦的架构。通过Spring的依赖注入和AOP功能,我们可以轻松地将Struts的表现层与底层的业务逻辑分离。Hibernate作为持久层框架,负责数据的持久化操作,使得数据访问更加简单和安全。通过这样的整合,我们可以充分利用每个框架的优点,提高开发效率,同时保证应用的稳定性和可维护性。
让我们欣赏Struts的配置文件struts-config.xml的魅力。在XML的骨架中,我们看到了Struts框架的精髓。文件的开头声明了XML的版本和编码方式,接着通过DOCTYPE声明指定了遵循的Struts配置DTD。
文件的核心部分在于`
接下来,我们转向Spring的配置文件applicationContext.xml。同样,文件的开始部分声明了XML的版本和编码方式,并通过DOCTYPE声明指定了遵循的Spring Bean DTD。
在`
这些bean之间的关联通过属性中的ref标签实现,如``表示“LoginService” bean依赖于“UsersDao” bean。这种配置方式避免了代理方式时可能出现的多份XML配置问题,降低了维护的复杂度。
这两个配置文件共同构成了Spring和Struts集成的架构基础。它们通过简洁而富有表现力的XML格式,实现了应用程序的关键组件之间的连接与配置,为开发高效、灵活的Web应用程序提供了强大的支持。在我所构建的系统架构中,你会发现,Hibernate的具体配置并未被详细展现。这是因为我们采用了Hibernate自身的配置管理机制,以此来降低三层之间的依赖性。通过这种方式,我们可以灵活地调整架构中的任何一层,而不必担心其他层的变动影响。
关于书籍中通常不会深入此类细节的问题,我认为这并非因为担心初学者难以理解。实际上,一个完整的架构所面临的问题远非初学者所能想象的那样简单。为了更好地解决这些问题,我们可以采用诸如RUP的4+1视图的方法,全面考虑架构的各个方面。除此之外,我们还可以从多个角度入手,如安全性、数据输入输出的校验与转换、国际化、日志记录、异常处理、异构系统整合以及后台运行程序等。对于涉及多个数据库的情况,我们还需要深入考虑事务控制的问题。
我正在计划完善这个整合工作,并希望实现一个Demo,作为快速开发小型简单项目的基础。在整合过程中,我也遇到了一些挑战。
其中一个问题是在启动时出现了“严重: Error listenerStart”。对于这个问题,网上有许多解决方案。虽然有一种最简单的方法是将Spring的初始化从Listener改为Servlet,但我并不推荐这种方法。因为这种解决方案没有找到问题的根源,而且可能会引发新的问题。一个更好的解决办法是加入Log4J的相关配置,以便在启动时获取更详细的错误信息。这样可以根据具体的信息来定位和解决问题,可能是DataSource配置或环境配置出了问题。具体的解决方法和参考(
我还遇到过“Required extension qdox not found”的提示。针对这个问题,我的解决方案是移除mons-attributes-piler.jar这个包。如果你需要使用这个包,可以参考狼蚁网站的SEO优化指南(
以上内容是我对整合过程中遇到的问题及解决方法的总结。我深信通过不断的学习和实践,我能更好地完善这个架构,并为其添加更多的功能。对于未来的开发之路,我充满期待。
编程语言
- 搭建SSH时的思考和遇到的几个问题的解决方法
- Vue 普通对象数据更新与 file 对象数据更新
- ASP.NET缓存管理的几种方法
- 纯JS单页面赛车游戏制作代码分享
- PHP类中的魔术方法(Magic Method)简明总结
- ASP.NET餐饮管理系统制作代码分享
- PHP生成plist数据的方法
- 如何对文件进行操作?
- 基于AJAX的分页类实现代码
- 如何使node也支持从url加载一个module详解
- iview table render集成switch开关的实例
- jQuery实现对网页节点的增删改查功能示例
- 基于javascript制作微博发布栏效果
- ASP.NET Core使用HostingStartup增强启动操作方法详解
- jQuery+css3实现Ajax点击后动态删除功能的方法
- JavaScript正则表达式简单实用实例