day11-mytag&jst&i18nの代码学习1
来源:互联网 发布:java排班做二休一源码 编辑:程序博客网 时间:2024/06/05 02:38
day11-mytag&jst&i18nの代码学习
mytag
ShowTimeTagDemo1.java(显示当前系统时间)
package com.itheima.web.mytag;import java.io.IOException;import java.util.Date;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 显示当前系统时间 * @author wangli * */public class ShowTimeTagDemo1 extends SimpleTagSupport { public ShowTimeTagDemo1(){ System.out.println("ShowTimeTagDemo1标签处理类实例化了"); } //标签处理程序放在doTag方法中 public void doTag() throws JspException, IOException { Date date = new Date(); //1.得到JspContext,并进行向下转型,从而得到PageContext PageContext pc = (PageContext) getJspContext(); //2.通过 PageContext得到JspWriter JspWriter out = pc.getOut(); //3.输出 out.write(date.toLocaleString()); }}
SkipBody.java(忽略标签 的主体内容)
package com.itheima.web.mytag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 忽略标签 的主体内容 * @author wangli * */public class SkipBody extends SimpleTagSupport { public void doTag() throws JspException, IOException { //不显示这个标签的主体内容 对于doTag()就是没有方法体 //2.如果想显示主体内容 ,就得有方法体 //2.1就要得到主体内容 /*JspFragment jf = getJspBody();//JspFragement可以调用它的invoke(Writer )来实现主体内容的输出 //2.2得到PageContext PageContext pc = (PageContext) getJspContext(); //2.3得到JspWriter out对象 JspWriter out = pc.getOut(); //2.4输出 ///out.write(jf.toString());不能实现输出主体内容 jf.invoke(out);//可以实现主体内容的输出*/ //3.用于实现主体内容输出的最终方法 getJspBody().invoke(null); }}
SkipAfterDemo3.java(控制标签后面的内容不输出)
package com.itheima.web.mytag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.SkipPageException;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 控制标签后面的内容不输出 * @author wangli * */public class SkipAfterDemo3 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { //当碰到这个标签时,就向外抛异常 throw new SkipPageException(); }}
RepeatBodyDemo4.java(控制主体内容重复执行)
package com.itheima.web.mytag;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 控制主体内容重复执行 * @author wangli * */public class RepeatBodyDemo4 extends SimpleTagSupport { private int count;//次数 //服务器当碰到jsp页面的标签时,就自动调用setter方法 public void setCount(int count) { this.count = count; } public void doTag() throws JspException, IOException { for (int i = 0; i <count; i++) { //输出主体内容 getJspBody().invoke(null); } }}
ChangeBodyDemo5.java(改变主体内容为大写字母)
package com.itheima.web.mytag;import java.io.IOException;import java.io.StringWriter;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.JspFragment;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 改变主体内容为大写字母 * @author wangli * */public class ChangeBodyDemo5 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { //1.获取主体内容 JspFragment jf = getJspBody(); //2.不能直接输出到浏览器,此时可以输出到自定义缓冲区中 要产生一个Writer的子对象,并带有缓冲区 StringWriter sw = new StringWriter(); //2.1将主体内容输出到缓冲区中 jf.invoke(sw); //放到StringWriter的内部StringBuffer中 //3.从缓冲区中取出数据 String content = sw.getBuffer().toString(); //4. 改变为大写 content = content.toUpperCase(); //5.手动输出 out.write(); PageContext pc = (PageContext) getJspContext(); pc.getOut().write(content); }}
MyIfDemo1.java(执行条件判断)
package com.itheima.web.mytag.app1;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;/** * 执行条件判断 * 当标签中有属性时,就应该到标签处理类中加入一个属性,用于给jsp页面的标签属性赋值 * @author wangli * */public class MyIfDemo1 extends SimpleTagSupport { private boolean test; public void setTest(boolean test) { this.test = test; } public void doTag() throws JspException, IOException { if(test){ getJspBody().invoke(null); } }}
MyWhenDemo2.java(When的用法)
package com.itheima.web.mytag.app1;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyWhenDemo2 extends SimpleTagSupport { private boolean test; public void setTest(boolean test) { this.test = test; } public void doTag() throws JspException, IOException { if(test){ //为真,就要执行主体内容 getJspBody().invoke(null); //2.还要告诉otherwise,不要执行了 //2.1找到他爹 MyChooseDemo2 mychoose = (MyChooseDemo2) getParent(); mychoose.setFlag(false);//告知otherwise不要执行了 } }}
MyOtherWiseDemo2.java(OtherWise的用法)
package com.itheima.web.mytag.app1;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyOtherWiseDemo2 extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { MyChooseDemo2 mychoose = (MyChooseDemo2) getParent(); if(mychoose.isFlag()){ //如果为真,说明otherwise要执行 getJspBody().invoke(null); } }}
MyChooseDemo2.java(Choose的用法)
package com.itheima.web.mytag.app1;import java.io.IOException;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyChooseDemo2 extends SimpleTagSupport { private boolean flag =true;//代表让otherwise标签执行 ,它是程序员调用 的 public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } @Override public void doTag() throws JspException, IOException { //它的主体内容一定执行,两个子标签根据情况,一定会执行其中一个 getJspBody().invoke(null); }}
MyForEach1Demo3.java(ForEach的用法)
package com.itheima.web.mytag.app1;import java.io.IOException;import java.util.List;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyForEach1Demo3 extends SimpleTagSupport { private List items;//用于接收集合 private String var;//用户接收集合中的每个元素 非常妙啊 public void setItems(List items) { this.items = items; } public void setVar(String var) { this.var = var; } public void doTag() throws JspException, IOException { //遍历集合 for(Object obj :items){ //遍历一个 //2.因为页面上直接取值时,是从pageContext域中取值,那么现在就要让集合中的数据放入到pageContext PageContext pc = (PageContext) getJspContext(); pc.setAttribute(var, obj); //3.执行主体内容 getJspBody().invoke(null); } }}
MyForEach2Demo3.java(forEach的用法)
package com.itheima.web.mytag.app1;import java.io.IOException;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Collection;import java.util.List;import java.util.Map;import java.util.Set;import javax.servlet.jsp.JspException;import javax.servlet.jsp.PageContext;import javax.servlet.jsp.tagext.SimpleTagSupport;public class MyForEach2Demo3 extends SimpleTagSupport { private Object items;//用于接收集合 private Collection collection = new ArrayList(); //子接口List Set Map不是它的子类 map.entrySet()可以将Map转成Set private String var;//非常妙啊 public void setItems(Object items) { //要处理页面上传过来的集合 if(items instanceof List){ collection = (List)items; }else if(items instanceof Map){ collection = ((Map)items).entrySet(); }else if(items instanceof Set){ collection = (Set)items; }else if(items.getClass().isArray()){ //只要是数组就行,8个基本类型的数组,及Object[] int length = Array.getLength(items);//得到数组长度 for (int i = 0; i < length; i++) { //取数组中的每个元素 Object obj = Array.get(items, i);// 取第i个元素 collection.add(obj);//将数组中的元素加入到集合中 } } this.items = items; } public void setVar(String var) { this.var = var; } public void doTag() throws JspException, IOException { //遍历集合 for(Object obj :collection){ //遍历一个 //2.因为页面上直接取值时,是从pageContext域中取值,那么现在就要让集合中的数据放入到pageContext PageContext pc = (PageContext) getJspContext(); pc.setAttribute(var, obj); //3.执行主体内容 getJspBody().invoke(null); } }}
MyTest.java
package com.itheima.web.mytag.app1;import java.lang.reflect.Array;import org.junit.Test;//反射数组 Array getClass().isArray()判断是否为数组// int length = getLength(Object obj) :长度// for(int i=0;i<length;i++){ Object obj = Array.get(obj,i); }public class MyTest { @Test public void testArray(){ int a[] = {1,2,3}; String b[]={"111","dddd"}; //System.out.println(a instanceof Object[]); //System.out.println(a instanceof int[]); ///System.out.println(b instanceof String[]); //System.out.println(b instanceof Object[]); // 反射Array System.out.println(a.getClass().isArray()); System.out.println(b.getClass().isArray()); //取元素 int length = Array.getLength(a); System.out.println(length); int blength = Array.getLength(b); System.out.println(blength +","+b.length); }}
mytag.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"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>myc</short-name> <uri>http://www.itheima.com/myjstl/</uri> <tag> <name>showTime</name> <tag-class>com.itheima.web.mytag.ShowTimeTagDemo1</tag-class> <!-- 设置主体内容 empty没有主体内容 --> <body-content>empty</body-content> </tag> <tag> <name>skipBody</name> <tag-class>com.itheima.web.mytag.SkipBody</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>tagdependent</body-content> </tag> <tag> <name>skipAfter</name> <tag-class>com.itheima.web.mytag.SkipAfterDemo3</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>empty</body-content> </tag> <!-- 主体内容执行次数 --> <tag> <name>for</name> <tag-class>com.itheima.web.mytag.RepeatBodyDemo4</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>tagdependent</body-content> <attribute> <!-- 参数名 --> <name>count</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <!-- 改变主体内容 --> <tag> <name>toUpperCase</name> <tag-class>com.itheima.web.mytag.ChangeBodyDemo5</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>tagdependent</body-content> </tag> <!-- 条件判断 --> <tag> <name>if</name> <tag-class>com.itheima.web.mytag.app1.MyIfDemo1</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>tagdependent</body-content> <attribute> <!-- 参数名 --> <name>test</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <!-- ifelse功能 --> <tag> <name>choose</name> <tag-class>com.itheima.web.mytag.app1.MyChooseDemo2</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>scriptless</body-content> </tag> <!-- 条件判断 --> <tag> <name>when</name> <tag-class>com.itheima.web.mytag.app1.MyWhenDemo2</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>tagdependent</body-content> <attribute> <!-- 参数名 --> <name>test</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <tag> <name>otherwise</name> <tag-class>com.itheima.web.mytag.app1.MyOtherWiseDemo2</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>tagdependent</body-content> </tag> <!-- 循环标签 --> <tag> <name>forEach1</name> <tag-class>com.itheima.web.mytag.app1.MyForEach1Demo3</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>scriptless</body-content> <attribute> <!-- 参数名 --> <name>items</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <!-- 参数名 --> <name>var</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> <!-- forEach1的功能加强版 --> <tag> <name>forEach2</name> <tag-class>com.itheima.web.mytag.app1.MyForEach2Demo3</tag-class> <!-- 设置主体内容 empty不能放入主体内容 --> <body-content>scriptless</body-content> <attribute> <!-- 参数名 --> <name>items</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <!-- 参数名 --> <name>var</name> <!-- 是必须的 --> <required>true</required> <!-- 支持表达式 rt:runtime expr:expression value el --> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
jsp代码例子演示自定义标签
01skipcontent.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> 我<myc:skipBody>喜欢</myc:skipBody>凤姐 </body></html>
02skipAfter.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> 冠希喜欢<myc:skipAfter></myc:skipAfter>阿娇 </body></html>
03repeatbody.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <myc:for count="${1+9 }"> 冠希喜欢阿娇<br> </myc:for> </body></html>
04changebody.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> abcdefg: <myc:toUpperCase>abcdefg</myc:toUpperCase> </body></html>
05myif.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <myc:if test="${1+1==2 }"> 你太聪明了 </myc:if> <h2>具有if-else功能的标签</h2> <myc:choose> <myc:when test="${1+1==2 }">你太聪明了</myc:when> <myc:otherwise>你真笨</myc:otherwise> </myc:choose> </body></html>
06myforEach.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title></title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <% List list = new ArrayList(); list.add("ddd"); list.add("aj"); list.add("cgx"); request.setAttribute("list", list); //将来上面的内容,放在Servlet中,request域中, 然后再转发 %> <!-- items代表集合 var代表的是集合中的每个元素 ,要将它放入到pageContext域中 --> <myc:forEach1 items="${requestScope.list }" var="vvv"> ${pageScope.vvv }<br> </myc:forEach1> <h2>输出Map集合</h2> <% Map map = new HashMap(); map.put("a1","ddd"); map.put("a2","cgx"); request.setAttribute("map", map); //将来上面的内容,放在Servlet中,request域中, 然后再转发 %> <myc:forEach2 items="${requestScope.map }" var="vvv"> ${pageScope.vvv }---------------${vvv.key }=====${vvv.value }<br> </myc:forEach2> <h2>输出数组中的元素</h2> <% int a[] = {12,34,56,78}; request.setAttribute("a", a); %> <myc:forEach2 items="${requestScope.a }" var="vvv"> ${pageScope.vvv }<br> </myc:forEach2> <h2>输出对象数组中的元素</h2> <% String str[] = {"aaa","cgx","金瓶梅"}; request.setAttribute("str", str); %> <myc:forEach2 items="${requestScope.str }" var="vvv"> ${pageScope.vvv }<br> </myc:forEach2> </body></html>
打包发布自定义的标签库
myeclipse演示:
1. 在自定义的项目中选中需要打包发布的包或者文件2. 点击右键Export进入Export导出操作敞口3. 选择java——>JAR file,点击next,进入JAR Export操作窗口4. 在JAR Export窗口中可以查看自己刚才选择的需要导出的文件,在 Select the export destination:JAR file:选择Browse...选择自己将要保存的jar的位置和名字(这里叫myjstl.jar),点击next5. 进入JAR Export窗口的可选项,选中Export class files with compile errors和Export class files with compile warnings,点击next,6. 进入JAR Export的JAR Manlfest Specification,按默认选择(选中Generate the manifest file和Seal some packages,点击finish,结束class文件的导出7. 同时要把.tld配置文件导入到jar包中的META-INF下,如果不能直接把.tld文件拖入到jar包中的话,可以先解压,等放好文件后,再压缩即可得到可以发布使用的jar包
网上找到的另外的例子:
第一步:准备工作1.创建一个目录:例如tag-libraries2.在tag-libraries下创建另外一个目录:META-INF(必须的)3.将你编写的“.tld”文件放入“META-INF”目录中,返回tag-libraries4.将你的class文件带包放入此目录中:例如com.cheng.……第二步:打包成jar1.运行cmd,输入命令:jar cvf my-taglib.jar META-INF com第三步:加入的web工程中的lib文件夹中第四步:jsp页面上引用
将打包的myjstl.jar在其他项目引用的例子
- 将myjstl.jar导入到lib,加入classpath
在jsp页面通过
<%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %>
加入myjstl的标签库
0 0
- day11-mytag&jst&i18nの代码学习1
- day11-mytag&jst&i18nの代码学习1
- day11-mytag&jst&i18nの代码学习2
- day11-mytag&jst&i18nの代码学习3
- day11-mytag&jst&i18nのPPT学习1
- day11-mytag&jst&i18nのPPTの学习2
- day11-mytag&jst&i18nのPPT学习3
- JST标签学习笔记
- java基础学习day11
- C++ 学习笔记day11
- java学习day11
- java学习day11
- Android学习笔记day11
- java学习day11
- Linux学习-day11
- python学习日志--day11
- 国家语言代码i18n
- 机器学习学习笔记.day11
- JAVA笔试面试题目集锦
- 黑马程序员——Java面对对象(一)
- 移动web开发规范
- ffmpeg解码流程
- 翻转字符串中的单词
- day11-mytag&jst&i18nの代码学习1
- day11-mytag&jst&i18nの代码学习1
- day11-mytag&jst&i18nの代码学习2
- day11-mytag&jst&i18nの代码学习3
- 检测有向图中的环
- 2D游戏
- YUV格式分析
- Java基础视频教程第12天_多线程二之线程间通信
- Merge k Sorted Lists