使用Struts2.1.6,如果設(shè)為開發(fā)模式,即

<constant name="struts.devMode" value="true"/> 或者
<constant name="struts.configuration.xml.reload" value="true"/>

啟動Tomcat時,會出現(xiàn)以下異常:

org.apache.catalina.core.StandardContext filterStart
嚴重: Exception starting filter struts2
java.lang.NullPointerException
    at com.opensymphony.xwork2.util.FileManager$FileRevision.needsReloading(FileManager.java:209)
    at com.opensymphony.xwork2.util.FileManager.fileNeedsReloading(FileManager.java:60)
    at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.needsReload(XmlConfigurationProvider.java:325)
    at org.apache.struts2.config.StrutsXmlConfigurationProvider.needsReload(StrutsXmlConfigurationProvider.java:168)
    at com.opensymphony.xwork2.config.ConfigurationManager.conditionalReload(ConfigurationManager.java:220)
    at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:61)
    at org.apache.struts2.dispatcher.Dispatcher.getContainer(Dispatcher.java:774)
    at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:191)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3709)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4363)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:926)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:889)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:492)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
2009-2-4 22:40:54 org.apache.catalina.core.StandardContext start
嚴重: Error filterStart
2009-2-4 22:40:54 org.apache.catalina.core.StandardContext start
嚴重: Context [/Struts2Demo2] startup failed due to previous errors

問題及解決方法:

做上個項目的時候就出現(xiàn)了這個異常,網(wǎng)上查了很多資料,有人說這個是216版本的BUG,還有一個.patch補丁文件,打上補丁就沒問題了,下一個版本就進行修訂,當時也不會打補丁就放棄了開發(fā)模式。今天又碰見這個問題,百度了一下竟然又解決方法了,原因很簡單也很令人汗顏,就是“tomcat的安裝路徑包含空格”,重裝了下Tomcat測試果然沒問題,汗死了??!

下面幾個知識點是從別人那里COPY來的,O(∩_∩)O哈哈~

下面是4個開發(fā)模式常用配置的簡介---
    <!-- 開啟使用開發(fā)模式,詳細錯誤提示 -->
    <!-- <constant name="struts.devMode" value="true"/>-->
    <!-- 指定每次請求到達,重新加載資源文件 -->
    <!-- <constant name="struts.i18n.reload" value="true"/>-->
    <!-- 指定每次配置文件更改后,自動重新加載 -->
    <!-- <constant name="struts.configuration.xml.reload" value="true"/>-->
    <!-- 指定XSLT Result使用樣式表緩存 -->
    <!-- <constant name="struts.xslt.nocache" value="true"/>-->

2.零配置插件codebehind一旦導(dǎo)入就必須進行init-param初始化配置,否則報錯:packageAction can't mapping action!

3.<s:i18n name="???"></s:i18n>包住那個標簽,該標簽就加載它指定的國際化文件,不管是text,textfield還是form都是如此。

4.action實例、xxxScope對象都在ValueStack內(nèi),直接使用${}調(diào)用

5.使用append標簽時,沒有所謂的將map和list集合對象連接起來的說法,在創(chuàng)建map對象的使用的語法為#{:,},如果省略冒號,則默認value為null。

5.StackContext 中的對象可以理解為struts2標簽庫使用的專用對象,比如通過value屬性調(diào)用:value="#xxx.xxx.xxx..."

6.ValueStack是StackContext的頂級對象,可以不需要#前綴使用,StackContext中的某些已建立對象可以通過比如在某些標簽中設(shè)置var屬性調(diào)入根對象ValueStack,達到省略#號的目的。在實際中則可以理解為在標簽內(nèi)臨時新建的一個或多個對象,通過var屬性指定的名稱訪問 value="xxx.xxx.xxx...."

7.${requestScope.xxx.name} 與 <s:property value="#request.xxx.name"/>(escapse屬性設(shè)置為false) 表達的內(nèi)容相同,都是輸出request范圍內(nèi)的xxx對象的name屬性值,且無論是否該值包含html代碼