Servlet和JSP之自定义标签学习
此文章会讲述简单标签处理器,因为经典自定义标签处理器没有简单标签处理器方便使用,故在此不进行描述。
参考:慕课网的《JSP自定义标签》视频;
《Servlet、JSP和Spring MVC初学指南》的第六章;
IBM的《利用 JSP 2 提供的 SimpleTagSupport 开发自定义标签》;
菜鸟教程的JSP自定义标签文章。
自定义标签
自定义标签
自定义标签就是将方法封装到自定义标签处理类中,然后使用方法与JSTL标签来达到,解决JSP中JavaBean的展现与业务实现分离问题。自定义标签提供了在JavaBean中所不能实现的便利,其中就包括,自定义标签允许访问JSP中隐藏的对象及它们的属性。
自定义标签的实现,叫做标签处理器,而简单标签处理器是指实现SimpleTag接口(或继承SimpleTagSupport类)实现的标签处理器,经典标签处理器是指实现BodyTag接口(或继承BodyTagSupport类)等实现的标签处理器。
自定义标签的继承结构
JSP<----Tag <----IterationTag<----TagSupport<----BodyTagSupport<-----BodyTag
JSP<----SimpleTag<-----SimpleSupportTag
简单标签处理器
简单标签处理器有简单的生命周期,SimpleTag接口中用于标签触发的方法只有一个------doTag,并且该方法只会执行一次。业务逻辑、遍历及页面内容操作都在这里实现。简单标签处理器中的页面内容都在JspFragment类的实例中体现。
简单标签的生命周期如下:
1) JSP容器通过简单标签处理器的无参数构造器创建它的实例,因此,简单标签处理器必须有无参数构造器(一般不用自己写, 用系统默认的就可以了)。
2) JSP容器通过setJspContext的方法,传入JspContext对象:该对象中最重要的方法是getOut(),它能返回JspWriter,通过JspWriter就可以把响应返回前端了。
3) 如果自定义标签被另一个自定义标签所嵌套,JSP容器就会调用setParent的方法。
4) JSP容器调用该标签中所定义的每个属性的Set方法。
5) 如果需要处理页面内容,JSP容器还会调用SimpleTag接口的setJspBody方法,把使用JspFragment封装的页面内容传过来。当然,如果没有页面内容,那么JSP容器不会调用该方法。
接下来是SimpleTag接口的详解:
|
方法 |
说明 |
|
doTag()方法 |
是核心方法,用于编写标签处理逻辑。 |
|
setParent(JspTag)方法 |
将父标签处理器对象传递给标签处理器。 |
|
getParent()方法 |
获取当前标签的父标签对象。 |
|
setJspContext(JspContext)方法 |
将JSP页面的pageContext对象传递给标签处理器对象。 |
|
setJspBody(JspFragment)方法 |
将代表当前标签体的JspFragment对象传递给标签处理器对象。(JspFragment中的invoke(Writer)方法用于执行JspFragment对象所代表的代码段) |
是不是看着上面的一大串文字,有点懵?没事儿,下面就是关于实现SimpleTagSupport类(跟实现SimpleTag接口的功用类似)的例子。
首先需要准备一个SimpleTag的.tld文件,用于注册自定义标签,这个文件是在apache-tomcat文件里面,一般地址是在E:\apache-tomcat-6.0.39\webapps\examples\WEB-INF\jsp里面,名称是jsp2-example-taglib.tld。
用一个显示当前时间的jsp页面来做为第一个例子:
自定义标签的创建步骤:
1) 创建标签处理类
package com.ny.tag2;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class DisplayInfo extends SimpleTagSupport{
@Override
public void doTag() throws JspException, IOException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = simpleDateFormat.format(new Date());
JspWriter jspWriter = getJspContext().getOut();
jspWriter.write(dateStr);
}
}
2) 创建标签库文件
在WEB-INF目录下创建一个.tld文件(如nyTag.tld),然后打开jsp2-example-taglib.tld文件,里面有我们需要的taglib配置,打开这个文件之后找到下面的代码段,复制到nyTag.tld中。
如果tid文件位于WEB-INF文件下面,Tomcat会自动加载tld文件中的标签库。如果位于其他位置,其实也可以在web.xml中配置。
<?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>A tag library exercising SimpleTag handlers. </description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/SimpleTagLibrary</uri>
</taglib>
3) 在标签库文件中注册标签
<?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>A tag library exercising SimpleTag handlers. </description>
<tlib-version>1.0</tlib-version>
<short-name>ny</short-name>
<uri>/ny-tag</uri>
<tag>
<name>dateInfo</name>
<tag-class>com.ny.tag2.DisplayInfo</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
① <short-name>:指明推荐使用的prefix(这个属性会在jsp页面中引入标签的时候出现)。
② <uri>:指明引用这个标签库时使用的uri(注意哦是uri不是url)。
③ <tag>:指明要定义标签的信息。
其中,tag可以设置的属性如下:
|
属性 |
说明 |
|
name |
定义属性的名称,每个标签的属性名称必须是唯一的。 |
|
tag-class |
指定映射的Java类。 |
|
required |
指定属性是否是必须的或者可选的,如果是必须的就设置为true。 |
|
rtexprvalue |
声明在运行表达式时,标签属性是否有效,有效则为true。 |
|
type |
定义该属性的Java类类型,默认指定为String。 |
|
decription |
描述信息 |
|
fragment |
如果声明了该属性,属性值将被视为一个JspFragment。 |
|
bodycontent |
指明标签体的限定,可以有以下几种取值(想了解更多可以在”参考”中查找到):a) empty:指定该标签只能作用空标签使用;b) scriptless:指定该标签的标签体可以是静态HTML元素、表达式语言,但不允许出现JSP脚本。 |
4) 在页面中引入标签库
<%@ taglib prefix="ny" uri="/ny-tag"%>
5) 在页面中使用标签
<body>
<imooc:dateInfo/>
</body>
所以JSP页面中的代码就是:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="imooc" uri="/imooc-tag2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<imooc:dateInfo/>
</body>
</html>
是不是感觉还挺简单的呢? 其实自定义标签的用法不止这些哦,加油吧!
Servlet和JSP之自定义标签学习的更多相关文章
- [Java] JSP笔记 - 自定义标签
自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...
- JavaWeb之 JSP:自定义标签
当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 自定义标签 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的 ...
- JavaWeb之 JSP:自定义标签的创建和使用
当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签. 下面我们先来开发一个自定义标签,然后再说它的原理吧! 自定义标签的开发步骤 步骤一 编写一个普通的java类, ...
- 【JSP】自定义标签开发入门
JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...
- Jsp开发自定义标签,自定义标签将字符串转成指定的时间格式显示
本例以将 字符串格式的时间转成指定的时间格式显示. 第一步.定义一个标签处理程序类,需要集成javax.servlet.jsp.tagext.TagSupport,代码如下: import java. ...
- jsp的自定义标签
1.相对于JSTL或Spring等第三方标签库而言的,用来实现项目中特定的功能需求. 2.自定义标签基本的组成部分 ①页面上看得见的部分 [1]通过taglib引入标签库 [2]标签本身 ②xxx.t ...
- 12、Jsp加强/自定义标签/JavaBean
1 Jsp加强回顾 Jsp加强 1)Jsp的9大内置对象 request HttpServletRequet response HttpServletResponse config ...
- spring自定义标签学习
看到几篇很全的自定义标签,从定义到使用,写的很好. 这里我也是在那里学习的,对学习spring源码也很有帮助. 贴出来与大家共享. http://sammor.iteye.com/blog/11009 ...
- jsp的自定义标签 控制jsp内容显示
引入方式示例 <%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %> tld文件 <?x ...
随机推荐
- 【223】◀▶ IDL HDF 文件操作说明
参考:I/O - HDF Routines —— HDF 操作函数 01 HDF_SD_START 打开一个 SDS 模式的 HDF 文件. 02 HDF_SD_END 关闭一个 SDS 模式 ...
- Algorithms : Programming Assignment 3: Pattern Recognition
Programming Assignment 3: Pattern Recognition 1.题目重述 原题目:Programming Assignment 3: Pattern Recogniti ...
- 算法学习--Day7
今天多做一些杂题练习一下. 第一题: 题目描述 在情报传递过程中,为了防止情报被截获,往往需要对情报用一定的方式加密,简单的加密算法虽然不足以完全避免情报被破译,但仍然能防止情报被轻易的识别.我们给出 ...
- 洛谷CF895C Square Subsets(线性基)
洛谷传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 题意: 给你n个数,每个数<=70,问有多少个集合,满足集合中所有数相乘是个完全平方数(空集除外) 题解: 完全看不出这玩意儿和线性基有什 ...
- DB2 - 编目的解释
编目(Catalog),是在本地或远程建立客户端到服务器的数据库连接的过程.其目的在于获取编目信息,即生成用来访问数据库的目录.系统数据库目录包含一个列表和指针,通过目录可以使 DB2 能够找到已知的 ...
- fetch请求数据,后台将cookie一起返回时
请求时,添加以上标记的属性,就可以拿到后台给的cookie,并返回给后台.比如登录后才能有的操作,这样就需要返回给后台cookie从而判断是否登录
- STP-3-收敛到新的STP拓扑
事实上,即使拓扑已经稳定,STP也从未停止工作,对每个收到的BPDU,交换机都会重新计算自己对于根桥,RP,DP的选择.在稳定的拓扑中,交换机收到的BPDU不变,因此对这些BPDU的处理会一遍一遍产生 ...
- tcp端口扫描(python多线程)
1 使用单线程扫描单台主机 首先实现的是对单台主机中0-1024端口的扫描,发现差不多每秒扫描一个端口,很慢. import socket def tcp_scanner(host,port): cl ...
- SpringMVC-高级参数绑定
绑定数组 需求 在商品列表页面选中多个商品,然后删除. 需求分析 此功能要求商品列表页面中的每个商品前有一个checkbook,选中多个商品后点击删除按钮把商品id传递给Controller,根据商品 ...
- bio,nio,aio简介
https://mp.weixin.qq.com/s/F9WwcsFdCOwOeeDc0oc98w——<BIO,NIO,AIO 总结>总结和对比这三种的区别 https://www.jia ...