java自定义标签遍历_自定义标签 - CarlDing的个人页面 - OSCHINA - 中文开源技术交流社区...

EL的不足,由JSTL来加强  -> 自定义标签来实现。

1:自定义标签

1:自定义标签也是类。

2:让用户在JSP页面使用,不引用Java代码的情况下,调用Java代码。

2:标签开的类的继承关系

3:快速的标签示例

1:创建一个类实现接口Tag

packagecn.tag;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importjavax.servlet.jsp.JspException;

importjavax.servlet.jsp.JspWriter;

importjavax.servlet.jsp.PageContext;

importjavax.servlet.jsp.tagext.Tag;

publicclassDateTagimplementsTag {

/**

* 为了在其他的方法中使用pageContext

*

*/

privatePageContextpageContext;

/**

* 当在页面上使用了这个标签,当jsp在运行时,会先调用此方法

* 将pageContext传递到DataTag类中类

*/

@Override

publicvoidsetPageContext(PageContextpc) {

this.pageContext=pc;

}

/**

* 当这个标签开始时,即容器来调用以下的方法标签的body部分

*/

@Override

publicintdoStartTag()throwsJspException {

// 输出当前时间,到页面上去

SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");

Stringstr=sdf.format(newDate());

// 输出如果要输出,获取JspWriter就可以了

JspWriterout=pageContext.getOut();

try{

out.print("当前时间是:"+str);

}catch(Exceptione) {

e.printStackTrace();

}

/*

* 返回值是有固定值的 这个的返回值,决定了这个标签后面的body部分如何执行
Tag.EVAL_BODY_INCLUDE

* 执行body部分 SKIP_BODY:不执行body部分不显示

*/

returnSKIP_BODY;

}

/**

* 当执行标签结束的时时执行以下的代码

* 返回的值是: SKIP_PAGE : 页面的后面的部分,不执行不显

* EVAL_PAGE : 执行页面的 后面的部分

*/

@Override

publicintdoEndTag()throwsJspException {

returnEVAL_PAGE;

}

2:添加标签的配置文件

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

version="2.1">

以下是开发完成的完整的配置:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"

version="2.1">

1.0

ql

/ql.com

date

cn.tag.DateTag

empty

3:在JSP页面上引用

使用:

4:继承TagSupport

publicclassDate2TagextendsTagSupport {

@Override

publicintdoStartTag()throwsJspException {

Stringstr=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(newDate());

JspWriterout=pageContext.getOut();

try{

out.print("当前的时间为:"+str);

}catch(Exceptione) {

}

returnSKIP_BODY;

}

}

配置:

myDate2

cn.tag.Date2Tag

empty

以下是使用:

5:标签的功能

功能:

让程序员在页面上像是使用HTML标签一样,使用Java代码。

防止重复提交:

以下的情况下,可能会发生重复提交:

1:刷新页面。

2:服务或是网络比较慢。

如何防止重复提交:

使用Session

在JSP页面上,生成一个UUID放放到Session中去。

同时在JSP页面上,和验证码一样,自动的提交这个UUID.

后台代码,从提交信息中,和Session中获取这个UUID的值比较。

自定义标签:

publicclassTokenTagextendsTagSupport {

@Override

publicintdoStartTag()throwsJspException {

Stringuuid= UUID.randomUUID().toString().replace("-","");

pageContext.getSession().setAttribute("token",uuid);

// 向页面上输出

JspWriterout=pageContext.getOut();

try{

Stringhtml="";

out.print(html);

}catch(Exceptione) {

e.printStackTrace();

}

returnSKIP_BODY;

}

}

配置:

token

cn.tag.TokenTag

empty

6:标签的细节

JSP

JSP 可以包含任意的JSP代码

在doStartTag中返回的是skip_body,则有内容也不显示。

Eval_body_include则显示,执行body部分内容

Empty : 则不能包含任意的内容

doEndTag的返回值

Skip_page : 页面的后面的部分不显示

Eval_page : 则页面的后面的部分显示。

7:接收属性的标签、

 c前缀 ,out标签功能   value =“...”属性。

让标签接收属性:

思想:

1:在标签类里面声明setXxx方法用于接收属性的值。

2:在*.tld的配置文件中,声明这个标签类有xxx属性。

3:在JSP页面上,使用标签时,设置属性的值。

修改时间:

- = >  你好张三,当前时间是:...

name

true

true

java.lang.String

8:遍历的标签

${name} - > EL - > 表示:pageContext.findAttribute(“name”);从四个域对象中找

多一个方法 :

packagecn.tag;

importjava.lang.reflect.Array;

importjava.util.ArrayList;

importjava.util.Collection;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Map;

importjavax.servlet.jsp.JspException;

importjavax.servlet.jsp.tagext.TagSupport;

publicclassForTagextendsTagSupport {

// 声明一个可以遍历的对象

privateIteratorit;

publicvoidsetItems(Objectobj) {

if(objinstanceofCollection) {// List/Set

it=((Collection)obj).iterator();

}elseif(objinstanceofMap) {

it=((Map)obj).entrySet().iterator();

}elseif(obj.getClass().isArray()) {

// 获取数组的长度

intlen= Array.getLength(obj);

Listlist=newArrayList();

for(inti= 0;i

Objectval= Array.get(obj,i);

list.add(val);

}

it=list.iterator();

}else{

thrownewRuntimeException("不接收的类型"+obj.getClass());

}

}

privateStringvar;

publicvoidsetVar(Stringvar) {

this.var=var;

}

@Override

publicintdoStartTag()throwsJspException {

if(it.hasNext()) {

// 获取这什个值

pageContext.setAttribute(var,it.next());

returnEVAL_BODY_INCLUDE;

}else{

returnSKIP_BODY;

}

}

@Override

publicintdoEndTag()throwsJspException {

pageContext.removeAttribute(var);

returnEVAL_PAGE;

}

@Override

publicintdoAfterBody()throwsJspException {

if(it.hasNext()) {

// 获取这什个值

pageContext.setAttribute(var,it.next());

returnEVAL_BODY_AGAIN;

}else{

returnSKIP_BODY;

}

}

}

for

cn.tag.ForTag

JSP

items

true

true

java.lang.Object

var

true

false

java.lang.String

a

9:使用simpletagsupport实现

publicclassHelloTagextendsSimpleTagSupport {

@Override

publicvoiddoTag()throwsJspException, IOException {

Stringstr=newDate().toLocaleString();

JspWriterout= getJspContext().getOut();

out.print("你好当前时间是:"+str);

}

}

hello

cn.tag.HelloTag

empty

接收属性,就是声明

setXxx,修改tld文件,在页面上传递

privateStringname;

publicvoidsetName(Stringname) {

this.name=name;

}

hello

cn.tag.HelloTag

empty

name

yes

true

java.lang.String

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

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

相关文章

python宏替换_简单的宏替换

简单的宏替换1.宏定义必须写在第一次使用该宏定义的代码之前;2.宏定义不是以分号结束的3.#define string1 string2 之间至少要有一个空格4.string 1称为宏,string2 称为宏扩展5. 宏名用大写的字母表示是一个习惯6.使用宏的好处:a 简化程序的书…

python逆序数怎么求_怎么算逆序数?急~~~!!!

展开全部可使用直bai接计数法,计算一个du排列的逆序数的直接zhi方法是逐个dao枚举逆序,同时统计个内数。举个例子:标准列是容1 2 3 4 5,那么 5 4 3 2 1 的逆序数算法:看第二个,4之前有一个5,在标…

java解析xml中文字符乱码_Eclipse读取xml中文乱码问题解决

【mysql】高可用集群之MMM一.复制的常用拓扑结构 复制的体系结构有以下一些基本原则: (1) 每个slave只能有一个master: (2) 每个slave只能有一个唯一的服务器ID: (3) 每个maste ...公钥私钥 ssl/tsl的概念一,公钥私钥1,公钥和私钥成对出现2,公开的密钥叫公钥,…

springboot整合rocketmq_面试官:简单说一下RocketMQ整合SpringBoot吧

前言在使用SpringBoot的starter集成包时,要特别注意版本。因为SpringBoot集成RocketMQ的starter依赖是由Spring社区提供的,目前正在快速迭代的过程当中,不同版本之间的差距非常大,甚至基础的底层对象都会经常有改动。例如如果使用…

java面试常考_JAVA面试常考系列十

JAVA面试常考系列十题目一Servlet是什么?Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的作用是处理客户端请求并生成动态Web内容。一般情况下,Servlet主要…

的ui在vs中显示没有成员_在电脑桌面使用敬业签团队便签怎么设置新增内容在上面显示?...

实时跟进小组成员的各项任务的完成情况,及时将工作任务安排下去,是提高团队工作效率的较为有效的方法。在监督小组成员任务状况以及及时安排工作方面,选择一款支持多人同步在线协作的软件是非常有必要的。敬业签团队便签是一款不受系统、设备…

Java利用二维数组判断节假日_《剑指offer》面试题3 二维数组中的查找 Java版

(二维数组,每行递增,每列递增。输入二维数组和一个整数,判断数组中是否含有此数。)我的方法:拿到题目,根据题目条件我提取出这样一个特性:一个数的右边和下面的数都比它大。于是就可以写出一种递归的方法&a…

多表关联查询_【函数007】 EXCEL多表关联查询实战

继续函数实战系列教程,今天要分享的案例是根据填写的表名自动提取对应表中的数据数据准备:需求说明:我们希望实现,我们选择不同月份,显示对应月份表中的数据!处理方案:1、构建下拉列表(菜单)数据…

java if emun_关于java:Enum与If-else

我有一个需求,其中我需要从事件列表中构建如下的雇员对象。 目前,我的代码如下所示,但是QE发表评论说可能使用枚举而不是多个。有人可以建议我如何用枚举实现这一点。Employee e new Employee();for(Event event:events){if("empid"…

管理动物园动物c++_《过山车大亨》开发商公开新作 建立自己的动物园

知名模拟经营游戏开发商Frontier Developments近日宣布,旗下游戏《动物园之星》(Planet Zoo)即将在不久后发售,登录Steam平台。本座是一款模拟经营游戏,玩家在游戏中将会从零开始,建立一个属于自己的动物园世界。游戏中有多种不同…

Java_数组练习答案_Java数组练习题带答案.doc

《Java数组练习题带答案.doc》由会员分享,可在线阅读,更多相关《Java数组练习题带答案.doc(11页珍藏版)》请在人人文库网上搜索。1、一 填空题1) 数组的元素通过 下标 来访问,数组Array的长度为 Array.length 。2) 数组复制时,将一…

安费诺amphenol连接器_安费诺的Ellison谈信号完整性职业和他的免费开源PCB设计软??件...

Amphenol的信号完整性工程师杰森埃里森(Jason Ellison )Amphenol(安费诺) ICC的高级职员信号完整性工程师杰森埃里森(Jason Ellison )深入了解了网络,给予EE(电子)社区以及他的开源信号完整性项目的重要性。信号完整性工程与其他EE(电子)领域相比如何?他…

python形参和实参命名方式_Python的形参和实参使用方式

Python的形参和实参使用方式形参可以设置参数默认值,设置遵循从右至左原则例如:fun(x0,y1),fun(x,y1),但不可以是fun(x1,y)形参设置可以为数字字符串变量、元组和字典等任意类型数据,元组形参是在变量名前加*,字典形参…

mysql的contains_mysql中json_contains、json_extract等json查询方法的使用

新版 Mysql 中加入了对 JSON Document 的支持,可以创建 JSON 类型的字段,并有一套函数支持对JSON的查询、修改等操作。JSON是一种轻量级的数据交换格式,采用了独立于语言的文本格式,类似XML,但是比XML简单,…

260多媒体语言如何调节_260马力配9.7米货厢,实拍柳汽H5小三轴载货车

【卡车之家 原创】高速公路按轴的收费实施让9米6大单桥载货车火了起来,能够满足快递快运、电商物流等以方量为主的轻型货物运输。但这种大单桥18吨的限重对于不少卡友来说或许不太够用,而8x4载货车又有些大材小用了。这时,处于中间位置的三轴…

php mysql复杂查询_半复杂的PHP / MySQL Select语句

我目前有3张桌子,我正在用这些桌子来预定某些设备.这是我的桌子:tblEquipment:id name description1 Camera Takes pictures2 Projector Projects pictures3 Laptop Portable ComputertblEvents:id start end first_name last_name email1 2009-08-10 2009-08-11 Jo…

python获取网络信息_利用psutil获取网络信息

获取网络总的io信息[rootbogon python_auto]# vim net.py!/usr/bin/env pythonimport psutilnet_information psutil.net_io_counters()print net_information执行查看网络信息[rootbogon python_auto]# python net.pysnetio(bytes_sent29111743, bytes_recv396060467, packet…

java dispatcher详解_dispatcherservlet初始化过程详解

之前给大家介绍了什么是dispatcherservlet,以及dispatcherservlet配置等方面的内容,那么下面要接着给大家介绍的就是dispatcherservlet初始化过程,一起来了解一下。Web容器启动时将调用HttpServletBean的init方法public abstract class HttpS…

python消息队列模块_day43-python消息队列二-queue模块

Python提供了Queue模块来专门实现消息队列Queue对象Queue对象实现一个fifo队列(其他的还有lifo、priority队列,这里不再介绍)。queue只有maxsize一个构造参数,用来指定队列容量,指定为0的时候代表容量无限。主要有以下成员函数:Qu…

linux php 如何上传webshell,linux+apache+php的一次拿webshell的心得

首先俺先声明俺是个菜鸟,俺虽然是菜鸟但俺不会一直是菜鸟的(一旁兄弟喊到:别俺,俺,俺的,说普通话!)。俺,不对,我一直遵照着实践是检验真理的唯一标准这句话学习技术,这不…