一、认识标签

1,说明:传统标签编程在开发中基本用不到,学习标签编程主要还是为了完善知识体系。

2,标签的主要作用:移除或减少jsp中的java代码

3,标签的主要组成部分及运行原理

4,简单标签示例:继承javax.servlet.jsp.tagext.TagSupport

标签开发步骤

4.1编写一个继承TagSupport(或实现Tag接口)的类

package com.chen.ying;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.JspWriter;

import javax.servlet.jsp.tagext.TagSupport;

public class FirstTag extends TagSupport {

public int doStartTag()throws JspException{

     System.out.println("调用doStartTag方法");

     HttpServletRequest req=(HttpServletRequest)pageContext.getRequest();

     JspWriter out=pageContext.getOut();

     String ip=req.getRemoteAddr();//通过request对象取得ip地址

     try {

         out.write(ip);//输出时有可能会抛出异常

     } catch (IOException e) {

         e.printStackTrace();

     }

     return TagSupport.SKIP_BODY;//表示跳过标签体

}

}

4.2在WEB-INF目录下新建*.tld文件,用于表示标签库,在*.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用来添加对taglib(标签库)的描述 -->

     <description>陈程编程开发的自定义标签库</description>

      <!--taglib(标签库)的版本号 -->

     <tlib-version>1.0</tlib-version>

     <short-name>GaclTagLibrary</short-name>

     <!--

         为自定义标签库设置一个uri用于表示标签库,uri以/开头,/后面的内容随便写,如这里的/chen ,

         在Jsp页面中引用标签库时,需要通过uri找到标签库

         在Jsp页面中就要这样引入标签库:<%@taglib uri="/chen" prefix="anyword"%>

     -->

     <uri>/chen</uri>

     <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述  -->

     <!-- 一个tag标记对应一个自定义标签 -->

      <tag>

         <description>这个标签的作用是用来输出客户端的IP地址</description>

         <!--

             为标签处理器类配一个标签名,在Jsp页面中使用标签时是通过标签名来找到要调用的标签处理器类

             通过IP就能找到对应的com.chen.ying.FirstTag类

          -->

         <name>IP</name>

         <!-- 标签对应的处理器类-->

         <tag-class>com.chen.ying.FirstTag</tag-class>

         <body-content>empty</body-content>

     </tag>

 </taglib>

4.3在jsp页面中使用自定义标签

使用<%@taglib uri=”标签库的uri”  prefix=”标签的使用前缀”%>来引入要使用的标签库,前缀可任意设置

显示结果

每次调用<haha:IP>标签时,都会触发doStartTag()方法

从上面代码可以看到,使用标签可以移除jsp中的java代码

二、定义有属性的标签

1,  要求

2,  完成一个日期格式化显示的操作,即根据用户输入的日期格式化模板显示日期。

2.1编写标签类

package com.chen.ying;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class DataTag extends TagSupport {

    private String format;

    public int doStartTag()throws JspException{

       SimpleDateFormat sdf=new SimpleDateFormat(this.format);//设置日期格式

       try {

           pageContext.getOut().write(sdf.format(new Date()));//用指定格式显示日期

       } catch (IOException e) {

           e.printStackTrace();

       }

       return TagSupport.SKIP_BODY;

    }

    public String getFormat() {

       return format;

    }

    public void setFormat(String format) {//在标签中通过反射机制设置

       this.format = format;

    }

}

2.2在标签库中配置标签

2.3在jsp使用标签

3,  小结

三、TagSupport类

1,  要求

2,  TagSupport主要属性及方法

Int doStartTag()

int doAfterBody()

int doEndTag()

3,Tag接口执行流程

4,含标签体的标签:判断某个属性范围内是否存在指定的属性名称的属性

4.1编写标签处理器类

package com.chen.ying;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

public class AttributeTag extends TagSupport {

private String name;//接收属性的名称

private String scope;//接收属性的范围

public int doStartTag()throws JspException{

     Object value=null;

     if("page".equals(this.scope)){//是否是page属性范围

         value=pageContext.getAttribute(this.name,pageContext.PAGE_SCOPE);

     }

     if("request".equals(this.scope)){//是否是request属性范围

         value=pageContext.getAttribute(this.name,pageContext.REQUEST_SCOPE);

     }

     if("session".equals(this.scope)){//是否是session属性范围

         value=pageContext.getAttribute(this.name,pageContext.SESSION_SCOPE);

     }

     if("application".equals(this.scope)){//是否是属性范围

         value=pageContext.getAttribute(this.name,pageContext.APPLICATION_SCOPE);

     }

     if(value==null){//表示没有此属性,不执行标签体

         return TagSupport.SKIP_BODY;

     }

     else{//执行标签体

         return TagSupport.EVAL_BODY_INCLUDE;

     }  

}

public void setName(String name) {

     this.name = name;

}

public void setScope(String scope) {

     this.scope = scope;

}

}

4.2在标签库中配置标签

4.3在jsp中使用标签‘

是否执行标签体,由返回值决定

5,小结

四、迭代标签

1,  要求

在MVC模式中强调,在一个JSP文件中最好不要出现script代码,因为这样会破坏程序的结构,维护起来非常麻烦,JSP文件就只是用来接收、判断与输出的。现在要在JSP中完成集合的输出,为了不出现script代码,可以用迭代标签

2,  迭代标签开发步骤

2.1编写标签处理类

public class IteratorTag extends TagSupport {

    private String name;

    private String scope;

    private String id;//指定保存集合中的每个元素的属性名称

    private Iterator<?> iter=null;

    public int doStartTag()throws JspException{

        Object value=null;

        if("page".equals(this.scope)){//是否是page属性范围

            value=pageContext.getAttribute(this.name,pageContext.PAGE_SCOPE);

        }

        if("request".equals(this.scope)){//是否是request属性范围

            value=pageContext.getAttribute(this.name,pageContext.REQUEST_SCOPE);

        }

        if("session".equals(this.scope)){//是否是session属性范围

            value=pageContext.getAttribute(this.name,pageContext.SESSION_SCOPE);

        }

        if("application".equals(this. Scope)){//是否是属性范围

            value=pageContext.getAttribute(this.name,pageContext.APPLICATION_SCOPE);

        }

        if(value!=null&&value instanceof List<?>){//有此属性且为List类型

            this.iter=((List<?>)value).iterator();

            if(iter.hasNext()){

                pageContext.setAttribute(this.id,iter.next());

                //将集合元素保存在指定属性名的属性范围中

                return TagSupport.EVAL_BODY_INCLUDE;//执行标签体,通过id属性名输出集合元素

            }

            else{

                return TagSupport.SKIP_BODY;

            }

        }

        else{

            return TagSupport.SKIP_BODY;

        }  

    }

    public int doAfterBody()throws JspException{

        if(iter.hasNext()){

            pageContext.setAttribute(this.id,iter.next());

            //将集合元素保存在属性范围中,属性名在jsp中指定

            return TagSupport.EVAL_BODY_AGAIN;//如果还有元素,交给doAfterBody()处理

        }

        else{

            return TagSupport.SKIP_BODY;

        }

    }

    public void setName(String name) {

        this.name = name;

    }

    public void setScope(String scope) {

        this.scope = scope;

    }

    public void setId(String id) {

        this.id = id;

    }  

}

注意,如果是要执行一次标签体则在doStartTag()中返回EVAL_BODY_INCLUDE,如果是要多次执行标签体,则在doAfterBody()中返回EVAL_BODY_AGAIN;

2.2在标签库中配置标签处理类

有时候tomcat会出现如下错误

Unable to find setter method for ***

只要在对应属性配置处添加<type>属性类型</type>即可解决

2.3在jsp中使用标签

id用于指定list中每个元素保存在属性范围中的属性名,以方便用表达式语言输出

2.4结果

3,  小结

通过标签操作对象,可分为以下步骤:首先在servlet中将对象保存在属性范围内,然后:1,确定标签的属性有哪些,如要操作对象属性的名称,范围等2,通过对象属性得到对象,然后处理对象,可将处理后的结果保存在指定属性名的属性范围内,然后在标签体中显示处理结果,如上述id=”person”.

五、 BodyTagSupport类

1, 要求

2, 定义

3, 主要扩充方法

4, BodyContent类

5, BodyTag接口的执行流程

6,TagExtraInfo类和VariableInfo类

TagExtraInfo类的主要方法

VariableInfo类的主要方法

7,小结

以上都是传统标签开发,在实际开发中并不常用,下面的简单标签才是重点

08.十分钟学会JSP传统标签编程的更多相关文章

  1. 十分钟学会Scratch图形化编程

    一.概要 Scratch是麻省理工学院开发的供儿童或者初学者学习编程的开发平台.其通过点击并拖拽的方式,完成编程,可以使儿童或者成人编程初学者学习编程基础概念等.Scratch是一款积木式图形编程软件 ...

  2. javaweb学习总结(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  3. javaweb(二十四)——jsp传统标签开发

    一.标签技术的API 1.1.标签技术的API类继承关系 二.标签API简单介绍 2.1.JspTag接口 JspTag接口是所有自定义标签的父接口,它是JSP2.0中新定义的一个标记接口,没有任何属 ...

  4. PHP学习过程_Symfony_(3)_整理_十分钟学会Symfony

    这篇文章主要介绍了Symfony学习十分钟入门教程,详细介绍了Symfony的安装配置,项目初始化,建立Bundle,设计实体,添加约束,增删改查等基本操作技巧,需要的朋友可以参考下 (此文章已被多人 ...

  5. 十分钟学会 tmux

    tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理.在 macOS 下,使用 iTerm2 能应付绝大多数窗口管理的需求. 如上图所示,iTerm2 能新建多个标签页(快捷键 ...

  6. 快速入门:十分钟学会Python

    初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...

  7. JSP传统标签开发

    1.标签技术的API类继承关系 1).JspTag接口是所有自定义标签的父接口 该接口中没有任何属性和方法,只有两个直接子接口,Tag接口和SimpleTag接口,把实现Tag接口的自定义标签叫做传统 ...

  8. Python十分钟学会

    初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...

  9. 快速入门:十分钟学会Python(转)

    初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...

随机推荐

  1. 如何将一个已有的项目托管到github或是码云上?git的配置

    场景一:已有的一个项目,要把它托管到Git上去,步骤和方法如下: 方法一: ①在工程的路径下 : git init 建一个裸仓库. ②远程仓库地址 :将本地的仓库和远程仓库关联 git remote ...

  2. C++调用Matlab函数求特征值

    最近需要用到C++和Matlab的混编,记录一下学习过程~ 要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量. //C++ #include "engine.h" ...

  3. 面试官问你:MYSQL事务和隔离级别,该如何回答

    一.事务 事务是由一组SQL语句组成的逻辑处理单元,是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚.事务具有以下4个属性,通常简称为事务 ...

  4. MySQL常用增删改查等操作语句

    修改数据库的字符集    mysql>use mydb    mysql>alter database mydb character set utf8;创建数据库指定数据库的字符集    ...

  5. Windows数字代码签名的作用和流程

    什么是数字代码签名?数字签名代码是一种技术,它使用数字证书来识别软件的发布商和使用hash算法来确保软件的完整性.数字签名使用公共密匙签名书法被创建,它使用两种不同的密匙:公共密匙和私有密匙,我们称其 ...

  6. Lua的热更新学习笔记_01

    热更新的的实现方式 1.使用lua脚本编写游戏的UI或者其他的逻辑 2.使用C#的反射技术 3.使用C#Light AssetBundle是什么? 1.unity提供一个资源更新技术,就是通过Asse ...

  7. 利用perf排查sys高的问题

    思路 perf top perf record -C 44,48,60,63 -g -o a.data perf report -i a.data --call-graph 查看调用链,可以确定,基本 ...

  8. 学习Linux服务的方法

    1.服务的概述:名字.功能.特点.原理.端口号 2.安装 3.配置文件的位置 4.服务器启动.关闭的脚本,查看端口 5.此服务的使用方法 6.修改配置文件,案例部署 7.排错调优

  9. 学习EXTJS6(6)基本功能-工具栏和菜单

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. ExtJs之Ext.view.View

    要注意MODEL的定义和实例化的代码,注释掉的是老式的不兼容4.0以上的.而下面的定义才是新推荐的. 我网上可是查的了.是书上的代码老了. <!DOCTYPE html> <html ...