day11-mytag&jst&i18nの代码学习1

来源:互联网 发布:java排班做二休一源码 编辑:程序博客网 时间:2024/06/04 19:26

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在其他项目引用的例子

  1. 将myjstl.jar导入到lib,加入classpath
  2. 在jsp页面通过

    <%@taglib uri="http://www.itheima.com/myjstl/" prefix="myc" %>

    加入myjstl的标签库

0 0
原创粉丝点击