最近在学JSP自定义标签,在网上找了个例子,怎么调都不能。大家帮我看看错在哪里?目录结构:
test
-----META-INF
------------MANIFEST.MF
-----WEB-INF
------------classes
------------------com
----------------------fastfish
------------------------------HelloWorldTag.class
------------lib
------------------jsp-api.jar
------------tlds
-------------------helloworld.tld
------------web.xml
-----hello.jsp
源码如下
web.xml<?xml version="1.0" encoding="UTF-8"?>    
<web-app version="2.5"    
     xmlns="http://java.sun.com/xml/ns/javaee"    
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee    
     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">      
   <jsp-config>    
     <taglib>    
         <taglib-uri>/helloworldTag</taglib-uri>    
         <taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>    
     </taglib>
   </jsp-config>    
</web-app>
helloworld.tld<?xml version="1.0" encoding="UTF-8"?>    
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"   
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">       
<taglib>    
    <tlib-version>1.0</tlib-version><!-- 标签库的版本 -->    
    <jsp-version>1.2</jsp-version><!-- 这个标签库要求的JSP规范版本 -->    
    <short-name>mytag</short-name><!-- JSP页面编写工具可以用来创建助记名的可选名字 -->    
    <tag>    
       <name>helloworld</name><!-- 唯一标签名 -->    
       <tag-class>com.fastfish.HelloWorldTag</tag-class><!-- 标签HelloWorldTag类的完全限定名 -->    
       <body-content>empty</body-content><!-- 正文内容类型 -->    
    </tag>    
</taglib>
HelloWorldTag.javapackage com.fastfish;    
   
import java.io.IOException;    
import javax.servlet.jsp.JspException;    
import javax.servlet.jsp.JspTagException;    
import javax.servlet.jsp.tagext.TagSupport;    
/** 
* TagSupport与BodyTagSupport的区别: 
* 主要看标签处理类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport 
* 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport 
*/   
public class HelloWorldTag extends TagSupport {    
    private static final long serialVersionUID = 3174234039143531070L;    
    @Override   
    public int doStartTag() throws JspException {//这个方法不用所以直接返回值    
        return EVAL_BODY_INCLUDE;    
     }    
    @Override   
    public int doEndTag() throws JspException {//重点在这个方法上    
        try {    
             pageContext.getOut().write("Hello World!");//标签的返回值      
         } catch (IOException ex) {    
            throw new JspTagException("错误");    
         }    
        return EVAL_PAGE;    
     }    
}
hello.jsp<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>    
<%@ taglib uri="/helloworldTag" prefix="mytag"%><!-- 在页面中加以声明 -->    
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">    
<html>
   <head>
     <title>MyJSP</title>        
   </head>      
   <body>    
     <h1>自定义标签:</h1><br>    
     <mytag:helloworld></mytag:helloworld>    
   </body>    
</html>
报错如下:type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:527)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:359)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause java.lang.NullPointerException
org.apache.jsp.hello_jsp._jspInit(hello_jsp.java:31)
org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:159)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:329)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs.