问题描述
原来我的struts2配置如下,完全正常:<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>后来要开发webservice,加入了CXF,因为也要配置web.xml:<servlet><servlet-name>cxf</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class></servlet><servlet-mapping><servlet-name>cxf</servlet-name><url-pattern>/services/*</url-pattern></servlet-mapping>这样发现因为struts2配置的是/*,所以会对所有操作拦截,也会拦截webservice的调用,所以把struts2的配置改成了以下:<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/action/*</url-pattern></filter-mapping>这样调用webservice正常了,但是struts2却出了问题,原来的action,除了在根目录下的文件中调用的可以正常之外,其它的全都不可以访问了,举个例子:在webcontext/cms下有一个epg.html文件,在它的文件中原来调用action,是直接写的:url=“epg.action“,但是现在改成了url="action/epg.action",在firefox中发现有错误,原来路径发生错误:本来应该是http://localhost:8080/project/action/epg.action,但是它却变成了http://localhost:8080/project/cms/action/epg.action,路径当然不一样了,但是我很不解,原来配置的/*为什么可以,这个不就是/action/*吗?就加了一个action,怎么和具体路径挂起来了,原来不是说action不和具体调用的文件路径挂钩吗?
解决方案
/action/* 这中写法不提倡 最好是/*.action 中间不要加 ‘/’因为 /在web里面有很多 路径上的含义。除非你完全弄懂 否则不要用 我的文章 http://chenchangqun11.iteye.com/blog/831530中有关于‘/’的讲解 希望可以帮到你另外 url 最好写绝对路径
解决方案二:
你的写法 和Struts2的命名空间挂上钩了 看看Struts2的命名空间吧 默认的命名空间是/