如何在Sling包中使用JSP标记文件?

时间:2014-06-21 02:40:46

标签: jsp jsp-tags cq5 sling aem

我正在尝试创建一个安装在吊索中的捆绑包并使用自定义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 (&lt;a&gt;) 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插件。我试过了:

  • / META-INF
  • / META-INF /标签
  • / WEB-INF
  • / WEB-INF /标签

根据这个: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类实际呈现标记。但似乎我的工作是徒劳的。

1 个答案:

答案 0 :(得分:6)

您的部分代码存在缺陷。但这绝对是可能的。我已成功使用标记文件编写了几个标记并将它们包装在osgi包中以便在cq中进行部署,一些相当复杂(例如,支持kml支持的google地图组件,或者从路径或资源开始打印递归导航)

在详细说明之前,我将做出以下假设

  1. 您知道如何设置maven项目并使用poms
  2. 您知道如何在pom中配置捆绑包以便在osgi中进行部署
  3. 您熟悉捆绑包的工作原理以及您对Activators的了解
  4. 您知道如何使用JSTL,tagslibs和tagfiles
  5. 我有一个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>