在CQ5.5中创建自定义标记库的问题

时间:2013-12-05 10:08:04

标签: osgi jsp-tags cq5 osgi-bundle

我正在创建一个自定义标记库,并希望在我的一个组件中使用它。我创建了一个包含标签hello类的包,它扩展了TagSupport类,我在我的资源文件夹下创建了tags.tld文件

在我的pom.xml中,我使用了资源标记将我的.tld文件包含在生成的jar文件中。

这是我的java类和tld文件

TAG CLASS: -

package com.cb;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
/**
* Simple tag example to show how content is added to the
* output stream when a tag is encountered in a JSP page.
*/
public class Hello extends TagSupport {
private String name=null;
  /**
   * Getter/Setter for the attribute name
     as defined in the tld file
   * for this tag*/
public void setName(String value){
    name = value;
}
public String getName(){
      return(name);
}
/**
* doStartTag is called by the JSP container
  when the tag is encountered */
public int doStartTag() {
  try {
    JspWriter out = pageContext.getOut();
    out.println("<table border=\"1\">");
     if (name != null)
      out.println("<tr><td> Welcome <b>" + name +
        "</b> </td></tr>");
    else
      out.println("<tr><td> Hello World </td></tr></table>");
  } catch (Exception ex) {
    throw new Error("All is not well in the world.");
  }
  // Must return SKIP_BODY because we are not
       //supporting a body for this
  // tag.
  return SKIP_BODY;
}
/**
* doEndTag is called by the
  JSP container when the tag is closed */
public int doEndTag(){
   return EVAL_PAGE;
}
}

我也成功地在我的felix控制台中安装了捆绑包而没有任何错误。然后我在我的jsp中写了自定义标签,如下所示

JSP: -

<%@include file="/libs/foundation/global.jsp"%>
<%@ page import="com.testcb.TestCustomTag"%>
<%@ taglib prefix="mytest" uri="http://cs.test.com/bundles/cq/1.8"%>
<mytest:hello name="sachin"></mytest:hello>

我得到的结果是“org.apache.sling.api.scripting.ScriptEvaluationException:org.apache.sling.scripting.jsp.jasper.JasperException:/apps/test/components/content/test/test.jsp( 4,0)无法为标签“mytest:hello”加载标签处理程序类“com.cb.Hello”。

相同的代码在我的apache tomcat服务器上工作正常,没有任何问题。当我将它合并到CQ中时,我收到了错误。

我在这做什么?我是否需要在OSGI控制台中进行任何配置才能使其可用?

更新

包名有问题。现在,在我重命名包名后,Sling可以读取我的标签处理程序类。

错误“无法加载标记处理程序类”也已消失。

现在我收到错误“ org.apache.sling.api.scripting.ScriptEvaluationException:javax.servlet.ServletException:javax.servlet.jsp.JspException:com.testcb.TestCustomTag无法转换到javax.servlet.jsp.tagext.Tag

我在pom.xml中有以下依赖

<dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
</dependency>

这是我的标准

<?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 
    <description>My tag library123</description>
    <tlib-version>1.0</tlib-version>
    <short-name>TagLib-Test</short-name>
    <uri>http://cs.test.com/bundles/cq/1.0</uri>
    <jspversion>2.1</jspversion>
    <tag>
      <name>testcustomtag</name>
      <tagclass>com.testcb.TestCustomTag</tagclass>
      <bodycontent>empty</bodycontent>
      <info>This is a simple hello tag</info>
    <attribute>
      <name>name</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag>
</taglib>

jsp版本有什么问题吗?

请指导我解决。

由于

2 个答案:

答案 0 :(得分:2)

tags.tld文件需要位于META-INF文件夹下。如果您还没有,可以在资源源文件夹下创建一个。

答案 1 :(得分:0)

是的,在我删除pom.xml中的标记后,它正在按预期工作。这是原因问题。 :)

谢谢!