我们目前正在使用我们的网络应用程序中的struts2-jquery插件。该插件工作得很好,但我对struts2插件的内部工作方式有一些疑问。
我们将插件添加到类路径中,并可以使用taglib中定义的标记。当我查看生成页面的源代码时,我可以看到正确包含了追索权:
<script type="text/javascript" src="/struts/js/base/jquery-1.x.x.min.js"></script>
<script type="text/javascript" src="/struts/js/base/jquery-ui.min.js"></script>
...
第一个问题是:我们的网络应用程序如何知道
似乎来自/struts/
指向jquery插件。我们没有为此定义任何内容。DefaultStaticContentLoader
类。有这样的方法:
public boolean canHandle(String resourcePath) {
return serveStatic && (resourcePath.startsWith("/struts/") || resourcePath.startsWith("/static/"));
}
第二个问题是,当我们调用类似/struts/
或/struts/themes/
的网址时,应用程序会将插件中的文件作为八位字节流下载(最终结果似乎是包含css的zip文件,js和图像文件)。为什么要这样做,有没有办法防止这种情况。
第二个问题比第一个问题更重要。
谢谢,汤姆。
编辑:问题一被解答了。
答案 0 :(得分:2)
Well插件是由S2提供的,以扩展其功能并改变S2在某些用例中的工作方式。 Struts 2插件包含扩展,替换或添加到现有Struts框架功能的类和配置.Plugin应该包含struts-plugin.xml文件,告诉S2哪个是插件的入口点。
因此,当S2启动时,它会以特定的方式和顺序加载配置。
因此,作为插件(jar)一部分的struts-plugin.xml将由S2加载并自行注册其存在。
有关详细信息,请参阅官方文档
jQuery插件的struts-plugin.xml文件中的典型条目是
<struts>
<bean type="org.apache.struts2.views.TagLibrary" name="sj" class="com.jgeppert.struts2.jquery.views.JqueryTagLibrary" />
</struts>
告诉S2 JqueryTagLibrary
是插件的入口点。关于加载静态内容的一个提到的是默认的S2处理机制,直到我们不提供任何标准机制。
Struts提供了StaticContentLoader的默认实现,即org.apache.struts2.dispatcher.DefaultStaticContentLoader
。此加载程序将处理以“/static/
”开头的网址。
有关S2如何从插件中提供静态内容以及从中获取jar内容的详细信息,请参阅doc
答案 1 :(得分:0)
第二个问题的答案也来自班级DefaultStaticContentLoader
。 findStaticResource
方法在文件夹或文件之间没有区别,因此即使它是文件夹,也会打开给定网址的流。