struts1+struts2项目兼容升级到了spring boot 2.7
原项目比较复杂,集成了各种框架(struts1 struts2 spring3等),趁工作之余练练手,学习一下springboot。大概花了一周时间才调通。
一、调整jar版本,寻找合适的版本。
第一步、首先原项目JDK6,要用springboot JDK肯定要升级了。原来的struts2也有漏洞了,也要升级。
在不升级其他框架的情况下。jdk21 17都可以运行,索性选择jdk21,反正是练手。
第二步、struts2 已经停止更新,就选最新版本了,目标是先按原来的框架跑起来,逐步把struts2废弃掉。升级后界面标签属性有点变化,批量替换。
s:iterator的 id 改成var
s:property escape属性没了。
过滤器路径也改了:org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
第三步、一切正常之后,可以说装载springboot 。3.0之后javaee9,最重要的是javax 变jakata了,变化太大,如果选3.0之前的程序肯定跑不起来。在这里折腾了好几天,调整版本兼容性。最终选择boot2.7.18 2.7的最高版本了。对应spring5.3
第四步、先把springboot空的应用正常启动,配置好能够对空的jsp访问,这里出现过不渲染JSp的问题,不知道怎么消失了。
第五步、把WEB.xml 里的配置 全部放到配置类中。把过滤器、监听器、servlet等注册到spring配置类中。 这里会出现版本兼容的问题,如果springboot选择3.0 就要求过滤器要继承jakata路径。
这里会把struts1和struts2在web.xml的配置全部注册完毕。
第六步、修改JSP ,主要是标签错误。
每一步都有不少问题,基本上不停的问百度、豆包、元宝
spring 配置如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.18</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
struts2配置如下
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
<version>2.5.30</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.30</version>
</dependency>
struts1配置如下:
<dependency>
<groupId>struts</groupId>
<artifactId>struts</artifactId>
<version>1.1</version>
<exclusions>
<exclusion>
<groupId>javax.sql</groupId>
<artifactId>jdbc-stdext</artifactId>
</exclusion>
</exclusions>
</dependency>
JSP支持配置如下:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
与struts1相关启动报错问题,但不影响使用,解决版本,在main类中增加方法:
@Bean
public TomcatServletWebServerFactory tomcatFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
((StandardJarScanner) context.getJarScanner()).setScanManifest(false);
}
};
}
另外理论上web.xml可以删除了。但是struts1还会读取web文件,如果文件不存在会抛异常,web.xml暂时保留着。