我們在appfuse中看到xwork直接可以調用spring配置文件action-servlet.xml中的類,那麼他們是通過什麼方法實現的呢?爲什麼同樣的配置我們的就不可以,原來一切都是因爲一個過濾器。
對於上次所遇到關於userAction無法找到的問題經查證如下:
在默認情況下xwork是無法之際在spring中所聲明的action類的,如果需要調用則需要在web.xml中添加一個過濾器,代碼如下:
<filter>
<filter-name>securityFilter</filter-name>
<filter-class>net.sf.acegisecurity.util.FilterChainProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>securityFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
但是一定要記得,文件net.sf.acegisecurity.util.FilterChainProxy是在acegi-security-x.x.x.jar包裏面的,調用前一定要記得放在應用的WEB-INF/lib/目錄下才能正常使用。
當系統啓動時會自動加載spring配置文件中所聲明的類,在appfuse中這一聲明是放在action-servlet.xml中的,因此必須將這個文件同其他的applicationContext.xml一起在web.xml中聲明爲contextConfigLocation的內容,如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-datasource.xml,/WEB-INF/applicationContext-hibernate.xml,/WEB-INF/applicationContext-service.xml,/WEB-INF/action-servlet.xml</param-value>
</context-param>
在action-servlet.xml中定義如下(這個文件必須符合spring-beans.dtd的規範):
<beans>
<bean id="userAction" class="com.mywap.webwork.action.UserAction" singleton="false">
<property name="userManager"><ref bean="userManager"/></property>
</bean>
<!-- Add additional actions here -->
</beans>
然後在xwork.xml中可以如下調用(這個文件需要符合xwork-1.0.dtd的標準):
<action name="loginCheck" class="userAction" method="add">
<result name="input">/</result>
<result name="success" type="redirect">/listUser.jsp</result>
</action>
不過配置完成以後新的問題又出現了:
在啓動服務的時候出現如下異常,錯誤的等級爲嚴重,正在解決中……
[mywap] ERROR [main] [/].log(662) | Exception starting filter securityFilter
javax.servlet.ServletException: Bean context must contain at least one bean of t
ype net.sf.acegisecurity.util.FilterChainProxy
at net.sf.acegisecurity.util.FilterToBeanProxy.doInit(FilterToBeanProxy.
java:200)
at net.sf.acegisecurity.util.FilterToBeanProxy.init(FilterToBeanProxy.ja
va:137)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(Applicatio
nFilterConfig.java:225)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(Applica
tionFilterConfig.java:308)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFi
lterConfig.java:79)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.
java:3502)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
071)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:755)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:73
9)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav
a:886)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.j
ava:849)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474
)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1079)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java
:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl
eSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1011)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1003)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:437
)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
50)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:201
0)
at org.apache.catalina.startup.Catalina.start(Catalina.java:537)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:271)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:409)
[mywap] ERROR [main] [/].log(662) | Exception starting filter sitemesh
com.opensymphony.module.sitemesh.factory.FactoryException: Cannot construct Fact
ory : com.opensymphony.module.sitemesh.factory.DefaultFactory: java.lang.reflect
.InvocationTargetException
at com.opensymphony.module.sitemesh.Factory.report(Factory.java:87)
at com.opensymphony.module.sitemesh.Factory.getInstance(Factory.java:56)
at com.opensymphony.module.sitemesh.filter.PageFilter.init(PageFilter.ja
va:86)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(Applicatio
nFilterConfig.java:225)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(Applica
tionFilterConfig.java:308)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFi
lterConfig.java:79)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.
java:3502)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
071)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:755)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:73
9)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav
a:886)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.j
ava:849)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474
)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1079)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java
:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl
eSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1011)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1003)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:437
)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
50)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:201
0)
at org.apache.catalina.startup.Catalina.start(Catalina.java:537)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:271)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:409)
Root cause:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at com.opensymphony.module.sitemesh.Factory.getInstance(Factory.java:52)
at com.opensymphony.module.sitemesh.filter.PageFilter.init(PageFilter.ja
va:86)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(Applicatio
nFilterConfig.java:225)
at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(Applica
tionFilterConfig.java:308)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFi
lterConfig.java:79)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.
java:3502)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4
071)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase
.java:755)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:73
9)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.jav
a:886)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.j
ava:849)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474
)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1079)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java
:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(Lifecycl
eSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1011)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1003)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:437
)
at org.apache.catalina.core.StandardService.start(StandardService.java:4
50)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:201
0)
at org.apache.catalina.startup.Catalina.start(Catalina.java:537)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:271)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:409)
Caused by: java.lang.IllegalStateException: Cannot load excludes configuration f
ile from jar
at com.opensymphony.module.sitemesh.factory.DefaultFactory.loadExcludes(
DefaultFactory.java:192)
at com.opensymphony.module.sitemesh.factory.DefaultFactory.loadConfig(De
faultFactory.java:121)
at com.opensymphony.module.sitemesh.factory.DefaultFactory.<init>(Defaul
tFactory.java:57)
... 33 more