博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)
阅读量:5122 次
发布时间:2019-06-13

本文共 17692 字,大约阅读时间需要 58 分钟。

一、自定义标签,步骤    * 确定需求        * 
输出当前系统的时间 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目录下 * 内容:
1.0
my
http://www.yxl.cn/jsp/mytag
date
com.yxl.tag.MyDateTag
empty
* 在JSP页面引入 * <%@ taglib uri="http://www.yxl.cn/jsp/mytag" prefix="my"%> * 测试 *
二、案例 * 需求:
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 } }
1.0
my
http://www.yxl.cn/jsp/mytag
date
com.yxl.tag.MyDateTag
empty
maxValue
com.yxl.tag.MyMaxValueTag
empty
num1
true
true
java.lang.Integer
num2
true
true
* 需求:
xxYYdfsdDFwerd
标签体 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 } }
toUpperCase
com.yxl.tag.MyToUpperCaseTag
scriptless
abcd
* 需求:循环 使用extends SimpleTagSupport这种方式实现标签类,SimpleTagSupport已经实现了SimpleTag接口 三种循环遍历
1.0
my
http://www.yxl.cn/jsp/mytag
myeach
com.yxl.tag.MyEachTag
scriptless
start
true
true
end
true
true
step
true
true
var
true
true
myList
com.yxl.tag.MyListTag
scriptless
items
true
true
var
true
true
forEach
com.yxl.tag.ForEachTag
scriptless
items
true
true
var
true
true
package com.yxl.tag; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class MyEachTag extends SimpleTagSupport{ /* *
${ss} **
*/ 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 { /*
${yyyyy} ##
*/ 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 { /*
${yyyyy} ##
*/ private Iterator 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); } } }
${eeee} **
<% List
list = new ArrayList
(); list.add("abc"); list.add("123"); list.add("wasd"); pageContext.setAttribute("listObj",list); %> myList
${yyyyy} ##
${mm}

<% Map
map = new HashMap
(); map.put("11111","11111"); map.put("22222","222222"); map.put("33333","33333"); pageContext.setAttribute("mapObj",map); %> 遍历Map
${map.key} ---- ${map.value}
三、自定义函数 * 创建类,但方法必须是静态的 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
1.0
myfn
http://www.yxl.cn/mytag/functions
calculator
com.yxl.domain.Calculator
void calculator(com.yxl.domain.Calculator)
* 引用 * <%@ taglib uri="http://www.yxl.cn/mytag/functions" prefix="myFn" %> * 测试
${myFn:calculator(cal)} ${cal.result}四、总结 * 共同点: * 需要引入 * <%@ taglib uri="http://www.yxl.cn/mytag/myeach" prefix="my" %> * 都需要配置tld文件 * 区别: * 自定义标签 * 创建一个类,完成一个功能或一组功能。 * 可以选择el表达式 * 自定义函数 * 创建一个静态方法,完成一个操作。 * 必须与EL表达式结合使用 ${fn:xxxx}

 

转载于:https://www.cnblogs.com/yxlblogs/p/4158792.html

你可能感兴趣的文章
新手算法学习之路----二叉树(在一个二叉查找树中插入一个节点)
查看>>
autopep8
查看>>
GIT在Linux上的安装和使用简介
查看>>
基于C#编程语言的Mysql常用操作
查看>>
s3c2440实验---定时器
查看>>
MyEclipse10安装SVN插件
查看>>
[转]: 视图和表的区别和联系
查看>>
Regular Experssion
查看>>
图论例题1——NOIP2015信息传递
查看>>
uCOS-II中的任务切换-图解多种任务调度时机与问题
查看>>
CocoaPods的安装和使用那些事(Xcode 7.2,iOS 9.2,Swift)
查看>>
Android 官方新手指导教程
查看>>
幸运转盘v1.0 【附视频】我的Android原创处女作,请支持!
查看>>
UseIIS
查看>>
集合体系
查看>>
vi命令提示:Terminal too wide
查看>>
引用 移植Linux到s3c2410上
查看>>
MySQL5.7开多实例指导
查看>>
[51nod] 1199 Money out of Thin Air #线段树+DFS序
查看>>
poj1201 查分约束系统
查看>>