JSP——JSTL语法总结
一、JSTL概述:
1、什么是JSTL?
- JSTL 全名为 JavaServer Pages Standard Tag Library, 它主要提供给开发人员一个标准通用的标签函数库。
2、JSTL的作用:
- Web程序开发人员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序的做法,以提高程序可读性、维护性和方便性。
3、JSTL所提供的标签函数库主要分为五大类:
- 核心标签库 (Core tag library)
- SQL 标签库 (SQL tag library)
- I18N 格式标签库 (internationalization )
- XML 标签库 (XML tag library)
- 函数标签库 (Functions tag library)
其中核心标签库是最常用的,这里只总结下核心标签库。
4、使用标签的方法:
<%@taglib tagdir/uri="标签位置" prefix="缩略名"%>
JSTL | 前缀 | URI | 范例 |
---|---|---|---|
核心标签库 | c | http://java.sun.com/jsp/jstl/core | <c:out> |
SQL标签库 | sql | http://java.sun.com/jsp/jstl/sql | <sql:query> |
I18N 标签库 | fmt | http://java.sun.com/jsp/jstl/fmt | <fmt:formatDate> |
XML标签库 | xml | http://java.sun.com/jsp/jstl/xml | <x:forBach> |
函数标签库 | fn | http://java.sun.com/jsp/jstl/functions | <fn:split> |
例 (使用核心标签库):
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
二、JSTL核心标签库:
JSTL的核心标签库(Core)主要操作有:表达式操作、流程控制和迭代操作。
1、表达式操作:
表达式操作主要有四种:<c:out>
、<c:set>
、<c:remove>
、<c:catch>
1. <c:out>
<c:out>
主要用来显示数据的内容,等效于<%= scripting-language %>
例:
Hello ! <c:out value="${username}" />
语法:
1:没有本体(body)内容
<c:out value=“value” [escapeXml=“{true|false}”]
[default=“默认值"] />
2:有本体内容
<c:out value="value" [escapeXml="{true|false}"]>
默认值
</c:out>
其中
2. <c:set>
<c:set>
用来将变量储存至 JSP 范围中或 JavaBean 的属性中。
语法:
1:将value的值存至范围为scope的varName变量之中
<c:set value="value" var="varName"
[scope="{ page|request|session|application }"]/>
若value为null时:将由储存变量改为移除变量
2:将本体内容存至范围为scope的varName变量之中
<c:set var="varName"
[scope="{ page|request|session|application }"]>
本体内容
</c:set>
3:将 value 的值储存至 target 对象的属性中
< c:set value="value" target=“${target}"
property="propertyName" />
若value为null时,则property 指定的属性为null
4:将本体内容的数据储存至 target 对象的属性中
<c:set target="target" property="propertyName">
本体内容
</c:set>
target常见为JavaBeans类型
target为null或不是JavaBean类型,将产生异常。
其中
3. <c:remove>
<c:remove>
主要用来移除变量
语法:
<c:remove var="varName"
[scope="{ page|request|session|application }"] />
若不设定 scope,则<c:remove>
将会从 Page、 Request、Session 及 Application 中顺序寻找是否存在名称为 var值 的数据,若能找到时, 则将它移除掉,反之则不会做任何的事情。
4、<c:catch>
<c:catch>
主要用来处理产生错误的异常状况,并且将错误信息储存起来。
语法:
<c:catch [var="varName"] >
欲抓取错误的部分
</c:catch>
<c:catch>
将可能发生错误的部分放在<c:catch>
和</c:catch>
之间。如果真的发生错误,可以将错误信息储存至varName变量中,例如:
<c:catch var="message">
可能发生错误的部分
</c:catch>
当错误发生在<c:catch>
和</c:catch>
之间时,只有<c:catch>
和</c:catch>
之间的程序会被中止忽略,但整个网页不会被中止。
2、程序流程控制:
1. <c:if>
语法 1:没有本体内容(body)
<c:if test="testCondition" var="varName"
[scope="{page|request|session|application}"]/>
语法 2:有本体内容
<c:if test="testCondition" [var="varName"]
[scope="{page|request|session|application}"]>
具体内容
</c:if>
属性:
2. <c:choose>
<c:choose>
本身只当做<c:when>
和<c:otherwise>
的父标签。
语法:
<c:choose>
本体内容( <when> 和 <otherwise> )
</c:choose>
<c:choose>的本体内容只能有:
- 空白
- 1 或多个 <c:when>
- 0 或1个 <c:otherwise>
说明:
使用<c:when>
和<c:otherwise>
做流程控制时,两者都必须为<c:choose>
的子标签。
即:
<c:choose>
<c:when> … </c:when>
<c:otherwise> … </c:otherwise>
</c:choose>
3. <c:when>
- <c:when> 表示当满足某一条件时执行本体内容。
语法:
<c:when test="testCondition" >
本体内容
</c:when>
限制:
<c:when>
必须在<c:choose>
和</c:choose>
之间。- 在同一个
<c:choose>
中,<c:when>
必须在<c:otherwise>
之前。
说明:
- <c:when>必须有 test 属性,当 test 中的表达式结果为 true 时,则会执行本体内容;如果为false 时,则不会执行。
3. <c:otherwise>
- 在同一个 <c:choose> 中,当所有 <c:when> 的条件都没有成立时,则执行 <c:otherwise> 的本体内容 。
语法:
<c:otherwise>
本体内容
</c:otherwise>
限制:
<c:otherwise>
必须在<c:choose>
和</c:choose>
之间- 在同一个
<c:choose>
中时,<c:otherwise>
必须为最后标签
说明:
- 在同一个
<c:choose>
中,假若所有<c:when>
的 test 属性都不为 true 时,则执行<c:otherwise>
的本体内容
3、迭代操作:
1. <c:forEach> :
<c:forEach>
为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。运行方式为当条件符合时,就会持续重复执行<c:forEach>
的本体内容 。
语法 1:迭代一集合对象的所有成员
<c:forEach [var="varName"] items="collection" [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>
本体内容
< /c:forEach>
语法 2:迭代指定的次数
<c:forEach [var="varName"] [varStatus="varStatusName"] begin="begin" end="end" [step="step"] >
本体内容
</c:forEach>
其中
限制:
- 假若有 begin 属性时,begin 必须大于等于 0。
- 假若有 end 属性时,必须大于 begin。
- 假若有 step 属性时,step 必须大于等于 0。
Null 和 错误处理:
- 假若items为null时,则表示为一空的集合对象。
- 假若begin大于或等于items大小时,则迭代不运算。
说明:
- 如果要循序浏览一个集合对象,并将它的内容显示出来,就必须有 items 属性。
2. <c:forTokens>:
- <c:forTokens> 用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。
语法:
<c:forTokens items="stringOfTokens"
delims="delimiters" [var="varName"]
[varStatus="varStatusName"] [begin="begin"]
[end="end"] [step="step"] >
本体内容
</c:forTokens>
其中:
限制:
- 假若有begin属性时,begin 必须大于等于 0。
- 假若有end属性时,必须大于 begin。
- 假若有step属性时,step 必须大于等于 0。
Null 和 错误处理:
- 若items为null时,则表示为一空的集合对象。
- 若begin大于或等于items的大小时,则迭代不运算。
说明:
- items的内容必须为字符串;而 delims 是用来分割items中定义的字符串之字符。
例子:
1、使用核心标签库输入输出方法:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> //插入使用通用标签的指令
<body>
<c:set var= "example" value="${100+1}" scope="session" /> //set 标签用于给变量设置值和作用域
<c:out value="${example}"/> //out 标签显示值的结果
<c:remove var= "example" scope="session"/> //remove 标签用于删除具有作用域的变量
</body>
2、使用核心标签库访问JavaBean
- 创建JavaBean类Student,包含属性name和age。创建JSP页面,在其中访问JavaBean,且使用核心标签库设置属性值和读取属性值。
<%@page import="cn.javabean.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL</title>
</head>
<body>
<jsp:useBean id="stu" class="cn.javabean.Student" scope="page"></jsp:useBean>
<c:set value="赵五" target="${stu}" property="name"></c:set>
<c:set target="${stu}" property="age">19</c:set>
<c:set value="张三" var="name1" scope="session"></c:set>
<c:set var="name2" scope="session">李四</c:set>
从Bean中获取对象person的name值:
<c:out value="${stu.name}"></c:out>
<br /> 从Bean中获取对象person的age值:
<c:out value="${stu.age}"></c:out>
<hr />
从session中得到的值:${sessionScope.name1}
<br /> 从session中得到的值:${sessionScope.name2}
</body>
</html>
🆗,JSTL的语法知识大致就这么多。