JSTL核心标签库

JSTL标签库,是日常开发经常使用的,也是众多标签中性能最好的。把常用的内容,放在这里备份一份,随用随查。尽量做到不用查,就可以随手就可以写出来。这算是Java程序员的基本功吧,一定要扎实。JSTL全名为JavaServer Pages Standard Tag Library,目前最新的版本为1.1版。JSTL是由JCP(Java Community Process)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签函数库。

1、前言
JSTL标签库,是日常开发经常使用的,也是众多标签中性能最好的。把常用的内容,放在这里备份一份,随用随查。尽量做到不用查,就可以随手就可以写出来。这算是Java程序员的基本功吧,一定要扎实。

JSTL全名为JavaServer Pages Standard Tag Library,目前最新的版本为1.1版。JSTL是由JCP(Java Community Process)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签函数库。

Web程序员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序的阅读性、维护性和方便性。JSTL 1.1必须在支持Servlet 2.4且JSP 2.0以上版本的Container才可使用


2、<%@ taglib %>引入标签库
a、以classPath中,加入jar包:  standard-1.1.2.jar ,  jstl-1.1.2.jar

b、在目录WEB-INF ld文件夹中放入常用的tld文件:c.tld,fmt.tld(tld是描述标签的XML文件,如果自定义的标签就通过tld来描述)此步可以忽略。

c、在jsp文件的顶部加入以下内容:<%@ taglib uri="https://java.sun.com/jsp/jstl/core" prefix="c" %>  
 

3、<c:> 核心标签库
JSTL 核心标签库(C标签)标签共有14个,功能上分为4类:

(1)、 表达式控制标签:out、set、remove、catch

(2)、 流程控制标签:if、choose、when、otherwise

(3) 、循环标签:forEach、forTokens

(4)、 URL操作标签:import、url、redirect、param

3.1 <c:forEach> 标签
为循环控制,它可以将集合(Collection)中的成员循序浏览一遍。语法如下:
语法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>

属性说明 :

名称

说明

EL

类型

必须

默认值

var

用来存放当前指向的成员

N

String

items

被迭代的集合对象

Y

Arrays

Collection

Iterator

Enumeration

Map

String

varStatus

用来存放现在指向的相关成员信息

N

String

begin

开始位置

Y

int

0

end

结束位置

Y

int

最后一个成员

step

每次迭代的间隔数

Y

int

1

varStatus属性的属性:

属性

类型

意义

index

number

现在指向成员的索引

count

number

总共指向成员的总和

first

boolean

现在指向的成员是否是第一个成员

last

boolean

现在指向的成员是否是最后一个成员

实例:
a、遍历List

<%  
   ArrayList<String> list = new ArrayList<String>();  
   list.add("张三");  
   list.add("李四");  
   list.add("王五");  
   session.setAttribute("list", list);  
%>  
<c:forEach var="item" items="${list}">  
   ${item }<br/>  
</c:forEach>

结果:
张三
李四
王五
 
b、遍历Map

<%  
   HashMap<String, Object> map = new HashMap<String, Object>();  
   map.put("name", "tom");  
   map.put("sex", "male");  
   map.put("age", 23);  
   session.setAttribute("map", map);  
%>  
<c:forEach var="item" items="${map}">  
   ${item.key } = ${item.value }<br/>  
</c:forEach>

结果:
sex = male
age = 23
name = tom
 
c、遍历Set

<%  
   HashSet<String> set = new HashSet<String>();  
   set.add("张三");  
   set.add("李四");  
   set.add("王五");  
   session.setAttribute("set", set);  
%>  
<c:forEach var="item" items="${set}">  
   ${item }<br/>  
</c:forEach>

结果:
张三
李四
王五
 
d、遍历Iterator(Enumeration同理)

<%  
   HashSet<String> set = new HashSet<String>();  
   set.add("张三");  
   set.add("李四");  
   set.add("王五");  
   session.setAttribute("iterator", set.iterator());  
%>  
<c:forEach var="item" items="${iterator}">  
   ${item }<br/>  
</c:forEach>

结果:
张三
李四
王五

e、遍历数组 

<%  
   String[] strs = {"java", "php", "script"};  
  
   session.setAttribute("strs", strs);  
%>  
<c:forEach var="item" items="${strs}">  
   ${item }<br/>  
</c:forEach>

结果:
java
php
script
 
f、遍历字符串(使用英文状态的逗号分割)

<c:forEach var="item" items="java,php,script">  
   ${item }<br/>  
</c:forEach>

结果:
java
php
script
 
g、打印10以内的偶数

<c:forEach var="i" begin="2" end="10" step="2">  
   ${i}<br/>  
</c:forEach>

结果:
2
4
6
8
10
 
h、测试varStatus属性的属性

<c:forEach var="item" items="c++,php,css,ftp,tld" varStatus="statu">  
   ${item} — ${statu.index} — ${statu.count} — ${statu.first} — ${statu.last}<br/>  
</c:forEach>

结果:
c++ — 0 — 1 — true — false
php — 1 — 2 — false — false
css  — 2 — 3 — false — false
ftp   — 3 — 4 — false — false
tld   — 4 — 5 — false — true 

3.2 <c:forTokens> 标签
用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。语法如下:

<c:forTokens items="stringOfTokens" delims="delimiters" [var="varName"]  [varStatus="varStatusName"] [begin="begin"] [end="end"] [step="step"]>  
本体内容  
</c:forTokens>

  属性说明:

名称

说明

EL

类型

必须

默认值

var

用来存放现在指向的成员

N

String

items

被迭代的字符串

Y

String

delims

定义用来分割字符串的分隔符

N

String

varStatus

用来存放当前指向的相关信息

N

String

begin

开始位置

Y

int

0

end

结束位置

Y

int

最后一个成员

step

每次迭代的间隔数

Y

int

1

 实例:

a、使用&符号分割

<c:forTokens var="str" items="I&Love&You" delims="&">  
   ${str}<br/>  
</c:forTokens>

结果:
I
Love
You

b、使用&、#和@作为分隔符

<c:forTokens var="str" items="
I&Love&You#Me@Too
@?" delims="&,#,@">  
   ${str}<br/>  
</c:forTokens>

结果:
I
Love
You
Me
Too
?
 

3.3 <c:out> 标签
主要用来显示数据的内容,语法如下:
语法1:没有本体(body)内容

<c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"] />

语法2:有本体内容

<c:out value="value" [escapeXml="{true|false}"]>  
default value  
</c:out>

 实例:

 <%  
   String str1 = "Hello World";  
   String str2 = "";  
   String str3 = null;  
     
   session.setAttribute("str1", str1);  
   session.setAttribute("str2", str2);  
   session.setAttribute("str3", str3);  
 %>  
  <c:out value="${str1}">default Value</c:out><br/>  
  <c:out value="${str2}">default Value</c:out><br/>  
  <c:out value="${str3}">default Value</c:out>

结果:
Hello World

default Value 

一般来说,<c:out>默认会将<、>、’、” 和 & 转换为 &lt;、&gt;、&#039;、&#034; 和&amp;。假若不想转换时,只需要设定<c:out>的escapeXml属性为fasle就可以了。
 
 
3.4 <c:set> 标签
主要用来将变量储存至JSP范围中或是JavaBean的属性中。语法如下:
语法1:将 value 的值储存至范围为 scope 的 varName变量之中

<c:set value="value" var="varName" [scope="{ page | request | session | application }"]/>

语法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" />

语法4:将本体内容的数据储存至target 对象的propertyName属性中

<c:set target="target" property="propertyName">  
本体内容  
</c:set>

属性说明 :

名称

说明

EL

类型

必须

默认值

value

要被存储的值

Y

Object

var

欲存入的变量名称

N

String

scope

var变量的JSP范围

N

String

page

target

唯一JavaBean或java.util.Map对象

Y

Object

property

指定target对象的属性

Y

String

实例:

a、保存字符串“java web”到一个变量中,然后输出变量的值

<c:set var="test">java web</c:set>  
<c:out value="${test}" />

<c:set var="test" value="java web" />  
<c:out value="${test}" />

结果:
java web
注意:默认scope为pageScope范围
 
b、将指定的字符串保存到applicationScope中

<c:set var="test" value="java web" scope="application"/>  
<c:out value="${applicationScope.test}"/>

结果:
java wen
 

3.5 <c:remove> 标签
主要用来移除变量。语法如下:

 <c:remove var="varName" [scope="{ age|request|session|application }"] />

实例:

<c:set var="test" value="java web"/>  
<c:out value="${test}"/>  
<c:remove var="test" />  
<c:out value="${test}"/>

结果:
java web

 
3.6 <c:catch> 标签
主要用来处理产生错误的异常状况,并且将错误信息储存起来。语法如下:

<c:catch [var="varName"] >
 欲抓取错误的部分  
</c:catch>

实例:

<c:catch var="msg">  
      <%= 1/0 %>  
</c:catch>  
<c:out value="${msg}" />

结果:
java.lang.ArithmeticException: / by zero

3.7 <c:if> 标签
的用途就和我们一般在程序中用的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>

实例:利用if标签输出1到10之间的偶数

<c:forEach var="i" begin="1" end="10">  
   <c:if test="${i mod 2 == 0}">  
    ${i}  
   </c:if>  
</c:forEach>

结果:
2 4 6 8 10

3.8 <c:choose> <c:when> <c:otherwise> 标签
该标签实现了swith语句的功能。实例: 

<c:set var="score">85</c:set>    
<c:choose>    
<c:when test="${score>=90}">    
 你的成绩为优秀!    
</c:when>    
<c:when test="${score>=70&&score<90}">    
 您的成绩为良好!    
</c:when>    
<c:when test="${score>60&&score<70}">    
 您的成绩为及格    
</c:when>    
<c:otherwise>    
 对不起,您没有通过考试!    
</c:otherwise>    
</c:choose>

结果:
您的成绩为良好! 


3.9 <c:import>标签
标签的功能类似于<jsp:include >,但是相比来说还是<c:import>标签的功能更强大一些。<jsp:include >标签只能导入同一个web容器内的资源,而<c:import>除此之外也可以导入外网的资源。同时<c:import>也可以把页面内容插入到页面中,还可以把内容保存到String对象中。语法如下:

<c:import url="url" [var="varName"] [scope="page|request|session|application"]>
      [<c:param/>]*
</c:import>

实例:
a、将从外网导入的资源保存在字符串中,然后输出字符串的内容

<c:import url="
https://www.baidu.com
" var="urlStr" />  
<c:out value="${urlStr}" />

b、导入内网资源

 <c:import url="result.jsp"></c:import>


3.10 <c:url>标签
用于重新构造URL,主要用途是URL重写。语法如下:

<c:url value="url" [var="varName"] [scope="page|request|session|application"]>
    [<c:param/>]*
</c:url>

标签把重新生成的URL存放在var属性指定的命名变量中,并且scope属性指定命名变量的范围,它的默认值为page(页面范围)。
实例:
a、以下标签在页面范围内创建一个myurl命名变量,它的值为"dir2/target.jsp"

<c:url value="dir2/target.jsp" var="myurl" />

结果:
dir2/target.jsp

b、以下标签中的value属性以"/"开头,标签会在重新生成的URL中加上当前Web应用的根路径,因此myurl命名变量的为"/helloapp/dir1/dir2/ target.jsp"

<c:url value="/dir1/dir2/target.jsp" var="myurl" />  
<a href="${myurl}" >target.jsp </a>

结果:
/helloapp/dir1/dir2/ target.jsp
 
c、在标签中可以包含子标签,用于设定请求参数,例如以下标签包含两个子标签,它们分别用于设定username请求参数和description请求参数

<c:url value="/dir1/dir2/target.jsp" var="myurl" >  
  <</span>c:param name="username" value="Tom" />  
  <</span>c:param name="description" value="Age>10&Age<30" />  
</c:url>  
<a href="${myurl}" >target.jsp </a>

标签会对value属性中的特殊符号(如">"和"&")进行正确地编码。以上标记生成的代码为:

<a href="/helloapp/dir1/dir2/target.jsp?username=Tom&description= Age>10&Age<30">target.jsp</a>

从以上代码可以看出,description参数值中的">"符号被编码为">","&"符号被编码为"&","<"符号被编码为"<"。
 
d、标签的name属性设定请求参数名,value属性设定请求参数值,此外,也可以在标签主体内设定请求参数值。例如以下标签主体判断username命名变量是否为"Tom",如果满足条件,就把role请求参数设为"Manager";如果username命名变量为空或者不是"Tom",就把role请求参数设为"Employee"

 <c:url value="/dir1/dir2/target.jsp" var="myurl" >  
  <c:param name="role">  
    <c:if test="${username=='Tom'}">  
      Manager  
    </c:if>  
    <c:if test="${empty username || ! username=='Tom'}">  
      Employee  
    </c:if>  
  </c:param>  
</c:url>  
   
<a href="${myurl}" >target.jsp </a>

如果username命名变量为空,那么以上标记生成的代码为:<a href="/helloapp/dir1/dir2/target.jsp?role=Employee" >target.jsp </a>

3.11 <c:redirect>标签
把客户的请求重定向到另一个资源。语法如下:

<c:redirect url="url">
    [<c:param/>]*
</c:redirect>

 实例:
a、将请求重定向到test.jsp页面

<c:redirect url="test.jsp" />

b、将请求重定向到test.jsp页面并发送参数

<c:redirect url="test">  
   <c:param name="name" value="Tom" />  
   <c:param name="age" value="20" />  
</c:redirect>

 

 3.12 <c:param>标签
<c:import>、<c:url>和<c:redirect>中添加请求的参数。语法如下:
语法1:

<c:param name="name" value="value" />

语法2:

<c:param name="name">
    parameter value
</c:param>
人永远是要学习的。死的时候,才是毕业的时候。 —— 萧楚女
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号