如何将一个旧的基于SSH的项目手工更新部署在相对较新环境上

1 引言

得到了一个2015年的基于SSH的Java Web项目,其含有源代码。通过该项目lib文件夹中jar文件、相关配置文件,以及运行编译相关代码过程,可知,该项目当时所用的开发和运行环境如下:

名称版本
Java小于1.8
MySQL5.0.5
Servlet2.5
Tomcat小于8.5.78
Struts2.3.16
Spring4.1.1
Hibernate4.3.6

从上面可知,该项目基于的环境相对较老。比如,Spring在2017年左右已推出Spring 5,Servlet 4.0 也已出现。此外,我电脑上安装的是MySQL 8.013,Tomcat用的是8.5.78版本。该项目基于的环境相对较老,并不是说Spring、Struts或Hibernate技术本身老,而是说所用的版本比较老。另外说明,我电脑上的环境也不是最新版本,只是与该项目比相对较新。

那么,问题来了,如何将该项目(基于其提供的源代码和相关资源文件)以手工编译的方式更新部署运行在我当前电脑相对较新的环境上

该项目当时所用的IDE是eclipse,而此次更新部署,我没用任何IDE工具,目的是想弄清楚后端代码之间的依赖关系及导入包与相关jar包之间的对应关系,以期对基于SSH的开发有更深刻的学习和探索。

本文仅对更新部署所需的前提知识、大致流程、对原项目的相应更改、Spring如何整合Struts和Hibernate、对该项目的未来设想等做相应阐述,不进行严格的操作细节讲演。相信具备相应水平的读者能够一看即懂,能在自己的电脑上重现整个过程。此外,本文对JSP、JavaScript的内容涉及较少,这也是一个需要专门学习的领域。JSP本质上转换为Servlet执行。

2 应具备的前提知识和技能

更新部署该相对较老的项目,应具备相应的知识和技能。就好像让一个不懂电路知识和技能的人改进电路不能成功那样,不具备相关Java Web开发知识和技能也不能成功更新部署该项目。所需的前提知识和技能如下:

  • 应熟悉Java语言,特别是Java范型编程方面。因为该项目的DAO层这块代码基于之前的JDK版本,而我用的JDK 1.8对范型的类型检查更严格,所以,需修改DAO层中的相关代码,这需要继承、接口、范型等知识和编程技能。
  • 应了解基于Tomcat的Servlet运行原理和具备Servlet编程的基本技能。这是从事Java Web开发的基础,Struts和Spring MVC框架等都是基于此。懂得Tomcat文件夹结构、启动和关闭Tomcat服务器的方法;当某个Web服务部署出错时,知道到哪里查看详细的部署出错日志。
  • 应懂得MySQL的基本知识,能够安装MySQL数据库服务器,能够利用sql语言脚本建立本项目所需的数据库,会用基本的select语句。
  • 基本了解Struts、Spring和Hibernate这三个开源框架,掌握它们的基本使用方法,会读和写xml方式的配置描述文件(最新版本的框架都提倡用Annotation方式),会写Hibernate的数据源配置,懂得它们的运行原理。
  • 对JSP、JavaScript等前端知识有简单了解,会对一些标签库安装和基本使用。

上面前提知识和基本技能并不是要求针对使用细节死记硬背,而是需要时会查相关知识,并做到灵活应用。上面所列实际上给出了Java Web开发的基本学习路线。这是针对Java Web开发初学者的一条明晰的学习路线。将上述的相应部分很容易替换为Spring MVC、Spring Boot或MyBatis等。

3 大概流程和对原项目的更改

3.1 大概流程

如下:

  1. 安装MySQL 8.0.13环境,利用sql语言脚本构建该项目所用的数据库;
  2. 安装JDK 1.8,配好Java环境;安装Tomcat 8.5,并配好环境。本项目用纯手工编译运行,并手工下载和管理相应的jar包,故无需安装Maven之类的构建工具。若你想用Maven工具自动下载和管理jar包,请安装Maven;
  3. 根据代码情况,更改DAO层相应源代码,手工编译所有的源代码文件,得到class文件夹结构;
  4. 修改jdbc.properties中的文件内容,针对的是jdbc.driverClassName、jdbc.url、jdbc.username和jdbc.password等内容。MySQL 5和MySQL 8的驱动器的名称是不同的。
  5. 按照文件夹结构放入相应文件,遵从Tomcat的文件夹结构,设置文件夹的根为spm;然后将spm整体放入到Tomcat的webapps中。
  6. 启动Tomcat服务器,在浏览器中输入网址http://localhost:8080/spm即可成功访问。

其中,手工编译的脚本举例(部分)如下:

javac -encoding utf-8 -d classes src/com/buptsse/spm/domain/User.java

javac -encoding utf-8 -classpath classes;. -d classes src/com/buptsse/spm/service/IUserService.java
javac -encoding utf-8 -classpath classes;. -d classes src/com/buptsse/spm/dao/IUserDao.java

javac -encoding utf-8 -d classes src/com/buptsse/spm/dao/IBaseDAO.java

javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\spring-context-4.1.1.RELEASE.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\spring-beans-4.1.1.RELEASE.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\hibernate-core-4.3.6.Final.jar;classes;. -d classes   src/com/buptsse/spm/dao/impl/BaseDAOImpl.java

javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\log4j-1.2.17.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\spring-context-4.1.1.RELEASE.jar;classes;. -d classes src/com/buptsse/spm/dao/impl/UserDaoImpl.java

javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\jboss-transaction-api_1.2_spec-1.0.0.Final.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\spring-context-4.1.1.RELEASE.jar;classes;. -d classes src/com/buptsse/spm/service/impl/UserServiceImpl.java


#----
javac -encoding utf-8 -d classes src/com/buptsse/spm/domain/Code.java
javac -encoding utf-8 -classpath classes;. -d classes src/com/buptsse/spm/service/ICodeService.java
javac -encoding utf-8 -classpath classes;. -d classes src/com/buptsse/spm/dao/ICodeDao.java

javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\log4j-1.2.17.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\spring-context-4.1.1.RELEASE.jar;classes;. -d classes src/com/buptsse/spm/dao/impl/CodeDaoImpl.java

javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\jboss-transaction-api_1.2_spec-1.0.0.Final.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\spring-context-4.1.1.RELEASE.jar;classes;. -d classes src/com/buptsse/spm/service/impl/CodeServiceImpl.java


#----------
javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\servlet-api.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\xwork-core-2.3.16.3.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\fastjson-1.1.40.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\slf4j-api-1.7.7.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\struts2-core-2.3.16.3.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\commons-lang3-3.1.jar;classes;. -d classes src/com/buptsse/spm/action/RegisterAction.java

#----------
javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\struts2-core-2.3.16.3.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\commons-lang3-3.1.jar;classes;. -d classes src/com/buptsse/spm/util/DwrUtil.java

#---------
javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\servlet-api.jar;classes;. -d classes src/com/buptsse/spm/filter/SessionFilter.java

#-------
javac -encoding utf-8 -classpath F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\xwork-core-2.3.16.3.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\struts2-core-2.3.16.3.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\commons-lang3-3.1.jar;F:\Compiler_IDE\apache-tomcat-8.5.78\webapps\spm\WEB-INF\lib\slf4j-api-1.7.7.jar;classes;. -d classes src/com/buptsse/spm/action/LoginAction.java

从上面编译脚本中可清晰地看出每个源代码文件所依赖的jar包。

3.2 对原项目的更改

对相应组件的更改如下:

原版本新版本
mysql-5.0.5.jarmysql-connector-java-8.0.13.jar
servlet-api-2.5.jarservlet-api-3.1.jar

对原项目中的hibernate.cfg.xml、hibernate文件夹删除,二者都在WEB-INF/classes文件夹中。这两个内容对本项目没有用,纯粹是原开发人员单独为测试Hibernate所用。

对DAO层相关源文件的内容修改如下。将BaseDAOImpl.java中的find(String hql, Object[] param)修改为find(String hql, T[] param);将UserDaoImpl.java中的 import com.buptsse.spm.domain.Message;内容删除。其他相关源文件的修改与上述类似。这部分代码中有一些冗余内容,在此不做修改了。

将文件jdbc.properties中的相关内容改为:

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spm?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
jdbc.username=root
...

4 本项目Spring如何整合Struts、Hibernate框架

整个过程是这样的。 Tomcat服务器启动后,调用web.xml中相应配置;在web.xml中<context-param>中设置有Spring的应用环境配置文件路径,于是Spring构建Spring应用环境;在构建Spring应用环境时,会遵照多个xml配置文件(具体请看web.xml),其中applicationContext.xml文件中<bean id="dataSource"><bean id="sessionFactory">指导Spring框架构建Hibernate应用环境;另外Spring-action.xml配置文件指导Spring创建和管理Struts所需的Action类;与此同时Tomcat服务器启动时会读取classes文件夹下的struts.xml配置文件,用于创建Struts的应用环境。上面可以看出,是Spring在创建和管理Hibernate、Struts应用环境所需的类实例,于是,Spring整合了Struts和Hibernate,所进行的开发也被称为基于SSH的开发

上述只是本项目利用Spring框架整合Struts、Hibernate框架的一种方法,应该还有其他整合方法。熟悉本部分内容,面对项目的内容将会更加从容和淡定。

5 未来设想

  • 将本项目改为基于Spring MVC或Spring Boot重新实现。Spring框架系列中本来就有Spring MVC Web开发框架。Spring Boot在2016年左右出现后,更将“约定优于配置”理念发挥到极致。
  • 将本项目改为基于MyBatis ORM框架来实现。这纯粹是为了好玩,Hibernate和MyBatis各有自己的优缺点。
  • 将本项目利用IntelliJ IDEA并配合Maven来开发。我在本文中用的是纯手工,所有的jar文件也是手工来配。该项目2015年时用的IDE是eclipse。利用IntelliJ IDEA将会大大提高开发效率。

6 总结

本文给出了将一个2015年的相对旧点的基于SSH的项目手工部署到较新环境的过程,阐述了所需的前提知识和技能、手工部署的大概流程,并讨论了本项目是如何用Spring将Struts、Hibernate整合在一起开发的。最后,给出了未来设想。

通过本文,读者将对Java Web开发的学习路线、开发内容本身及如何更新部署一个旧项目有更加深刻的理解。

7 致谢

特别感谢北京邮电大学的韩万江老师提供本项目的原始版本。

8 参考资料

[1] Kathy Sierra and Bert Bates. Head First Java. 2nd Edition. O’Reilly Media, 2005.
[2] Bruce Eckel. Thinking in Java. 4th Edition. Prentice Hall, 2006.
[3] Bryan Basham, Kathy Sierra and Bert Bates. Head First Servlets and JSP. 2nd Edition. O’Reilly Media, 2008.
[4] 许晓斌. Maven实战. 北京: 机械工业出版社, 2010.
[5] 刘鑫. JSP从零开始学: 视频教学版. 北京: 清华大学出版社, 2016.
[6] 李刚. Struts 2.x 权威指南. 第3版. 北京: 电子工业出版社, 2012.
[7] Christian Bauer, Gavin King, and Gary Gregory. Java Persistence with Hibernate. 2nd Edition. Shelter Island, NY: Manning Publications, 2016.
[8] Craig Walls. Spring in Action. 4th Edition. Shelter Island, NY: Manning Publications, 2015.
[9] CĂTĂLIN TUDOSE. JUnit in Action. 3rd Edition. Shelter Island, NY: Manning Publications, 2020.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值