Struts - Struts 提供的 JSP 页面中 .tld 的 Taglib 指令

问题描述 投票:0回答:3

我正在开发一个基于

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

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

我不知道

struts-html.tld
文件位于哪个.jar文件中。

java struts2 struts taglib
3个回答
7
投票

我在本例中使用 Struts 1.3.10:

  1. 在此处下载最新的 struts 库 (http://struts.apache.org/download.cgi#struts1310)。请记住,完整发行版是您必须下载的内容,因为它包含带有 Struts TLD 的 war 文件。
  2. 在您的 Web 应用程序上,将下载的存档文件中的所有库复制到您的
    /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 应用程序将查找匹配的

<taglib-uri>
,然后查找它在
<taglib-location>
上的位置,并找到要调用的相关类。

在您的 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" %>

希望这有帮助。


4
投票

即使这个问题有一个(对我来说,难以理解的)可接受的答案,我也觉得有必要自己尝试一下。真正的答案包含在 BalusC 的评论中,建议将杂散的

.tld
文件放在
WEB-INF
中是非常糟糕的建议。我的目的是使用 OP 询问的 Struts2 的确切版本 (v2.1.8) 对此进行扩展,我从 Apache 的历史档案下载了该版本。

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

Struts2 中没有

struts-html.tld
- 而是有以下内容:

  • struts-tags.tld
    ,位于
    META-INF
    struts2-core-2.1.8.jar
    目录中,包含 所有标准 Struts 标签,就像您希望在 Struts1 中的
    struts-html.tld
    中找到的标签一样。
  • tiles-jsp.tld
    ,位于
    META-INF
    tiles-jsp-2.0.6.jar
    目录中,对应于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 时,它会在根元素
    <uri>
    内查找
    <taglib>
    元素,并存储该 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>

1
投票

BalusC 是正确的:您只需要

/WEB-INF/lib
中的 JAR 文件以及每个 JSP 中适当的
taglib
。最初让我困惑的一件事是敏感的 JSP 语法;某些元素之间的空格很重要。根据 Stripes 文档,Stripes TLD 的每个
taglib
应如下所示:

<%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld" %>
© www.soinside.com 2019 - 2024. All rights reserved.