【问题标题】:Struts - Taglib directive in a JSP page for .tld provided by StrutsStruts - Struts 提供的 .tld 的 JSP 页面中的 Taglib 指令
【发布时间】:2010-03-06 15:32:36
【问题描述】:

我正在开发一个基于Struts 的应用程序。我是 Struts 的新手。我想在JSP 页面中使用html 标签,在Struts 提供的taglib 目录中指定。

但是不知道怎么用。我知道如何使用 taglib 指令,但我从消息来源得知 .tld 文件在 1.2.8 版之后已嵌入到 .jar 文件中。我使用的是 Struts 2.1.8 版。

我不知道struts-html.tld 文件位于哪个.jar 文件中。

【问题讨论】:

    标签: java struts2 taglib


    【解决方案1】:

    我正在使用 Struts 1.3.10 进行此插图:

    1. 在此处下载最新的 struts 库 (http://struts.apache.org/download.cgi#struts1310)。请记住,完整分发版是您必须下载的内容,因为它包含一个带有 Struts TLD 的 war 文件。
    2. 在您的 Web 应用程序上,将您下载的存档文件中的所有 lib 复制到您的 /WEB-INF/lib 文件夹中。
    3. 对于 JSTL 库(与 struts 配合得很好),请访问此处 (http://java.sun.com/products/jsp/jstl/)
    4. 获得 Struts TLD 和 JSTL Tld 后,将它们放在 /WEB-INF/tld/ 文件夹下(它必须位于 /WEB-INF/ 文件夹中)。
    5. 在 web.xml 上添加以下内容(在 <web-app> 元素下)

        <jsp-config>
          <taglib>
              <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
          </taglib>
          <taglib>
              <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
          </taglib>
          <taglib>
              <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
          </taglib>
          <taglib>
              <taglib-uri>/WEB-INF/struts-nested.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>
          </taglib>
          <taglib>
              <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>
          </taglib>
          <taglib>
              <taglib-uri>/WEB-INF/sslext.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/sslext.tld</taglib-location>
          </taglib>
          <taglib>
              <taglib-uri>/WEB-INF/struts-layout.tld</taglib-uri>
              <taglib-location>/WEB-INF/tld/struts-layout.tld</taglib-location>
          </taglib>
      
          <!-- Sun's JSTL -->
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/fn</taglib-uri>
              <taglib-location>/WEB-INF/tld/fn.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
              <taglib-location>/WEB-INF/tld/fmt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/fmt-1-0</taglib-uri>
              <taglib-location>/WEB-INF/tld/fmt-1_0.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/fmt-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/fmt-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/fmt-1-0-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/fmt-1_0-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
              <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/core-1-0</taglib-uri>
              <taglib-location>/WEB-INF/tld/c-1_0.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/c-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/core-1-0-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/c-1_0-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
              <taglib-location>/WEB-INF/tld/sql.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/sql-1-0</taglib-uri>
              <taglib-location>/WEB-INF/tld/sql-1_0.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/sql-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/sql-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/sql-1-0-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/sql-1_0-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
              <taglib-location>/WEB-INF/tld/x.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/x-1-0</taglib-uri>
              <taglib-location>/WEB-INF/tld/x-1_0.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/x-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/x-rt.tld</taglib-location>
          </taglib>
      
          <taglib>
              <taglib-uri>http://java.sun.com/jstl/x-1-0-rt</taglib-uri>
              <taglib-location>/WEB-INF/tld/x-1_0-rt.tld</taglib-location>
          </taglib>
      </jsp-config>
      

    这表明一旦您从 JSP 调用您的 TLD,您的 web 应用程序将查找匹配的 &lt;taglib-uri&gt;,然后在 &lt;taglib-location&gt; 上查找它的位置并找到要调用的相关类。

    在您的 JSP 上,现在您可以这样做:

    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
    <%@ taglib uri="/WEB-INF/struts-layout.tld" prefix="layout"%>
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
    <%@ taglib uri="http://java.sun.com/jstl/fn" prefix="fn" %>
    

    希望这会有所帮助。

    【讨论】:

    • 我不做 Struts,所以我不会说什么,但对于 JSTL,绝对不需要提取 JAR 文件并弄乱/WEB-INF带有松散的 TLD 文件。只需将 JAR 文件放入 /WEB-INF/lib 并根据 TLD 文档在 JSP 顶部声明标记库就足以让 JSTL 工作。这也应该是所有其他 JSP 标记库的常规做法:1)在类路径中删除 JAR 文件(即/WEB-INF/lib),2)在 JSP 中声明 taglib。就这样。类似答案:stackoverflow.com/questions/2323645
    • JSF 一路。此外,我还使用了 Stripes 和 Spring MVC(仅出于爱好目的)。我还有一个基于 JSP/Servlet 的私有/本土约定优于配置的 MVC 框架。
    【解决方案2】:

    即使这个问题有一个(对我来说,难以理解的)被接受的答案,我还是觉得有必要亲自尝试一下。真正的答案包含在 BalusC 的评论中,并建议在 WEB-INF 中散布的 .tld 文件是非常糟糕的建议。我的意图是使用 OP 询问的 Struts2 的确切版本(v2.1.8)对此进行扩展,我从Apache's historical archive 下载。

    1. 不知道struts-html.tld文件在哪个.jar文件中。

    在 Struts2 中没有 struts-html.tld - 取而代之的是:

    • struts-tags.tld,位于struts2-core-2.1.8.jarMETA-INF 目录中,包含所有标准的Struts 标记,就像您期望在Struts1 中的struts-html.tld 中找到的标记一样。
    • tiles-jsp.tld,位于tiles-jsp-2.0.6.jarMETA-INF 目录中,对应于Struts1 中的struts-tiles.tld
    • 更多 TLD,例如对于与问题没有直接关系的 SiteMesh。

    1. 我想在JSP 页面中使用在Struts 提供的taglib 目录中指定的html 标记。但是不知道怎么用。我知道如何使用 taglib 指令,但我从消息来源得知 .tld 文件已在 1.2.8 版本之后嵌入到 .jar 文件中。

    没错。它通常的工作方式如下:

    • 当 servlet 容器启动时,它会查看 WEB-INF/lib 目录并加载它在其中找到的所有 .jar 文件 - 这是您需要放置 Struts2 库的位置。
    • 在这些 .jar 文件中,所有 TLD 都应位于 META-INF 目录中。显然,如上所述,struts2-core-2.1.8.jar 的情况已经如此,因此无需做任何事情。
    • 当 servlet 容器加载 TLD 时,它会在根元素 &lt;taglib&gt; 中查找 &lt;uri&gt; 元素,并存储该 TLD 与其 URI 之间的映射。相应地,此 URI 在您的 .jsp 文件中用于引用 TLD。

    对于struts2-core-2.1.8.jar,URI 是/struts-tags,因此您需要在.jsp 文件中像这样引用它(当然您可以根据自己的喜好更改prefix 属性)...

    <%@ taglib uri="/struts-tags" prefix="s" %>
    

    ...然后将其投入使用,例如这个:

    <s:form action="HelloWorld">
        (...)
    </s:form>
    

    【讨论】:

    • 好吧,第二次阅读它与 S1 无关。加一个以获得完整答案。
    【解决方案3】:

    BalusC 是正确的:您只需要 /WEB-INF/lib 中的 JAR 文件和每个 JSP 中的正确 taglib。一开始让我感到困惑的一件事是敏感的 JSP 语法。一些元素之间的空间很重要。根据 Stripes documentation,每个 Stripes TLD 的 taglib 应如下所示:

    <%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld" %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多