Проблема с запуском классического обработчика тегов

Я хочу отобразить значение тела JSP в пользовательском имени тега Simple из обработчика тега, расширив класс BodyTagSupport, но получив исключение времени выполнения; 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>

Что я здесь не так делаю?


person Community    schedule 25.07.2009    source источник
comment
Просто догадка, но попробуйте установить body-content в JSP вместо скриптов.   -  person skaffman    schedule 25.07.2009
comment
Спасибо, теперь он работает нормально и возвращает вывод как страницу советника org.apache.jasper.runtime.BodyContentImpl@7be8c2 вместо страницы советника Балле Балле. Почему?   -  person    schedule 25.07.2009


Ответы (3)


setJspContext относится только к SimpleTag и SimpleTagSupport, но не BodyTag (не спрашивайте меня, почему). Tomcat по какой-то причине обрабатывает ваш тег как SimpleTag. Проблема может заключаться в вашем TLD файле. Не могли бы вы изменить свой вопрос, чтобы добавить это?

person skaffman    schedule 25.07.2009

Вы распечатываете 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
}
person ChssPly76    schedule 26.07.2009
comment
Пример здесь не совсем правильный. Если вам нужен доступ к выходным данным ответа (в методе doAfterTag () в теге, который расширяет BodyTagSupport и где метод doStartTag () возвращает EVAL_BODY_BUFFERED), вам нужно сделать что-то вроде bodyContent.getEnclosingWriter (). Write (bodyText); - person CodeClimber; 21.03.2011

Это произойдет, если вы используете Taglib версии 2.1 вместо 2.0. Измените версию и атрибут схемы taglib-Tag в tld-файле. Это должно выглядеть так:

<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">
person 30thh    schedule 10.05.2011