当前位置: 首页 > 知识库问答 >
问题:

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

农明辉
2023-03-14

我正在尝试创建一个安装在sling中的捆绑包,并使用自定义TagLib。我想使用标记文件,而不是使用扩展TagSupport的java类。这样,我可以使用Sling模型来表示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捆绑包插件。我尝试过:

  • /META-INF

据此:http://mail-archives.apache.org/mod_mbox/sling-dev/200901.mbox/<49750256.7040704@oracle.com>

<Bundle-Resource>/WEB-INF</Bundle-Resource>
<Sling-Bundle-Resource>/WEB-INF</Sling-Bundle-Resource>

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

org.apache.sling.api.scripting.脚本评估异常:org.apache.sling.scripting.jsp.jasper.JasperException: /apps/example/calltoaction/calltoaction.jsp(1,1)文件"/WEB-INF/tags/cta.tag"未找到

所以,我的问题是:你真的能在Sling中以这种方式使用jsp标签文件吗?我的目标是没有一个Java类通过打印写入器命令实际呈现标记。但是我的工作似乎是徒劳的。

共有1个答案

屠建本
2023-03-14

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

在详细讨论之前,我将做出以下假设

  1. 您知道如何设置maven项目并使用poms

我有一个taglib项目,该项目使用tagfile对特定标记进行以下配置。

在我的taglib项目中,我有 /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>

我不喜欢script let,所以我会使用适当的sling tag 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>

我假设您正确设置了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>
 类似资料:
  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 我对一个难以捉摸但可能非常强大的DropWizard特性Bundles感到好奇。根据文件: Dropwizard捆绑包是一组可重用的功能,用于定义应用程序的行为块。 鉴于DropWizard(DW)的文档非常丰富,我感到震惊的是,这实际上是对bundle的唯一解释。我在野外看到了一些这样的例子: 资产组合 但我不明白的是:bundle似乎只是在jar中进行代码打包和分发。那么,为什么我不能编写“原

  • 问题内容: 我有以下代码: 如何编写第5行以及目标意图中的getExtra 问题答案: 你需要有实现的界面,你将需要实现的和合适的构造函数,一个作为参数。请参阅接口文档。 要将列表放入中,请使用: 要使列表脱离目标活动,请使用:

  • 我编写了一个定制的NiFi处理器,它使用一些Hadoop类,处理流文件,并在Avro之间序列化流文件。 处理器的pom.xml文件如下所示: 因为我已经将标记为,所以它不会绑定在生成的NAR文件中。现在,我可以做一个快速修复,完全删除作用域并创建NAR,但NiFi会抱怨next class not found错误。 我想知道:

  • 我想在jsp文档文件中使用类似的内容: 但是,在我看到的所有30个示例中,每个人都使用简单的jsp语法,而不是jsp文档语法。类似于这样: 根本不起作用。页面上看不到驻留在 /WEB-INF/tags中的所有标记文件。只有当我定义一个tld文件并在其中列出所有标记时,才能在页面上访问它们。是否可以避免tld声明并仍然在jsp文档页面中使用标记文件?

  • 问题内容: 我知道与此相关的一些问题,但是它们在Objective-C中。 如何 在实际的iPhone上*使用Swift 访问应用程序中包含的文件?我希望能够从中读取和写入。如果您想看一下,这是我的项目文件。如有必要,我很乐意添加详细信息。 * 问题答案: 只需在应用程序捆绑中搜索资源 但是,您无法写入它,因为它位于应用程序资源目录中,并且必须在文档目录中创建它才能写入 现在您可以从 fileUR