08.十分钟学会jsp传统标签编程

陈程编程      2022-02-14     101

关键词:

一、认识标签

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,小结

 

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

 

五分钟学会一门编程语言?(代码片段)

...开始骂我了:**标题党,什么编程语言五分钟就能学会?其实我本来也是不相信的,但是学过了才知道这是真的。1、Brainfuck看到这个小标题,不要误会,我没有骂人。这就是今天文章的主人公,也就是... 查看详情

学会怎样使用jsp内置标签jstl标签库及自定义标签

 jsp标签的分类:  1)内置标签(动作标签):不需要在jsp页面导入标签  2)jstl标签:需要在jsp页面中导入标签  3)自定义标签:开发者自行定义,需要在jsp页面导入标签  1、内置标签(动作标签): &nbs... 查看详情

❤️一分钟学会python条件语句❤️(代码片段)

Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。我们通过下图来简单了解下条件语句的执行过程:Python程序语言指定任何非0和非空(null)值为true,0或者null为false。Python编... 查看详情

❤️一分钟学会python网络编程❤️(代码片段)

无监督学习🦄博客主页:https://blog.csdn.net/qq_42257666🦄欢迎点赞👍收藏⭐留言📝如有错误敬请指正!🦄本文由[振华OPPO]原创,首发于CSDN🐋🦄艰难之路,唯勇者行。行善积德,立命... 查看详情

少儿编程电子学会图形化scratch编程等级考试四级真题答案解析(判断题)2022年6月

2022年6月scratch编程等级考试四级真题判断题(共10题,每题2分,共20分)16、3只兔子3分钟吃掉6根胡萝卜,9只兔子6分钟能吃掉36根胡萝卜答案:对考点分析:考查数学逻辑推理,3只兔子3分钟吃掉6根萝卜,那1只兔子3分钟吃掉了2... 查看详情

jsp第六篇自定义标签之传统标签

为什么要使用自定义标签?JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签!编写自定义标签的步骤:编写一个实现Tag接... 查看详情

五分钟学会企业的openstack(t版)——简介及安装方式

五分钟学会企业的OpenStack(T版)——简介及安装方式前言一、OpenStack简介二、OpenStack安装方式(T版)系列前言花了几天写完了OpenStack(T版)的系列文章,希望能帮到大家,也不枉我每天花时间在... 查看详情

linux编程三分钟让你学会linux下用户密码更改(代码片段)

Linux环境下密码更改包括两种:第一种:root用户(管理员)密码更改第二种:非root用户(普通用户)密码更改可能需要进行密码更改的场景:①购买云服务后,原始的root密码过于复杂,不... 查看详情

5分钟轻松教你学会:docker镜像仓库的使用

参考技术A镜像保存在Registry的仓库中,默认的Registry是由Docker公司运营的公共Registry服务,即DockerHub,网址为:https://hub.docker.com/。可以把DockerHub看成类似于Github一样的网址。1、登录「docker」命令:dockerlogin,显示LoginSucceeded说明... 查看详情

30分钟学会typescript(代码片段)

TypeScript可编译为JavaScript,专为开发大型和复杂应用程序的开发人员设计。TypeScript从C#和Java这样的语言继承了许多编程概念,为强大灵活、弱类型的JavaScript增加了更多的强类型语言的特性。 本文适用于熟悉JavaScript同时想... 查看详情

十分钟学会哈希表

一、为什么会有哈希表?是想不通过比较就能找到表中的关键字二、用的什么方法?建立关键字与其位置的函数(哈希函数)三、有什么问题?不同的关键字通过哈希函数可能会产生相同的位置(产生冲突... 查看详情

30分钟让你学会shell脚本

            Shell脚本编程入门什么是shell脚本实例看个例子: #!/bin/shcd~mkdirshell_tutcdshell_tutfor((i=0;i<10;i++));do touchtest_$i.txtdone示例解释&n 查看详情

3分钟学会textinputlayout

参考技术A大家好,我叫噬魂源码传送门TextInputLayout是在MaterialDesign中的,如果我们要使用的话,必须在gradle文件中配置在TextInputLayout官方文档API中描述了它是一种新的继承自LinearLayout的布局,让我们使用时里面只能包含一个EditText或者... 查看详情

5分钟学会快速排序(分治思想)(代码片段)

快速排序快速排序(Quicksort)是对冒泡排序算法的一种改进(先排序再递归)基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小࿰... 查看详情

趣味故事5分钟学会第一个java程序,秒懂跨平台执行原理(代码片段)

趣味故事5分钟学会Java程序秒懂跨平台执行原理之前小白过来找学委学习了很多编程知识。然后他也推荐了一些朋友看学委的文章。可是那些朋友编程都没有玩过,只想入门看看。好吧,这个也不难的。还记得我们是怎么... 查看详情

趣味故事5分钟学会第一个java程序,秒懂跨平台执行原理(代码片段)

趣味故事5分钟学会Java程序秒懂跨平台执行原理之前小白过来找学委学习了很多编程知识。然后他也推荐了一些朋友看学委的文章。可是那些朋友编程都没有玩过,只想入门看看。好吧,这个也不难的。还记得我们是怎么... 查看详情

效率技巧│十分钟学会xmind思维导图的使用(代码片段)

✨目录🎈下载xmind🎈导图结构🎈主题和图库🎈兄弟主题和子主题🎈框组概要🎈主题样式🎈画布设置🎈标记和贴纸🎈设置标签🎈插入链接🎈其他功能🎈下载xmindxmind是一款全功能... 查看详情

效率技巧│十分钟学会xmind思维导图的使用(代码片段)

✨目录🎈下载xmind🎈导图结构🎈主题和图库🎈兄弟主题和子主题🎈框组概要🎈主题样式🎈画布设置🎈标记和贴纸🎈设置标签🎈插入链接🎈其他功能🎈下载xmindxmind是一款全功能... 查看详情