2013-08-23 30 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