2013-08-23 80 views
1

我正在使用Struts 2.3.15,並且s:optionselecttransfer標記不起作用,因爲JavaScript未加載。我使用:Struts2在configuration.reload()後沒有提供靜態資源

<%@ taglib prefix="s" uri="/struts-tags" %> 
<s:optiontransferselect ... /> 

產生以下JavaScript:因爲我稱之爲加載存儲在各種插件一些附加Struts2的XML配置文件後,在Struts configurationManager.reload()方法

<script type="text/javascript" src="/struts/optiontransferselect.js"></script> 

我的問題是引起的。調用reload()殺死Struts的靜態資源。我重裝按如下規則進行:

ConfigurationManager configurationManager = dispatcher.getConfigurationManager(); 
StrutsXmlConfigurationProvider strutsXmlConfigurationProvider = 
     new StrutsXmlConfigurationProvider(strutsXMLLocation, false, getServletContext()); 
configurationManager.addContainerProvider(strutsXmlConfigurationProvider); 
configurationManager.reload(); 

爲了解決這個問題,我已經從org.apache.struts2.static將文件複製到我的服務器的根,使他們都可以訪問,然後用來羅馬C'S代碼,以防止Struts的服務靜態資源。這允許瀏覽器找到s:optionselecttransfer標籤的JavaScript。

如果有人可以冒險猜測爲什麼reload()阻止提供靜態資源,我想嘗試修復它。如果沒有其他想法,我會接受Roman C的解決方案。

+0

出於好奇,你做了哪些修改? –

+0

所做的更改將在struts類的其他類加載器中查找。這是需要的,因爲web應用程序使用支持Struts2的插件,Struts2不考慮'Thread.currentThread()之外的類加載器。getContextClassLoader()' – Doahh

+0

啊,有趣的是,這可能是值得引入核心框架的東西。 –

回答

1

s:head標籤應放在標籤下。

默認情況下,FilterDispatcher使用的常量可以在jar中使用靜態內容。

struts.serve.static=true 

如果你想從context_path/struts訪問它然後通過設置到false將其關閉。

struts.serve.static=false 
+0

感謝有關靜態服務的信息,這可能會有用。我的問題實際上是由於現在已修復的Struts2'ClassLoaderUtil'類的一些定製引起的。 – Doahh