目录
前言
最近在为公司系统进行Struts2升级,从2.3.24.3升级到2.5.14.1,在此整理一下在升级过程中遇到的问题和解决办法,防止自己忘记。顺带提醒一点,升级struts2.5版本时,工程的jdk版本需要1.7以上,否则编译不支持。
开始升级
一、更换jar包
第一步就是下载struts2的2.5.14.1版本的包,移除工程中不再需要的jar包,替换为新的jar包。网上其他文章对于jar包的替换大同小异,所以在此列出的jar包更新列表并不是完整的,可能需要根据各自系统进行补充。
移除jar包
- commons-fileupload
- commons-lang-2.3
- commons-lang3-3.1
- freemarker-2.3.22
- javassist-3.11.0.GA
- log4j-1.2.14
- ognl-3.0.6.1
- struts2-core-2.3.24.3
- struts2-json-plugin-2.3.24.3
- struts2-spring-plugin-2.3.24.3
- xwork-core-2.3.24.3
添加jar包
- commons-fileupload-1.3.3
- commons-lang-2.4
- commons-lang3-3.6
- freemarker-2.3.26-incubating
- javassist-3.20.0-GA
- log4j-1.2-api-2.9.1
- log4j-api-2.9.1
- log4j-core-2.9.1
- ognl-3.1.15
- struts2-core-2.5.14.1
- struts2-json-plugin-2.5.14.1
- struts2-spring-plugin-2.5.14.1
说明
- 在struts2.5版本中xwork-core这个类库已经包含在struts2-core中,所以在此次升级中移除。
- 如果引用了其他struts2-x-plugin类库,也需要进行相应更新。
- struts2.5版本开始使用log4j2日志系统,引入log4j-1.2-api-2.9.1可以避免log4j代码的修改,但需要在工程src目录下新增log4j2.xml配置文件,旧的log4j日志规则需要迁移到新的日志配置文件中,然后移除旧的日志配置文件。log4j2.xml的配置可以参考网上的教程。
二、配置文件修改
web.xml文件
在2.5版本的struts2-core中没有了ng包,所以StrutsPrepareAndExecuteFilter类的路径需要修改。
修改前:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
修改后:
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
struts配置文件
1、所有struts配置文件的文件头部需要更新为2.5。
修改前:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
修改后:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
2、如果需要使用通配符的方式配置action时,需要在action所在的package中设置strict-method-invocation属性为false或者在package包中添加<global-allowed-methods>regex:.*</global-allowed-methods>
。
网上其他的文章的解释:因为2.5版本升级了很多特性,在Struts 2.5中,严格DMI被扩展,它被称为严格方法调用 又名SMI。你可以想象DMI是一个“边境警察”,SMI是一个“税务警察”,并注意内部。使用此版本,SMI默认情况下启用(strict-method-invocation属性默认设置为 true在 struts-default包中),您可以选择禁用它每个包 - 没有全局开关禁用整个应用程序的SMI。
下面是修改的例子(二选一):
<package name="videoDetail" namespace="/videoDetail"
extends="json-default" strict-method-invocation="false">
<action name="*" class="com.coder.video.action.VideoDetailAction"
method="{1}">
</package>
或者
<package name="videoDetail" namespace="/videoDetail"
extends="json-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="*" class="com.coder.video.action.VideoDetailAction"
method="{1}">
</package>
如果有公用的package,可以把<global-allowed-methods>regex:.*</global-allowed-methods>
添加到公用package,然后继承公用package,这样的好处就是不用一个个package去添加。也可以根据实际需要修改个别package。
另外package中元素需要按照一定的顺序排列:
result-types
interceptors
default-interceptor-ref
default-action-ref
default-class-ref
global-results
global-exception-mappings
action*(就是所有的action放到最后)
否则会报错:
The content of element type "package" must match default-interceptor-
ref?,default-action-ref?,default-class-ref?,global-results?,global-
exception-mappings?,action*)".
三、代码修改
JSP文件
JSP文件主要是要替换struts标签的一些过时的属性,和规范JSP语法。在此列出在升级中遇到的修改。
- s标签库
<s:iterator>
、<s:bean>
等标签的id属性已过时,需要修改为var 属性。<s:set>
的name属性需要修改为var属性。<s:property>
标签的escape属性需要修改为escapeHtml属性。
- JSP语法
- 使用
<@page import="">
导入包时,不要加分号结束。例如:
<@page import="java.lang.*">
(正确写法)
<@page import="java.lang.*;">
(错误写法)
- 使用
此类修改如果在IDE(我使用的是MyEclipse)工具上进行,使用正则表达式搜索能够比较快速定位修改点。
Java文件
javabean的getter/setter方法需要注意按照规则书写。具体规则可参考:JavaBean的命名规则。其中需要特别注意:
如果属性名的第二个字母是大写,则它的存取方法是 set/get 加上属性原名
/**例子**/
private String sNum;
//正确写法,getter/setter为set/get 加上属性原名
public String getsNum(){ return this.sNum;}
public void setsNum(String sNum){this.sNum=sNum;}
//错误写法
public String getSNum(){ return this.sNum;}
public void setSNum(String sNum){this.sNum=sNum;}
总结
这次struts2升级遇到不少的问题,不过都一一解决了,学到不少东西,在此记录一番,也不枉这些天的劳苦。以后写代码尽量按照规范,避免软件升级时出现不兼容的情况。log4j2日志系统的配置有时间也需要记录一下。