JavaWeb_07_jsp_JSTL标签

jsp操作bean的标签+EL表达式+JSTL标签
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="cn.itcast.domain.Person" %>
<%@ page import="cn.itcast.domain.Address" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>jsp操作bean的标签+EL表达式+JSTL标签</title>
  </head>
  <body>
    ja<jsp:useBean id="p" class="cn.itcast.domain.Person" scope="page" />
    <%
            p.setName("张三"); 
    %>
    p.getName=<%=p.getName() %>
    <br/>=========================<br/>
    <jsp:useBean id="p1" class="cn.itcast.domain.Person" scope="session">
        该句标签体内的代码,仅在第一次实例对象时才执行!
    </jsp:useBean>
    <br/>============我是鸡肋分割线===========<br/>
    <jsp:useBean id="p2" class="cn.itcast.domain.Person" scope="page" />
    <jsp:setProperty name="p2" property="name" value="李四"/>
    p2.getName=<%=p2.getName() %>
    <br/>=======================<br/>
    用地址栏的请求参数给bean赋值(支持8种基本数据类型转换)
    <jsp:useBean id="p3" class="cn.itcast.domain.Person" scope="page" />
    <jsp:setProperty name="p3" property="name" param="name"/>
    <jsp:setProperty name="p3" property="age" param="age"/>
    p3.getName()=<%=p3.getName() %>
    p3.getAge()=<%=p3.getAge() %>
    <br/>=======================<br/>
    给所有的请求参数赋值
    <jsp:useBean id="p4" class="cn.itcast.domain.Person" scope="page" />
    <jsp:setProperty name="p4" property="*"/>
    p4.getName()=<%=p4.getName() %>
    p4.getAge()=<%=p4.getAge() %>
    <br/>=======================<br/>
    <jsp:getProperty name="p4" property="name"/>
    <jsp:getProperty name="p4" property="age"/>
    <br/>=======================<br/>
    <% 
         Map<String,Person> map = new HashMap();
         map.put("aa",new Person("aaaaa"));
         map.put("bb",new Person("bbbbb"));
         map.put("cc",new Person("ccccc"));
         map.put("dd",new Person("ddddd"));
         map.put("111",new Person("eeeee"));
         request.setAttribute("map111",map);
     %>
     ${map111['111'].name }
    <br/>=======================<br/>
    ${pageContext.request.contextPath }
    <br/>=======================<br/>
    <%
            HttpServletRequest re= (HttpServletRequest)pageContext.getRequest();
            out.write(re.getContextPath());
     %>
    <br/>=======================<br/>
    <a href="${pageContext.request.contextPath }/index.jsp">到首页</a>
    <br/>=======================<br/>
     <% 
        String data = "abcd";
        request.setAttribute("data",data);
    %>
    ${data }
    <br/>=======================<br/>
    <% 
        Person p6 = new Person();
        p6.setName("aaaa");
        request.setAttribute("person",p6);
    %>
    ${person.name }
    <br/>=======================<br/>
    <% 
        Person p7 = new Person();
        Address a = new Address();
        a.setCity("上海");
        p7.setAddress(a);
        request.setAttribute("p7",p7);
    %>
    ${p7.address.city }
    <br/>=====>使用jstl+el完成集合迭代=======<br/>
    <%--
    JSTL标签库使用方法:
    1,导入jstl.jar和standard.jar到WEB-INF目录下的lib文件夹
    2,进入standard.jar/META-INF/c.tld/12行的uri
    3,使用tablib指令<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    前缀最好和文件名(c.tld)一样 
    --%>
    <% 
        List list = new ArrayList();
        list.add(new Person("aaa"));
        list.add(new Person("bbb"));
        list.add(new Person("ccc"));
        request.setAttribute("list",list);
    %>
    <c:forEach var="p7" items="${list }">
    ${p7.name }<br />
    </c:forEach>
    <br/>=====>使用jstl+el完成集合迭代=======<br/>
    <% 
         Map<String,Person> map1 = new HashMap();
         map.put("aa",new Person("aaaaa"));
         map.put("bb",new Person("bbbbb"));
         map.put("cc",new Person("ccccc"));
         map.put("dd",new Person("ddddd"));
         map.put("111",new Person("eeeee"));
          request.setAttribute("map",map);
     %>
     <c:forEach var="entry" items="${map }">
     ${entry.key }--------------${entry.value.name }<br />
     </c:forEach>
    <br/>=====>jstl标签=======<br/>
    <c:if test="${map!=null}">
    map不为空
    </c:if>   
    <% request.removeAttribute("map");  %>
    <c:if test="${map==null}">
    map空                                                          
    </c:if>   
    <br/><br/>
  </body>
</html>

App1

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class App1 extends SimpleTagSupport {
  private String site;
  private String page;
  public void setSite(String site) {
    this.site = site;
  }
  public void setPage(String page) {
    this.page = page;
  }
  @Override
  public void doTag() throws JspException, IOException {
    /*方法说明:防盗链分3种情况讨论page*/
    PageContext pageContext=(PageContext) this.getJspContext();
    HttpServletRequest request=(HttpServletRequest) pageContext.getRequest();
    HttpServletResponse response=(HttpServletResponse) pageContext.getResponse();
    String referer=request.getHeader("referer");
    //得到/day11
    String path=request.getContextPath();
    if(referer==null || !referer.startsWith(site)){
      //如果是/day11开头,即/day11/index.jsp,直接跳转
      if (page.startsWith(path)) {
        response.sendRedirect(page);
      } else if(page.startsWith("/")){
        //如果是/index.jsp,则在前面加上path后跳转
        response.sendRedirect(path+page);
      }else{
        //如果是index.jsp,则在前面加上path和/再跳转
        response.sendRedirect(path+"/"+page);
      }
    }
    //否则是正常访问,就不作任何处理
  }
}
App2

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class App2 extends SimpleTagSupport {
  private boolean test;
  public void setTest(boolean test) {
    this.test = test;
  }
  public void doTag() throws JspException, IOException {
    /* 方法说明:if标签,属性为test*/     
    if (test) {
      JspFragment jf=this.getJspBody();
      //jf.invoke(null);
      JspWriter out=this.getJspContext().getOut();
      jf.invoke(out);
    } else {
      //如果条件为假,则什么也不做
    }
  }
}
App3_ChooseTag
package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class App3_ChooseTag extends SimpleTagSupport {
  /*方法说明:
   * 1,两个子标签共享一个父成员
   * 2,让标签体执行就可以了*/
  private boolean isDo;
  public boolean isDo() {
    return isDo;
  }
  public void setDo(boolean isDo) {
    this.isDo = isDo;
  }
  public void doTag() throws JspException, IOException {
    this.getJspBody().invoke(null);
  }
}

App3_WhenTag

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class App3_WhenTag extends SimpleTagSupport {
  private boolean test;
  public void setTest(boolean test) {
    this.test = test;
  }
  @Override
  public void doTag() throws JspException, IOException {
    /*方法说明:
    *1,先得到父标签的成员变量isDo
    *2,如果test为真,且isDo为假(boolean成员变量默认为假)
    *就执行标签体,并且将父的isDo置为真(即让App3_OtherwiseTag不执行)
    */
    App3_ChooseTag parent=(App3_ChooseTag) this.getParent();
    if (test&&!parent.isDo()) {
      this.getJspBody().invoke(null);
      parent.setDo(true);//目的是让App3_OtherwiseTag不执行
    }
  }
}
App3_OtherwiseTag
package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class App3_OtherwiseTag extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    /*方法说明:
    *1,先得到父标签的成员变量isDo
    *2,如果isDo为假(boolean成员变量默认为假)
    *就执行标签体,并且将父的isDo置为真(即让App3_WhenTag不执行?)
    *3,else可以什么也不写,即代表什么也不做!*/
    App3_ChooseTag parent=(App3_ChooseTag) this.getParent();
    if (!parent.isDo()) {
      this.getJspBody().invoke(null);
      parent.setDo(true);//目的是让App3_OtherwiseTag不执行
    }
  }
}

App4_ForEachTag

package cn.itcast.web.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 App4_ForEachTag extends SimpleTagSupport {
  private String var;
  private Object items;
  public void setVar(String var) {
    this.var = var;
  }
  public void setItems(Object items) {
    this.items = items;
  }
  public void doTag() throws JspException, IOException {
     // 先就最简单的一种情况进行迭代!
    List list=(List) this.items;
    Iterator it=list.iterator();
    while (it.hasNext()) {
      Object obj = (Object) it.next();
      //下面是最巧妙的地方,将迭代出来的对象放到page域内,并通知标签体取出
      this.getJspContext().setAttribute(var, obj);
      this.getJspBody().invoke(null);
    }
  }
}
App5_ForEachTag
package cn.itcast.web.tag;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
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 App5_ForEachTag extends SimpleTagSupport {
  private String var;
  private Object items;
  private Collection coll;
  public void setVar(String var) {
    this.var = var;
  }
  public void setItems(Object items) {
    this.items = items;
    if (items instanceof Collection) {
      coll=(Collection) items;
    }
    if (items instanceof Map) {
      Map map=(Map) items;
      coll=map.entrySet();
    }
    //sun_foreachtag_source(items);该方法为sun公司对8种基本数组分析源码
    /*先判断是不是Collection和Map,
     * 再判断用java.lang.Class<T>方法:
     *  boolean  isArray() 
          判定此 Class 对象是否表示一个数组类。
     * (包括8种基本类型和对象数组)
     * 如果是,则进行迭代添加到coll,
     * 用java.lang.reflect包中的类Array的两个方法:
     * static Object  get(Object array, int index) 
          返回指定数组对象中索引组件的值。
     * static int  getLength(Object array) 
          以 int 形式返回指定数组对象的长度。
     */
    if (items.getClass().isArray()) {
      int length=Array.getLength(items);
      this.coll=new ArrayList();
      for (int i = 0; i < length; i++) {
        Object obj=Array.get(items, i);
        this.coll.add(obj);
      }
    }
  }
  /**
   * @param items
   */
  public void sun_foreachtag_source(Object items) {
    if (items instanceof Object[]) {
      Object[] obj=(Object[]) items;
      //工具类Arrays的asList方法,接受对象数组,转成集合
      this.coll=Arrays.asList(obj);
    }
    //下面是八种基本数据类型数组(sun公司standard.jar源码ForEachTag.class中使用的方法)
    //先解压standard.jar,在c.tld中找到org.apache.taglibs.standard.tag.rt.core.ForEachTag
    if (items instanceof int[]) {
      int[] arr=(int[]) items;
      this.coll=new ArrayList();
      for (int i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof boolean[]) {
      boolean[] arr=(boolean[]) items;
      this.coll=new ArrayList();
      for (boolean i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof byte[]) {
      byte[] arr=(byte[]) items;
      this.coll=new ArrayList();
      for (byte i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof char[]) {
      char[] arr=(char[]) items;
      this.coll=new ArrayList();
      for (char i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof short[]) {
      short[] arr=(short[]) items;
      this.coll=new ArrayList();
      for (short i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof long[]) {
      long[] arr=(long[]) items;
      this.coll=new ArrayList();
      for (long i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof float[]) {
      float[] arr=(float[]) items;
      this.coll=new ArrayList();
      for (float i : arr) {
        this.coll.add(i);
      }
    }
    if (items instanceof double[]) {
      double[] arr=(double[]) items;
      this.coll=new ArrayList();
      for (double i : arr) {
        this.coll.add(i);
      }
    }
  }
  public void doTag() throws JspException, IOException {
     /*开发和sun公司一样的foreach标签
      * 可以迭代map,collection,object数组,8种基本数据类型数组!
      * 1,定义一个成员变量Collection coll,用于装下不同集合的所有的对象;
      * 2,在setItems的方法里,将所有其他类型的集合变成单列集合!
      * 3,在doTag方法里,仅需对coll进行迭代即可
      */
    Iterator it=coll.iterator();
    while (it.hasNext()) {
      Object obj = (Object) it.next();
      //下面是最巧妙的地方,将迭代出来的对象放到page域内,并通知标签体取出
      this.getJspContext().setAttribute(var, obj);
      this.getJspBody().invoke(null);
    }
  }
}

App6_HTMLFilterTag

package cn.itcast.web.tag;
import java.io.IOException;
import java.io.StringWriter;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class App6_HTMLFilterTag extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    /*实用技术论坛必备!转义标签
     * 实际上改变标签体内容!
     * 抄Tomcat/webapps/examples/WEB-INF/classes/util/HTMLFilter.java
     * 中的filter方法!*/
     JspFragment jf=this.getJspBody();
     //来个内存输出流
     StringWriter sw=new StringWriter();
     //先写进内存
     jf.invoke(sw);
     //再取出来
     String context=sw.getBuffer().toString();
     //调用apache的方法进行字符转义
     context=this.filter(context);
     //转好了义,写回浏览器
     this.getJspContext().getOut().write(context);
  }
  public static String filter(String message) {
        if (message == null)
            return (null);
        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
            case '<':
                result.append("<");
                break;
            case '>':
                result.append(">");
                break;
            case '&':
                result.append("&");
                break;
            case '"':
                result.append(""");
                break;
            default:
                result.append(content[i]);
            }
        }
        return (result.toString());
    }
}

简单标签应用1

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class demo1 extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    /*方法说明:简单标签应用1:控制标签体输出
    *1,继承SimpleTagSupport
    *2,复写doTag方法
    *3,getJspBody取得标签体,调用invoke写出去*/
    JspFragment jf = this.getJspBody();
    //jf.invoke(null);这一句等效下面两句!null代表默认是写到浏览器
    JspWriter out=this.getJspContext().getOut();
    jf.invoke(out);
  }
}
简单标签应用2

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class demo2 extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    /*方法说明:简单标签应用2:控制标签体循环输出
    *1,继承SimpleTagSupport
    *2,复写doTag方法
    *3,getJspBody取得标签体,调用invoke写出去*/
    JspFragment jf = this.getJspBody();
    /*JspWriter out=this.getJspContext().getOut();
    jf.invoke(out);*/
    for (int i = 0; i <5; i++) {
      jf.invoke(null);//null代表默认是写到浏览器
    }
  }
}

简单标签应用3

package cn.itcast.web.tag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class demo3 extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    /*方法说明:简单标签应用3:修改标签体后输出
    *1,继承SimpleTagSupport
    *2,复写doTag方法
    *3,getJspBody取得标签体,调用invoke写到内存
    *4,从内存取出标签体,修改后写出去*/
    JspFragment jf = this.getJspBody();
    StringWriter sw=new StringWriter();
    jf.invoke(sw);//写到内存
    String content=sw.toString();
    content=content.toUpperCase();
    JspWriter out=this.getJspContext().getOut();
    out.write(content);
  }
}

简单标签应用4

package cn.itcast.web.tag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class demo4 extends SimpleTagSupport {
  @Override
  public void doTag() throws JspException, IOException {
    /*方法说明:简单标签应用4:控制整个页面是否执行
    *1,继承SimpleTagSupport
    *2,复写doTag方法
    *3,抛出SkipPageException*/
    throw new SkipPageException();
  }
}
简单标签应用5
package cn.itcast.web.tag;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class demo5 extends SimpleTagSupport {
  private int count;
  private Date date;
  public void setCount(int count) {
    this.count = count;
  }
  public void setDate(Date date) {
    this.date = date;
  }
  public void doTag() throws JspException, IOException {
    /*方法说明:简单标签应用5:(带属性标签)控制标签体循环输出
    *1,继承SimpleTagSupport
    *3,为属性生成setter方法
    *3,复写doTag方法
    *4,getJspBody取得标签体,调用invoke写出去*/
    JspFragment jf = this.getJspBody();
    JspWriter out=this.getJspContext().getOut();
    out.write(date.toLocaleString()+"<hr/>");
    for (int i = 0; i <count; i++) {
      jf.invoke(null);//null代表默认是写到浏览器
    }
  }
}
传统标签应用1
package cn.itcast.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo1 extends TagSupport {
  public int doStartTag() throws JspException {
    /*方法说明:
    *传统标签应用1:控制标签体是否输出
    *返回Tag.EVAL_BODY_INCLUDE代表执行标签体
    *返回Tag.SKIP_BODY代表执行标签体*/
    return Tag.EVAL_BODY_INCLUDE;
  }
}
传统标签应用2
package cn.itcast.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo2 extends TagSupport {
  public int doEndTag() throws JspException {
    /*方法说明:
     * 传统标签应用2:控制jsp页面是否输出
    *SKIP_PAGE
    *EVAL_PAGE*/
    return TagSupport.SKIP_PAGE;
  }
}
传统标签应用3
package cn.itcast.web.tag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
public class TagDemo3 extends TagSupport {
	/*方法说明:控制标签体循环输出5次*/
	public int x=5;
	public int doStartTag() throws JspException {
		return Tag.EVAL_BODY_INCLUDE;
	}
	public int doAfterBody() throws JspException {
		x--;
		if (x>0) {
			return TagSupport.EVAL_BODY_AGAIN;
		} else {
			return TagSupport.SKIP_BODY;
		}
	}
}
传统标签应用4

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTag;
import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.tagext.Tag;
public class TagDemo4 extends BodyTagSupport {
  /*方法说明:传统标签应用4:改标签体内容后输出*/
  public int doStartTag() throws JspException {
    return BodyTag.EVAL_BODY_BUFFERED;
  }
  public int doEndTag() throws JspException {
    BodyContent bc=this.getBodyContent();
    String content=bc.getString();
    content=content.toUpperCase();
    try {
      this.pageContext.getOut().write(content);
    } catch (IOException e) {
      throw new RuntimeException();
    }
    //让余下的jsp页面继续执行
    return Tag.EVAL_PAGE;
  }
}

传统标签演示

package cn.itcast.web.tag;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class ViewIP extends TagSupport {
  public int doStartTag() throws JspException {
    /*第一个自定义标签
     * 方法说明: 在页面中输入来访者IP*/
    HttpServletRequest request=(HttpServletRequest) this.pageContext.getRequest();
    JspWriter out=this.pageContext.getOut();
    String ip=request.getRemoteAddr();
    try {
      out.print("ip........ "+ip);
    } catch (IOException e) {
      //子类不能抛出更多异常,且异常链不能断,故转型
      throw new RuntimeException();
    }
    return super.doStartTag();
  }
}
app.tld描述文件
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
 <description>A tag library exercising SimpleTag handlers.</description>
 <tlib-version>1.0</tlib-version>
 <short-name>SimpleTagLibrary</short-name>
 <uri>http://www.i.com</uri>
 <tag>
  	<name>App1</name>
  	<tag-class>cn.itcast.web.tag.App1</tag-class>
  	<body-content>empty</body-content>
  	<attribute>
  	<name>site</name>
  	<required>true</required>
  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
  	<attribute>
  	<name>page</name>
  	<required>true</required>
  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
 </tag>
 <tag>
  	<name>App2</name>
  	<tag-class>cn.itcast.web.tag.App2</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
  	<name>test</name>
  	<required>true</required>
  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
 </tag>
 <tag>
  	<name>App3_ChooseTag</name>
  	<tag-class>cn.itcast.web.tag.App3_ChooseTag</tag-class>
  	<body-content>scriptless</body-content>
 </tag>
  <tag>
  	<name>App3_WhenTag</name>
  	<tag-class>cn.itcast.web.tag.App3_WhenTag</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
  	<name>test</name>
  	<required>true</required>
  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
 </tag>
  <tag>
  	<name>App3_OtherwiseTag</name>
  	<tag-class>cn.itcast.web.tag.App3_OtherwiseTag</tag-class>
  	<body-content>scriptless</body-content>
 </tag>
 <tag>
  	<name>App4_ForEachTag</name>
  	<tag-class>cn.itcast.web.tag.App4_ForEachTag</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
	  	<name>var</name>
	  	<required>true</required>
	  	<rtexprvalue>false</rtexprvalue>
  	</attribute>
  	<attribute>
	  	<name>items</name>
	  	<required>true</required>
	  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
 </tag>
 <tag>
  	<name>App5_ForEachTag</name>
  	<tag-class>cn.itcast.web.tag.App5_ForEachTag</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
	  	<name>var</name>
	  	<required>true</required>
	  	<rtexprvalue>false</rtexprvalue>
  	</attribute>
  	<attribute>
	  	<name>items</name>
	  	<required>true</required>
	  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
 </tag>
  <tag>
  	<name>App6_HTMLFilterTag</name>
  	<tag-class>cn.itcast.web.tag.App6_HTMLFilterTag</tag-class>
  	<body-content>scriptless</body-content>
 </tag>
</taglib>

应用1:防盗链标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<app:App1 site="http://127.0.0.1" page="111.jsp"/>
<html>
  <head>
    <title>应用1:防盗链标签</title>
  </head>
  <body>
  </body>
</html>
应用2:开发if标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用2:开发if标签 属性为test</title>
  </head>
  <body>
  <% session.setAttribute("user","pre_eminent"); %>
    <app:App2 test="${user==null}">
    user为空
    </app:App2>
    <app:App2 test="${user!=null}">
    user不为空
    </app:App2>
  </body>
</html>

应用3:开发if else标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用3:开发if else标签 属性为test,即choose when otherwise</title>
  </head>
  <body>
  <% session.setAttribute("user","pre_eminent"); %>
    <app:App2 test="${user==null}">
    user为空
    </app:App2>
    <app:App2 test="${user!=null}">
    user不为空
    </app:App2>
    =========================
    <app:App3_ChooseTag>
      <app:App3_WhenTag test="${user==null}">
        user为空
      </app:App3_WhenTag>
      <app:App3_OtherwiseTag>
        user不为空
      </app:App3_OtherwiseTag>
    </app:App3_ChooseTag>
  </body>
</html>
应用4:开发foreach迭代标签
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用4:开发foreach迭代标签 属性为var,items</title>
  </head>
  <body>
  <%
      List list=new ArrayList();
      list.add("林黛玉");
      list.add("薛宝钗");
      list.add("史湘云");
      request.setAttribute("list",list);
   %>
   <app:App4_ForEachTag var="str" items="${list}">
     ${str }
   </app:App4_ForEachTag>
   <hr />
  </body>
</html>
应用5:开发foreach迭代标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用5:开发foreach迭代标签 属性为var,items</title>
  </head>
  <body>
  <%
      List list=new ArrayList();
      list.add("林黛玉");
      list.add("薛宝钗");
      list.add("史湘云");
      request.setAttribute("list",list);
   %>
   <app:App5_ForEachTag var="str" items="${list}">
     ${str }
   </app:App5_ForEachTag>
   <hr />
   <%
       Map map=new LinkedHashMap();
       map.put("1","林黛玉");
       map.put("2","薛宝钗");
       map.put("3","林黛玉");
       map.put("4","林黛玉");
       request.setAttribute("map",map);
    %>
    <app:App5_ForEachTag  var="entry" items="${map}">
      ${entry.key }
      ${entry.value }
    </app:App5_ForEachTag>
   <hr />
   <%
       Integer[] arr={2,4,6,7};
       request.setAttribute("arr",arr);
    %>
    <app:App5_ForEachTag  var="i" items="${arr}">
      ${i }
    </app:App5_ForEachTag>
   <hr />
   <%
       double[] arr_d={2.1,4.1,6.1,7.1};
       request.setAttribute("arr_d",arr_d);
    %>
    <app:App5_ForEachTag  var="i" items="${arr_d}">
      ${i }
    </app:App5_ForEachTag>
  </body>
</html>
应用6:开发转义标签(即输出html源码)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/app.tld" prefix="app" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用6:开发转义标签(即输出html源码)</title>
  </head>
  <body>
 <app:App6_HTMLFilterTag>
     <a href="${pageContext.request.contextPath }/index.jsp">回到首页</a>
     &就写成了&
     "就写成了"
     <就写成了<
     >就写成了>
 </app:App6_HTMLFilterTag>
  </body>
</html>
sun公司的核心标签库c.tld
<%@ page language="java" import="java.util.*,cn.itcast.domain.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title>sun公司的核心标签库c.tld</title>
  </head>
  <body> 
    ===========c:out标签============ 
    escapeXml默认为true,表示转义后输出
     <c:out value="<a href='/day11/index.jsp'>首页</a>" escapeXml="true"></c:out>
     <% request.setAttribute("username","小强"); %>
     <c:out value="${username}" default="游客" ></c:out>
     <% request.setAttribute("username",null); %>
     <c:out value="${username}" default="游客" ></c:out>
    ===========c:set标签============
    <c:set var="username" value="史湘云" scope="page" />
     ${username }
     <%		Map map=new HashMap();
     			request.setAttribute("map",map);
      %>
    <c:set property="username" value="林黛玉" target="${map}" /> 
    ${map.username }
      <c:remove var="map" scope="request"/>
    <%		Person p=new Person();
     			request.setAttribute("p",p);
      %>
      <c:set property="name" value="薛宝钗" target="${p}"/>
      ${p.name }
      <c:remove var="p" scope="request"/>
    ===========c:catch标签将异常存在page域里============
     <c:catch var="exp">
     	<% int i= 10/0; %>
     </c:catch>
     <c:out value="${exp}" />		<br/>
     <c:out value="${exp.stackTrace}" />		<br/>
     <c:out value="${exp.cause}" />		<br/>
     <c:out value="${exp.class}" />		<br/>
     <c:out value="${exp.localizedMessage}" />
    ===========c:if标签============
    <c:if var="b" test="${username!=null}" scope="page">
    	如果为true,就执行这句
    </c:if> 
    ${b }
    ===========c:forEach标签============ 
    <c:forEach var="i" begin="0" end="11" step="1" varStatus="status">
    	${i }
    </c:forEach>
    <c:forEach var="i" begin="0" end="11" step="2" varStatus="status">
    	${status.count }表示第几次,从1开始
    </c:forEach>
    ===========c:forEach标签实现表格间色============
    首先tr:hover属性需先修改文档声明高版本的xhtml 1.0
   	<style type="text/css">	
   		.even{
   			background-color: red;
   		}
   		.odd{
   			background-color: purple;
   		}
   		tr:hover{
   			background-color: green;
   		}
   	</style>
   	<%
   		List list=new LinkedList();
   		list.add("林黛玉"); 
   		list.add("薛宝钗"); 
   		list.add("史湘云"); 
   		list.add("妙玉"); 
   		list.add("贾宝玉"); 
   		request.setAttribute("list",list);
   	%>
   	<table border="1" width="30%">
   		<c:forEach var="name" items="${list}" varStatus="status">
   			<tr class="${status.count%2==0?'even':'odd' }">
   				<td>${name }</td>
			</tr>
   		</c:forEach>
   	</table>
     ===========c:url标签============		<br/>
     <c:url value="/index.jsp" /> 		<br/>
     <c:url var="url" value="/index.jsp" />		<br/>
     ${url } 会自动加上web应用路径
     首次访问还会加上jsessionid(重构url)
     如果没有var,会直接输出到页面
     <a href="${url }" >首页</a>
     <a href="${pageContext.request.contextPath }/index.jsp" >首页</a>
     <c:url var="url" value="/index.jsp" >
     	<c:param name="country" value="中国"></c:param>
     </c:url>
     <a href="${url }" >首页</a>
     c:param标签最大好处: 对中文参数自动URL编码
     http://127.0.0.1:8080/day11/index.jsp;jsessionid=30FE8C77BED4D1DB74B7940EF98A04CA?country=%e4%b8%ad%e5%9b%bd
     
     ===========c:redirect标签跳转时自动加上web应用路径============
     <%--<c:redirect url="/index.jsp" >
     		<c:param name="country" value="中国"></c:param>
     </c:redirect>
     http://127.0.0.1:8080/day11/index.jsp?country=%e4%b8%ad%e5%9b%bd
     <c:redirect url="/index.jsp" ></c:redirect>
     http://127.0.0.1:8080/day11/index.jsp;jsessionid=454518D1AE7DC513942C5AE74FA8C7C6 
     <c:redirect url="/index.jsp" context="/day04"></c:redirect> 
     http://127.0.0.1:8080/day04/index.jsp
     <c:redirect url="http://www.baidu.com" ></c:redirect>  --%>
     ===========c:import标签用得少============ 
     ===========c:forTokens标签分割============
     <% request.setAttribute("data","林黛玉,薛宝钗,史湘云"); %>
     <c:forTokens var="name" items="${data}" delims=",">
     		${name }
     </c:forTokens> 
     ===========c:forTokens标签============ 
     <c:set var="sourceStr" value="林黛玉|薛宝钗|史湘云|探春|妙玉" />    
     原字符串:<br />
		<c:out value="${sourceStr}" />
     分割后:<br />    
     <c:forTokens var="str" items="${sourceStr}" delims="|" varStatus="status">
     		<c:out value="${status.count}" />    
    		 <c:out value="${str}" />
    		 <c:if test="${status.last}">              
  						总共被分为<c:out value="${status.count}" />段.    
  			</c:if>    
  	</c:forTokens>
     ===========核心标签描述:standard.jar/META-INF/c.tld文件============ 
  </body>
</html>

简单标签的5个应用

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/i.tld" prefix="i" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用1:简单标签输出标签体</title>
  </head>
  <body>
    <i:demo1>
    		应用1:简单标签输出标签体
    </i:demo1>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/i.tld" prefix="i" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用2:简单标签循环输出标签体</title>
  </head>
  <body>
    <i:demo2>
    		应用2:简单标签循环输出标签体
    </i:demo2>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/i.tld" prefix="i" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用3:简单标签改变标签体为大写后输出</title>
  </head>
  <body>
    <i:demo3>
 			应用3:简单标签改变标签体为大写后输出
    </i:demo3>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/i.tld" prefix="i" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <i:demo4/>
<html>
  <head>
    <title>应用4:简单标签控制整个页面是否输出</title>
  </head>
  <body>
  </body>
</html>

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/WEB-INF/i.tld" prefix="i" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>应用5:(带属性的)简单标签循环输出标签体</title>
  </head>
  <body>
    <i:demo5 count="10" date="<%=new Date() %>>">
    		应用5:(带属性的)简单标签循环输出标签体<hr/>
    </i:demo5>
	Unable to convert string "1992-12-12" to class "java.util.Date" for attribute "date": Property Editor not registered with the PropertyEditorManager
  </body>
</html>

i.tld描述文件

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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">
 <description>A tag library exercising SimpleTag handlers.</description>
 <tlib-version>1.0</tlib-version>
 <short-name>SimpleTagLibrary</short-name>
 <uri>http://www.i.com</uri>
 <tag>
  <name>demo1</name>
  <tag-class>cn.itcast.web.tag.demo1</tag-class>
  <body-content>scriptless</body-content>
 </tag>
 <tag>
  <name>demo2</name>
  <tag-class>cn.itcast.web.tag.demo2</tag-class>
  <body-content>scriptless</body-content>
 </tag>
 <tag>
  <name>demo3</name>
  <tag-class>cn.itcast.web.tag.demo3</tag-class>
  <body-content>scriptless</body-content>
 </tag>
 <tag>
  <name>demo4</name>
  <tag-class>cn.itcast.web.tag.demo4</tag-class>
  <body-content>empty</body-content>
 </tag>
 <tag>
  	<name>demo5</name>
  	<tag-class>cn.itcast.web.tag.demo5</tag-class>
  	<body-content>scriptless</body-content>
  	<attribute>
  	<name>count</name>
  	<required>true</required>
  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
  	<attribute>
  	<name>date</name>
  	<required>true</required>
  	<rtexprvalue>true</rtexprvalue>
  	</attribute>
 </tag>
</taglib>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值