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

Bry*_*opp 3 jsp jsp-tags 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>
Run Code Online (Sandbox Code Playgroud)

我创建了一个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>
Run Code Online (Sandbox Code Playgroud)

我在JSP中使用它,如下所示:

<test:cta resource="${resource}"  />
Run Code Online (Sandbox Code Playgroud)

我已正确配置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>
Run Code Online (Sandbox Code Playgroud)

但是,无论我做什么,我都会收到以下错误:

org.apache.sling.api.scripting.ScriptEvaluationException:org.apache.sling.scripting.jsp.jasper.JasperException:/apps/example/calltoaction/calltoaction.jsp(1,1)文件"/ WEB-INF /标签/ cta.tag"未找到

所以,我的问题是:你能在Sling中以这种方式实际使用jsp标签文件吗?我的目标是通过print writer命令不让Java类实际呈现标记.但似乎我的工作是徒劳的.

3xi*_*il3 6

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

在详细介绍之前,我将做出以下假设

  1. 您知道如何设置maven项目并使用poms
  2. 您知道如何在pom中配置bundle以在osgi中进行部署
  3. 您熟悉bundle的工作方式,并了解Activators
  4. 您知道如何使用JSTL,tagslib和tagfiles

我有一个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>
Run Code Online (Sandbox Code Playgroud)

实际标记文件位于/src/main/resources/META-INF/tags/cta.tag下

我不喜欢scriptlet,所以我会为adaptTo 使用适当的sling标签lib.另外我没有看到你的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>
Run Code Online (Sandbox Code Playgroud)

我假设您正确设置了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>
Run Code Online (Sandbox Code Playgroud)