jsp操作bean的标签+EL表达式+JSTL标签
App3_WhenTag
App4_ForEachTag
App6_HTMLFilterTag
简单标签应用1
简单标签应用3
简单标签应用4
传统标签演示
应用1:防盗链标签
应用3:开发if else标签
简单标签的5个应用
i.tld描述文件
<%@ 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>