今天是学习自定义标签的第二天,主要是写一个自定义的循环标签。

先看效果图:

前台页面Jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib prefix="myout" uri="/demo" %>
<html>
<head>
</head><%String[] array = new String[]{"one","two","three","four","five"};pageContext.setAttribute("arr", array);%>
<body><h1>我的测试页面</h1><myout:Foreach items="arr" var="item">array数组里对应的英文数字:${item}<br></myout:Foreach>
</body>
</html>

跟第一篇一样,还是分四部分讲解:

第一部分:自定义标签文件(*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"><tlib-version>1.0</tlib-version><short-name>myout</short-name><uri>/demo</uri><!-- 循环 --><tag><name>Foreach</name><tag-class>com.tag.support.TagDemo</tag-class><!-- 标签体可以用EL表达式 --><body-content>scriptless</body-content><attribute><name>items</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute><attribute><name>var</name><required>true</required><rtexprvalue>true</rtexprvalue></attribute></tag>
</taglib>

这个地方要注意一点:关于<%@taglib prefix="myout" uri="/demo" %> 是如何找到demo.tld文件的?

两种方式:

第一种方式:就如同上面这样配置,在demo.tld文件中加上<uri>/demo</uri> ,指定uri,

但是这种方式demo.tld必须放在WEB-INF下,不然容器找不到

  第二种方式:在web.xml中配置,这种方式是通过显示的指定demo.tld的位置,可以不放在WEB-INF只要指向正确就好

        <jsp-config><taglib><taglib-uri>/demo</taglib-uri><taglib-location>/WEB-INF/lirui.tld</taglib-location></taglib></jsp-config>

新增一种方式:其实在jsp页面引用自定义标签还可以另一种方式(指定*.tld文件所在路径),只是这种方式不灵活。

%@taglib prefix="myout" uri="/WEB-INF/demo.tld" %

第二部分:标签具体业务实现类。

自定义的类要继承(extends)SimpleTagSupport

import java.io.IOException;import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;public class TagDemo extends SimpleTagSupport {//注意:这个属性要与tld文件中定义的属性一致,并提供get和set方法private String items;private String var;public String getItems() {return items;}public void setItems(String items) {this.items = items;}public String getVar() {return var;}public void setVar(String var) {this.var = var;}//具体业务实现类
    @Overridepublic void doTag() throws JspException, IOException {//this.getJspContext()获得JspContext对象也就是前台页面的PageContext//可以看出页面输出Hello World注意是这里的write方法实现的JspContext jspContext = this.getJspContext();String[] arr = (String[])jspContext.getAttribute(items);for(String s: arr){jspContext.setAttribute(var, s);this.getJspBody().invoke(null);}}
}

注意一点:this.getJspBody().invoke(null); 这行代码表示把标签体的内容的内容输入到浏览器,如果没有调用该方法,则忽略标签体

我一开始做的时候没有加这一行代码,

直接导致前台页面<myout:Foreach items="arr" var="item">array数组里对应的英文数字:${item}<br> </myout:Foreach> 标签体内同显示不出来,当时查了下资料才知道这里没有加this.getJspBody().invoke(null); 这一行代码。

扩充一下知识点:JspFragment是个抽象类,这个类代码很简单,具体如下:

import java.io.IOException;
import java.io.Writer;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;public abstract class JspFragment
{public abstract void invoke(Writer paramWriter)throws JspException, IOException;public abstract JspContext getJspContext();
}

这个类的实例通过SimpleTagSupport类中的getJspBody()方法获得的。

该类实例封装了标签体的内容,主要方法就是invoke方法,该方法具体有两种用法:

第一种:this.getJspBody().invoke(null);表示输出到浏览器,这是原样输出的

第二种:当需要对标签体进行修改时,需要用到第二种,this.getJspBody().invoke(Writer out);

假设:我希望上面显示的页面效果使所有字母大写,效果如图

代码如下:

//具体业务实现类
    @Overridepublic void doTag() throws JspException, IOException {JspContext jspContext = this.getJspContext();String[] arr = (String[])jspContext.getAttribute(items);for(String s: arr){jspContext.setAttribute(var, s);//定义一个缓冲区,把内容先输入到缓存区中,然后在打印到浏览器StringWriter sw = new StringWriter();this.getJspBody().invoke(sw);String str = sw.toString().toUpperCase();//打印的具体操作this.getJspContext().getOut().write(str);}}

这就是这两种方式的区别。

第三部分:Jsp页面引用自定义标签。

<%@taglib prefix="myout" uri="/demo" %>

关于引用自定义标签,上面第二部分已说的很清楚,这里就不多说了。

第四部分:关于定义uri的几种方式。

两种方式:(第一部分好像也说了,这里再重复一遍)

第一种方式:就如同上面这样配置,在demo.tld文件中加上<uri>/demo</uri> ,指定uri,

但是这种方式demo.tld必须放在WEB-INF下,不然容器找不到

  第二种方式:在web.xml中配置,这种方式是通过显示的指定demo.tld的位置,可以不放在WEB-INF只要指向正确就好

        <jsp-config><taglib><taglib-uri>/demo</taglib-uri><taglib-location>/WEB-INF/lirui.tld</taglib-location></taglib></jsp-config>

今天是学习Jsp自定义标签的第二天,刚开始写博客,如果有什么问题欢迎各位网友及时提出,谢谢。

技术的提高在于分享,而不是闭门造车。

转载于:https://www.cnblogs.com/liruiloveparents/p/5041071.html

Jsp2.0自定义标签(第二天)——自定义循环标签相关推荐

  1. HTML基础之常用标签第二篇:有序无序标签,以及框架标签

    上一篇聊了一些HTML中的一些基础标签,现在开始再聊HTML中的一些其它标签,比如有序无限标签,还有一些框架标签.表单标签涉及内容有点多,后面再来一篇. li <li> 标签定义列表项目. ...

  2. java 自定义循环标签_Jsp2.0自定义标签(第二天)——自定义循环标签

    今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 String[]array = new String[]{"one","t ...

  3. JAVAWEB开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)

    JSTL  JSTL简介: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用:   提供给Java Web开发人员一个标准通用的标签函数库   和EL ...

  4. Java-Web JSTL标签库、自定义标签库和MVC设计模式

    目录 一.JSTL标签库 1.什么是JSTL 2.JSTL标签库 3.使用taglib指令导入标签库 4.core标签库常用标签 (1)out和set (2)remove (3)url (4)if ( ...

  5. java web 自定义标签_JavaWeb学习——自定义标签

    自定义标签 一.自定义标签概述 使用标准JSP访问.操作JavaBean,是实现展现(HTML)与业务实现(Java代码)分离的第一步.然而,标准方法功能不够强大,以至于开发者无法仅仅使用它们开发应用 ...

  6. 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签.  jsp标签的分 ...

  7. JSP标签:jsp内置标签、jstl标签、自定义标签

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

  8. 自定义EL函数、自定义JSTL标签

    自定义EL函数 1.做一个类(静态) package com.maya.el;public class ELBiaoDaoShi {public static String TiHuan(String ...

  9. 【死磕 Spring】----- IOC 之解析 bean 标签:解析自定义标签

    前面四篇文章都是分析 Bean 默认标签的解析过程,包括基本属性.六个子元素(meta.lookup-method.replaced-method.constructor-arg.property.q ...

最新文章

  1. 兰大博士神论文: 我和同门亲师妹是如何走到一起的?
  2. 一个简单的Spring的AOP例子(JAVA面向切面编程)
  3. 老婆,我会好好爱你的
  4. 概述 互联网时代的商业挑战
  5. 漫谈数据库索引 | 脚印 footprint(转载)
  6. linux 切图软件下载,学会23个linux常用命令,不做前端切图仔~
  7. 电脑重装系统之后git pull报错 Permission denied (publickey)
  8. NEC学习 ---- 模块 - 带点文字链接列表
  9. 架构(三层架构)、框架(MVC)、设计模式三者异同点
  10. ndnsim r语言 ubuntu_Ubuntu14.04下配置ndnSIM-nom-rapid-car2car
  11. 学习python:模块的建立与发布
  12. trie树 java 开源_用于实现Trie的内存java应用程序中的最佳开源
  13. 如何在win 8的64位下破解安装EPLAN
  14. 【Tomcat】修改密码
  15. 3DsMax导出插件编写(二)——常规SDK方法进行信息获取和保存文件
  16. 很舒服的几句话,心静,人就不会累了
  17. linux利用su -从普通用户切换root权限
  18. Oracle Datapump实验
  19. XStream使用记录
  20. 路径规划--地图分割

热门文章

  1. 文件共享服务器imac,iMac怎么在网络上共享设备windows文件夹和服务 | MOS86
  2. java jmap mat_java内存调优之jmap,jstack,mat
  3. linux c实现一个简单的sniffer
  4. 汇编语言中变量的声明
  5. 160 - 21 Cabeca
  6. Java BigDecimal stripTrailingZeros()方法与示例
  7. Binary String Matching(C++)
  8. oracle 数组的用法,oracle存储过程中数组的使用
  9. Linux gcc 制作静态库01
  10. tornado 学习注意事项--00