自定义标签技术自sun公司发布以来,便一向很受欢迎!下面我就来谈一谈如何实现自定义标签,以及如何使用自定义标签。


如何实现自定义标签

首先我们应该知道原理,不管是标签还是JSP,本身实际上都会被JSP Complier翻译成Servlet,然后才会被执行。那么在Java这门面向对象的语言中,标签就应该是一个特殊的类。之所以说它特殊,仅仅是它出现的地方,以及实现的功能与我们平时见到的普通的类有些不一样罢了。我们完全可以将标签视为一个简单的java类。就是这样!下面我们就来看一看要怎么写出这样一个类吧


  • 首先这个类要实现一个特殊的接口,那就是Tag接口,实现里面的方法。
  • 在WEB-INF目录下新建一个tld文件,名称随意,然后按照相关的xml约束进行声明即可
  • 在需要引入的jsp页面添加命令<%@ taglib uri="/summer" prefix="summer"%>,然后我们就可以使用自定义的标签了。

实现的步骤就是这样,下面我们一起来看一个小例子吧,这样印象会更加的深刻!

小案例:检测客户机的IP地址


首先是创建一个实现了Tag接口的实现类:

package web.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class ViewIPTag implements Tag {

    PageContext pageContext=null;

    public ViewIPTag() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public int doEndTag() throws JspException {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int doStartTag() throws JspException {
        // TODO Auto-generated method stub

        String ip = pageContext.getRequest().getRemoteAddr();
        try {
            pageContext.getOut().write(ip);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new RuntimeException(e);
        }

        return 0;
    }

    @Override
    public Tag getParent() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void release() {
        // TODO Auto-generated method stub

    }

    @Override
    public void setPageContext(PageContext arg0) {
        // TODO Auto-generated method stub
        this.pageContext = arg0;

    }

    @Override
    public void setParent(Tag arg0) {
        // TODO Auto-generated method stub

    }

}

再是在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">

    <description>JSTL 1.1 XML library</description>
    <display-name>JSTL XML</display-name>
    <tlib-version>1.1</tlib-version>
    <short-name>x</short-name>
    <uri>/summer</uri>

    <!-- 返回客户机的IP地址的自定义标签 -->
    <tag>
        <name>viewIP</name>
        <tag-class>web.tag.ViewIPTag</tag-class>
        <body-content>empty</body-content>
    </tag>

</taglib>

注意:里面的uri是一个命名空间,可以自定义,随意设置,但是在需要引用的jsp页面上需要一致,这样才能获得自定义的标签使用


最后是在页面上引用自定义标签:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/summer"  prefix="sumer"%>

<!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>输出客户机的IP地址!</title>
</head>
<body>

    您的IP地址是:
<sumer:viewIP></sumer:viewIP>

</body>
</html>

测试结果:



自定义标签之manipulate篇


自定义标签可以实现如下功能:

  • 控制jsp页面某一部分(一般认为是标签体)是否执行(编写一个实现了Tag接口的类,控制doStartTag方法的返回值,Tag.EVAL_BODY_INCLUDE时执行标签体,返回Tag.SKIP_BODY时不执行标签体)
  • 控制整个页面是否执行(编写一个实现Tag接口的类,控制doStartTag方法的返回值,返回Tag.EVAL_PAGE,则执行下面的jsp页面,返回Tag.SKIP_PAGE则不执行后续的jsp页面,如果设置在页面头部,则服务器不会向浏览器发送jsp页面)
  • 控制标签页面标签内容重复执行(编写一个实现IterationTag接口的实现类,控制doAfterBody方法的返回值,返回值为BodyTag.EVAL_BODY_AGAIN时重复执行,一直到该方法的返回值为BodyTag.SKIP_PAGE时停止重复执行)
  • 修改jsp标签内容再输出(需要编写一个实现BodyTag接口的实现类,然后控制doStartTag,控制返回值为BodyTag.EVAL_BODY_BUFFERED时,就可以在doEndTag 方法中获得bodyContent对象的实例,这一切由complier来执行。然后就可以实现自己的逻辑了)。

下面来看一个小例子吧。

实现标签内容大写输出的自定义标签

第一步,编写实现了BodyTag接口的实现类:

package web.tag;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;

/**
 * 修改标签体内容的自定义标签(转换成大写的形式)
 * @author Summer
 *
 */
public class TagBodyModify extends BodyTagSupport {

    /**
     * 设置标签体被执行的返回值,残能实现后续操作
     * 在返回值为BodyTagSupport.EVAL_BODY_BUFFERED时会通知JSP Complier自动生成一个BodyContent对象
     * 用于后续的操作所用
     */
    @Override
    public int doStartTag() throws JspException {
        // TODO Auto-generated method stub
        return BodyTagSupport.EVAL_BODY_BUFFERED;
    }

    /**
     * 在doStartTag方法中已经获得了一个bodyContent对象,这样我们就可以在doStartTag或者doEndTag方法中
     * 进行对标签体内容的加工的操作
     */
    @Override
    public int doEndTag() throws JspException {
        // TODO Auto-generated method stub
        String content = bodyContent.getString();
        String result = content.toUpperCase();
        try {
            this.pageContext.getOut().write(result);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return Tag.EVAL_PAGE;//BodyTagSupport(父类)会默认返回这个方法
    }

}

第二步:在tld文件中进行声明,相关信息:

<!--Manipulate操作标签体内容的的自定义的标签  -->
    <tag>
        <name>TagBodyModify</name>
        <tag-class>web.tag.TagBodyModify</tag-class>
        <body-content>JSP</body-content>
    </tag>

第三步:在jsp页面添加引用。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="/summer" prefix="summer"%>

<!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>控制标签体内容转换成大写的测试页面</title>
</head>
<body>
    <summer:TagBodyModify>I am Summer !</summer:TagBodyModify>

</body>
</html>

测试结果:


总结:

  • 官方文档对这些方法的调用过程及使用方法做了详细的介绍,应该对文档熟练阅读并理解
  • 代码逻辑很清晰,按照流程就不容易出错
  • 自定义标签的出现便是为了消除jsp页面中的java代码,应学会其与el表达式的配合!

JSP自定义标签必知必会的更多相关文章

  1. JSP自定义标签之简单标签入门

    在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Ta ...

  2. 《MySQL必知必会》整理

    目录 第1章 了解数据库 1.1 数据库基础 1.1.1 什么是数据库 1.1.2 表 1.1.3 列和数据类型 1.1.4 行 1.1.5 主键 1.2 什么是SQL 第2章 MySQL简介 2.1 ...

  3. 1.4(学习笔记)JSP自定义标签

    一.JSP自定义标签 JSP自定义标签,可以通过实现Tag接口.继承TagSupport类来设置标签功能. 后续通过配置文件将标签和具体的实现类关联. 二.自定义第一个标签(实现Tag接口) 自定义标 ...

  4. H5系列之History(必知必会)

    H5系列之History(必知必会)   目录 概念 兼容性 属性 方法 H5方法       概念     理解History Api的使用方式 目的是为了解决哪些问题   作用:ajax获取数据时 ...

  5. 2015 前端[JS]工程师必知必会

    2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...

  6. [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)

    http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...

  7. JSP自定义标签库

    总所周知,JSP自定义标签库,主要是为了去掉JSP页面中的JAVA语句 此处以格式化输出时间戳为指定日期格式为例,简单介绍下JSP自定义标签的过程. 编写标签处理类(可继承自javax.servlet ...

  8. makefile 必知必会

    Makefile 必知必会 Makefile的根本任务是根据规则生成目标文件. 规则 一条规则包含三个:目标文件,目标文件依赖的文件,更新(或生成)目标文件的命令. 规则: <目标文件>: ...

  9. python网络爬虫,知识储备,简单爬虫的必知必会,【核心】

    知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...

  10. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...

随机推荐

  1. 关于ajax的content-download时间过慢问题的解决方案与思考

    前言:   做前端架构很久很久了,经常到我这里都是些棘手的问题,之前没有养成很好的记录问题的习惯,以后会努力成文,积累. 于是今天就有个这篇文章.关于ajax的content-download时间过慢 ...

  2. Vue2学习结合bootstrapTable遇到的问题

    Vue2学习 项目中在使用bootstrapTable的时候,在table里面会有操作结合vue使用过程中点击相应的操作不会起作用 解决办法 1.把事件绑定到父元素上即可,但要判断什么样的需要点击,用 ...

  3. windows的常用快捷键(实用篇)

    整理一下windows的常用快捷键,有些快捷键老不用都忘记了,这里整理一下方便自己以后忘记时翻阅. 一.Fn键的使用 1.F1帮助 2.F2重命名 3.F3打开搜索 4.F4打开地址栏常用地址 5.F ...

  4. 使用mybatis注解@Options实现添加记录时返回主键值

    官网:http://www.mybatis.org/mybatis-3/index.html 在使用mybatis作为ORM框架时,我通常更喜欢使用注解而非xml配置文件的方式.业务场景:添加记录之后 ...

  5. selenium登录163邮箱

    环境:windows8  python2.7+selenium+chrome 直接上脚本: # coding=utf-8from selenium import webdriverimport tim ...

  6. 【转】使用virtualenv在ubuntu上搭建python 3开发环境

    ubuntu 13.04默认的python版本是2.7的,想在其上做python3的开发会遇到问题.比如要使用pip安装软件包时,默认安装的就是python2的包.如果想安装python3的包,就需要 ...

  7. webpack4新建一个项目

    Create a new directory mkdir webpack-4-quickstart Initialize a package.json by running: npm init -y ...

  8. Docker标准化开发测试和生产环境

    对于大部分企业来说,搭建 PaaS 既没有那个精力,也没那个必要,用 Docker 做个人的 sandbox 用处又小了点. 可以用 Docker 来标准化开发.测试.生产环境. Docker 占用资 ...

  9. JavaScript 知识图谱

  10. springMVC源码解析--HandlerMethodArgumentResolverComposite参数解析器集合(二)

    上一篇博客springMVC源码分析--HandlerMethodArgumentResolver参数解析器(一)中我们已经介绍了参数解析相关的东西,并且也提到了HandlerMethodArgume ...