我正在尝试创建一个安装在吊索中的捆绑包并使用自定义TagLib。我想使用标记文件,而不是使用扩展TagSupport的java类。这样我就可以使用Sling Model来表示JCR和JSP标记文件来表示标记。
这是我的标记文件,它是一个非常基本的锚点,没什么特别的,我只是想测试一下:
<%@ tag body-content="scriptless" %>
<%@ tag language="java" pageEncoding="ISO-8859-1"%>
<%@ tag import="org.apache.sling.api.resource.Resource, CallToAction" %>
<%@ attribute name="resource" rtexprvalue="true" required="true" type="org.apache.sling.api.resource.Resource" %>
<%
CallToAction cta = resource.adaptTo(CallToAction.class);
jspContext.setAttribute("cta", cta);
%>
<jsp:doBody var="bodytext">
<c:choose>
<c:when test="${not empty bodytext }">
<c:set var="text" value="${bodytext}" />
</c:when>
<c:when test="${not empty cta.text}">
<c:set var="text" value="${cta.text}" />
</c:when>
</c:choose>
<a class="${cta.css}" href="${cta.href}" title="${cta.title}" >${text}</a>
我创建了一个TLD文件,我在WEB-INF / tags和META-INF / tags文件夹中尝试过(我删除了xmlns,但该文件有效且有效)。:
<tlib-version>1.0</tlib-version>
<short-name>test</short-name>
<uri>http://www.example.com/taglibs/test/1.0</uri>
<tag-file>
<description>
Creates an anchor (<a>) HTML element according to the description in
CallToAction
</description>
<name>cta</name>
<path>/WEB-INF/tags/cta.tag</path>
</tag-file>
我在像这样的JSP中使用它:
<test:cta resource="${resource}" />
我已正确配置Maven Bundle插件。我试过了:
根据这个:http://mail-archives.apache.org/mod_mbox/sling-dev/200901.mbox/%3C49750256.7040704@oracle.com%3E
<Bundle-Resource>/WEB-INF</Bundle-Resource>
<Sling-Bundle-Resource>/WEB-INF</Sling-Bundle-Resource>
然而,无论我做什么,我都会收到以下错误:
org.apache.sling.api.scripting.ScriptEvaluationException: org.apache.sling.scripting.jsp.jasper.JasperException: /apps/example/calltoaction/calltoaction.jsp(1,1)文件“/WEB-INF/tags/cta.tag” 找不到
所以,我的问题是:你能在Sling中以这种方式实际使用 jsp标签文件吗?我的目标是通过print writer命令不让Java类实际呈现标记。但似乎我的工作是徒劳的。
答案 0 :(得分:6)
您的部分代码存在缺陷。但这绝对是可能的。我已成功使用标记文件编写了几个标记并将它们包装在osgi包中以便在cq中进行部署,一些相当复杂(例如,支持kml支持的google地图组件,或者从路径或资源开始打印递归导航)
在详细说明之前,我将做出以下假设
我有一个taglib项目,它使用tagfile对特定标记进行了以下配置。
在我的taglib项目中,我将我的tld放在/src/main/resources/META-INF/my-taglib.tld
内容类似,但我使用了一些不同的配置,翻译成你的例子,这将来到
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee">
<tlib-version>1.0-SNAPSHOT</tlib-version>
<short-name>test</short-name>
<uri>http://www.example.com/my-taglib</uri>
<tag-file>
<name>cta</name>
<path>/META-INF/tags/cta.tag</path>
</tag-file>
</taglib>
实际标记文件位于/src/main/resources/META-INF/tags/cta.tag
下我不喜欢scriptlet,所以我会使用适当的sling tag lib作为adaptTo。另外我没有看到你的CallToAction类的任何特定包,所以我把它放在虚构的包com.company.models.CallToAction中。在你的情况下这个文件:
<%@ tag body-content="empty" isELIgnored="false" display-name="CallToAction" %>
<%@ taglib prefix="sling" uri="http://sling.apache.org/taglibs/sling" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="resource" rtexprvalue="true" required="true"
type="org.apache.sling.api.resource.Resource" %>
<c:set var="cta" value="${sling:adaptTo(resource,'com.company.models.CallToAction')}" />
<c:choose>
<c:when test="${not empty cta.text}">
<c:set var="text" value="${cta.text}" />
</c:when>
<c:otherwise>
<c:set var="text" value="${cta.href}" />
</c:otherwise>
</c:choose>
<a class="${cta.css}" href="${cta.href}" title="${cta.title}" >${text}</a>
我假设您正确设置了maven依赖项,以使您的CallToAction类可用于此maven项目。用于在pom中生成taglib的maven插件看起来像这样
<plugin>
<groupId>com.squeakysand.jsp</groupId>
<artifactId>jsptld-maven-plugin</artifactId>
<configuration>
<shortName>test</shortName>
<processTagFiles>true</processTagFiles>
</configuration>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-Activator>company.project.taglib.osgi.Activator</Bundle-Activator>
<Include-Resource>META-INF/${project.artifactId}-${project.version}.tld=${project.build.outputDirectory}/META-INF/${project.artifactId}-${project.version}.tld,{maven-resources}
</Include-Resource>
<Sling-Bundle-Resources>/META-INF/tags</Sling-Bundle-Resources>
</instructions>
</configuration>
</plugin>