【问题标题】:Problem in running Classic tag handler运行经典标签处理程序时出现问题
【发布时间】:2009-07-25 08:47:06
【问题描述】:

我想通过扩展类 BodyTagSupport 来在标签处理程序中以自定义标签名称 Simple 显示 JSP 的主体值,但得到一个运行时异常;o)

JSP 代码为:

<html><body>
<%@ taglib prefix="mine" uri="simpleTags" %>

Advisor page
<mine:simple>
Balle Balle
</mine:simple>
</html></body>

标签处理程序类是:

package foo;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class SelectTagHandler extends BodyTagSupport
{
public int doStartTag() throws JspException{

return EVAL_BODY_BUFFERED;
}

public int EndTag()
{
try{
pageContext.getOut().print(bodyContent);
}
catch(Exception e)
{
}
return EVAL_PAGE;
}

我得到的例外是:

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: foo.SelectTagHandler.setJspContext(Ljavax/servlet/jsp/JspContext;)V
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

javax.servlet.ServletException: foo.SelectTagHandler.setJspContext(Ljavax/servlet/jsp/JspContext;)V
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
    org.apache.jsp.new_jsp._jspService(new_jsp.java:60)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

java.lang.NoSuchMethodError: foo.SelectTagHandler.setJspContext(Ljavax/servlet/jsp/JspContext;)V
    org.apache.jsp.new_jsp._jspx_meth_mine_005fsimple_005f0(new_jsp.java:73)
    org.apache.jsp.new_jsp._jspService(new_jsp.java:51)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.27 logs.

编辑:我的 TLD 文件的代码是:

<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">

<tlib-version>1.2</tlib-version>
<uri>simpleTags</uri>
<tag>
<name>simple</name>
<tag-class>foo.SelectTagHandler</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>

我在这里做错了什么?

【问题讨论】:

  • 只是预感,但尝试将 body-content 设置为“JSP”而不是“无脚本”
  • 谢谢,它现在工作正常,并将输出返回为“顾问页面 org.apache.jasper.runtime.BodyContentImpl@7be8c2”而不是“顾问页面 Balle Balle”。为什么?

标签: java jsp tomcat tags


【解决方案1】:

setJspContext 仅适用于SimpleTagSimpleTagSupport,不适用于BodyTag(不要问我为什么)。出于某种原因,Tomcat 将您的标签视为 SimpleTag。问题可能出在您的TLD 文件中,您可以修改您的问题以添加它吗?

【讨论】:

    【解决方案2】:

    您直接在代码中打印出bodyContent

    pageContext.getOut().print(bodyContent);
    

    bodyContent 不是字符串,它是javax.servlet.jsp.tagext.BodyContent 类的对象,它没有定义合适的 toString() 方法(也不应该)以这种方式使用。您应该改为通过getString() 方法从中获取实际的正文内容:

    if (bodyContent!=null) {
        String bodyText = bodyContent.getString();
        pageContext.getOut().print(bodyText); // or whatever you want to do with it
    }
    

    【讨论】:

    • 这里的例子不太对。如果您想访问响应输出(在扩展 BodyTagSupport 的标签中的 doAfterTag() 方法中,并且 doStartTag() 方法返回 EVAL_BODY_BUFFERED),您需要执行类似 bodyContent.getEnclosureWriter().write(bodyText); 的操作。
    【解决方案3】:

    如果您使用 Taglib 2.1 版而不是 2.0 版,就会发生这种情况。更改 tld 文件中 taglib-Tag 的版本和架构属性。它必须是这样的:

    <taglib version="2.0"
       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 
                  http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-14
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多