Tomcat 7.0.23 не работает с библиотеками тегов - PullRequest
1 голос
/ 16 января 2012

Я скачал последнюю версию tomcat 7, т.е. 7.0.23 от 16.01.2011. Я обнаружил, что ни один из моих компонентов библиотеки тегов jakarta не работает в jsps. Точка отказа одинакова и последовательна в каждом jsp. Это

org.apache.taglibs.input.Select _jspx_th_input_005fselect_005f0 = (org.apache.taglibs.input.Select)_jsp_instancemanager.newInstance("org.apache.taglibs.input.Select", this.getClass().getClassLoader());

Я также написал пользовательский тег, чтобы увидеть, работает ли он, у меня была такая же проблема и для этого jsp.

com.ah.util.customtags.SelectTag _jspx_th_hirezon_005fform_005fselect_005f0 = (com.ah.util.customtags.SelectTag)_jsp_instancemanager.newInstance("com.ah.util.customtags.SelectTag", this.getClass().getClassLoader());

Код JSP

<%@ page extends="com.ah.servlets.BaseJSPServlet"%>
<%@ taglib uri="/WEB-INF/hirezon_form.tld" prefix="hirezon_form" %>
<html>
<body>Test tags
<%
System.setProperty("org.apache.jasper.Constants.USE_INSTANCE_MANAGER_FOR_TAGS", "true");
%>
<hirezon_form:select count="100"/>
</body>
</html>

Код для класса CustomTagSupport:

package com.ah.util.customtags;

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class SelectTag extends TagSupport {

    String count;
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }
    public int doStartTag() throws JspException {
        // This means the JSP must evaluate the contents of any CHild tags
        // in this tag;
        return EVAL_BODY_INCLUDE;
    }
    // This method is called when the JSP encounters the end of te tag
    // implemented by this class
    public int doEndTag() throws JspException {

        String sum = "200000";
        try {
            pageContext.getOut().write("The Sum of first " + count + " numbers is " + sum);
        } catch (IOException e) {
            throw new JspException("Fatal Error: HelloTag could'nt write to the JSP out");
        }
        // This return type tells the JSP page to continue processing
        // the rest of the page
        return EVAL_PAGE;
    }
}

Есть ли известная ошибка в Tomcat 7.0.23? Я провел много исследований, а также попытался установить для свойства USE_INSTANCE_MANAGER_FOR_TAGS значение true, но я все еще получаю ту же ошибку. Любые предложения будут оценены, спасибо

1 Ответ

3 голосов
/ 17 января 2012

Я разобрался в проблеме, это был мой jsp.JSP расширяет сервлет BaseJSPServlet.По умолчанию, когда java-класс создается для jsp, он расширяет org.apache.jasper.runtime.HttpJspBase, но когда вы добавляете директиву расширения страницы, ваш java-класс будет расширять упомянутый вами класс вместо org.apache.jasper.runtime.HttpJspBase.Так что вам нужно убедиться, что ваш родительский класс в значительной степени выполняет то, что делает класс HttpJspBase.

Вот пример кода родительского класса, который может быть расширен в jsp с помощью директивы page extends.

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import org.apache.jasper.compiler.Localizer;

public abstract class BaseJSPServlet2 implements javax.servlet.jsp.HttpJspPage

{
  private static final long serialVersionUID = 1L;

  public final void init(ServletConfig config)
    throws ServletException
  {
    super.init(config);
    jspInit();
    _jspInit();
  }

  public String getServletInfo()
  {
    return Localizer.getMessage("jsp.engine.info");
  }

  public final void destroy()
  {
    jspDestroy();
    _jspDestroy();
  }

  public final void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
  {
    _jspService(request, response);
  }

  public void jspInit()
  {
  }

  public void _jspInit()
  {
  }

  public void jspDestroy()
  {
  }

  protected void _jspDestroy()
  {
  }

  public abstract void _jspService(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse)
    throws ServletException, IOException;

}
...