这几天,接到一个简单的项目,本来在公司实习用的是struts1.x的版本,不过后来自己想想,还是struts2.x功能要强大一点,没有公司已有的各色各样的组建,自己开发的话,用struts2.x效率更好些。可惜啊,很久没有用struts2.x了,很多东西都要重新复习一次。同时,在搭建struts应用的时候,遇到了很多之前没有遇到的问题,现在我把问题都罗列一下,希望可以帮助大家。
1.struts2.x配置文件的默认存放路径是在/WEB-INF/classes目录下,也就是说,把struts.xml放在src的目录下。
2.如果要修改struts2.x配置文件的存放位置,需要几个步骤:
2.1在原有的filter中加入一个init-param标签,具体配置如下:
<filter>
<filter-name>controller</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>modules/struts.xml</param-value>
</init-param>
</filter>
2.2 在struts.xml文件中添加如下代码,添加代码的原因就是,你没有用struts2的默认路径(或者这就是不听话的代价吧。后面还有更多的代价)
<include file="struts-plugin.xml"></include>
如果不添加这段代码,会出现类似下面的错误:(找不到配置文件里面的action类,不知道你看到下面代码会想到什么,我的第一感觉就是检查有没有拼写错误,如果没有拼写错误,跟住....头大了...不知道哪里下手....答案就在这里)
Caused by: Action class [xxxAction] not found - action - file:....../resources/modules/struts.xml:7:65
3.如果要把一个庞大的struts.xml配置文件分成几个单独的配置文件,可以用<include file="...">标签。如果你按照普通的方式把文件路径写入file属性中,没有意外的话,应该会报错。这个问题,我搞了很久才想明白,跟struts2的默认配置路径有关,所有配置文件的默认路径都是/WEB-INF/classes,要记住这点,明白了之后,应该就知道怎么改了。想到了吗?假如你的子配置文件的路径是 /WEB-INF/classes/aa/bb/cc/struts-config.xml的话,file属性的值应该写:aa/bb/cc/struts-config.xml。赶快试试吧。
4.好了,讲好struts2跟spring整合了。网上很多朋友,甚至连strut2 in action 都是这样教你整合这两个框架的。
第一:假如spring-core.jar、spring-web.jar、spring-web.jar、spring-context.jar、struts2-spring-plugin.jar
第二:在struts.xml中加入:<constant name="struts.objectFactory" value="spring" />
完成!
事实上,这种情况只针对struts.xml放在默认路径。
如果你修改了配置文件的存放路径的话,上面的步骤还是要做足,不过,当你以为成功的时候,实际上应该会报一个错误,说找不到objectFactory的对象spring。这个问题,我也是搞了很久才突然想到,不知道你想到了没有。看看上面我写的第三条,再想想。
好吧,我讲一下吧。
在struts.xml(主配置文件,如果你有分子配置文件的话)中添加以下代码:
<include file="struts-plugin.xml"></include>
再启动试试....偷笑了吧....
5.如果你spring和struts整合成功(针对修改了struts2配置文件路径的,不修改配置文件路径的轻松解决,这里就不赞扬了),先恭喜了一下。
另外,这个时候,如果你把struts.xml文件中的<constant name="struts.objectFactory" value="spring" />删除了之后,整合还成功吗?讲多无谓,自己试试吧。
应该还是可以的吧,为什么这样呢?按照道理,应该整合失败才对啊,怎么会这样呢?原因很简单,看看struts2-spring-plugin.jar包中的struts-plugin.xml文件就知道了。不管你是修改了配置文件存放路径(收到添加要读取的配置文件),还是默认的存放路径(struts2默认帮你做了),都是需要读取struts-plugin.xml文件的内容,所以,明白了吧。