JSP2的自定义标签和方法
Jsp2的自定义标签
Jsp2 开发标签库的几个步骤:
- 开发自定义标签处理类。
- 建立一个*.tld文件,每个tld文件对应一个标签库,每个标签库可对应多个标签。
- 在jsp文件中使用自定义标签
空标签
开发自定义标签类
- 自定义标签类应该继承一个父类javax.servlet.jsp.tagext.SimpleTagSupport;
- 如果标签类包含属性,每个属性都有对应的getter 和settter方法;
- 重写doTag()方法,这个方法负责生成页面内容
建立一个简单的自定义标签,在页面上输出HelloWorld

1 package com.dev.sen;
2
3 import java.io.IOException;
4
5 import javax.servlet.jsp.JspException;
6 import javax.servlet.jsp.tagext.SimpleTagSupport;
7 /**
8 * 自定义标签在页面上输出hello World
9 * @author WangSen
10 * @date 2014-6-28
11 * @time 下午7:22:36
12 */
13 public class HelloWorldTag extends SimpleTagSupport {
14 /**
15 * 重写doTag方法,该方法在标签结束生成页面内容
16 */
17 @Override
18 public void doTag() throws JspException, IOException {
19 getJspContext().getOut().write("Hello World !");
20 }
21
22 }

建立TlD文件
TLD是Tag Library Definition,标签库的定义文件的根元素是taglib,它可以包含多个tag子元素,每个tag子元素定义一个标签 ,部署标签库文件,只需要将tld文件存放在WEB-INF/路径,或者WEB-INF的任意子路径下。

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
4 version="2.0">
5 <description>my customTag</description>
6 <tlib-version>1.0</tlib-version>
7 <short-name>mytag</short-name>
8 <!-- 标签库的URL -->
9 <uri>http://www.dev.com/taglib</uri>
10 <tag>
11 <description>Outputs Hello, World</description>
12 <!-- 标签名 -->
13 <name>helloWorld</name>
14 <!-- 标签处理类 -->
15 <tag-class>com.dev.sen.HelloWorldTag</tag-class>
16 <!-- 定义标签体为空 -->
17 <body-content>empty</body-content>
18 </tag>
19 </taglib>

元素说明:
使用标签库
在jsp页面中确定指定的标签需要两点,
- 标签库的URI:确定使用那个标签库。
- 标签名:确定使用那个标签。
使用标签库的步骤
- 导入标签库:使用taglib编译指令导入标签库,就是将标签库和指定前缀关联起来。
- 使用标签:在jsp页面中使用自定义标签。
带属性的标签
开发自定义标签类

1 package com.dev.sen;
2
3 import java.io.IOException;
4 import java.sql.Connection;
5 import java.sql.DriverManager;
6 import java.sql.ResultSet;
7 import java.sql.ResultSetMetaData;
8 import java.sql.SQLException;
9 import java.sql.Statement;
10
11 import javax.servlet.jsp.JspException;
12 import javax.servlet.jsp.JspWriter;
13 import javax.servlet.jsp.tagext.SimpleTagSupport;
14
15 /**
16 * 根据sql语句查询数据库
17 *
18 * @author WangSen
19 * @date 2014-6-28
20 * @time 下午8:50:19
21 */
22 public class QueryTag extends SimpleTagSupport {
23 private String driver;
24 private String url;
25 private String user;
26 private String password;
27 private String sql;
28
29 public String getDriver() {
30 return driver;
31 }
32
33 public void setDriver(String driver) {
34 this.driver = driver;
35 }
36
37 public String getUrl() {
38 return url;
39 }
40
41 public void setUrl(String url) {
42 this.url = url;
43 }
44
45 public String getUser() {
46 return user;
47 }
48
49 public void setUser(String user) {
50 this.user = user;
51 }
52
53 public String getPassword() {
54 return password;
55 }
56
57 public void setPassword(String password) {
58 this.password = password;
59 }
60
61 public String getSql() {
62 return sql;
63 }
64
65 public void setSql(String sql) {
66 this.sql = sql;
67 }
68 /**
69 * 执行sql查询并输出结果
70 */
71 @Override
72 public void doTag() throws JspException, IOException {
73 Connection conn = null;
74 Statement st = null;
75 ResultSet rs = null;
76 ResultSetMetaData rsmd = null;
77 try {
78 Class.forName(driver);//注册驱动
79 conn = DriverManager.getConnection(url,user,password);//获取连接
80 st = conn.createStatement();//创建Statement
81 rs = st.executeQuery(sql); //执行查询
82 rsmd = rs.getMetaData();
83 //获取列数目
84 int columnConout = rsmd.getColumnCount();
85 //获取页面输出流
86 JspWriter out = getJspContext().getOut();
87 //在页面输出表格
88 out.write("<table border='1' bgcolor='#9999cc' width='400'>");
89 while (rs.next()) {
90 out.write("<tr>");
91 //逐列遍历查询到的数据
92 for (int i = 0; i < columnConout; i++) {
93 out.write("<td>");
94 out.write(rs.getString(i+1));
95 out.write("</td>");
96 }
97 out.write("</tr>");
98 }
99 out.write("</table>");
100 } catch (ClassNotFoundException e) {
101 e.printStackTrace();
102 throw new JspException("自定义标签错误", e);
103 } catch (SQLException e) {
104 e.printStackTrace();
105 throw new JspException("自定义标签错误", e);
106 }finally{
107 try {
108 //关闭结果集
109 if(rs!=null&&!rs.isClosed()){
110 rs.close();
111 }
112 if(st!=null&&!st.isClosed()){
113 st.close();
114 }
115 if(conn!=null&&!conn.isClosed()){
116 conn.close();
117 }
118 } catch (SQLException e) {
119 e.printStackTrace();
120 }
121 }
122
123 }
124 }

在tld文件中配置标签
在上文中的tld文件中增加一个tag标签,内容如下

1 <!-- 定义带属性的标签 -->
2 <tag>
3 <description>根据sql语句查询数据库</description>
4 <name>query</name>
5 <tag-class>com.dev.sen.QueryTag</tag-class>
6 <body-content>empty</body-content>
7 <!-- 配置标签属性 -->
8 <attribute>
9 <description>driverName</description>
10 <name>driver</name>
11 <required>true</required>
12 <fragment>true</fragment>
13 </attribute>
14 <attribute>
15 <description>url</description>
16 <name>url</name>
17 <required>true</required>
18 <fragment>true</fragment>
19 </attribute>
20 <attribute>
21 <description>user</description>
22 <name>user</name>
23 <required>true</required>
24 <fragment>true</fragment>
25 </attribute>
26 <attribute>
27 <description>password</description>
28 <name>password</name>
29 <required>true</required>
30 <fragment>true</fragment>
31 </attribute>
32 <attribute>
33 <description>querysql</description>
34 <name>sql</name>
35 <required>true</required>
36 <fragment>true</fragment>
37 </attribute>
38 </tag>

使用标签
带标签体的标签
开发自定义标签类

1 package com.dev.sen;
2
3 import java.io.IOException;
4 import java.util.Collection;
5
6 import javax.servlet.jsp.JspException;
7 import javax.servlet.jsp.tagext.SimpleTagSupport;
8
9 /**
10 * 迭代输出集合元素
11 *
12 * @author WangSen
13 * @date 2014-6-28
14 * @time 下午9:28:51
15 */
16 public class IteratorTag extends SimpleTagSupport {
17 private String collection;
18 private String item;
19
20 public String getCollection() {
21 return collection;
22 }
23
24 public void setCollection(String collection) {
25 this.collection = collection;
26 }
27
28 public String getItem() {
29 return item;
30 }
31
32 public void setItem(String item) {
33 this.item = item;
34 }
35
36 @SuppressWarnings("rawtypes")
37 @Override
38 public void doTag() throws JspException, IOException {
39 // 从page scope 中获取属性名为collection的集合
40 Collection itemList = (Collection) getJspContext().getAttribute(
41 collection);
42 // 遍历集合
43 for (Object s : itemList) {
44 //将集合元素设置到page scope中
45 getJspContext().setAttribute(item, s);
46 /* 输出标签体
47 *getJspBody()方法返回标签所包含的标签体:JspFragment对象
48 *执行该对象的invoke()方法,即可输出标签体的内容
49 */
50 getJspBody().invoke(null);
51 }
52 }
53
54 }

getJspBody()方法返回标签所包含的标签体:JspFragment对象,执行该对象的invoke()方法,即可输出标签体的内容
在tld文件中配置标签
在上文中的tld文件中增加一个tag标签,内容如下

1 <tag>
2 <description>Iterator Tag</description>
3 <name>iterator</name>
4 <tag-class>com.dev.sen.IteratorTag</tag-class>
5 <body-content>scriptless</body-content>
6 <attribute>
7 <description>collection name </description>
8 <name>collection</name>
9 <required>true</required>
10 <fragment>true</fragment>
11 </attribute>
12 <attribute>
13 <description>item</description>
14 <name>item</name>
15 <required>true</required>
16 <fragment>true</fragment>
17 </attribute>
18 </tag>

使用标签
以页面片段作为属性的标签
以页面片段作为属性的标签与普通标签区别并不大,只有两个简单的改变
- 标签处理类中定义类型为JspFragment的属性,该属性代表”页面片段”
- 使用标签库时使用<jsp:attribute…>动作指令为标签库属性指定值。
开发自定义标签类

1 package com.dev.sen;
2
3 import java.io.IOException;
4
5 import javax.servlet.jsp.JspException;
6 import javax.servlet.jsp.JspWriter;
7 import javax.servlet.jsp.tagext.JspFragment;
8 import javax.servlet.jsp.tagext.SimpleTagSupport;
9
10 /**
11 * 以页面片段做为属性的标签
12 *
13 * @author WangSen
14 * @date 2014-6-28
15 * @time 下午10:56:40
16 */
17 public class FragmentTag extends SimpleTagSupport {
18 private JspFragment fragment;
19
20 public JspFragment getFragment() {
21 return fragment;
22 }
23
24 public void setFragment(JspFragment fragment) {
25 this.fragment = fragment;
26 }
27
28 @Override
29 public void doTag() throws JspException, IOException {
30 JspWriter out = getJspContext().getOut();
31 out.println("<div style='padding:10px;border:1px solid black'>");
32 out.println("<h3>下面是动态传入的jsp片段</h3>");
33 //调用 输出页面片段
34 fragment.invoke(null);
35 out.println("</div>");
36 }
37
38 }

在tld文件中配置标签
在上文中的tld文件中增加一个tag标签,内容如下

1 <!-- 以页面片段作为属性的标签 -->
2 <tag>
3 <name>fragment</name>
4 <tag-class>com.dev.sen.FragmentTag</tag-class>
5 <!-- 指定该标签不支持标签体 -->
6 <body-content>empty</body-content>
7 <attribute>
8 <name>fragment</name>
9 <required>true</required>
10 <fragment>true</fragment>
11 </attribute>
12 </tag>

使用标签
动态属性的标签
开发自定义标签类
动态属性标签比普通标签多如下两个额外要求
- 处理类还需要实现DynamicAttributes接口
- 配置标签时通过<dynamic-attributes../>子元素指定该标签支持动态属性

1 package com.dev.sen;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5
6 import javax.servlet.jsp.JspException;
7 import javax.servlet.jsp.JspWriter;
8 import javax.servlet.jsp.tagext.DynamicAttributes;
9 import javax.servlet.jsp.tagext.SimpleTagSupport;
10 /**
11 * 动态属性标签
12 * @author WangSen
13 * @date 2014-6-28
14 * @time 下午11:33:33
15 */
16 public class DynaAttributesTag extends SimpleTagSupport implements
17 DynamicAttributes {
18 // 保存属性名的集合
19 private ArrayList<String> keys = new ArrayList<String>();
20 // 保存属性值的集合
21 private ArrayList<Object> values = new ArrayList<Object>();
22
23 @Override
24 public void doTag() throws JspException, IOException {
25 super.doTag();
26 JspWriter out = getJspContext().getOut();
27 out.println("<ol>");
28 for (int i = 0; i < keys.size(); i++) {
29 out.println("<li>"+keys.get(i)+"="+values.get(i)+"</li>");
30 }
31 out.println("</ol>");
32 }
33
34 @Override
35 public void setDynamicAttribute(String uri, String key, Object value)
36 throws JspException {
37 //添加属性名
38 keys.add(key);
39 //添加属性值
40 values.add(value);
41 }
42 }

在tld文件中配置标签
在上文中的tld文件中增加一个tag标签,内容如下

1 <!-- 动态属性标签 -->
2 <tag>
3 <name>dynimicAttr</name>
4 <tag-class>com.dev.sen.DynaAttributesTag</tag-class>
5 <body-content>empty</body-content>
6 <!-- 设置支持动态属性 -->
7 <dynamic-attributes>true</dynamic-attributes>
8 </tag>

使用标签
Jsp2的自定义方法
开发函数处理类
开发函数处理类:函数处理类就是普通类,这个普通类中包含若干个静态方法,每个静态方法都可以定义成函数。实际上这个步骤也可省略——完全可以直接用JDK或者其他项目提供的类,只要这个类包含静态方法即可

1 package com.dev.tld;
2 /**
3 * 自定义标签方法
4 * @author WangSen
5 * @date 2014-6-29
6 * @time 下午8:09:52
7 */
8 public class Functions {
9 /**
10 * 字符翻转
11 * @param text 传入的字符串
12 * @return 翻转后的字符串
13 */
14 public static String reverse(String text){
15 return new StringBuffer(text).reverse().toString();
16 }
17
18 /**
19 * 统计字串的长度
20 * @param text 待统计的字符串
21 * @return 带统计字符的长度
22 */
23 public static int CountChar(String text){
24 return text.length();
25 }
26
27 }

使用标签库定义函数
定义函数的方法和定义标签类似,在<taglib…/>元素下增加<tag../>元素用于定义自定义标签;增加<function…>元素用于自定义函数,每个<function…/>只要三个子元素即可。
- name :指定自定义函数函数名;
- function-class :指定自定义函数处理类;
- function-signature :指定自定义函数对应的
在上文中的标签库定义文件中<taglib.>下追加方法的定义

1 <!-- 自定义函数 -->
2 <function>
3 <name>reverse</name>
4 <function-class>com.dev.tld.Functions</function-class>
5 <function-signature>java.lang.String reverse(java.lang.String)</function-signature>
6 </function>
7 <function>
8 <name>countChar</name>
9 <function-class>com.dev.tld.Functions</function-class>
10 <function-signature>int countChar(java.lang.String)</function-signature>
11 </function>

在jsp页面中的EL中使用函数
需要先导入标签库,然后再使用函数。如下
JSP2的自定义标签和方法的更多相关文章
- (转) ThinkPHP模板自定义标签使用方法
这篇文章主要介绍了ThinkPHP模板自定义标签使用方法,需要的朋友可以参考下 转之--http://www.jb51.net/article/51584.htm 使用模板标签可以让网站前台开发 ...
- JSP2 的自定义标签
在 JSP 中开发标签库只需如下几个步骤 1.开发自定义标签处理类 2.建立一个 *.tld 文件,每个 *.tld 文件对应一个标签库,每个标签库可包含多个标签 3.在 JSP 文件中使用自定义标签 ...
- JSP2.0自定义标签
JSP1.0中可以通过继承TagSupport或者BodyTagSupport来实现自定义的tag处理方法. JSP2.0中也支持另外一种更为简单的自定tag的方法,那就是直接讲JSP代码保存成*.t ...
- Jsp2.0自定义标签(第一天)——一个简单的例子
今天是学习自定义标签的第一天 Jsp2.0以来,自定义标签的实现比传统标签的实现容易了很多,一般只要extends类SimpleSupport重写doTag()方法即可. 先看最简单的例子,输出一个H ...
- JSP2.2自定义标签、EL函数
简介 JSTL是一个JSP标准标签库,可以解决大部分问题,但是如果我们需要一些更特殊的功能,就需要自定义类似JSTL中标签的标签.如果EL表达式无法满足我们的需求,我们也可以自定义EL函数. tld后 ...
- Jsp2.0自定义标签(第二天)——自定义循环标签
今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 <%@ page language="java" contentType=&q ...
- Jsp2.0自定义标签(第三天)——EL表达式的使用
1.提出问题: 我们经常会看到这样的jsp页面代码: 浏览器显示: 为什么会在页面输出:Hello World ,${per}究竟是如何找到“Hello World”的呢? 2.分析问题: 要想解决 ...
- Java之 jstl 自定义标签的方法
1.写一个Java类 我的路径是写再tag包中的一个 HelloTag类 package tag; import java.io.IOException; import javax.servlet.j ...
- dedecms 自定义标签的方法
function lib_demotest(&$ctag,&$refObj) { global $dsql,$envs; //属性处理 $attlist="row|12,ti ...
随机推荐
- linux文件系统的类型
文件系统的类型 兄弟连介绍-Linux有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等 ...
- mysql NOT NULL约束 语法
mysql NOT NULL约束 语法 作用:约束强制列不接受 NULL 值. 东莞大理石平台 说明:NOT NULL 约束强制字段始终包含值.这意味着,如果不向字段添加值,就无法插入新记录或者更新记 ...
- POJ 1743 Musical Theme ( 后缀数组 && 最长不重叠相似子串 )
题意 : 给 n 个数组成的串,求是否有多个“相似”且不重叠的子串的长度大于等于5,两个子串相似当且仅当长度相等且每一位的数字差都相等. 分析 : 根据题目对于 “ 相似 ” 串的定义,我们可以将原 ...
- 旧题再做【bzoj2287】【[pojchallenge]消失之物】分治背包
(上不了p站我要死了) 今天听了 doggu神 讲了这道题的另一种做法,真是脑洞大开.眼界大开.虽然复杂度比黄学长的要大一点,但不总结一下简直对不起这神思路. 方法1:黄学长的做法(点这里) Desc ...
- WIN10系统和压缩内存占用磁盘过高的解决方案(亲测有效)
系统和压缩内存磁盘占用过高的解决方案 最近一段时间玩游戏看视频经常莫名的卡顿,观察发现电脑卡的时候,WIN10进程中的"系统和压缩内存"一项占用了近100%的磁盘空间. 百度搜索到 ...
- [django]上下文管理器
上下文管理器django提取context中的数据去供模板调用 需求: 所有的页面都需要一个特定的变量 本质: python函数 , 接收一个HttpRequest对象的参数 , 且返回的必须是一个字 ...
- php versionscan YAF
https://github.com/psecio/versionscan Yaf 的特点: 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销. 所有的框架类, 不需要编 ...
- Java中的BigDecimal类和int和Integer总结
前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0. ...
- python上下文管理,with语句
今天在网上看到一段代码,其中使用了with seam:初见不解其意,遂查询资料. 代码: #! /usr/bin/env python # -*- coding:utf-8 -*- import ti ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_7_增强for循环
collections实现了interable接口.实现了interable接口就可以使用Foreach int i是临时 变量