1.JSTL介绍

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。


2.JSTL的使用及分类

要使用JSTL,首先要先下载好jar包,点击这里进行下载,下载好后,导入项目的WEN-INF的lib目录下即可,当然,要在jsp中使用JSTL,还得使用@taglib标签,不过不同的分类情况不一样,下面我们来看看JSTL标签的分类。

可以分为4大类和JSTL函数

  • 核心标签
  • 格式化标签
  • SQL标签
  • XML标签
  • JSTL函数

本文主要介绍核心标签和JSTL函数。


3.五类标签的简介

核心标签:

在JSP文件开头使用如下语法

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

JSTL核心标签超详细_总结

格式化标签:

在JSP文件开头使用如下语法

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

JSTL核心标签超详细_JavaWeb_02

SQL标签:

在JSP文件开头使用如下语法

<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>

JSTL核心标签超详细_网站_03

XML标签:

在JSP文件开头使用如下语法

<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

JSTL核心标签超详细_总结_04

JSTL函数:

在JSP文件开头使用如下语法

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

JSTL核心标签超详细_网站_05

下面正式开始介绍核心标签。


4.JSTL核心标签

核心标签库共有14个标签,从功能上分为4类

  • 表达式控制标签:out,set,remove,catch
  • 流程控制标签:if,choose,when,otherwise
  • 循环标签:forEach,forTokens
  • URL操作标签:import,url,redirect,param

下面开始一个一个介绍。都配代码。

1. out标签的用法

用于在JSP中显示数据,就像<%= … >
JSTL核心标签超详细_JavaWeb_06

<!-- 直接输出常量 -->
<c:out value="第一个JSTL小程序"></c:out>
<% 
    String name = "CodeTiger"; 
    request.setAttribute("name", name); 
%>
<!-- 使用default属性 ,当name1的属性为空时,输出default属性的值--> 
<c:out value="${name1}" default="error"></c:out><br> 
<!-- 使用escapeXml属性,设置是否对转义字符进行转义,默认为true不转义 --> 
<c:out value="&lt;CodeTiger&gt;" escapeXml="false"></c:out><br>

输出

第一个JSTL小程序 
error
<CodeTiger>

2.set标签的用法

用于保存数据
JSTL核心标签超详细_网站_07

<!-- 通过set标签存值到scope中,其中var是变量的名称,value是变量的值,scope表示把变量存在哪个scope中 --> 
<c:set var="person1" value="CodeTiger" scope="page"></c:set> 
<c:out value="${person1}"></c:out><br> 
<!-- 也可以把value的值放在两个标签之间 --> 
<c:set var="person2" scope="session">liu</c:set> 
<c:out value="${person2}"></c:out><br>

<!-- 通过set标签为JavaBean里的属性赋值 ,首先创建一个JavaBean-->
<c:set target="${people}" property="username" value="CodeTiger"></c:set> 
<c:set target="${people}" property="address" value="NJUPT"></c:set> 
<c:out value="${people.username}"></c:out>&nbsp;&nbsp; 
<c:out value="${people.address}"></c:out><br>

输出

CodeTiger
liu
CodeTiger   NJUPT



3.remove标签的用法

用于删除数据
JSTL核心标签超详细_Java学习之旅_08

<!-- remove标签的用法 --> 
<c:set var="firstName" value="xiaop"></c:set> 
<c:out value="${firstName}"></c:out> 
<c:set var="lastName" value="liu"></c:set> 
<!-- 只能remove某个变量,不能remove掉JavaBean里的属性值 --> 
<c:remove var="lastName"/> 
<c:out value="${lastName}"></c:out><br>

输出

xiaop



4.catch标签的用法

用来处理产生错误的异常状况,并且将错误信息储存起来
JSTL核心标签超详细_JSTL核心标签_09

<!-- catch标签的用法 --> 
<c:catch var="error"> 
    <!-- 随便使用一个没有定义的JavaBean-->
    <c:set target="${Code}" property="Tiger">CodeTiger</c:set> 
</c:catch> 
<c:out value="${error}"></c:out><br>

输出

javax.servlet.jsp.JspTagException



5.if标签的用法

与我们在一般程序中用的if一样
JSTL核心标签超详细_总结_10

<!-- if标签的用法 --> 
<form action="index.jsp" method = "post"> 
    <!-- param为EL的隐式对象,获取用户输入的值 --> 
    <input type = "text" name = "score" value = "${param.score}"> 
    <input type = "submit" value = "提交"> 
</form> 
<!-- var中的变量为boolean类型,取决于test中的表达式 --> 
<c:if test="${param.score >= 90}" var="grade" scope="session"> 
    <c:out value="恭喜,成绩优秀"></c:out> 
</c:if> 
<c:if test="${param.score >= 80 && param.score < 90}"> 
    <c:out value="恭喜,成绩良好"></c:out> 
</c:if> 
<c:out value="${sessionScope.grade}"></c:out>

输出
JSTL核心标签超详细_网站_11



6.choose,when,otherwise标签的用法

这三个合在一起讲,有点类似switch case default。

choose:本身只当做<c:when>和<c:otherwise>的父标签

when:<c:choose>的子标签,用来判断条件是否成立

otherwise:<c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
JSTL核心标签超详细_Java学习之旅_12
接上面的form表单

<!-- choose,when,otherwise标签的用法 --> 
<c:choose> 
    <c:when test="${param.score >= 90 && param.score <= 100}"> 
        <c:out value="优秀"></c:out> 
    </c:when> 
    <c:when test="${param.score >= 80 && param.score < 90}"> 
        <c:out value="良好"></c:out> 
    </c:when> 
    <c:when test="${param.score >= 70 && param.score < 80}"> 
        <c:out value="中等"></c:out> </c:when> 
    <c:when test="${param.score >= 60 && param.score < 70}"> 
        <c:out value="及格"></c:out> 
    </c:when> 
    <c:when test="${param.score >= 0 && param.score < 60}"> 
        <c:out value="不及格"></c:out> 
    </c:when> 
    <c:otherwise> 
        <c:out value="输入的分数不合法"></c:out> 
    </c:otherwise> 
</c:choose> 
<c:choose> 
    <c:when test="${param.score == 100}"> 
        <c:out value="您是第一名"></c:out> 
    </c:when> 
</c:choose><br>

输出
JSTL核心标签超详细_Java学习之旅_13JSTL核心标签超详细_JavaWeb_14



7.forEach标签的用法

基础迭代标签,接受多种集合类型
JSTL核心标签超详细_JavaWeb_15

<!-- forEach标签的用法 --> 
<% 
    List<String> names = new ArrayList<String>(); 
    names.add("liu"); 
    names.add("xu"); 
    names.add("Code"); 
    names.add("Tiger"); 
    request.setAttribute("names", names); 
%> 
<!-- 获取全部值 --> 
<c:forEach var="name" items = "${requestScope.names}"> 
    <c:out value="${name}"></c:out><br> 
</c:forEach> 
<c:out value="========================"></c:out><br> 
<!-- 获取部分值 --> 
<c:forEach var="name" items = "${requestScope.names}" begin="1" end="3"> 
    <c:out value="${name}"></c:out><br> 
</c:forEach> 
<c:out value="========================"></c:out><br> 
<!-- 获取部分值 并指定步长--> 
<c:forEach var="name" items = "${requestScope.names}" begin="1" end="3" step = "2"> 
    <c:out value="${name}"></c:out><br> 
</c:forEach> 
<c:out value="========================"></c:out><br> 
<!-- 获取部分值 并指定varStatus--> 
<c:forEach var="name" items = "${requestScope.names}" begin="0" end="3" varStatus="n"> 
    <c:out value="${name}"></c:out><br> 
    <c:out value="index:${n.index}"></c:out><br> 
    <c:out value="count:${n.count}"></c:out><br> 
    <c:out value="first:${n.first}"></c:out><br> 
    <c:out value="last:${n.last}"></c:out><br> 
    <c:out value="-----------------"></c:out><br> 
</c:forEach> 
<c:out value="========================"></c:out><br>

输出

liu
xu
Code
Tiger
========================
xu
Code
Tiger
========================
xu
Tiger
========================
liu
index:0
count:1
first:true
last:false
-----------------
xu
index:1
count:2
first:false
last:false
-----------------
Code
index:2
count:3
first:false
last:false
-----------------
Tiger
index:3
count:4
first:false
last:true
-----------------
========================

上面的varStatus属性,有index、count、first、last这几个状态。



8.forTokens标签的用法

根据指定的分隔符来分隔内容并迭代输出
JSTL核心标签超详细_JSTL核心标签_16

<!-- forTokens标签的使用 --> 
<c:forTokens items="010-12345-678" delims="-" var="num"> 
    <c:out value="${num}"></c:out><br> 
</c:forTokens>

输出

010
12345
678

9.import标签的用法

检索一个绝对或相对 URL,然后将其内容暴露给页面
JSTL核心标签超详细_总结_17
该标签和<jsp:include>的区别:<jsp:include>只能包含同一个web应用中的文件,而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。

该标签只是把URL属性中的资源加载到页面中,URL地址栏的地址不会改变。

<!-- import标签的用法 绝对路径--> 
<c:catch var="error1"> 
    <c:import url="http://www.codeliu.com"></c:import> 
</c:catch> 
<c:out value="${error1}"></c:out><br> 
<!-- 相对路径 --> 
<c:catch var="error2"> 
    <c:import url="test.txt" charEncoding="gbk" scope="session" var="test"></c:import> 
</c:catch> 
<c:out value="${error2}"></c:out> 
<c:out value="${sessionScope.test}"></c:out><br> 
<!-- 使用context属性 ,前面要加/,导入MyFirstJSP项目中的index.jsp页面--> 
<c:catch var="error3"> 
    <c:import url="/index.jsp" context="/MyFirstJSP"></c:import> 
</c:catch> 
<c:out value="${error3}"></c:out><br>



10.redirect,param标签的用法

redirect:重定向至一个新的URL.同时可以在url中加入指定的参数
JSTL核心标签超详细_网站_18
param:用来给包含或重定向的页面传递参数
JSTL核心标签超详细_Java学习之旅_19

<!-- redirect标签的用法 --> 
<c:redirect url="rec.jsp"> 
    <c:param name="username" value="liu"></c:param> 
    <c:param name="password" value="123456"></c:param> 
</c:redirect>

该标签会使URL地址栏的地址发生改变。可通过EL表达式的param对象来获取传递的参数值。

<c:out value="${param.username}"></c:out><br> 
<c:out value="${param.password}"></c:out><br>

输出

liu
123456



11.url标签的用法

使用可选的查询参数来创造一个URL
JSTL核心标签超详细_总结_20
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。

这个标签在需要的时候会自动重写URL。

var属性用于存储格式化后的URL。

<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。

<!-- url标签的用法 --> 
<a href = "<c:url value = "http://www.codeliu.com"/>">这个链接通过&lt;c:url&gt;生成</a>

输出

这个链接通过<c:url>生成

我们看看网页源代码
JSTL核心标签超详细_JavaWeb_21


5.JSTL函数的使用

函数在上面已经列出来了,我就选了几个写了一下,其实和String的都差不多。不过要记得先在前面引入

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

测试以下几个函数

<c:out value="${fn:contains('Hello world', 'Hello')}"></c:out><br> 
<c:out value="${fn:contains('Hello world', 'aaaa')}"></c:out><br> 
<c:out value="${fn:containsIgnoreCase('Hello world', 'hello')}"></c:out><br>

输出

true
false
true



好了,大概也就说这么多了。

个人博客http://www.codeliu.com,欢迎各位志同道合的小伙伴!