JSP 标签学习笔记

canca14年前 (2010-04-10)JavaServer Page338
1.标签类型
JSP2.0规范之后,标签分为两类:传统标签和简单标签。
传统标签继承Tag接口,简单继承集成SimpleTag接口

2.标签开发步骤
(1)基于Tag或者SimpleTag或他们的子接口(Support类)开发标签动作类
(2)在web-inf目录下的tld下定义标签说明
(3)jsp中引用标签(共有三种方法)

3.标签开发
(0)关于标签参数传递
只需要在标签动作类中,定义方法,然后getter/setter
接下来,在.tld文件中声明<attribute>,最后jsp中,就可以用类似<mytag:hello p1="" p2="" />类似的方法向Java类传递参数了。

(1)Tag接口与TagSupport
Tag,父接口,标签的鼻祖,继承自JspTag。
重点覆盖
doStartTag():标签开始时候执行的动作,要返回EVAL_BODY_INCLUDE 或者 SKIP_BODY,前者执行标签体,后者不执行。
doEndTag():标签结束时候执行的动作,要返回EVAL_PAGE 或者 SKIP_PAGE。前者继续执行剩余JSP,后者放弃执行剩余JSP。
Tag的其他几个方法很少用到,所以可以直接继承辅助类TagSupport

(2)IterationTag 、 BodyTag和BodyTagSupport
这三个都是为了处理重复标签(循环)的情况。特别注意,这些标签接口(类)是有缓存的,这个对线程安全非常不利。
IterationTag多出来了doAfterBody()方法。即下次调用同样标签就不重复创建了。
doAfterBody(),在每次处理标签体后被调用,如果没有标签体要处理,则不被调用。需要返回EVAL_BODY_AGAIN或者SKIP_BODY,前者表示重复执行标签体,后者则不在执行下次。

BodyTag继承了IterationTag,可以对标签体执行后的内容进行处理。

(3)SimpleTag
这个接口没有缓冲,每次调用标签就创建一个新的实例。
重要方法:doTag()
doTag(),在这里写要执行的Tag动作即可。
setJspBody(),如果覆盖了这个方法,则可以传入标签体内容,例如<tag>abcde</tag>,但是要设置.tld文件中<tag>的<body-content>tagdependent</body-content>
那么abcde的值就会传入,但是你无法获得她,只能直接输出。

4.tld配置
记住一点就好了,必须以.tld为拓展名,必须放在web-inf和其子目录下。

一个简单的模板如下:
de><?xml version="1.0" encoding="UTF-8"?>
<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 web-jsptaglibrary_2_0.xsd">
 <tlib-version>1.0</tlib-version>
 <short-name>writer</short-name>
 <uri>tags/MessageWriter</uri>
 <tag>
   <name>write</name>
   <tag-class>com.lilijun.tags.MessageWriterTagHandler</tag-class>
   <body-content>JSP</body-content>
   <attribute>
     <name>fontColor</name>
     <required>true</required>>
   </attribute>
 </tag>
</taglib>

5.在jsp中使用
有三种方法:

(1)web.xml中配置一个<taglib>节点,如下:
<jsp-config>
    <taglib>
        <taglib-uri>de>de>/mytag</taglib-uri>
        <taglib-location>/WEB-INF/tlds/hello.tld</taglib-location>
    </taglib>
</jsp-config>
JSP中如下写:
<%@ taglib uri="/mytag" prefix="mytag" %>

(2)不在web.xml中配置,直接在JSP中使用TLD文件的位置:
JSP中如下写:
<%@ taglib uri="/web-inf/tlds/hello.tld" prefix="mytag" %>

(3)在jsp中直接指定tag的url
<%@ taglib uri="/mytag" prefix="mytag" %>


下面是一个基于SimpleTag的例子:


标签动作Java类:

package tag;

import java.io.IOException;

import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/***
 * 测试的简单标签
 * @author liheyuan
 *
 */
public class HelloTag1 extends SimpleTagSupport
{
    /**测试属性name*/
    private String name;
    /**标签体*/
    private JspFragment body;
   
    public void setJspBody(JspFragment body)
    {
        this.body = body;
    }
   
    public void doTag()throws JspException,IOException
    {
        JspContext ctx = this.getJspContext();
        JspWriter out = ctx.getOut();
        out.println("<h1>"+name+",</h1>");
        body.invoke(out);
    }
   
   
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

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>
    <short-name>tagSample</short-name>
    <uri>/mytag</uri>
    <tag>
        <name>hello1</name>
        <tag-class>tag.HelloTag1</tag-class>
        <body-content>tagdependent</body-content>
        <attribute>
            <name>name</name>
            <type>java.lang.String</type>
        </attribute>
    </tag>
</taglib>

JSP

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/mytag" prefix="mytag" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<mytag:hello1 name="李赫元" >
你好!
</mytag:hello1>
</body>
</html>

相关文章

在web.xml不认<taglib>解决办法

在web.xml不认<taglib>解决办法: 如果是头是这样的<!DOCTYPE web-app PUBLIC "-//Sun Micros...

<html:select>设置默认值

在ActionFrom的reset方法里赋初值就可以,这样不管是调用的action或jsp都会先调用reset方法。...

struts,ajax乱码解决方案

乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UT...

FCKeditor的秘密

       哈哈。。由于项目的需要,这几天一直在搞FCKeditor。其实,FCKeditor配置很简单。但不知道怎么样。在我的项目里FC...

几个open source的html parser的比较

HTMLParser最先是看见SourceForge上下载的包,真是有点大的吓人,一个小小的html parser, 居然有5M。下载回来,展开刨去文档等等杂乱的部分,source也还是不小的。用an...

Struts 防止重复表单提交的工具包

       今天,我位网友在烦这个东东。他说,怎样防止用户重复提交同一个表单呢?我跟他说用Token。过了一会儿,他说,用Token有点烦...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。