关于Struts2中struts.xml文件分层问题

来源:互联网 发布:短线王炒股软件 编辑:程序博客网 时间:2024/06/10 01:03

没事折腾struts2,遇到异常,浪费好长时间,于是干脆把所有可能的异常都给跑一遍,来个痛快的。

文件的结构

WEB-INF

      |------configs

                   |-------struts-common.xml

                   |-------struts.xml

      |------web.xml

遇到的异常:

WARNING: Could not find action or result: /Pro_struts2/common/login!preLoginThere is no Action mapped for action name login!preLogin. - [unknown location]at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:552)at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:724)

一般情况下struts的配置文件都是放在src文件目录下。我想把这些配置文件放到WEB-INF目录下面,然后在web.xml中告诉系统这些文件的位置。xml文件

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Pro_struts2</display-name><!-- 注册struts框架过滤器 --><filter><filter-name>struts</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><init-param><description>指定struts.xml文件位置</description><param-name>config</param-name><span style="color:#ff0000;"><param-value>configs/struts.xml</param-value></span></init-param></filter><filter-mapping><filter-name>struts</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>

参见红色字体部分,错误原因:此处路径是相对于web.xml本身,因此路径应该修改为“../configs/struts.xml”

修改好后,服务器启动报错:

SEVERE: Dispatcher initialization failedcom.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory).at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:144)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMethods(ContainerImpl.java:113)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:90)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:86)at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:71)at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:67)at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)at java.util.concurrent.FutureTask.run(FutureTask.java:166)at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:490)at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:530)at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:528)at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:584)at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:528)at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:257)at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445)at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:489)at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4809)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5485)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:670)at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1839)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)at java.util.concurrent.FutureTask.run(FutureTask.java:166)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:724)Caused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory).at com.opensymphony.xwork2.inject.ContainerImpl.createParameterInjector(ContainerImpl.java:239)at com.opensymphony.xwork2.inject.ContainerImpl.getParametersInjectors(ContainerImpl.java:229)at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.<init>(ContainerImpl.java:293)at com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:117)at com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:114)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:141)... 38 moreJul 02, 2014 3:34:30 PM org.apache.catalina.core.StandardContext filterStartSEVERE: Exception starting filter strutscom.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory). - Class: com.opensymphony.xwork2.inject.ContainerImplFile: ContainerImpl.javaMethod: addInjectorsForMembersLine: 144 - com/opensymphony/xwork2/inject/ContainerImpl.java:144:-1at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:501)at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:279)at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:260)at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105)at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4809)at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5485)at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:670)at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1839)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)at java.util.concurrent.FutureTask.run(FutureTask.java:166)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:724)Caused by: com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory).at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:144)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMethods(ContainerImpl.java:113)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:90)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:86)at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:71)at com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:67)at com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:150)at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)at java.util.concurrent.FutureTask.run(FutureTask.java:166)at com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:76)at com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:116)at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:490)at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:530)at com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:528)at com.opensymphony.xwork2.inject.ContainerImpl.callInContext(ContainerImpl.java:584)at com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:528)at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:257)at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445)at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:489)... 19 moreCaused by: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException: No mapping found for dependency [type=com.opensymphony.xwork2.ObjectFactory, name='default'] in public void com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.setObjectFactory(com.opensymphony.xwork2.ObjectFactory).at com.opensymphony.xwork2.inject.ContainerImpl.createParameterInjector(ContainerImpl.java:239)at com.opensymphony.xwork2.inject.ContainerImpl.getParametersInjectors(ContainerImpl.java:229)at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.<init>(ContainerImpl.java:293)at com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:117)at com.opensymphony.xwork2.inject.ContainerImpl$3.create(ContainerImpl.java:114)at com.opensymphony.xwork2.inject.ContainerImpl.addInjectorsForMembers(ContainerImpl.java:141)... 38 more


错误原因,当struts.xml文件不再src下时,无法自动关联到strtus-default.xml文件,因此需要以下配置

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"><display-name>Pro_struts2</display-name><!-- 注册struts框架过滤器 --><filter><filter-name>struts</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class><init-param><description>指定struts.xml文件位置</description><param-name>config</param-name><param-value><span style="color:#ff0000;">struts-default.xml,</span>../configs/struts.xml</param-value></init-param></filter><filter-mapping><filter-name>struts</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>


这样处理之后,启动就不会报错了。

由于struts文件也被分割成两个文件,struts.xml 使用include标签将sturts-common.xml包含进来。sturts.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><!-- 这些属性可以再struts的StrutsConstant.java中找到 --><constant name="struts.devMode" value="true"></constant><constant name="struts.custom.i18n.resources" value="MessageResource"></constant><constant name="struts.i18n.encoding" value="utf-8"></constant><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><include file="struts-common.xml"></include></struts>


服务器启动没有问题,但是无法访问到sturts-common.xml中的Action,报错信息如下

SEVERE: Could not find action or result/Pro_struts2/common/login!preLoginThere is no Action mapped for action name login. - [unknown location]at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185)at org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37)at com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:552)at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at java.lang.Thread.run(Thread.java:724)

错误原因:虽然sturts.xml在configs文件夹中,但是编译后struts.xml文件的位置是在WEB-INF/classes下面的,因此相对路径应该相对于classes文件夹。修改如下

<?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><!-- 这些属性可以再struts的StrutsConstant.java中找到 --><constant name="struts.devMode" value="true"></constant><constant name="struts.custom.i18n.resources" value="MessageResource"></constant><constant name="struts.i18n.encoding" value="utf-8"></constant><constant name="struts.enable.DynamicMethodInvocation" value="true"></constant><include file="<span style="color:#ff0000;">../configs/</span>struts-common.xml"></include></struts>



0 0
原创粉丝点击