jsp之jstl核心标签库
JSTL核心标签库技术
1. JSTL介绍
在JSP页面中即可书写html,也可以书写Java代码,导致页面混乱,维护,修改,升级难度加大,于是国际上不同的公司在实际应用中,根据页面的需求将Java代码进行抽离封装,页面上需要的时候,通过标签(和书写HTML标签差不多)的方式引入封装的Java代码。由于每个公司都有自己一套标签,开发人员在使用标签的时候,可以使用不同公司研发的标签,导致标签严重重复。为了解决这个问题,Apache Jakarta小组归纳汇总了那些网页设计人员经常遇到的问题,开发了一套用于解决这些常用问题的自定义标签库,这套标签库被SUN公司定义为标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL。
总结:JSTL就是一套封装Java代码的标签库,开发人员不用在JSP页面上书写Java代码,直接使用封装好的标签库,就能完成和书写Java代码相同的效果。
2. JSTL的使用细节
在使用JSTL核心标签库之前,必须保证的项目中已经引入JSTL的jar包。一般在新建项目的时候可以选择JSTL的版本,建议选择最高版本即可。
一般myeclipse都会自带这个jar包:
在某个JSP页面上需要使用JSTL标签库,那么就必须使用前面学的JSP中的taglib指令引入标签库。
页面引入的方式:
注意:在jsp页面中使用jstl标签时,必须先使用taglib指令引入对应的标签库。
JSTL标签库提供5大功能:
core:jstl的核心标签库,使用最多(重点)
fmt:国际化的标签(可以根据用户本地的信息对 时间、数据、货币等内容进行格式化)
functions:jstl中提供的函数库(主要代替的String类中的方法)
sql:jstl提供的在jsp页面上书写sql,操作数据库,最好不要使用(页面上一般不要操作数据库,这个交给dao层完成)
xml:jstl操作xml文件的。已经不使用
3. fmt标签介绍
3.1. fmt标签介绍
fmt标签:主要是完成国际化和格式化数据的功能。它封装的的java.util包和java.text包下的与格式化和国际化相关的类。
使用fmt标签,必须先在JSP页面上引入fmt标签库。<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
下面演示两个比较常用的标签:日期和数字格式化。
fmt标签格式:
<fmt:formatDate value="xxx" pattern="xxx"/>
3.2. <fmt:formatDate>标签 日期格式化
属性名 |
是否支持EL |
属性类型 |
属 性 描 述 |
value |
true |
java.util.Date |
指定要格式化的日期或时间值 |
pattern |
true |
String |
指定一个自定义的日期和时间输出格式 |
3.3. <fmt:formatNumber> 数字格式化
属性名 |
是否支持EL |
属性类型 |
属 性 描 述 |
value |
true |
java.util.Date |
指定要格式化的日期或时间值 |
maxFractionDigits |
true |
int |
指定格式化后的结果的小数部分最多包含几位小数 |
minFractionDigits |
true |
int |
指定格式化后的结果的小数部分最少包含几位小数 |
注意:如果数据超出最多包含位数则删除多的位数,不四舍五入;如果数据少于最少包含位数则添0增加至最少的位数;
页面效果:
4. fn函数介绍
为了简化在JSP页面操作字符串,JSTL中提供了一套EL自定义函数,这些函数包含了JSP页面制作者经常要用到的字符串操作。
在JSP页面使用fn函数,需要使用taglib 标签引入fn函数。
fn标签格式:
${fn:方法名(参数) }
注意:不是< >,而是${ };
4.1. fn:toLowerCase函数
fn:toLowerCase函数将一个字符串中包含的所有字符转换为小写形式,并返回转换后的字符串,它接收一个字符串类型的参数。
fn:toLowerCase函数的应用举例:
${fn:toLowerCase("Www.IT315.org") }的返回值为字符串“www.it315.org”
${fn:toLowerCase("")} 的返回值为空字符串
4.2. fn:toUpperCase函数
fn:toUpperCase函数将一个字符串中包含的所有字符转换为大写形式,并返回转换后的字符串,它接收一个字符串类型的参数。
fn:toUpperCase函数的应用举例:
${fn:toUpperCase("Www.IT315.org")} 的返回值为字符串“WWW.IT315.ORG”
${fn:toUpperCase("")}的返回值为空字符串
4.3. fn:startsWith函数
fn:startsWith函数用于检测一个字符串是否是以指定字符串开始的,返回值为布尔类型。
fn:startsWith函数接收两个字符串类型的参数,如果第一个参数字符串以第二个参数字符串开始,则函数返回true,否则函数返回false。如果第二个参数为空字符串,则fn:startsWith函数总是返回true
fn:startsWith函数的应用举例:
${fn:startsWith("www.it315.org","it315")}的返回值为false
${fn:startsWith("www.it315.org","www")}的返回值为true
${fn:startsWith("www.it315.org","")}的返回值为true
4.4. fn:contains函数
fn:contains函数检测一个字符串中是否包含指定的字符串,返回值为布尔类型。fn:contains函数在比较两个字符串是否相等时是大小写敏感的。
fn:contains函数接收两个字符串类型的参数,如果第一个参数字符串中包含第二个参数字符串,则fn:contains函数返回true,否则返回false。如果第二个参数的值为空字符串,则fn:contains函数总是返回true
fn:contains函数的应用举例:
${fn:contains("www.it315.org", "org")}的返回值为true
${fn:contains("www.it315.org", "Org")}的返回值为false
${fn:contains("", "")}的返回值为true
总结:fn函数中列出的方法,和JDK中String类的方法基本雷同。如果是在Servlet中可以直接使用String类中的方法处理完字符串,保存在响应的域对象中,在JSP页面上使用EL表达式取出即可。
5. 核心标签库core(重点)
核心标签core标签,有时也被称为c标签。
5.1. 核心标签库介绍
JSTL核心标签库中core库中提供了12个标签。可以在JSP页面上完成循环,判断,switch等复杂的结构操作。
其中的 c:if 、 c:forEach 、 c:set 、 c:choose 、 c:when 、 c:otherwise 需要重点练习和掌握。
使用前必须先导入core库:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
5.2. c:if标签
使用c:if 标签,在JSP页面上可以完成if判断。注意在JSTL核心标签库中没有c:else.只有c:if
注意:test属性的内容是表达式,返回值为布尔类型;且内容支持EL表达式;
Var属性的内容是将test属性的执行结果即布尔值保存到某个域中此数据(name,value)的name,test的布尔值则是value;
注意:
1.如果test的值为true,则会将此c标签包裹的内容输出的浏览器,否则不会;
2.如果c标签中没有var属性,则不会将test的布尔值保存到域中,且如果有var属性无scope属性则默认保存到page域中;
5.3. c:choose、c:when、c:otherwise标签
它可以理解成switch结构。
c:choose 相当于switch
c:when 相当于 case, 其中的test 需要书写的表达式,可以使用EL表达式
c:otherwise 相当于 default
注意:在EL表达式中,可以将数据(name,value)中的name当做value使用;
EL表达式的数据(name,value)可以写作name=value,将name当做变量,value当做放在变量中的值,这样理解就可以很容易理解${day==1}的写法了;
5.4. c:set和c:out标签
c:set它可以给某个范围中保存(修改)数据,或者还可以去修改某个对象的属性值。
相当于代替了pageContext.setAttribute(name,value,scope)
属性名 |
是否支持EL |
属性类型 |
属 性 描 述 |
value |
true |
Object |
用于指定属性值 |
var |
false |
String |
用于指定要设置的Web域属性的名称 |
scope |
false |
String |
用于指定属性所在的Web域 |
target |
true |
Object |
用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象 |
property |
true |
string |
用于指定当前要为对象设置的属性名称 |
5种属性有2种组合方式:
方式一:
<c:set var="address" value="上海" scope="page"></c:set>
方式二:
<c:set target="${user1 }" property="username" value="李四"></c:set>
方式一相当于将数据(var,value)放到scope域中
方式二相当于将数据(property,value)封装到对象terget中
方式一相当于给变量赋值,方式二相当于给对象中的属性变量赋值,区别就是方式二必须是针对对象;
c:out 它可以把数据输出到页面上,相当于JSP的内置对象out
属性名 |
是否支持EL |
属性类型 |
属 性 描 述 |
value |
true |
Object |
指定要输出的内容 |
escapeXml |
true |
Boolean |
指定是否将>、<、&、'、" 等特殊字符进行HTML编码转换后再进行输出。默认值为true |
default |
true |
Object |
指定如果value属性的值为null时所输出的默认值 |
<body>
<h3>需求1: 使用 c:set 向page域设置address=上海, 使用c:out 输出到浏览器;</h3>
<% pageContext.setAttribute("address", "上海"); %>
<%= pageContext.getAttribute("address") %>
<hr/>
<c:set var="address" value="上海" scope="page"></c:set>
解释:相当于<% pageContext.setAttribute("address", "上海"); %>
var相当于name,value相当于value,scope相当于scope,而且set标签不会输出到浏览器
<c:out value="${address}"></c:out>
<c:out value="${pageScope.address}"></c:out>
解释:out会输出到浏览器,value支持EL表达式;
<h3>需求2: 使用 c:set 向自定义的user对象设置属性 username=张三, 并使用EL输出到到页面上</h3>
<%
User user = new User();
user.setUsername("张三");
pageContext.setAttribute("user1", user);
%>
${user1.username }
<%-- 相当于 User user = new User(); pageContext.setAttribute("user1", user); --%>
<jsp:useBean id="user1" class="cn.itcast.domain.User"></jsp:useBean>
解释;Jsp的useBean标签会创建对象并将此对象放到指定域中
<%-- 相当于 user1.setUsername("张三") --%>
<c:set target="${user1 }" property="username" value="李四"></c:set>
解释:set标签的target属性表示将name和value存储到的对象,支持EL表达式
Property属性表示对象的name,value表示对象的value
<c:out value="${user1.username }"></c:out>
<h3>需求3: 使用 c:out 的default属性 给域中不存在的参数 提供默认值;</h3>
<c:out value="${score}" default="90"></c:out>
解释:value如果有值则为值,无值则为default的值;
<h3>需求4: 使用 c:out 的 escapeXml属性 将超链接原样输出到浏览器中.</h3>
<a href='http://www.baidu.com'>百度</a> <br/>
<c:out value="<a href='http://www.baidu.com'>百度</a>" escapeXml="true"></c:out>
解释:escapeXml="true"表示不会转义特殊字符,默认为true,输出为原字符串,否则为链接;
</body>
5.5. c:forEach标签
c:forEach的标签主要是在界面上完成循环功能。必须使用掌握使用forEach标签遍历数组、list集合、map集合、以及充当普通的for循环
语法1,在集合对象中迭代:
<c:forEach var="当前元素名称" items="将要迭代的集合对象">
${元素名称}
</c:forEach>
如:
<c:foreach var=”e” items=”${list1}”>
${e}
</c:foreach>
相当于
for(String e : list1) {
response.getwriter().println(e)
}
需求 :
<body>
<h3> 需求1 : 遍历保存在page域中的数组 </h3>
<%
int[] arr = {11,33,55};
pageContext.setAttribute("arr1", arr);
%>
<c:forEach var="e" items="${arr1}">
${e }
</c:forEach>
<h3> 需求2 : 遍历保存在page域中的list集合 </h3>
<%
List<String> list = new ArrayList<String>();
Collections.addAll(list, "aaa","cccc","eee");
pageContext.setAttribute("list1", list);
%>
<c:forEach var="e" items="${list1}">
${e }
</c:forEach>
<h3> 需求3 : 遍历保存在page域中的map集合(注意: 是key) </h3>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa","111");
map.put("ccc","333");
map.put("eee","222");
pageContext.setAttribute("map1", map);
%>
<c:forEach var="entry" items="${map1 }">
<%--name: ${entry.name } --%>
key: ${entry.key }
value: ${entry.value } <br/>
</c:forEach>
</body>
遍历的应用场景:
语法2,迭代固定的次数:
<c:forEach [var="varName"]
[varStatus="循环的这个状态对象名称"]
begin="开始值" end="结束值" [step="步长"]>
内容
</c:forEach>
varStatus属性:
begin:forEach标签设置的begin属性的值,如果没有设置begin属性则返回null
end:标签设置的end属性的值,如果没有设置end属性则返回null
step:标签设置的step属性的值,如果没有设置step属性则返回null
first:当前是否是第一次迭代操作
last:当前是否是最后一次迭代操作
count:当前已循环迭代的次数
index:当前迭代的索引号
current:前迭代到的元素对象
需求:
<body>
<h3>需求1: 使用forEach输出 1~10, 奇数为红色,偶数为蓝色</h3>
<c:forEach begin="1" end="10" step="1" var="i">
<c:if test="${i%2==0 }">
<font color="red">${i }</font>
</c:if>
<c:if test="${i%2!=0 }">
<font color="blue">${i }</font>
</c:if>
</c:forEach>
<hr/>
<c:forEach begin="1" end="10" step="1" var="i" varStatus="vs">
<font color='${vs.count%2==0? "red":"blue" }'>${i }</font>
</c:forEach>
<h3>需求2: 使用forEach完成 1~10的和</h3>
<%
int sum = 0;
for(int i=1; i<=10; i++) {
sum += i;
}
out.println("和: " + sum);
%>
<hr/>
<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach begin="1" end="10" step="1" var="i">
<c:set var="sum" value="${sum+i }" scope="page"></c:set>
</c:forEach>
和: <c:out value="${sum }"></c:out>
</body>
重点:使用forEach 遍历List和Map集合。
5.6. 其他标签
<c:forTokens 它指的是把 itmes中提供的字符串,使用delims提供的分隔符进行分割
<c:import url=""></c:import>可以在当当前页面引入其他的页面
<c:remove var=""/> 删除某个域中的数据
<c:catch></c:catch> 捕获异常的
<c:redirect></c:redirect> 完成重定向的
<body>
<%--<c:forTokens 它指的是把 itmes中提供的字符串,使用delims提供的分隔符进行分割 --%>
<c:forTokens items="33,55,88,99" delims="," var="str">
<font color="red">${str }</font>
</c:forTokens>
<hr/>
<%--
<c:import url=""></c:import>可以在当当前页面引入其他的页面
<c:import url="09.jsp"></c:import>
--%>
<%--<c:remove var=""/> 删除某个域中的数据 --%>
<c:set var="username" value="柳岩" scope="request"></c:set>
删除前: <c:out value="${requestScope.username}"></c:out> <br/>
<c:remove var="username" scope="request"/>
删除后: <c:out value="${requestScope.username}"></c:out>
<%--<c:catch></c:catch> 捕获异常的 --%>
<c:catch var="ex">
<% int i=1/0; %>
</c:catch>
${ex.message }
<%--<c:redirect></c:redirect> 完成重定向的 相当于 response.sendRedirect(url); --%>
<c:redirect url="/09.jsp"></c:redirect>
</body>
jsp之jstl核心标签库的更多相关文章
- 【JSP】JSTL核心标签库的使用方法和示例
JSTL 核心标签库 JSTL 核心标签库标签共有13个,功能上分为4类: 1. 表达式控制标签:out.set.remove.catch 2. 流程控制标签:if.choose.when.other ...
- jsp引用JSTL核心标签库
一.引用JSTL 1. JSTL的引入可以让JSP代码中<%%>等代码消失掉,再结合EL表达式,会更加方便以及美观. 2. 各套框架(还没有学习,比如struts,SpringMVC等 ...
- 小峰servlet/jsp(6)jstl核心标签库
一.引入jstl 需要jstl.jar;standard.jar; 二.jstl核心标签库: c:out 内容输出标签; c:set 用来设置4种属性范围值的标签: c:re ...
- JSTL 核心标签库 使用
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- JSTL 核心标签库 使用(C标签)
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- JSTL核心标签库使用
JSTL是什么? java standard taglib(java标准标签库). 标签是什么? sun公司制订的一种技术规范,用来将jsp页面中的java代码使用类似于html当中的标记来替换 的一 ...
- EL表达式和JSTL核心标签库
1 EL表达式 1.1 EL的概述 EL,全名为Expression Language. 主要作用: ①EL表达式主要用于替换jsp页面中的脚本表达式,以便于从各种类型的web域中检索java对象(某 ...
- Javaweb学习笔记——(十三)——————JSTL、JSTL核心标签库、自定义标签、有标签体的标签、带有属性的标签、MVC、Javaweb三层框架
JSTLApache提供的标签库 jar包:jstl-1.2.jar,如果传MyEclipse,他会在我们导入jar包,无需自己导入,如果没有使用MyEclipse那么需要自行导入.--------- ...
- JavaWeb——JSTL 核心标签库使用
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
随机推荐
- MHDD工具使用简写
检查硬盘,建议接主板一口,DOS工具箱输入mhdd回车进入界面 输入硬盘接口号(这里不固定) 按F4是进行硬盘扫描,按两次就开始,按方向键进行快进 Mhdd界面输入 erase命令:擦除指定扇区范围内 ...
- c++:error2019,无法解析的外部命令blabla~
出现这个原因的问题汇总: 1,相应的附加库没有包含进去,注意附加库的目录是 / 2,函数没有与之对应的类,却在main中以某一类的对象调用了该方法. 其实,当错误中显示fun()成为无法解析的外部命令 ...
- 【python】python sqlalchemy core
SQLAlchemy是和很多数据库进行交互的一个库,他可以让你创建model,让你可以以一种Python中面向对象的方式进行查询.使得你的代码和数据库可以分开,也就是减轻他们之间的依赖.让你进行数据库 ...
- [BZOJ5303] [HAOI2018] 反色游戏
题目链接 LOJ:https://loj.ac/problem/2524 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=5303 洛谷:https ...
- Spark2.1.0之初识Spark
随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题:社交圈子从现实搬到了Facebook.Twitter.微信等社交平台上:女孩子们现在少了逛街,多了在各大电商平台上的 ...
- C++中typedef和#define简介
本文基于<C++ Primer(第5版)>和网上博客,整理而成. 一.类型别名 类型别名是一个名字,它是某种类型的同义词,有两种方法可用于定义类型别名:typedef.using. 1.关 ...
- C/C++中字符串与数字相互转换
数字转字符串: 用C++的streanstream: #include <sstream> #Include <string> string num2str(double i) ...
- JavaScript滚动条的制作
效果演示 这个效果的制作是借助setTimeout的第三个参数.setTimeout/setInterval,这两个函数相信前端开发同学都很熟悉.它们在非IE(6-9)浏览器中还可以如下使用: v ...
- 【题解】Radio stations Codeforces 762E CDQ分治
虽然说好像这题有其他做法,但是在问题转化之后,使用CDQ分治是显而易见的 并且如果CDQ打的熟练的话,码量也不算大,打的也很快,思维难度也很小 没学过CDQ分治的话,可以去看看我的另一篇博客,是CDQ ...
- kubernetes创建资源对象yaml文件例子--pod详解
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: ...