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

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

但不知道如何使用它。 我知道如何使用taglib指令,但我从源代码中了解到.tld文件已经嵌入到版本1.2.8之后的.jar文件中。 我使用的是Struts 2.1.8版。

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

我在这个例子中使用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-INF/struts-bean.tld /WEB-INF/tld/struts-bean.tld   /WEB-INF/struts-html.tld /WEB-INF/tld/struts-html.tld   /WEB-INF/struts-logic.tld /WEB-INF/tld/struts-logic.tld   /WEB-INF/struts-nested.tld /WEB-INF/tld/struts-nested.tld   /WEB-INF/struts-tiles.tld /WEB-INF/tld/struts-tiles.tld   /WEB-INF/sslext.tld /WEB-INF/tld/sslext.tld   /WEB-INF/struts-layout.tld /WEB-INF/tld/struts-layout.tld    http://java.sun.com/jstl/fn /WEB-INF/tld/fn.tld   http://java.sun.com/jstl/fmt /WEB-INF/tld/fmt.tld   http://java.sun.com/jstl/fmt-1-0 /WEB-INF/tld/fmt-1_0.tld   http://java.sun.com/jstl/fmt-rt /WEB-INF/tld/fmt-rt.tld   http://java.sun.com/jstl/fmt-1-0-rt /WEB-INF/tld/fmt-1_0-rt.tld   http://java.sun.com/jstl/core /WEB-INF/tld/c.tld   http://java.sun.com/jstl/core-1-0 /WEB-INF/tld/c-1_0.tld   http://java.sun.com/jstl/core-rt /WEB-INF/tld/c-rt.tld   http://java.sun.com/jstl/core-1-0-rt /WEB-INF/tld/c-1_0-rt.tld   http://java.sun.com/jstl/sql /WEB-INF/tld/sql.tld   http://java.sun.com/jstl/sql-1-0 /WEB-INF/tld/sql-1_0.tld   http://java.sun.com/jstl/sql-rt /WEB-INF/tld/sql-rt.tld   http://java.sun.com/jstl/sql-1-0-rt /WEB-INF/tld/sql-1_0-rt.tld   http://java.sun.com/jstl/x /WEB-INF/tld/x.tld   http://java.sun.com/jstl/x-1-0 /WEB-INF/tld/x-1_0.tld   http://java.sun.com/jstl/x-rt /WEB-INF/tld/x-rt.tld   http://java.sun.com/jstl/x-1-0-rt /WEB-INF/tld/x-1_0-rt.tld   

这告诉您,一旦从JSP调用TLD,您的webapp将查找匹配的然后在上查找它的位置,并找到要调用的相关类。

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

希望这可以帮助。

即使这个问题(对我来说,难以理解)接受了答案,我也不得不自己去做。 真正的答案包含在BalusC的评论中,并暗示在WEB-INF存在的流浪.tld文件是非常糟糕的建议 。 我的意图是使用OP询问的确切版本的Struts2(v2.1.8)进行扩展,我从Apache的历史档案中下载了该版本。

  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时,它会在根元素查找元素,并存储该TLD与其URI之间的映射。 相应地,此URI在.jsp文件中用于引用TLD。

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

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

……然后将其投入使用,例如:

  (...)  

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

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