struts2插件如何工作

时间:2012-03-16 08:52:51

标签: java web-applications plugins struts2

我们目前正在使用我们的网络应用程序中的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和图像文件)。为什么要这样做,有没有办法防止这种情况。

第二个问题比第一个问题更重要。

谢谢,汤姆。

编辑:问题一被解答了。

2 个答案:

答案 0 :(得分:2)

Well插件是由S2提供的,以扩展其功能并改变S2在某些用例中的工作方式。 Struts 2插件包含扩展,替换或添加到现有Struts框架功能的类和配置.Plugin应该包含struts-plugin.xml文件,告诉S2哪个是插件的入口点。

因此,当S2启动时,它会以特定的方式和顺序加载配置。

  1. 支柱-default.xml中
  2. struts-plugin.xml
  3. struts.xml中
  4. 因此,作为插件(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)

第二个问题的答案也来自班级DefaultStaticContentLoaderfindStaticResource方法在文件夹或文件之间没有区别,因此即使它是文件夹,也会打开给定网址的流。