自定义标签入门例子流程总结

来源:互联网 发布:底层架空建筑面积算法 编辑:程序博客网 时间:2024/06/04 20:47

一、简单的自定义标签入门例子,定义了两个标签。主要结构是 两个处理类加标签应用的jsp加一个标签描述tld文件。如图一。

                    图一                                                                                                    图二

1.在写标签的处理类MyTag时,需要继承tagsupport类。至少重写doStartTag()、doEndTag()一个。

问题L:我点击右边的add,输入TagSupport却找不到这个类。(如图二)然后悲剧开始了。。。

我导入jsp-api.jar 和servlet-api.jar,还是没找到这个类。但是运行任何我的包下之前的jsp页面,都会出现下面的错误:如图三


解决方法:

jsp-api.jar等加载失败。一般 jsp-api.jar等 是不需要自己引入到Eclipse或Myeclipse中的,MyEclipse会自动引入该文件(tomcat的lib下都会有这个jar文件),如果再自己引入的话就会产生冲突,出现上面的错误。

Add是为新创建的类添加接口而不是父类,上面“Superclass”后的"Browse"才是用来添加继承的父类名。Add键那个框右边的标题是 Interface!是接口的意思啊。

2.一个标签处理类对应tld文件中的一个tag元素,然后就可以在jsp页面中使用这个标签了。其中有几个配对。(用相同颜色标志了)

tag.tld全部代码

<?xml version="1.0" encoding="UTF-8" ?>
<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
    http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.1</tlib-version>
    <!--    另一种头文件的描述。

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library
        1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
        <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version>

-->
    <short-name>MyTag</short-name>
    <uri>/myTag</uri>
    <tag>
        <name>firstTag</name>
        <tag-class>com.my.tag.MyTag</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>secondTag</name>
        <tag-class>com.my.tag.MyTag2</tag-class>
        <body-content>empty</body-content>
    </tag>
</taglib>

index.jsp 全部代码:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/myTag"prefix = "pf" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
  </head>
 
  <body>
    <p><font color = "red"> <pf:firstTag/> </font><br>
 
  <font color = "blue"> <pf:secondTag/></font>
  </body>
</html>

 至于绿色的对应于我的标签处理类MyTag。


二、使用propertities配置文件的简单的自定义标签入门例子。目录结构如图四。


图四

1.为了在标签处理类MyTag3的doEnd Tag()f方法中能读到properties中设置的键值对,需要添加一个servlet。配置servlet时,不用写servlet-mapping。因为这时servlet只被容器使用,不给用户访问。这时需要配置load-on-startup.具体代码如下:

<servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>mytag</servlet-name>
    <servlet-class>com.my.servlet.MyTagInitServlet</servlet-class>
    <load-on-startup>30</load-on-startup>
  </servlet>

在servlet的初始化方法中先获取properties对象,然后把tag.properties配置文件作为输入流加载进来。这样properties对象就和配置文件中的键值对关联。其中有几种读取文件输入流方式,具体代码如下:

public class MyTagInitServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
Properties ps = new Properties();

/*//方法一。包外。getResourceAsStream:其本质是,通过类加载器根据一个相对路径返回一个文件输入流。根据类所在的位置,去加载配置文件所在的位置。http://wang-zhi-peng2007.iteye.com/blog/856941
InputStream is1 = this.getClass().getClassLoader().getResourceAsStream("tag.properties");
try {ps.load(is1);
is1.close();
} catch (IOException e) {
e.printStackTrace();
}*/

/*//方法二。包内。这种方式要求properties文件和当前类在同一文件夹下面。显然本例不符合。
InputStream is2 = this.getClass().getResourceAsStream("tag.properties");
try {ps.load(is2);
    is2.close();
} catch (IOException e) {
    e.printStackTrace();
}*/

/*//方法三。包外。如果在不同的包中,路径指定完全。http://www.52ij.com/jishu/83.html
try {
    InputStream is3 = new FileInputStream("D:\\myeclipseworkspace\\test\\WebRoot\\WEB-INF\\tag.properties");
    ps.load(is3);
    is3.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}*/

//将tag.propetties配置的键值队存入处理类中。http://www.cnblogs.com/FlameRen/archive/2013/03/14/2959586.html
ServletContext context = config.getServletContext();
 

 //方法四。相对路径。最常用。
InputStream is = context.getResourceAsStream("/WEB-INF/tag.properties");

try {
    ps.load(is);
    is.close();
} catch (IOException e) {
    e.printStackTrace();
}

//将properties对象放置到application范围内供其它组件使用。
context.setAttribute("ps", ps);

}
}

2.在标签处理类MyTag3中,具体代码如下:


public class MyTag3 extends TagSupport {
    private String key;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    @Override
    public int doStartTag() throws JspException {
        try {
            this.pageContext.getOut().println(
                    "The second exmple of tag started:" + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return EVAL_BODY_INCLUDE;
    }

    @Override
    public int doEndTag() throws JspException {
        try {
            Properties ps = (Properties) this.pageContext.getAttribute("ps",
                    PageContext.APPLICATION_SCOPE);

            String message = ps.getProperty(key);

            this.pageContext.getOut().println( message+"\n");

        } catch (IOException e) {
            e.printStackTrace();
        }
        return EVAL_PAGE;

    }

}
index.jsp代码如下
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@taglib uri="/MyTag3" prefix ="pf" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head> 
  </head>
 
  <body>
<pf:message key="name"/>
<pf:message key="love"/>
<pf:message key="interest"/>
  </body>
</html>

当运行index.jsp时,当查找Jsp常用指令的taglib时,会指定页面中使用的标签库以及自定义标签的前缀。与tag.tld 文件对照。一定会处理标签类MyTag3。当在index.jsp body中使用自定义标签时,会在相应的MyTag3种调用doStartTag()、doEndTag()中一个或两个。传入一个属性key,通过tag,tld 中指定attribute元素即可。(如下为tag.tld主要代码)

<tag>
        <name>message</name>
        <tag-class>com.my.tag.MyTag3</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>key</name>
            <required>true</required>
        </attribute>
    </tag>

key值就是从配置文件中传入的,比如love,它会赋值给MyTag3.java,r然后ps.getProperty(key)就得到了。





0 0
原创粉丝点击