[Java] JSP笔记 - 自定义标签

自定义标签的创建步骤:

自定义标签的四大功能:

自定义标签的类结构:

在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现jsp代码。

接下来呢,我直接贴一些Demo代码:

tagdatetag.tld  (标签声明 XML,将之方于 WEB-INF 目录中)

<?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">
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <!-- 标签URI,用于在jsp中指定uri -->
    <uri>/date-tag</uri>

    <tag>
        <description>Outputs Date String</description>
        <name>simple</name>
        <tag-class>com.demo.TagDate</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>format</name>
            <required>false</required> <!-- 属性是否是必须的 -->
            <rtexprvalue>true</rtexprvalue> <!-- 让属性在运行时可以写入 -->
        </attribute>
    </tag>

    <tag>
        <description>Outputs Date String</description>
        <name>simple2</name>
        <tag-class>com.demo.TagDate2</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>format</name>
            <required>false</required> <!-- 属性是否是必须的 -->
            <rtexprvalue>true</rtexprvalue> <!-- 让属性在运行时可以写入 -->
        </attribute>
    </tag>

    <tag>
        <name>displayOrSkipBody</name>
        <tag-class>com.demo.DisplayOrSkipBody</tag-class>
        <body-content>scriptless</body-content>
    </tag> 

    <tag>
        <name>skipPageOrEvalPage</name>
        <tag-class>com.demo.SkipPageOrEvalPage</tag-class>
        <body-content>empty</body-content>
    </tag>

    <tag>
        <name>interationTagDemo</name>
        <tag-class>com.demo.InterationTagDemo</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>items</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

    <tag>
        <name>modifyBodyContent</name>
        <tag-class>com.demo.ModifyBodyContent</tag-class>
        <body-content>scriptless</body-content>
    </tag>

    <tag>
        <name>if</name>
        <tag-class>com.demo.IfTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

    <!-- 标签组 -->
    <tag>
        <name>choose</name>
        <tag-class>com.demo.ChooseTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>

    <tag>
        <name>when</name>
        <tag-class>com.demo.WhenTag</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>test</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

    <tag>
        <name>other</name>
        <tag-class>com.demo.OtherWiseTag</tag-class>
        <body-content>scriptless</body-content>
    </tag>

</taglib>

index.jsp (使用方法)

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="date" uri="/date-tag" %>
<!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>

<%pageContext.setAttribute("name", request.getParameter("name")); %>
<%pageContext.setAttribute("score", request.getParameter("score")); %>

Hello. 今天是
<date:simple format="yyyy年MM月dd日 HH:mm:ss" /><br>
<date:simple/><br>
<date:simple2/><br>
<date:simple2 format="yyyy/MM/dd HH:mm:ss" /><br>

<date:displayOrSkipBody>
    <h2>中国最大的免费在线培训平台</h2>
</date:displayOrSkipBody>

<!-- 条件判断标签 -->
<date:if test="${name==‘imooc‘}">
慕课网是中国最大的IT技能免费学习平台<br>
</date:if>
<date:if test="${name!=‘imooc‘}">
小伙伴们快点加入慕课网一起学习吧。www.imooc.com<br>
</date:if>

<%
    pageContext.setAttribute("nbastar", new String[]{"jordan", "kobe", "t-mac"});
%>
<!-- 循环遍列数组 -->
<date:interationTagDemo items="${nbastar}" name="name">${name}<br></date:interationTagDemo>

<!-- 修改标签体中的内容 -->
<date:modifyBodyContent>虽然我出现在这里,但是我不会显示</date:modifyBodyContent>

<!-- 标签组 -->
<date:choose>
    <date:when test="${score>90}">非常优秀<br></date:when>
    <date:other>加油吧少年<br></date:other>
</date:choose>

<br>
<a href="index2.jsp">链接到index2.jsp</a><br>
<a href="index.jsp?score=98">非常优秀</a><br>
<a href="index.jsp?name=imooc">Name为imooc</a><br>
</body>
</html>

部分实现代码:

package com.demo;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class ChooseTag extends SimpleTagSupport {
    private boolean flag;

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void doTag() throws JspException, IOException {
        getJspBody().invoke(null); // 输出标签体的内容
    }
}
package com.demo;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class WhenTag extends SimpleTagSupport {
    private boolean test;

    public void setTest(boolean test) {
        this.test = test;
    }

    @Override
    public void doTag() throws JspException, IOException {
        if (test) {
            getJspBody().invoke(null);
            ChooseTag choose = (ChooseTag) getParent();
            choose.setFlag(true); // 设置父标签的标识为true
        }
    }
}
package com.demo;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

public class OtherWiseTag extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        ChooseTag choose = (ChooseTag) getParent();
        if (!choose.isFlag()) // 如果父标签的标识为true,表示WhenTag已被执行。那么这里就再执行了
            getJspBody().invoke(null);
    }
}
package com.demo;

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

/** 自定义 Jsp 标签  */
public class TagDate extends TagSupport {
    private static final long serialVersionUID = 1L;

    private String format;

    public TagDate() {}

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    @Override
    public int doStartTag() throws JspException {
        if (format == null || format.length() == 0)
            format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            pageContext.getOut().print(sdf.format(System.currentTimeMillis()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return super.doStartTag();
    }
}
package com.demo;

import java.io.IOException;
import java.text.SimpleDateFormat;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/** 自定义 Jsp 标签  */
public class TagDate2 extends SimpleTagSupport {
    private String format;

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    @Override
    public void doTag() throws JspException, IOException {
        if (format == null || format.length() == 0)
            format = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        try {
            getJspContext().getOut().print(sdf.format(System.currentTimeMillis()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package com.demo;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.SimpleTagSupport;

/**
 * @author Administrator
 *
 */
public class SkipPageOrEvalPage extends SimpleTagSupport {

    @Override
    public void doTag() throws JspException, IOException {
        PageContext context = (PageContext) getJspContext();
        HttpServletRequest req = (HttpServletRequest) context.getRequest();
        String referer = req.getHeader("Referer");
        // 如果来源(referer)为空,则代表是在浏览器中直接输入地址访问的。不继续执行
        if (referer == null || referer.length() == 0)
            throw new SkipPageException();
    }
}

完整源码下载:

链接: http://pan.baidu.com/s/1nu851u5 密码: 456e

【感谢】

慕课网, Eleven_Lee JAVA开发工程师

http://www.imooc.com/learn/480

时间: 2024-10-08 21:46:48

[Java] JSP笔记 - 自定义标签的相关文章

java学习笔记—自定义标签2(40)

案例一:实现一个基本防盗链标签 1. 标签处理类 public class MyReferer extends BodyTagSupport { private String site; private String back; public String getSite() { return site; } public void setSite(String site) { this.site = site; } public String getBack() { return back;

java学习笔记—自定义标签1(39)

在实际的开发中,如为了简化JSP中出现大量的JSP脚本,那么我们需要使用标准标签库和EL表达式,但是和新标签库中提供的标签是有限的,不可能完全满足开发的需要.如:分页.因此需要学习如何自定义自己的标签库. 如果要实现自定义标签,那么需要如下几步: 编写标签处理类 需要继承或者实现相关的类或者接口 编写标签描述文件 该文件是一个XML文件,而且必须放在网站的WEB-INF目录中 在JSP中引入标签且使用 使用taglib指令引入标签库,随后使用. 自定标签的类体系 详细了解下一下几个类和接口: -

Jsp开发自定义标签,自定义标签将字符串转成指定的时间格式显示

本例以将 字符串格式的时间转成指定的时间格式显示. 第一步.定义一个标签处理程序类,需要集成javax.servlet.jsp.tagext.TagSupport,代码如下: import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.T

jsp的自定义标签

1.相对于JSTL或Spring等第三方标签库而言的,用来实现项目中特定的功能需求. 2.自定义标签基本的组成部分 ①页面上看得见的部分 [1]通过taglib引入标签库 [2]标签本身 ②xxx.tld文件:用来注册标签处理器类 ③标签处理器类 3.创建一个没有属性没有标签体的自定义标签 ①创建自定义标签的处理器类 [1]标准要求:实现接口javax.servlet.jsp.tagext.SimpleTag [2]实际操作:继承javax.servlet.jsp.tagext.SimpleTa

JavaWeb之 JSP:自定义标签

当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 自定义标签 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的java类,继承TagSupport类~ package com.vmaxtam.dotest; import javax.servlet.jsp.tagext.TagSupport; public class MyTagTest extends TagSupport { } 步骤二 重写父类的se

【JSP】自定义标签开放入门

JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作. JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面. JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记. 你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签 开发步

Servlet和JSP之自定义标签学习

  此文章会讲述简单标签处理器,因为经典自定义标签处理器没有简单标签处理器方便使用,故在此不进行描述. 参考:慕课网的<JSP自定义标签>视频; <Servlet.JSP和Spring MVC初学指南>的第六章; IBM的<利用 JSP 2 提供的 SimpleTagSupport 开发自定义标签>; 菜鸟教程的JSP自定义标签文章. 自定义标签   自定义标签 自定义标签就是将方法封装到自定义标签处理类中,然后使用方法与JSTL标签来达到,解决JSP中JavaBean

[Java] JSP笔记 - EL、JSTL 常用标签

一. 什么是 EL 语言 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语言. 二.EL 语言的作用 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法.它是一种简单的语言,基于可用的命名空间(PageContext 属性).嵌套属性和对集合.操作符(算术型.关系型和逻辑型)的访问符.映射到 Java 类中静态方法的可扩展函数以及一组隐式对象. 三.使用 EL 语言前的配置

[Java] JSP笔记 - Filter 过滤器

一.什么是Web过滤器 Servlet API 很久以前就已成为企业应用开发的基石,而 Servlet 过滤器则是对 J2EE 家族的相对较新的补充. Servlet 过滤器是可插入的 Web 组件,它允许我们实现 Web 应用程序中的预处理和后期处理逻辑.过滤器支持 servlet 和 JSP 页面的基本请求处理功能,比如日志记录.性能.安全.会话处理.XSLT 转换,等等. 过滤器最初是随 Java Servlet 2.3 规范发布的. Servlet 过滤器是什么?Servlet 过滤器是