Struts2 升级由2.3.4.1 升级到2.5.17
Tomcat升级:
新增替换JAR包:
需要删除旧版本中的JAR包,替换为新版本中的JAR包,具体操作如下:
替换JAR包
参照如下表格进行替换:
新版JAR包名称 |
旧版JAR包名称 |
asm-5.2.jar |
asm-3.2.jar |
asm-commons-5.2.jar |
asm-commons-3.3.jar |
asm-tree-5.2.jar |
asm-tree-3.3.jar |
commons-collections-commons-collections-3.2.1.jar |
commons-collections-3.2.1.jar |
commons-digester-2.0.jar |
commons-digester-1.8.1.jar |
commons-fileupload-1.3.3.jar |
commons-fileupload-1.2.2.jar |
commons-io-2.5.jar |
commons-io-1.4.jar |
commons-lang3-3.6.jar |
commons-lang3-3.1.jar |
commons-lang-commons-lang-2.5.jar |
commons-lang-2.5.jar |
freemarker-2.3.26-incubating.jar |
freemarker-2.3.16.jar |
ica-dao-unicom-0.0.1-SNAPSHOT.jar |
ica-dao-unicom-0.0.1-SNAPSHOT.jar |
ica-intercept-unicom-0.0.1-SNAPSHOT.jar |
ica-intercept-unicom-0.0.1-SNAPSHOT.jar |
ica-lang-unicom-0.0.1-SNAPSHOT.jar |
ica-lang-unicom-0.0.1-SNAPSHOT.jar |
ica-misc-unicom-0.0.1-SNAPSHOT.jar |
ica-misc-unicom-0.0.1-SNAPSHOT.jar |
ica-service-unicom-0.0.1-SNAPSHOT.jar |
ica-service-unicom-0.0.1-SNAPSHOT.jar |
ognl-3.1.15.jar |
ognl-3.0.5.jar |
struts2-convention-plugin-2.5.17.jar |
struts2-convention-plugin-2.3.4.1.jar |
tiles-servlet-3.0.7.jar |
tiles-servlet-2.1.4.jar |
struts2-core-2.5.17.jar |
struts2-core-2.3.4.1.jar |
struts2-json-plugin-2.5.17.jar |
struts2-json-plugin-2.3.4.1.jar |
tiles-jsp-3.0.7.jar |
tiles-jsp-2.1.4.jar |
javassist-3.20.0-GA.jar |
javassist-3.12.1-GA.jar |
tiles-core-3.0.7.jar |
tiles-core-2.1.4.jar |
struts2-tiles-plugin-2.5.17.jar |
struts2-tiles-plugin-2.1.8.1.jar |
tiles-api-3.0.7.jar |
tiles-api-2.1.4.jar |
ica-version-unicom-0.0.1-SNAPSHOT.jar |
ica-version-unicom-0.0.1-SNAPSHOT.jar |
ica-view-unicom-0.0.1-SNAPSHOT.jar |
ica-view-unicom-0.0.1-SNAPSHOT.jar |
log4j-1.2-api-2.7.jar |
log4j-1.2.16.jar |
新增JAR包
参照如下表格进行新增:
新增JAR包名称 |
jackson-annotations-2.9.0.jar |
jackson-core-2.9.4.jar |
jackson-databind-2.9.4.jar |
jackson-dataformat-xml-2.1.2.jar |
jackson-module-jaxb-annotations-2.1.2.jar |
jcl-over-slf4j-1.7.6.jar |
json-lib-2.4-jdk15-1.0.jar |
log4j-api-2.7.jar |
log4j-core-2.7.jar |
tiles-autotag-core-runtime-1.2.jar |
tiles-el-3.0.7.jar |
tiles-freemarker-3.0.7.jar |
tiles-ognl-3.0.7.jar |
tiles-request-api-1.0.6.jar |
tiles-request-freemarker-1.0.6.jar |
tiles-request-jsp-1.0.6.jar |
tiles-request-servlet-1.0.6.jar |
tiles-template-3.0.7.jar |
替换class:
替换class文件,将在eclipse里用新版本编译过的class文件(主要是action相关文件)替换到tomcat工程里。
修改配置:
相关配置文件在tomcat里的路径如下:
web.xml
\WEB-INF\web.xml
struts.xml
\WEB-INF\classes\struts.xml
tiles.xml
\WEB-INF\tiles.xml
log4j2.xml
\WEB-INF\classes\log4j2.xml
tiles-jsp.tld
\WEB-INF\tld\tiles-jsp.tld
applicationContext.xml
\WEB-INF\classes\applicationContext.xml
web.xml修改
Struts2 filter修改:
之前:
修改为:
struts.xml修改
DTD修改:
之前为:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> |
修改为:
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd"> |
Action扫描jar包修改:
修改原因:由于一些包里的注解是用旧版本进行编译的,而升级后需要用新版本进行编辑,否则会报错,而发现struts.xml里扫描的有些jar包在工程项目里并不存在,不确定是否有用,暂时先删除掉。
之前为:
<constant name="struts.convention.action.includeJars" value=".*?/ica-view-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-corpaudit-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-qh4a-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-cashbox-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-auditSensitive-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-jsbusiness-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-workflow-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-intercept-unicom-0.0.1-SNAPSHOT.*?jar(!/)?" /> |
修改后为:
<constant name="struts.convention.action.includeJars" value=".*?/ica-view-unicom-0.0.1-SNAPSHOT.*?jar(!/)?,.*?/ica-intercept-unicom-0.0.1-SNAPSHOT.*?jar(!/)?" /> |
扫描包移除的有:
ica-corpaudit-unicom-0.0.1-SNAPSHOT
ica-qh4a-unicom-0.0.1-SNAPSHOT
ica-cashbox-unicom-0.0.1-SNAPSHOT
ica-auditSensitive-unicom-0.0.1-SNAPSHOT
ica-jsbusiness-unicom-0.0.1-SNAPSHOT
ica-workflow-unicom-0.0.1-SNAPSHOT
tiles.xml修改
DTD修改:
之前为:
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd"> |
修改为:
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd"> |
log4j2.xml
/ica-portal-unicom/src/main/resources目录下添加log4j2.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <configuration status="debug"> <appenders> </appenders> <loggers> <root level="info"> <appender-ref ref="Console"/> <appender-ref ref="log"/> </root> </loggers> </configuration> |
上述配置为初始化配置,后续需要修改。
tiles-jsp.tld
tiles-jsp.tld文件需要替换
可以从如下jar包中得到最新的tld文件:
新版tiles相关业务代码修改
由于新版本的tiles相关类、方法的改变导致旧版本一些代码编译错误,现将修改内容记录如下:
先说下项目中旧版本中action的设计过程:
首先项目中创建了一个所有action都继承的抽象基类:
public abstract class CrudActionSupport<T> extends ActionSupport implements ModelDriven<T>, Preparable
|
在该类里通过业务代码可以控制tiles的渲染页面,主要通过如下方法实现:
/** * 设置模板 * * @param key * @param template */ protected void setNamedTemplate(String key, String template) { TilesContainer container = ServletUtil.getCurrentContainer(getRequest(), getRequest().getSession().getServletContext()); AttributeContext attributeContext = container.startContext(getRequest(), getResponse()); attributeContext.putAttribute("title", new Attribute(StringUtils.trimToEmpty(ConfigInfoUtils.shopResource.getString("SYS.TITLE.NAME")))); attributeContext.putAttribute(key, new Attribute(template)); }
/** * 默认设置模板 * * @param template */ protected void setDefaultNamedTemplate(String template) { setNamedTemplate("body", "/WEB-INF/content" + template); }
|
然后所有继承该类的action都可以通过调用setDefaultNamedTemplate方法来实现titles页面渲染的改变。在新版本中会导致上述代码编译失败,我尝试了几种修改方式,都没改成功,无意间在网上搜索到可以通过org.apache.tiles.preparer.ViewPreparer类来实现,因此修改如下:
新增your.package.name.ActionViewPreparer类用于在渲染页面重新设置相关跳转页面,该类主要内容为:
public class ActionViewPreparer implements ViewPreparer { private String template;
public String getTemplate() { return template; }
public void setTemplate(String template) { this.template = template; }
@Override public void execute(Request tilesContext, AttributeContext attributeContext) { // TODO Auto-generated method stub System.out.println("==>进入到execute!"); System.out.println("==>this.template="+this.template); if(this.template!=null && !"".equals(this.template) && !"null".equals(this.template)) { attributeContext.putAttribute("body", new Attribute("/WEB-INF/context"+this.template)); } }
} |
applicationContext.xml文件增加上述javaBean配置:
<bean id="actionViewPreparer" class="your.package.name.ActionViewPreparer" />
tiles.xml文件基础模版增加preparer="actionViewPreparer":
上述preparer属性值为spring注入bean的beanID
CrudActionSupport.java修改:
主要修改有:
增加ActionViewPreparer属性:
@Autowired
private ActionViewPreparer actionViewPreparer;
删除setNamedTemplate方法
修改setDefaultNamedTemplate方法为:
protected void setDefaultNamedTemplate(String template) { this.actionViewPreparer.setTemplate(template); } |
prepare方法为:
public void prepare()中添加:
this.actionViewPreparer.setTemplate(null);//struts2 升级 action执行前给viewPrepare对象初始化
修改JDK环境
将tomcat中JDK环境修改为1.7及以上