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

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

先看效果图:

image_thumb3

 

前台页面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)

image_thumb9

具体内容:

<?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);

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

image_thumb12

代码如下:

//具体业务实现类
    @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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正则表达式以什么开头以什么结尾_股票hk是什么意思,股票st开头是什么意思,新通联股票...

股票hk是什么意思,股票st开头是什么意思,新通联股票股票hk是什么意思,股票st开头是什么意思,新通联股票我们首先解决时间跨度问题&#xff1a;如果您为诸如退休之类的遥远目标投资&#xff0c;则应主要投资股票(同样&#xff0c;我们建议您通过共同基金投资)。心理控制第一&…

电脑显示连接了网络但是不能上网_为什么电脑插上网线显示已连接却上不了网...

尝试断一下网&#xff0c;或者重启一下系统看一下是否解决&#xff1b;也可能是开启了网络代理&#xff0c;可以重置一下浏览器或者网络设置&#xff1b;还可以使用安全管家软件&#xff0c;扫描一下网络设置。以下是详细介绍&#xff1a;1、有时候系统显示已经连接其实并没有真…

python getopterror_python3 getopt用法

python channel_builder.py -s /Users/graypn/ -d /Users/graypn/Documents -m 7 --outreport/xx.html参数也分长格式和短格式短格式&#xff1a;-s长格式&#xff1a;--sourceopts, args getopt.getopt(sys.argv[1:], "hs:d:m:v:p:c:",["help", "sr…

excel删除空行_Excel里99.9%的人都踩过的坑,早看早避开!

本文作者丨可可&#xff08;小 E 背后的小仙女&#xff09;本文由「秋叶 Excel」原创发布如需转载&#xff0c;请在公众号发送关键词「转载」查看说明2019 年上班第一天感觉怎么样呢&#xff1f;望着满屏幕铺天盖地的表格&#xff0c;我只能摸摸自己还没下去的小肚子&#xff0…

CentOS 6.5 Zabbix-agent3.2 安装 1.0版

1.关闭防火墙service iptables stop2.更换源、安装zabbix-agentrpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpmyum install -y zabbix-agent3.修改配置文件vim /etc/zabbix/zabbix_agentd.confServer192.168.8.228 ser…

centos下利用httpd搭建http服务器方法

centos下利用httpd搭建http服务器方法 1. 解决的问题 在开发测试过程中&#xff0c;分析图片任务需要将图片保存在服务器端&#xff0c;通过url来访问和下载该图片&#xff0c;这就需要使用一台图片服务器&#xff0c;但常常遇到图片服务器匮乏的情况&#xff0c;为了解决该问题…

[转]Java7中的ForkJoin并发框架初探(上)——需求背景和设计原理

详见&#xff1a; http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp83 这篇我们来简要了解一下JavaSE7中提供的一个新特性 —— Fork Join 框架。 0. 处理器发展和需求背景 回想一下并发开发的初衷&#xff0c;其实可以说是有两点&#xff0c;或者说可以从两个方面…

安装oculus运行时出现问题_U盘安装windows10出现的问题解决方法

安装windows10 出现的问题之前安装windows10都没什么问题&#xff0c;今天安装windows10出现了好多问题&#xff0c;记录一下。我这个教程我觉得是最好的安装教程安装windows10教程问题1. 我们无法创建新的分区&#xff0c;找不到现有分区&#xff08;或者因为MBR分区表问题&am…

python选择排序从大到小_Python实现选择排序

一、选择排序简介选择排序(Selection sort)是一种简单直观的排序算法。选择排序首先从待排序列表中找到最小(大)的元素&#xff0c;存放到元素列表的起始位置(与起始位置进行交换)&#xff0c;作为已排序序列&#xff0c;第一轮排序完成。然后&#xff0c;继续从未排序序列中找…

java句柄数过高怎么解决_主播个人及企业利润高,个税或企业所得税怎么解决...

网络直播在2020年尤为火热&#xff0c;男女老少都纷纷投入其中&#xff0c;究其原因还是其行业表现出来的“利润高”等。也确实有部分人取得了一定的成效&#xff0c;也催生了不少的直播平台、经纪公司的出现。 那么这些主播个人或者企业利润高&#xff0c;个税或企业所得…

杂项-Java:JBoss

ylbtech-杂项-Java&#xff1a;JBoss是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可&#xff0c;可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器&#xff0c;支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WE…

任务调度及远端管理(基于Quartz.net)

这篇文章我们来了解一些项目中的一个很重要的功能&#xff1a;任务调度 可能有些同学还不了解这个&#xff0c;其实简单点说任务调度与数据库中的Job是很相似的东西 只不过是运行的物理位置与管理方式有点不一样&#xff0c;从功能上来说我觉得还是差不多的&#xff0c; 存储过…

C# 子类实例化基类 基类使用不了子类的方法_C#高级编程面试考题

一、简答题1.简述C#中的所有访问修饰符及访问权限private(私有的)给类&#xff0c;及所有类成员使用所有类成员的默认访问修饰符可访问范围当前类自身public(公开的)给类&#xff0c;及所有类成员使用可访问范围当前类自身所有的子类同一程序集其他类通过实例化也可以访问其他程…

关于img 403 forbidden的一些思考

网页中经常需要显示图片给用户看&#xff0c;对网站本身来说有的图片是从本地图片服务器来的&#xff0c;但是一旦数量多了以后&#xff0c;磁盘空间又是一个问题。 所以有时就希望显示其他网站的Image&#xff0c;直接把其他网站的图片显示在我的网站上。但并不是所有的外网Im…

python 循环赋值_Python打牢基础,从19个语法开始!

Python简单易学&#xff0c;但又博大精深。许多人号称精通Python&#xff0c;却不会写Pythonic的代码&#xff0c;对很多常用包的使用也并不熟悉。学海无涯&#xff0c;我们先来了解一些Python中最基本的内容。Python的特点解释型语言&#xff0c;无需编译即可运行提供了交互式…

uwp连接mysql数据库_在 UWP 应用中使用 SQLite 数据库

在 UWP 应用中使用 SQLite 数据库Use a SQLite database in a UWP app06/26/2020本文内容可以使用 SQLite 在用户设备上的轻量级数据库中存储和检索数据。You can use SQLite to store and retrieve data in a light-weight database on the users device. 本指南演示如何执行该…

MySQL 的实时性能监控利器

操作系统及MySQL数据库的实时性能状态数据尤为重要&#xff0c;特别是在有性能抖动的时候&#xff0c;这些实时的性能数据可以快速帮助你定位系统或MySQL数据库的性能瓶颈&#xff0c;就像你在Linux系统上使用「top&#xff0c;sar&#xff0c;iostat」等命令工具一样&#xff…

设置linearlayout最大高度_技术案例 | 排烟口个数与挡烟垂壁高度的关系探讨

随着《建筑防烟排烟系统技术标准》( 以下简称新规范) 的正式实施&#xff0c;新规范对排烟系统的设计提出了完全不同的设计理念。根据新规范正文: 当建筑空间净高不大于6m时&#xff0c;每个防烟分区的排烟量应按不小于60m/(h㎡)计算且不小于15,000m/h( 走道不小于13,000m/h) &…

python安装requests第三方模块

2018-08-28 22:04:51 1 .下载到桌面后解压&#xff0c;放到python的目录下 --------------------------------------------------------------------------------------------------------------------------------------------------------- 2 . 在CMD输入以下 F:\>cd /d F…

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1、文件不是数据库&#xff0c;不能用SQL访问。当过滤条件变化时需要改写代码。如果要实现象SQL那样灵活的条件过滤&#xff0c;则需要自己实现动态表达式解析和求值&#xff0c;编程工作量非常大。 2、文件太大时不能一…