【发布时间】:2013-08-26 11:09:58
【问题描述】:
我正在使用 Struts 2.3.15 并且 s:optionselecttransfer 标记不工作,因为 JavaScript 不加载。我用:
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:optiontransferselect ... />
生成以下 JavaScript:
<script type="text/javascript" src="/struts/optiontransferselect.js"></script>
我的问题是因为我在加载存储在各种插件中的一些额外的 Struts2 XML 配置文件后调用了 Struts configurationManager.reload() 方法。调用reload() 会终止Struts 对静态资源的服务。我的重新加载如下:
ConfigurationManager configurationManager = dispatcher.getConfigurationManager();
StrutsXmlConfigurationProvider strutsXmlConfigurationProvider =
new StrutsXmlConfigurationProvider(strutsXMLLocation, false, getServletContext());
configurationManager.addContainerProvider(strutsXmlConfigurationProvider);
configurationManager.reload();
为了解决这个问题,我将文件从org.apache.struts2.static 复制到我的服务器根目录,以便可以访问它们,然后使用 Roman C 的代码来防止 Struts 提供静态资源。这允许浏览器找到s:optionselecttransfer 标签的JavaScript。
如果有人可以猜测为什么reload() 会阻止提供静态资源,我想尝试修复它。如果没有其他想法,我会接受 Roman C 的解决方案。
【问题讨论】:
-
只是出于好奇,您做了哪些修改?
-
更改是在额外的类加载器中查找 struts 类。这是需要的,因为 web 应用程序使用启用了 Struts2 的插件,并且 Struts2 不考虑
Thread.currentThread().getContextClassLoader()之外的类加载器 -
啊,有趣——这可能是值得引入核心框架的东西。
-
那肯定对我有用。我的 mods 非常 hacky,因为我从自定义 PluginManager 单例中获取类加载器,所以我的代码对 Struts 核心没有用。
标签: java jsp configuration struts2 static-content