JAVA 之 JSTL
一、什么是JSTL
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
二、JSTL的安装
从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)
官方下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
下载 jakarta-taglibs-standard-1.1.2.zip 包并解压,将 jakarta-taglibs-standard-1.1.2/lib/ 下的两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下。
将 tld 下的需要引入的 tld 文件复制到 WEB-INF 目录下。
三、核心标签库
引用核心标签库语法
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
1、<c:out>标签
<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似。
语法格式
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
value:要输出的值 default:默认值 escapeXml:是否忽略xml特殊字符
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <body> <c:out value="<h1>要显示的数据对象</h1>" escapeXml="true" default="默认值"></c:out><br/> <c:out value="<h1>要显示的数据对象</h1>" escapeXml="false" default="默认值"></c:out><br/> <c:out value="${null}" default="默认值" escapeXml="false"></c:out><br/> </body> </html>
2、<c:set>标签
<c:set>标签用于设置变量值和对象属性。
语法格式:
<c:set var="<string>" value="<string>" target="<string>" property="<string>" scope="<string>"/>
var:存储信息的变量 value:要存储的值 target:要修改属性所属对象 property:要修改的属性 scope:var属性的作用域 默认page
<%@ page import="cn.xy.model.User" %> <%@ page import="java.util.Map" %> <%@ page import="java.util.HashMap" %> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <body> <%-- <c:set>给bean赋值--%> <% User user = new User(); pageContext.setAttribute("user",user); %> <c:set property="name" value="zero" target="${pageScope.user}"></c:set> name=${user.name}<br> <%--<c:set>给map赋值 --%> <% Map<String,String> map=new HashMap(); pageContext.setAttribute("map", map); %> <c:set property="name" value="zero" target="${map}"></c:set> <c:set property="age" value="20" target="${map}"></c:set> map=${map }<br> name=${map.name }<br> age=${map.age }<br>
<c:set var="num" value="200*4" ></c:set>
num=${num}
</body> </html>
3、<c:remove>标签
<c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
语法格式:
<c:remove var="<string>" scope="<string>"/>
var:要移除的变量名 scope:变量所属的作用域
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <body> <c:set var="name" value="req zero" scope="request"></c:set> <c:set var="name" value="page zero" scope="page"></c:set> <c:set var="name" value="session zero" scope="session"></c:set> <c:set var="name" value="application zero" scope="application"></c:set> 删除指定域空间中的指定变量<br> <c:remove var="name" scope="request"/> name_request=${requestScope.name }<br> name_page=${pageScope.name }<br> name_session=${sessionScope.name }<br> name_application=${applicationScope.name }<br> <br> ----------------------------- <br> 删除所有域中的属性值<br> <c:remove var="name"/> name_request=${requestScope.name}<br> name_page=${pageScope.name }<br> name_session=${sessionScope.name }<br> name_application=${applicationScope.name }<br> </body> </html>
4、<c:catch>标签
<c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。
语法格式:
<c:catch var="<string>"> ... </c:catch>
var:用来存储错误信息的变量
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <body> <c:catch var ="catchException"> <% int x = 5/0; %> </c:catch> <c:if test = "${catchException != null}"> <p>异常为 : ${catchException} <br /> 发生了异常: ${catchException.message}</p> </c:if> </body> </html>
5、<c:if>标签
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
语法格式:
<c:if test="<boolean>" var="<string>" scope="<string>"> ... </c:if>
test:条件 var:存储结果的变量 scope:var的作用域
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <body> <c:set var="salary" scope="session" value="${2000*2}"/> <c:if test="${salary > 2000}"> <p>我的工资为: <c:out value="${salary}"/><p></c:if> </body> </html>
6、<c:choose>, <c:when>, <c:otherwise> 标签
<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。
语法格式:
<c:choose> <c:when test="<boolean>"> ... </c:when> <c:when test="<boolean>"> ... </c:when> ... ... <c:otherwise> ... </c:otherwise> </c:choose>
test:条件
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <body> <c:set var="salary" scope="session" value="${2000*2}"/> <c:choose> <c:when test="${salary}<=1000"> 难搞哦 </c:when> <c:when test="${salary}>1000 && ${salary}<=3500"> 勉强能过 </c:when> <c:otherwise> 还行 </c:otherwise> </c:choose> </body> </html>
7、<c:forEach> 标签
<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。
语法格式:
<c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> ... </c:forEach>
items:要循环的信息 begin:开始的元素 end:最后一个元素 step:每次迭代的步长 var:代表当前条目的变量名称 varStatus:代表循环状态的变量名称
<%@ page import="java.util.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> ---------遍历LIST-----------<br> <% List<String> names = new ArrayList<String>(); names.add("zero 001"); names.add("zero 002"); names.add("zero 003"); pageContext.setAttribute("names",names); %> <c:forEach items="${names}" var="name"> ${name}<br> </c:forEach> <br> ---------遍历set-----------<br> <% Set<String> address = new HashSet<String>(); address.add("四川"); address.add("重庆"); address.add("北京"); pageContext.setAttribute("address",address); %> <c:forEach items="${address}" var="addr"> ${addr}<br> </c:forEach> <br> ---------遍历map-----------<br> <% Map<String,String> maps = new HashMap<>(); maps.put("name","zero"); maps.put("sex","男"); maps.put("address","四川"); pageContext.setAttribute("maps",maps); %> <c:forEach items="${maps}" var="map"> ${map}<br> </c:forEach> <br> ---------遍历数组-----------<br> <% String[] hobbies ={"music","games","read"}; pageContext.setAttribute("hobbies",hobbies); %> <c:forEach items="${hobbies}" var="hobby"> ${hobby}<br> </c:forEach> </body> </html>
<%@ page import="java.util.*" %> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> ---------遍历LIST-----------<br> <% List<String> names = new ArrayList<String>(); names.add("zero 001"); names.add("zero 002"); names.add("zero 003"); names.add("zero 004"); names.add("zero 005"); names.add("zero 006"); pageContext.setAttribute("names",names); %> <c:forEach items="${names}" var="name" begin="1" step="2"> ${name}<br> </c:forEach> <br> </body> </html>
<%@ page import="java.util.*" %> <%@ page import="cn.xy.model.User" %> <%@ page import="cn.xy.service.UserService" %> <%@ page import="cn.xy.service.impl.UserServiceImpl" %> <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> <meta charset="utf-8"> <title>JSTL</title> </head> <% UserService userService = new UserServiceImpl(); List<User> users=userService.findAll(); pageContext.setAttribute("users",users); %> <table> <tr> <th>序号</th> <th>id</th> <th>姓名</th> <th>密码</th> <th>性别</th> <th>爱好</th> </tr> <!-- varStatus:处理一些域行数相关的功能(vs.count\vs.first\vs.last\vs.index) --> <c:forEach items="${users }" var="user" varStatus="vs"> <tr > <td align="center">${vs.count }</td> <td align="center">${user.id}</td> <td align="center">${user.name}</td> <td align="center">${user.password}</td> <td align="center">${user.sex}</td> <td align="center">${user.hobby}</td> </tr> </c:forEach> </table> </body> </html>
8、<c:forTokens> 标签
<c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
语法格式:
<c:forTokens items="<string>" delims="<string>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> </c:forTokens>
items:要循环的信息 delims:分隔符 begin:开始的元素 end:最后一个元素 step:每次迭代的步长 var:代表当前条目的变量名称 varStatus:代表循环状态的变量名称
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta charset="utf-8">
<title>JSTL</title>
</head>
<c:forTokens items="java-c-python-go-C++-js" delims="-" var="name">
${name}<br>
</c:forTokens>
</body>
</html>
9、<c:redirect>标签
<c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签
语法格式:
<c:redirect url="<string>" context="<string>"/>
10、<c:param>、<c:url>标签
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。
这个标签在需要的时候会自动重写URL。
var属性用于存储格式化后的URL。
<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。
语法格式:
<c:url var="<string>" scope="<string>" value="<string>" context="<string>"/>
<c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。
在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。
语法格式:
<c:param name="<string>" value="<string>"/>
四、格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
标签 | 描述 |
---|---|
<fmt:formatNumber> | 使用指定的格式或精度格式化数字 |
<fmt:parseNumber> | 解析一个代表着数字,货币或百分比的字符串 |
<fmt:formatDate> | 使用指定的风格或模式格式化日期和时间 |
<fmt:parseDate> | 解析一个代表着日期或时间的字符串 |
<fmt:bundle> | 绑定资源 |
<fmt:setLocale> | 指定地区 |
<fmt:setBundle> | 绑定资源 |
<fmt:timeZone> | 指定时区 |
<fmt:setTimeZone> | 指定时区 |
<fmt:message> | 显示资源配置文件信息 |
<fmt:requestEncoding> | 设置request的字符编码 |
五、SQL标签
JSTL SQL标签库提供了与关系型数据库(Oracle,MySQL,SQL Server等等)进行交互的标签。引用SQL标签库的语法如下:
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
标签 | 描述 |
---|---|
<sql:setDataSource> | 指定数据源 |
<sql:query> | 运行SQL查询语句 |
<sql:update> | 运行SQL更新语句 |
<sql:param> | 将SQL语句中的参数设为指定值 |
<sql:dateParam> | 将SQL语句中的日期参数设为指定的java.util.Date 对象值 |
<sql:transaction> | 在共享数据库连接中提供嵌套的数据库行为元素,将所有语句以一个事务的形式来运行 |
六、XML 标签
JSTL XML标签库提供了创建和操作XML文档的标签。引用XML标签库的语法如下:
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
标签 | 描述 |
---|---|
<x:out> | 与<%= ... >,类似,不过只用于XPath表达式 |
<x:parse> | 解析 XML 数据 |
<x:set> | 设置XPath表达式 |
<x:if> | 判断XPath表达式,若为真,则执行本体中的内容,否则跳过本体 |
<x:forEach> | 迭代XML文档中的节点 |
<x:choose> | <x:when>和<x:otherwise>的父标签 |
<x:when> | <x:choose>的子标签,用来进行条件判断 |
<x:otherwise> | <x:choose>的子标签,当<x:when>判断为false时被执行 |
<x:transform> | 将XSL转换应用在XML文档中 |
<x:param> | 与<x:transform>共同使用,用于设置XSL样式表 |
七、JSTL函数
JSTL包含一系列标准函数,大部分是通用的字符串处理函数。引用JSTL函数库的语法如下:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
函数 | 描述 |
---|---|
fn:contains() | 测试输入的字符串是否包含指定的子串 |
fn:containsIgnoreCase() | 测试输入的字符串是否包含指定的子串,大小写不敏感 |
fn:endsWith() | 测试输入的字符串是否以指定的后缀结尾 |
fn:escapeXml() | 跳过可以作为XML标记的字符 |
fn:indexOf() | 返回指定字符串在输入字符串中出现的位置 |
fn:join() | 将数组中的元素合成一个字符串然后输出 |
fn:length() | 返回字符串长度 |
fn:replace() | 将输入字符串中指定的位置替换为指定的字符串然后返回 |
fn:split() | 将字符串用指定的分隔符分隔然后组成一个子字符串数组并返回 |
fn:startsWith() | 测试输入字符串是否以指定的前缀开始 |
fn:substring() | 返回字符串的子集 |
fn:substringAfter() | 返回字符串在指定子串之后的子集 |
fn:substringBefore() | 返回字符串在指定子串之前的子集 |
fn:toLowerCase() | 将字符串中的字符转为小写 |
fn:toUpperCase() | 将字符串中的字符转为大写 |
fn:trim() | 移除首尾的空白符 |