一、jstl标签库
1.JSTL概述
apache提供的,依赖EL,导入jstl-1.2.jar
四大库:
core:核心库!!!
fmt:格式化:日期、数字
sql:过时了
xml:过时了
2.导入标签库
jar包
在jsp页面中格式:<%@taglib prefix="前缀" uri="路径"%>
3.core --> c标签
(1)out和set
<c:out>输出
value:可以是字符串常量,也可以是EL表达式
default:当要输出的内容为null时,会输出指定default的值
escapeXml:默认值为true,表示转义
<c:set>设置
var:变量名
value:变量值,可以是EL表达式
scope:域,默认值为page!!!!
(2)remove
<c:remove>:删除域变量
var:变量名
scope:如果不给出scope,删除所有xxx,如果给出scope,删除指定域的xxx
(3)url
value:指定一个路径,它会在路径前面自动添加项目名
<c:url value="/index.jsp"/>,它会自动输出/.../index.jsp
子标签:<c:param>,用来给url后面加参数,例如:
<c:url value="/index.jsp">
<c:param name="username" value="张三"/> <!--可以对参数进行url编码-->
</c:url>
结果为:/.../index.jsp?username=%ED%J7%Q1%V7%Z7%Q2
var:指定变量名,一旦添加了这个属性,那么url标签就不会再输出到页面,而是把生成的url保存到域中
scope:它与var一起使用,用来保存url
(4)if:对应java中的if语句
<c:if test="布尔类型">...</c:if>,当test为真时,执行标签体内容
(5)choose:它对应java中的jf..else if...else....
<c:choose>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:when test="">...</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
(6)forEach
它用来循环数组,集合,还可以用计数方式来循环
for ( int i=0 ; i < 10 ; i++){
}
----->
<c:forEach var="i" begin="1" end="10" step="2"> step:设置步长
${i}
</c:forEach>
for(String str:s){
}
----->
<c:forEach items="${s}" var="str">
${str}
</c:forEach>
循环状态:
可以使用varStatus来创建循环状态变量
有如下属性:
count:循环元素的个数
index:循环元素的下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素
<c:forEach items="${list}" var="element" varStatus="vs">
${element}<br/>${vs.last}
</c:forEach>
4.fmt库
它是格式化库
<fmt:formatDate value="" pattern=""/>
value:指定一个Date类型的变量
pattern:指定输出的模板,例如:yyyy-MM-dd HH:mm:ss
<fmt:formatNumber value="${num1}" pattern="0.00">
保留小数点后两位(会四舍五入),如果不足位数,则补0
<fmt:formatNumber value="${num1}" pattern="#.##">
保留小数点后两位(会四舍五入),如果不足位数,不补0
5.自定义标签
(1)步骤
标签处理类(标签也是一个对象,那么首先需要有类)
tld文件,它是一个xml
页面中使用<%@taglib%>来指定tld文件的位置
(2)标签处理类
SimpleTag接口
void doTag():每次执行标签时都会调用这个方法
JspTag getParent():返回父标签(非生命周期方法)
void setParent(JspTag):设置父标签
void setJspBody(JspFragment):设置标签体
void setJspContext(JspContext):设置jsp上下文对象,它儿子是pageContext
其中doTag()会在其他三个方法之后被调用
3.配置tld文件
tld文件一般都放在WEB-INF之下,这样保证客户端访问不到
<taglib version="2.1" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd">
<tlib-version>1.0</tlib-version>
<short-name>a</short-name>
<uri>http://hpsyche/tags/1.0</uri>
<tlib-version>1.0</tlib-version>
<short-name>a</short-name>
<uri>http://hpsyche/tags/1.0</uri>
<tag>
<name>myTag1</name> //标签名称
<tag-class>MyTag1</tag-class> //标签处理类
<body-content>empty</body-content> //空标签
</tag>
</taglib>
4.页面中指定tld文件位置
<%@ taglib prefix="it" uri="http://hpsyche/tags/1.0"%>
5.进阶
标签体内容
empty:无标签
JSP:jsp2.0已经不再支持这个类型了,表示标签体可以是java脚本、标签、el表达式
scriptless:只能是el表达式,也可以是其他的标签
不再执行标签下面内容的标签:
在标签处理类中的doTag()中使用SkipPageException来结束
Tomcat会调用标签处理类的doTag()方法,然后tomcat得到SkipPageException,它会跳过本页面的其他内容
标签属性:
步骤:
1.为标签处理类添加属性,属性至少要有一个set方法,这个set方法会在doTag之前会被tomcat调用,所以在doTag就可以使用属性了
2.在tld文件对属性进行配置
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
注意:this.getJspBody().invoke(null);
//和this.getJspBody().invoke(this.getJspContext().getOut())功能一致,都是输出本身
二、问题
在自定义标签那里调试了很久,一直出现MyTag cannot be resolved to a type 错误
最后发现直接把MyTag文件放在src下是不可以的,需要将其放在src下的文件夹下。