1.什么是JSTL
apache对EL表达式的扩展(也就是说JSTL依赖EL)
JSTL是标签语言!
2.JSTL标签库
一共有四大标签库
core:核心标签库,学习的重点
fmt:格式化标签库
sql:数据库标签库,已经过时
xml:xml标签库,已经过时
3.使用taglib指令导入标签库
除了JSP动作标签外,使用其他第三方的标签库都需要导包
在使用标签的JSP页面中使用taglib指令导入标签库
下面是导入JSTL的core标签库
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
prefix=”c”:指定标签库的前缀,这个前缀可以随便给值,但大家都约定俗成使用c
uri=”xx”:指定标签库的uri,它不一定是真实存在的网址,但他可以让JSP找到描述他的文件
core库的c标签
- out和set
<c:out value="${a}" default="xxx" escapeXml="false"/>
-----------
<c:set var="a" value="hello" scope="request">
相当于设置request.setAttribute(”)
默认值为page,可选有page,request,session,application
remove
<c:remove var="a" scope="page"/>
如果不指定域,那就是删除所有域中为a的数据url
value:指定一个路径,会自动添加项目名
var:本来要输出的,和scope一起保存url
<c:url value="/index.jsp"/>
子标签:用来给Url后面添加参数
<c:url value="/index.jsp">
<c:param name="username" value="章"/>
可以对参数进行url编码
例子
<a href="<c:url value="/jsp/b.jsp">
<c:param name="d" value="陈"/>
</c:url>">点击到b.jsp</a>
逻辑标签
if
if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行
<c:set var="a" value="hello"/>
<c:if test="${not empty a}">
<c:out vlaue="${a}"/>
</c:if>
- choose 对应java中的if else中的else
<c:set var="score" value="${param.score}"/>
<c:choose>
<c:when test="${score>100||scope<0">错误的分数</c:when>
<c:when test="${score>=90"}>A级</c:when>
<c:when test="${score>=80"}>B级别</c:when>
<c:otherwise>...</c:otherwise>
</c:choose>
例子
访问页面时候携带参数?name=chenchenchen即可
<c:if test="${empty param.name}">
<c:out value="空"/>
</c:if>
....
<c:choose>
<c:when test="${not empty param.name}">
<c:out value="空"/>
</c:when>
<c:otherwise>
<c:out value="不空"/>
forEach
它用来循环遍历数组、集合
她还可以用来计数方式来循环
<c:forEach var="i" begin="1" end="10">
${i}</br>
</c:forEach>
当然还可以调步长
属性:
var表示循环变量
begin:设置循环变量从几开始
end:设置循环变量到几结束
step:设置步长 step=”3”
items 表示遍历谁
<c:forEach items="${strs}" var="str">
${str}<br/>
</c:forEach>
forEach中的循环状态
可以使用一个varstatus来创建循环状态变量!
count:个数
index:下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素
<%
Map map=new HashMap();
map.put("x","coco");
map.put("y","caoxi");
map.put("z","cyl");
request.setAttribute("map", map);
%>
<c:forEach items="${map}" var="e" varStatus="s">
s.count:${s.count}
s.index:${s.index}
first:${s.first}<br>
</c:forEach>
fmt标签
时间标签
<fm:formatDate value="${date }" pattern="yyyy-MM-dd HH:mm:ss"/>
Number标签
<fm:formatNumber value="3333.3346" pattern="0.00000"></fm:formatNumber>不足会补充0
<fm:formatNumber value="3333.3346" pattern="#.#####"></fm:formatNumber>不会补充
4.自定义标签
无标签体
1.步骤
标签处理类,标签也是一个对象,也需要类
tld文件,他是一个xml
页面中使用<%@taglib%>来指定tld文件的位置2.标签处理类
SimpleTag接口
void doTag():每次执行标签都会调用这个方法
JspTag getParent() 返回父标签
void setParent(JspTag) 设置父标签
void setJspBody(JspFragment) 设置标签体
void setJspContext(JspContext) 设置JSP上下文对象,它儿子是pageContext例子
类
public class MyTag implements SimpleTag {
private PageContext pageContext;
private JspFragment body;
@Override
public void doTag() throws JspException, IOException {
pageContext.getOut().print("这是陈陈的标签");
}
@Override
public JspTag getParent() {
return null;
}
@Override
public void setJspBody(JspFragment jspbody) {
this.body=jspbody;
}
@Override
public void setJspContext(JspContext jspcontext) {
this.pageContext=(PageContext)jspcontext;
}
@Override
public void setParent(JspTag arg0) {
}
}
zidingyi.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">
<tlib-version>1.0</tlib-version>
<short-name>coco</short-name>
<uri>http://chenyalan/2017/tld"</uri>
<tag>
<name>myT</name>
<tag-class>com.cn.jstl.MyTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>
jsp
引入
<%@ taglib prefix="c" uri="/WEB-INF/tlds/zidingyi.tld"%>
<c:myT/>
输出:这是陈陈的标签
还有另外一个继承类
public class MyTag2 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
this.getJspContext().getOut().print("接口");
}
}
有标签体
标签体内容
empty:无标签体
JSP:jsp2.0已经不再支持这个类型了
scriptless:只能是el表达式,也可以是其他的标签
tagdependent:标签体内容不会被执行,而是直接被赋值给标签处理类MyTag3.java
public class MyTag3 extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
Writer out=this.getJspContext().getOut();//获取当前Jsp页面的输出流
out.write("*********************************<br>");
this.getJspBody().invoke(out);
out.write("<br>*********************************<br>");
}
}
继续在tld添加
<tag>
<name>myT3</name>
<tag-class>com.cn.jstl.MyTag3</tag-class>
<body-content>scriptless</body-content>
</tag>
jsp
<%
request.setAttribute("xxx","zzz");
%>
<c:myT3>
${xxx}
</c:myT3>
不执行标签下面的标签
如果想在执行了自定义标签后,不再执行JSP页面下面的东西,那么就需要在doTag()方法中使用SkipPageException
throw new SkipPageException();
自定义标签之有属性的标签
步骤
1.给你的标签处理类添加属性
2.在tld文件中对属性进行配置类
public class MyTag4 extends SimpleTagSupport{
private boolean test;
public void setTest(boolean test){
this.test=test;
}
@Override
public void doTag() throws JspException, IOException {
if(test){
this.getJspBody().invoke(null); //如果传递的输出为null,表示使用的就是当前的out
}
}
}
继续在tld里添加
<tag>
<name>myT4</name>
<tag-class>com.cn.jstl.MyTag4</tag-class>
<body-content>scriptless</body-content>
<!-- 开始部署属性 -->
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
jsp中使用
<c:myT4 test="${empty param.xxx}">
<br>dddddd
</c:myT4>
结果
xxxdds 接口
dddddd