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() 移除首尾的空白符
posted @ 2020-05-01 17:48  念月_xy  阅读(535)  评论(0编辑  收藏  举报