目錄
前言
最近在爲公司系統進行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日誌系統的配置有時間也需要記錄一下。