Struts2.3升级2.5版本注意点整理

目录

前言

  最近在为公司系统进行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

说明

  1. 在struts2.5版本中xwork-core这个类库已经包含在struts2-core中,所以在此次升级中移除。
  2. 如果引用了其他struts2-x-plugin类库,也需要进行相应更新。
  3. 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日志系统的配置有时间也需要记录一下。

展开阅读全文

没有更多推荐了,返回首页