代码改变世界

在同一应用中让struts1与struts2和平共处

2012-07-30 09:34  idkkk  阅读(893)  评论(2编辑  收藏  举报

1 前言

本文档的目的是为了让CLAP同时支持struts1以及struts2,兼容两者在同一个app中共存,运行前端既可以使用struts1进行开发,又可以使用struts2进行开发。由于现有的大部分项目采用struts2进行开发,为了降低迁移成本以及提升CLAP平台的适用范围,故此文档的目的也源于此:让CLAP(内置struts1)支持struts2。Struts2源自webwork2,struts2与struts1不是师出同门,两者兼容在理论上应该完全没有问题。

集成主要包含两大部分:配置、jar包。

2 集成步骤

2.1     配置

>>  web.xml配置:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>

核心是保持struts1与struts2的请求处理分离,比如上面的将所有请求后缀为action的交由struts2处理,而所有请求后缀为do的交由struts1处理,这部分可以自行规划来进行相应配置。

 >>  struts.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.configuration.xml.reload" value="false" />
    <constant name="struts.custom.i18n.resources" value="globalMessages" />
    <constant name="struts.action.extension" value="action,," />
    <constant name="struts.enable.SlashesInActionNames" value="true" />

    <package name="actions" namespace="/" extends="struts-default">
        <action name="*/*" class="clap.sample.struts2.action.{1}Action" method="{2}">
            <result>/WEB-INF/views/{1}/{2}.jsp</result>
            <result name="list">/index.jsp</result>
        </action>
    </package>
</struts>

 struts2配置只供参考(示例中集成的是struts2.3.4),可以根据实际项目使用struts2的方式来进行规范及约束,比如加入Convention插件解决配置文件问题。 

2.2     jar包

由于jar包升级不同struts2版本,可能会稍有不同,请稍微注意一下,以下以struts2.3.4来进行集成过程描述:

>>   拷贝struts2.3.4-all.zip包里的struts2-blank.war里的lib目录到项目的lib目录下;

>>   删除所有同一类包的低版本jar包(比如common-lang);

>>   修正jar包更新后导致的java代码变更;

>>   将JSTL 1.2降为JSTL 1.1;