JSP自定义标签库
总所周知,JSP自定义标签库,主要是为了去掉JSP页面中的JAVA语句
此处以格式化输出时间戳为指定日期格式为例,简单介绍下JSP自定义标签的过程。
- 编写标签处理类(可继承自javax.servlet.jsp.tagext.TagSupport),主要重写方法doStartTag()即可。
- 创建TLD文件(在WEB-INF目录下创建)。
- JSP页面中使用标签
1、编写标签处理类(继承自TagSupport.java ):FormatDate.java (类中实例变量 value, patter与TLD文件中的标签属性对应,同时需要定义相应的getter/setter方法用于获取jsp页面的 值)
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport; import com.tianwen.dcdp.common.General; public class FormatDate extends TagSupport { private static final long serialVersionUID = -4328438154019437198L; private String value; private String pattern; public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public String getPattern() {
return pattern;
} public void setPattern(String pattern) {
this.pattern = pattern;
} @Override
public int doStartTag() throws JspException {
if(General.isEmpty(value)) {
value = "";
}
SimpleDateFormat format = new SimpleDateFormat(General.isEmpty(pattern) ? "yyyy-MM-dd" : pattern);
String result = format.format(new Date(Long.parseLong(value)));
try {
this.pageContext.getOut().write(result);
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
} }
2、定义TLD文件 :formatTag.tld (此处标签名为date, uri用于稍后再jsp页面引入)
<?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.1</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>cl</short-name>
<uri>/mytag1</uri>
<tag>
<name>date</name>
<tag-class>com.tianwen.dcdp.FormatDate</tag-class>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pattern</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
如上所述,pattern属性定义为了非必须(<required>false</required>)的,意味着,后续再JSP中使用时可以不指定该属性。
需要注意的是 :
若上述TLD文件中没有配置uri属性,我们还可以在web.xml中按如下方式配置(若已配置可省略如下步骤):
<jsp-config>
<taglib><
<taglib-uri>/mytag1</taglib-uri>
<taglib-location>/WEB-INF/formatTag.tld</taglib-location>
</taglib>
</jsp-config>
3、jsp页面中使用自定义标签
首先需要引入相应的标签库(uri与标签库TLD文件中 的uri对应),如下所示:
<%@ taglib uri="/mytag1" prefix="cl"%>
然后便可以在JSP中使用该标签库中的标签了(此处只定义了一个标签“date”, 实际开发中可定义多个tag标签),如下所示:
<cl:date value="" pattern="yyyy-MM-dd HH-mm-ss"></cl:date> <cl:date value=""></cl:date>
因为pattern为非必须属性,所以上述两种用法均可以。
到此,jsp自定义标签的开发与使用介绍完毕。
最后介绍下,编写标签处理类时,父类(TagSupport.java)中的三个方法:
先看下该类所实现的接口Tag中的常量声明:
/**
* Skip body evaluation.
* Valid return value for doStartTag and doAfterBody.
*/ public final static int SKIP_BODY = ; /**
* Evaluate body into existing out stream.
* Valid return value for doStartTag.
*/ public final static int EVAL_BODY_INCLUDE = ; /**
* Skip the rest of the page.
* Valid return value for doEndTag.
*/ public final static int SKIP_PAGE = ; /**
* Continue evaluating the page.
* Valid return value for doEndTag().
*/ public final static int EVAL_PAGE = ;
下面接着看第一个方法:doStartTag(),默认实现如下(不显示标签体内容)
/**
* Default processing of the start tag, returning SKIP_BODY.
*
* @return SKIP_BODY
* @throws JspException if an error occurs while processing this tag
*
* @see Tag#doStartTag()
*/ public int doStartTag() throws JspException {
return SKIP_BODY;
}
该方法是遇到开始标签是被调用,通过上述接口中的常量声明可以看出,其合法的返回值是:SKIP_BODY = 和 EVAL_BODY_INCLUDE = 1 前者表示将显示标签间(标签体)的文字,后者表示不显示标签间的文字,由此可见默认的实现为:不显示标签体的内容,若我们在编写自己的标签处理类时,若需要显示标签体,则在重写方法doStartTag()时修改返回值为:EVAL_BODY_INCLUDE
紧接着介绍第二个方法:doEndTag()默认实现如下(处理完标签后继续执行以下的JSP网页),通常不需要重写该方法
/**
* Default processing of the end tag returning EVAL_PAGE.
*
* @return EVAL_PAGE
* @throws JspException if an error occurs while processing this tag
*
* @see Tag#doEndTag()
*/ public int doEndTag() throws JspException {
return EVAL_PAGE;
}
该方法遇到结束标签时被调用,通过上述接口中的常量声明可以看出,其合法的返回值是:SKIP_PAGE = 5 和 EVAL_PAGE = 6 前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页(可重写该方法实现防倒链功能)。
下面介绍最后一个方法 :doAfterBody(),通常不需重写该方法
/**
* Default processing for a body.
*
* @return SKIP_BODY
* @throws JspException if an error occurs while processing this tag
*
* @see IterationTag#doAfterBody()
*/ public int doAfterBody() throws JspException {
return SKIP_BODY;
}
该方法是在显示完标签间文字之后呼叫的.常用于迭代
JSP自定义标签库的更多相关文章
- jsp 自定义标签库
自定义标签的作用 *** 自定义标签的主要用于移除jsp页面中java代码 *** JSP页面中使用自定义的标签 使用jsp指令<% @taglib uri="标签库的uri" ...
- [JSP]自定义标签库taglib
自定义标签的步骤 自定义标签的步骤大概有三步: 1.继承javax.servlet.jsp.tagext.*下提供的几个标签类,如Tag.TagSupport.BodyTagSupport.Simpl ...
- JSP自定义标签的使用简化版
在jsp中 如果不想页面中出现java代码 这个时候就需要使用到jsp的自定义标签库技术了 自定义标签库 能够有效的减少jsp中java代码的出现 使其更加自然的像html页面一样 如果要使用jsp自 ...
- jsp的标签库和自定义标签
1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- JSP 标准标签库(JSTL)
JSP 标准标签库(JSTL) JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签, ...
- JSP 自定义标签
0 标签技术的API继承体系 1 作用 jsp自定义标签用于移除页面中的java代码 2 实现 2.1 标签处理类ViewIPTag.java package com.zsm.util; import ...
- JSP自定义标签开发入门
一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...
- javaweb学习总结(二十三)——jsp自定义标签开发入门
一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...
- JSP 标准标签库(JSTL)之最常用的JSTL标签总结
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-t ...
随机推荐
- TCP协议的3次握手与4次挥手过程详解
1.前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提供一种面向连接的.可靠的字节流服务. 面向连接意味着两个使用TCP的应用(通常是一个客户和一 ...
- TCP/IP小纪
链 路 层 主 要 有 三 个 目 的 :( 1 )为 I P 模 块 发 送 和 接收 I P 数 据 报 ; ( 2 )为 A R P 模块发送 A R P 请 求 和 接 收 A R P 应 答 ...
- Java实现生产者消费者
方法1:最简单--利用LinkedBlockingQueue 队列具有先进先出的特点,成为经常应用于生产-消费者模式的数据结构. 1.将一个对象放到队列尾部,如果队列已满,就等待直到有空闲节点. —— ...
- 14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例
14.5.5.1 An InnoDB Deadlock Example 一个InnoDB 死锁实例 下面的例子演示了一个错误可以发生当一个lock 请求会导致一个死锁,例子设计2个客户端,A和B: J ...
- WordPress Ultimate Auction插件跨站请求伪造漏洞
漏洞名称: WordPress Ultimate Auction插件跨站请求伪造漏洞 CNNVD编号: CNNVD-201306-396 发布时间: 2013-09-11 更新时间: 2013-09- ...
- HDU 5924 Mr. Frog’s Problem 【模拟】 (2016CCPC东北地区大学生程序设计竞赛)
Mr. Frog's Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- TCP Socket的通讯框架
http://www.oschina.net/p/simple-socketshttp://www.oschina.net/p/cwsshttp://www.oschina.net/p/tcpprox ...
- c#查看电脑内存
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- HDOJ/HDU 2549 壮志难酬(取小数点后几位~)
Problem Description 话说MCA山上各路豪杰均出山抗敌,去年曾在江湖威名显赫的,江湖人称<万军中取上将首级舍我其谁>的甘露也不甘示弱,"天将降大任于斯人也,必先 ...
- linux性能优化
一.最小化安装系统二.关闭NetworkManager服务. NetworkManger服务如果启动,当你手动配置网卡时会发生冲突 [root@linuxangel ~]# /etc/init.d/N ...