day13内容
1、JSTL标签库
jstl是apache对EL表达式的扩展,依赖EL
使用jstl需要导入jstl1.2.jar
jstl标签库中四大库
core:核心标签库
fmt:格式化标签库 日期、数字
sql: 过时
xml: 过时
使用前先通过taglib导入标签库。
在jsp页面中:<%taglib prefix="前缀 "uri="路径"%>
2、core库 –> c标签
1) 输出:
value : 可以是字符串常量,也可以是EL表达式
default: 当要输出的内容是null时,输出默认值
escapexml:为true时,将自动转义
<c:out value="${aaa}" default="xxx" escopexml="true"/>
2) 设置域的属性
var变量名
value:变量值
scope:域,默认为page。 可选值为四大域。
3)remove 删除域属性
var:变量名
scope: 表示删除所有域中指定名称的变量。指定域后范围为指定域
4)url:
value:指定一个路径,在路径前自动添加项目名。但必须以"/"开头
param: 表示给url后添加参数
var: 指定变量名。url将不会输出到页面中
5)if: 与java中用法相同。
6)choose:对应java中的if/else if/else语句
例如: 对应的if/else结构:
<c:choose> if(...){
<c:when test="">...</c:when> } else if{
<c:when test="">...</c:when> } else if{
<c:when test="">...</c:when> } ...
<c:otherwise>...</c:otherwise> else{...}
</c:choose>
7)forEach:
1)可以用计数方式来循环
属性:
var:设置循环遍历
begin:设置起始值
end: 结束值
step:设置步长 等同于java中的 i++或i+=2 等。
items: 指定循环谁,可以是数组或集合。
计数方式:
<c:forEach var="i" begin="1" end="10">
${i} // i从1开始 到10结束。
</c:forEach>
2)用来循环遍历数组、集合
String[] strs = {"one","two"}; //创建数组
request.setAttribute("strs",strs); //设置属性,存放数组
<c:forEach items="${strs}" var="str"> //遍历,相当于增强for
${str}
</c:forEach>
varStatus : 循环状态 可以设置循环状态。
count:已遍历元素个数
index:当前元素下标
first 是否为第一个元素
last:是否为最后一个元素
current:表示当前项目 Object类型
eg:<c:forEach items="${strs}" var="str" varStatus="vs">
${vs.index} ${vs.count}
</c:forEach>
3、fmt库 格式化输出
<fmt: formatDate value="" pattern="">
value:指定一个Date类型的变量
pattern:用来指定输出的模板! 例如: yyyy-MM-dd
<fmt: formatNumber value="" pattern="0.00">
pattern表示四舍五,保留两位数。
4、自定义标签过程
步骤:
1)定义标签处理类 继承SimpleTagSupport
2)配置tld文件,是一个xml文件
3)在jsp页面中使用<%@taglib%> 来指定文件位置。
标签处理类介绍
simpleTag接口:
void doTag(): 每次执行标签时都会调用
JspTag getParent():返回父标签
void setParent(JspTag):设置父标签
void setJspBody(JspFragment):设置标签体
void setJspContext(JspContext):设置jsp上下文对象,儿子是Pagecontext。
示例一:自定义标签(无标签体)
1)设置标签处理类:
1)继承SimpleTagSupport
2)在setJspContext(JspContext context) 中
//保存传过来的pagecontext
this.pagecontext = (PageContext) context;
3)在setJspBody(JspFragment body) 中
//保存传过来的body
this.body = body;
2)配置tld文件。
tld一般放在WEB-INF之下,保证客户端访问不到。
<tag>
<name>myTag1</name> //指定当前标签的名称
<tag-class>/tag/MyTag1.java</tag-class> //指定当前标签的标签处理类
<body-content>empty</body-content> // 指定标签体的类型。这里使用空标签
</tag>
3)在jsp页面中指定文件位置
<%@ taglib prefix="it" uri="/WEB-INF/tlds/tags.tld"%>
prefix 为前缀。 uri 路径
4)在jsp中使用标签。
<body>
<h1><it:myTag1/> </h1> 使用prefix定义的前缀:和tld文件中的标签名称
</body>
示例二:自定义标签(有标签体)
标签体内容:
empty: 无标签体
scriptless: 只能是EL表达式,也可以是其他的标签。
tagdependent:标签体内容不会被执行,而是直接赋值给标签处理类。
1)定义标签处理类:
public void doTag() throws JspException, IOException {
//获取当前jsp页面的输出流。
Writer out = this.getJspContext().getOut();
out.write("**** TAG 3 ****");
//得到标签体 ,执行标签体内容,把结果写到指定的流中
this.getJspBody().invoke(out);
}
2)配置tld文件
<tag>
<name>myTag3</name>
<tag-class>tag.MyTag3</tag-class>
<body-content>scriptless</body-content> //表示含有标签体
</tag>
3)在jsp页面中指定文件位置
4)在jsp中使用标签
<body>
<%
request.setAttribute("xxx", "张三"); //向request域中存放属性
%>
<it:myTag3>我是TAG3</it:myTag3> //执行内容标签体
<it:myTag3>${xxx} </it:myTag3> //执行内容为EL表达式的标签体
</body>
SkipPageException异常:
在doTag()方法下抛出此异常,在执行完自定义标签后,不再执行jsp页面下的东西。
public void doTag() throws JspException, IOException {
//得到已传递的JSP对象。得到用于输出的out内置对象 ,调用print方法输出
this.getJspContext().getOut().print("**** TAG 4 ****");
throw new SkipPageException; //抛出此异常,后面的将不执行
}
示例三:设置带标签属性的标签体。
步骤:
1)在标签处理类中添加属性
属性至少含有setXxx()方法
2)在tld文件中配置属性。
3)在jsp中使用
1)添加属性 test
private boolean test;
//此方法将由tomcat调用,并在daTag()之前
public void setTest(boolean test){
this.test = test;
}
2)在tld文件中配置
<tag>
<name>myTag4</name> //指定当前标签的名称
<tag-class>/tag/MyTag4.java</tag-class> //指定当前标签的标签处理类
<body-content>scriptless</body-content> // 指定标签体的类型
<tag>
<attribute> //属性标签
<name>test</name> //指定属性名
<required>true</required> //指定属性是否必须存在
<rtexprvalue>true</rtexprvalue> //指定是否可以使用EL表达式
</attribute>
</tag>
3)在jsp页面中指定文件位置
4)在jsp中使用
//属性test必须有值(在tld中设置的)
<it:myTag4 test="${empty param.xxx} }"></it:myTag4>