【问题标题】:Struts2 not serving static resources after configuration.reload()Struts2 在 configuration.reload() 之后不提供静态资源
【发布时间】: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


【解决方案1】:

s:head 标签应该放在 head 标签下面。

FilterDispatcher 默认使用的常量从其 jar 中提供静态内容。

struts.serve.static=true

如果您想从context_path/struts 访问它,请通过设置为false 将其关闭。

struts.serve.static=false

【讨论】:

  • 感谢您提供有关静态服务的信息,这可能很有用。我的问题实际上是由对 Struts2 ClassLoaderUtil 类的一些定制引起的,这些定制现已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多