一、自定义标签,步骤
* 确定需求
* <my:date /> 输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS
* 编写Java类
新建包名:com.yxl.tag,新建类MyDateTag,实现SimpleTag接口
* 只要与此接口有关的实现类,javax.servlet.jsp.tagext.JspTag
* 需要实现具体的接口
* javax.servlet.jsp.tagext.SimpleTag,简单标签,JSP2.0**,选择这个
* javax.servlet.jsp.tagext.Tag,经典标签
package com.yxl.tag; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag; public class MyDateTag implements SimpleTag { public MyDateTag(){
System.out.println("默认构造");
} private PageContext pageContext; /**
* 1、被调用的方法,tomcat调用
*/
public void setJspContext(JspContext pc) {
// System.out.println(pc);
// System.out.println("setJspContext");
this.pageContext = (PageContext) pc; } /**
* 2、tomcat调用
* 建议,在doTage方法中完成整个tag的功能
* 需要再doTage方法之前,完成准备工作
*/
public void doTag() throws JspException, IOException {
// System.out.println("doTag");
//输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:SSS");
String date = format.format(new Date());
//将获得的时间输出到浏览器
this.pageContext.getOut().print(date); } @Override
public JspTag getParent() {
// TODO Auto-generated method stub
return null;
} @Override
public void setJspBody(JspFragment arg0) {
// TODO Auto-generated method stub } @Override
public void setParent(JspTag arg0) {
// TODO Auto-generated method stub } } * 编写tld文件
在WEB-INF下新建文件夹tld,在tld文件夹下新建mytag.tld
* tld文件是xml文档
* 扩展名为*.tld
* 位置:必须放置到WEB-INF目录下
* 内容:
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
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">
<!-- 确定当前标签库的版本 -->
<tlib-version>1.0</tlib-version>
<!-- 建议引入当前便签库是,使用的简写 @taglib prefix="my" -->
<short-name>my</short-name>
<!-- 为当前标签库配置文件,起一个名称
* 内容:自定义,全球唯一
-->
<uri>http://www.yxl.cn/jsp/mytag</uri> <!-- <my:date / > 注册标签 -->
<tag>
<!-- 确定标签名称 -->
<name>date</name>
<!-- 确定实现类 -->
<tag-class>com.yxl.tag.MyDateTag</tag-class>
<!-- 格式化当前标签的body内容
* empty:当前标签没有标签体
-->
<body-content>empty</body-content> </tag> </taglib>
* 在JSP页面引入
* <%@ taglib uri="http://www.yxl.cn/jsp/mytag" prefix="my"%>
* 测试
* <my:date /> 二、案例
* 需求:<my:maxVal num1="12" num2="13" />
package com.yxl.tag; import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag; public class MyMaxValueTag implements SimpleTag { public MyMaxValueTag() {
System.out.println("默认构造");
} private PageContext pageContext;
private Integer num1;
private Integer num2; // num1
public void setNum1(Integer num) {
this.num1 = num;
} public void setNum2(Integer num) {
this.num2 = num;
} /**
* 1、被调用的方法,tomcat调用
*/
public void setJspContext(JspContext pc) {
// System.out.println(pc);
// System.out.println("setJspContext");
this.pageContext = (PageContext) pc; } /**
* 2、tomcat调用 建议,在doTage方法中完成整个tag的功能 需要再doTage方法之前,完成准备工作
*/
public void doTag() throws JspException, IOException {
System.out.println(this.num1);
System.out.println(this.num2);
// 判断两个数据的大小,然后输出
if (this.num1 > this.num2) {
this.pageContext.getOut().print(num1 + "大于" + num2);
} else if (this.num1 < this.num2){ this.pageContext.getOut().print(num1 + "小于" + num2);
}
else{
this.pageContext.getOut().print(num1 + "等于" + num2);
} } @Override
public JspTag getParent() {
// TODO Auto-generated method stub
return null;
} @Override
public void setJspBody(JspFragment arg0) {
// TODO Auto-generated method stub } @Override
public void setParent(JspTag arg0) {
// TODO Auto-generated method stub } }
<taglib xmlns="http://java.sun.com/xml/ns/javaee" 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">
<!-- 确定当前标签库的版本 -->
<tlib-version>1.0</tlib-version>
<!-- 建议引入当前便签库是,使用的简写 @taglib prefix="my" -->
<short-name>my</short-name>
<!-- 为当前标签库配置文件,起一个名称 * 内容:自定义,全球唯一 -->
<uri>http://www.yxl.cn/jsp/mytag</uri> <!-- <my:date / > 注册标签 -->
<tag>
<!-- 确定标签名称 -->
<name>date</name>
<!-- 确定实现类 -->
<tag-class>com.yxl.tag.MyDateTag</tag-class>
<!-- 格式化当前标签的body内容 * empty:当前标签没有标签体 -->
<body-content>empty</body-content> </tag> <!-- <my:maxValue / > 注册标签 -->
<tag>
<!-- 确定标签名称 -->
<name>maxValue</name>
<!-- 确定实现类 -->
<tag-class>com.yxl.tag.MyMaxValueTag</tag-class>
<!-- 格式化当前标签的body内容 * empty:当前标签没有标签体 -->
<body-content>empty</body-content>
<!-- 确定当前标签使用了哪些属性 -->
<attribute>
<!-- 设置属性名称 -->
<name>num1</name>
<!-- 设置属性是否必须 * true/false * yes/no -->
<required>true</required>
<!-- rtexprvalue 运行时表达式的值 * runtime expression value -->
<rtexprvalue>true</rtexprvalue>
<!-- 确定标签类型 -->
<type>java.lang.Integer</type>
</attribute> <attribute>
<!-- 设置属性名称 -->
<name>num2</name>
<!-- 设置属性是否必须 * true/false * yes/no -->
<required>true</required>
<!-- rtexprvalue 运行时表达式的值 * runtime expression value -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib> * 需求:<my:toUpperCase>xxYYdfsdDFwerd</my:toUpperCase>
标签体
package com.yxl.tag; import java.io.IOException;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag; public class MyToUpperCaseTag implements SimpleTag { public MyToUpperCaseTag() {
System.out.println("默认构造");
} private PageContext pageContext; private JspFragment jspBody; /**
* 1、被调用的方法,tomcat调用
*/
public void setJspContext(JspContext pc) { this.pageContext = (PageContext) pc; } public void setJspBody(JspFragment jspBody){
this.jspBody = jspBody;
} /**
* 2、tomcat调用 建议,在doTage方法中完成整个tag的功能 需要再doTage方法之前,完成准备工作
*/
public void doTag() throws JspException, IOException {
StringWriter stringWriter = new StringWriter();
this.jspBody.invoke(stringWriter);
String data = stringWriter.toString();
this.pageContext.getOut().print(data.toUpperCase()); } @Override
public JspTag getParent() {
// TODO Auto-generated method stub
return null;
} @Override
public void setParent(JspTag arg0) {
// TODO Auto-generated method stub } }
<!-- <my:toUpperCase / > 转换为大写 -->
<tag>
<!-- 确定标签名称 -->
<name>toUpperCase</name>
<!-- 确定实现类 -->
<tag-class>com.yxl.tag.MyToUpperCaseTag</tag-class> <!-- 格式化当前标签的body内容 * empty:当前标签没有标签体 -->
<!-- JSP:支持JSP所有的语法,在Tag中使用
scriptless:对于JSP页面的脚本不支持
tagdependent:标签体不做处理,原样输出 -->
<body-content>scriptless</body-content> </tag>
<my:toUpperCase>abcd</my:toUpperCase>
* 需求:循环
使用extends SimpleTagSupport这种方式实现标签类,SimpleTagSupport已经实现了SimpleTag接口
三种循环遍历
<taglib xmlns="http://java.sun.com/xml/ns/javaee" 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">
<!-- 确定当前标签库的版本 -->
<tlib-version>1.0</tlib-version>
<!-- 建议引入当前便签库是,使用的简写 @taglib prefix="my" -->
<short-name>my</short-name>
<!-- 为当前标签库配置文件,起一个名称 * 内容:自定义,全球唯一 -->
<uri>http://www.yxl.cn/jsp/mytag</uri> <!--
<my:myeach start="0" end="9" step="1" var="ss">
${ss} ** <br/>
</my:myeach>
--> <tag>
<name>myeach</name>
<tag-class>com.yxl.tag.MyEachTag</tag-class>
<body-content>scriptless</body-content> <attribute>
<name>start</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>end</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>step</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> <!--
<my:myList items="${listObj}" var="yyyyy">
${yyyyy} ## <br/>
</my:myList> --> <tag>
<name>myList</name>
<tag-class>com.yxl.tag.MyListTag</tag-class>
<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> <tag>
<name>forEach</name>
<tag-class>com.yxl.tag.ForEachTag</tag-class>
<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>
package com.yxl.tag; import java.io.IOException; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; public class MyEachTag extends SimpleTagSupport{ /*
* <my:myeach start="0" end="9" step="1" var="ss">
${ss} ** <br/>
</my:myeach>
*/ private Integer start;
private Integer end;
private Integer step;
private String var; public void setStart(Integer start) {
this.start = start;
} public void setEnd(Integer end) {
this.end = end;
} public void setStep(Integer step) {
this.step = step;
} public void setVar(String var) {
this.var = var;
} public void doTag() throws JspException, IOException {
//完成功能:将获得的变量信息,输出到浏览器 for(int i = start ; i <= end ; i +=step){
//从父类中,获得pagecontext对象
this.getJspContext().setAttribute(var, i);
//将el表达式的结果发送到浏览器
// * el表达式的位置
// * 如何发送
this.getJspBody().invoke(null);
//this.getJspBody().invoke(this.getJspContext().getOut());
} } } package com.yxl.tag; import java.io.IOException;
import java.util.Iterator;
import java.util.List; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; public class MyListTag extends SimpleTagSupport { /*
<my:myList items="${listObj}" var="yyyyy">
${yyyyy} ## <br/>
</my:myList>
*/ private List items;
private String var;
public void setItems(List items) {
this.items = items;
} public void setVar(String var) {
this.var = var;
} @Override
public void doTag() throws JspException, IOException {
//完成功能:将获得的list信息遍历输出到浏览器
Iterator it = items.iterator();
while(it.hasNext()){
Object str = it.next();
//将结果放置到作用域
this.getJspContext().setAttribute(var, str);
//将el表达式的结果数据到浏览器
this.getJspBody().invoke(null);
}
} } package com.yxl.tag; import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport; public class ForEachTag extends SimpleTagSupport { /*
<my:myList items="${listObj}" var="yyyyy">
${yyyyy} ## <br/>
</my:myList>
*/ private Iterator<Object> items;
private String var;
public void setItems(Object items) {
//list
if(items instanceof List){
this.items = ((List)items).iterator();
}
//map
if(items instanceof Map){
this.items = ((Map)items).entrySet().iterator();
}
//object[]
if(items instanceof Object[]){
this.items = Arrays.asList((Object[])items).iterator();
} } public void setVar(String var) {
this.var = var;
} @Override
public void doTag() throws JspException, IOException {
//完成功能:将获得的list信息遍历输出到浏览器 while(items.hasNext()){
Object str = items.next();
//将结果放置到作用域
this.getJspContext().setAttribute(var, str);
//将el表达式的结果数据到浏览器
this.getJspBody().invoke(null);
}
} } <my:myeach start="0" end="9" step="1" var="eeee">
${eeee} ** <br/>
</my:myeach>
<% List<String> list = new ArrayList<String>();
list.add("abc");
list.add("123");
list.add("wasd"); pageContext.setAttribute("listObj",list);
%>
myList<br/>
<my:myList items="${listObj}" var="yyyyy">
${yyyyy} ## <br/>
</my:myList> <my:forEach items="${listObj}" var="mm">
${mm} <br/>
</my:forEach> <hr/> <% Map<String,String> map = new HashMap<String,String>();
map.put("11111","11111");
map.put("22222","222222");
map.put("33333","33333"); pageContext.setAttribute("mapObj",map); %>
遍历Map<br/> <my:forEach items="${mapObj}" var="map">
${map.key} ---- ${map.value} <br/>
</my:forEach>
三、自定义函数
* 创建类,但方法必须是静态的
package com.yxl.domain; public class Calculator {
private String firstNum;
private String operator;
private String secondNum;
private String result;
public String getFirstNum() {
return firstNum;
}
public void setFirstNum(String firstNum) {
this.firstNum = firstNum;
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator;
}
public String getSecondNum() {
return secondNum;
}
public void setSecondNum(String secondNum) {
this.secondNum = secondNum;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
public Calculator() {
} //计算方法
public static void calculator(Calculator cal){ //通过运算符,将firstNum和secondNum处理的结果,存放到result double first = Double.valueOf(cal.firstNum);
double second = Double.valueOf(cal.secondNum);
char ope = cal.operator.charAt(0); switch (ope) {
case '+':
cal.result = String.valueOf(first + second);
break;
case '-':
cal.result = String.valueOf(first - second);
break;
case '*':
cal.result = String.valueOf(first * second); break;
case '/':
cal.result = String.valueOf(first / second);
break; default:
throw new RuntimeException("非法操作符");
} }
} * 书写配置文件tld
新建myFun.tld
<?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>myfn</short-name>
<uri>http://www.yxl.cn/mytag/functions</uri>
<!-- 确定当前函数 myfn:calculator(cal) -->
<function>
<name>calculator</name>
<function-class>com.yxl.domain.Calculator</function-class>
<!-- 当前使用函数的声明 public static void calculator(Calculator cal) -->
<function-signature>void calculator(com.yxl.domain.Calculator)</function-signature>
</function> </taglib>
* 引用
* <%@ taglib uri="http://www.yxl.cn/mytag/functions" prefix="myFn" %>
* 测试
<jsp:useBean id="cal" class="com.yxl.domain.Calculator"></jsp:useBean>
<jsp:setProperty property="firstNum" value="1" name="cal"/>
<jsp:setProperty property="operator" value="+" name="cal"/>
<jsp:setProperty property="secondNum" value="4" name="cal"/>
${myFn:calculator(cal)}
${cal.result}
四、总结
* 共同点:
* 需要引入
* <%@ taglib uri="http://www.yxl.cn/mytag/myeach" prefix="my" %>
* 都需要配置tld文件
* 区别:
* 自定义标签
* 创建一个类,完成一个功能或一组功能。
* 可以选择el表达式
* 自定义函数
* 创建一个静态方法,完成一个操作。
* 必须与EL表达式结合使用
${fn:xxxx}

JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)的更多相关文章

  1. day12(jsp指令&内置对象&动作标签、JavaBean、EL表达式&函数库)

    day12 JSP指令 JSP指令概述 JSP指令的格式:<%@指令名 attr1="" attr2="" %>,一般都会把JSP指令放到JSP文件 ...

  2. java_自定义标签,我的第一个自定义标签!

    自定义标签,我的第一个自定义标签! 总共分两步 编写一个实现tag接口的java类,把jsp页面中的java代码移到这个类中,(标签处理器类) 编写标签库描述符(tld)文件,在tld文件中把标签处理 ...

  3. Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

    前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...

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

    今天是学习自定义标签的第二天,主要是写一个自定义的循环标签. 先看效果图: 前台页面Jsp代码 <%@ page language="java" contentType=&q ...

  5. 【神经网络与深度学习】【C/C++】C++日志操作开源函数库之Google-glog

    今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge ...

  6. JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)

    1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...

  7. JavaWeb学习笔记——JSP标准标签库JSTL

  8. JavaWeb学习 (十八)————JSP标签

    一.JSP标签介绍 JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. 二.JSP常用标签 ...

  9. JavaWeb学习篇之----自定义标签&&JSTL标签库详解

    今天来看一下自定义标签的内容,自定义标签是JavaWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面 ...

  10. 超全面的JavaWeb笔记day13<JSTL&自定义标签>

    1.JSTL标签库(重点) core out set remove url if choose when otherwise forEach fmt formatDate formatNumber 2 ...

随机推荐

  1. 数据库多对多关联表(Python&MySQL)

    Python Python对MySQL数据库操作使用的是sqlalchemy这个ORM框架 #一本书可以有多个作者,一个作者又可以出版多本书 from sqlalchemy import Table, ...

  2. ndk学习8: 编译动态库

    目录: 手工编译动态库 ndk-build编译动态库(Eclipse环境)   手工编译静态库 老规矩还是先手工操作,知其然并知其所以然   需要用到的核心命令: gcc -g -c -fpic -W ...

  3. [20160701]DevideByZeroWithoutNoException——from 《Java How To Program (Early Objects), 10th》

    //一段优美的例子 import java.util.Scanner; import java.util.InputMismatchException; public class DevideByZe ...

  4. Max Subsequence

    一个sequence,里面都是整数,求最长的subsequence的长度,使得这个subsquence的最大值和最小值相差不超过1. 比如[1,3,2,2,5,2,3,7]最长的subsequence ...

  5. 小波变换C++实现(一)----单层小波变换

    文章转自: http://www.cnblogs.com/IDoIUnderstand/archive/2013/03/30/3280724.html [小波变换]STL版 一维离散小波变换(DWT) ...

  6. cf592d

    题意:给出一个无根树,点数为10^5,所有边的长度为1.给定其中有一些点是受到攻击的. 现在要求一个人选定一个点作为起点,走遍所有的受攻击点(不用再回到起点). 需要的最短距离是多少,选定的起点是哪个 ...

  7. 一名Delphi程序员的开发习惯

    一名Delphi程序员的开发习惯 有关开发习惯的一些想法,如鲠在喉,不吐不快.究其发贴动机,当然不排除有骗取参与分的可能,但另一方面,也希望能给同行(念Xing)者提供一些 建议,或者参考(希望不是误 ...

  8. HDU 4942 Game on S♂play(线段树、模拟、扩栈)

    比赛的时候想到这题的大概做法,但由于卡别的水题...就赛后做了... 题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值 ...

  9. 士兵杀敌(三)_RMQ(区间最值查询)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

  10. 2076 Problem F Quick Brown Fox

    题目描述 A pangram is a phrase that includes at least one occurrence of each of the 26 letters, ‘a’. . . ...