JSP第五篇【JSTL的介绍、core标签库、fn方法库、fmt标签库】
什么是JSTL
JSTL全称为 JSP Standard Tag Library 即JSP标准标签库。
JSTL作为最基本的标签库,提供了一系列的JSP标签,实现了基本的功能:集合的遍历、数据的输出、字符串的处理、数据的格式化等等!
为什么要使用JSTL
- EL表达式不够完美,需要JSTL的支持!在JSP中,我们前面已经用到了EL表达式,体会到了EL表达式的强大功能:使用EL表达式可以很方便地引用一些JavaBean以及其属性,不会抛出NullPointerException之类的错误!但是,EL表达式非常有限,它不能遍历集合,做逻辑的控制。这时,就需要JSTL的支持了!
- Scriptlet的可读性,维护性,重用性都十分差!*JSTL与HTML代码十分类似,遵循着XML标签语法,使用JSTL让JSP页面显得整洁,可读性非常好,重用性非常高,可以完成复杂的功能!*
- 在JSP中不推荐使用scriptlet输出,推荐使用JSP标签。
使用JSTL标签库步骤:
- 导入jstl.jar和standard.jar开发包
- 在JSP页面中用tablib指令引入需要用到的JSTL标签
core标签库
- core标签库是JSTL的核心标签库,实现了最基本的功能:流程控制、迭代输出等操作!
- core标签库的前缀一般是c
<c:out/>
- 简单使用一下
<%
session.setAttribute("name", "zhongfucheng");
%>
//<c:out/>标签支持标签体,default属性上的数据可以写在标签体中
//<c:out value="${name}" escapeXml="true">您要的数据找不着</c:out>
<c:out value="${name}" default="您要的数据找不着" escapeXml="true"/>
- 我们发现上面的代码实现的效果和EL表达式是一样的,它出色的地方就多了两个属性,default和escapeXml属性。如果我们用到这两个属性,我们就使用该标签,如果没有用到这两个属性就用EL表达式就可以了。
<c:set/>
- 该标签有5个属性,用起来有稍微有些复杂了!现在要记住的就是:var属性操作的是Integer、Double、Float、String等类型的数据,target属性操作的是JavaBean或Map对象的数据,scope代表的是Web域,value是值,property是对象的属性!
使用var属性
既然var属性只能操作Integer、Double、String等类型,那么存在var属性就一定没有property属性(property代表的是对象的成员属性,Integer、String这些类型哪来的成员变量呀)
下面的代码流程是这样的:创建了一个name的变量,设置的值为zhongfucheng,范围是page
<c:set var="name" value="fucheng" scope="page"/>
${name}
- 效果:
- 当然了,set标签也支持标签体,value的值可以写在标签体里边
<c:set var="name" scope="page">
zhongfucheng
</c:set>
- 使用var属性和scope属性实现计数器
<%--由于下面变量需要做加法运算,所以要定义出来,不然服务器是不知道我的变量是Integer类型的--%>
<%
Integer sessionCount = 0;
Integer applicationCount = 0;
%>
<c:set var="sessionCount" value="${sessionCount+1}" scope="session"/>
<c:set var="applicationCount" value="${applicationCount+1}" scope="application"/>
- 效果:
使用target属性
- 使用target属性与之配对的是property属性,target属性只能操作JavaBean或Map对象,property就是对应的成员变量或key了。。
- 既然target属性操作的是JavaBean或Map对象,那么一定是通过EL表达式来获取到对象了。taget属性如果获取不到数据会抛出异常!使用target属性就一定没有scope属性(scope属性代表的是保存范围,target的值都是获取来的,难道你还能改变人家的范围?)
<%--创建出JavaBean对象,设置为session范围的属性--%>
<jsp:useBean id="person" class="domain.Person" scope="session"/>
<%--获取到person对象,设置age属性的值为32--%>
<c:set target="${person}" property="age" value="32"/>
${person.age}
- 效果:
<c:remove/>
remove标签就相当简单了,只有var和scope属性,代表的是删除域范围的属性
- 下面简单来测试一下吧:
<%--创建出JavaBean对象,设置为session范围的属性--%>
<jsp:useBean id="person" class="domain.Person" scope="session"/>
<%--获取到person对象,设置age属性的值为32--%>
<c:set target="${person}" property="age" value="32"/>
${person.age}
<br>
<%--删除session属性--%>
<c:remove var="person" scope="session"></c:remove>
${person.age==null?"存在session的person对象被删除了!":"我还在呢!"}
- 效果:
<c:catch/>
该标签主要用来处理程序中产生的异常。
catch标签也十分简单,只有一个var属性,var属性封装了异常的信息!
<%--创建出JavaBean对象,设置为session范围的属性--%>
<jsp:useBean id="person" class="domain.Person" scope="session"/>
<c:catch var="message">
<%--target属性只能是EL表达式,现在我是字符串,获取不到对象,肯定会抛出异常的!--%>
<c:set target="person" property="age" value="32"/>
</c:catch>
${message}
- 效果:
<c:if/>
JSTL提供了if标签完成分支语句的实现,test属性是不可或缺的。
var和scope属性我看来好像没什么用的(保存执行结果有什么用?)
- 根据传递过来的参数的不同显示不同的页面!
<%--如果带过来的名字是zhongfucheng,那么可以登陆--%>
<c:if test="${param.name=='zhongfucheng'}">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登陆">
</c:if>
<%--如果带过来的名字是ouzicheng,那么就是注册--%>
<c:if test="${param.name=='ouzicheng'}">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="注册">
</c:if>
- 注意地址栏的参数!
<c:choose>
if标签没有else的功能,如果需要类似于java中的if else流程就需要使用choose标签。
choose标签需要联合when和otherwise标签一起使用!
<c:choose>
<c:when test="${param.name=='zhongfucheng'}">
你好啊,zhongfucheng
</c:when>
<c:when test="${param.name=='ouzicheng'}">
你好啊,ouzicheng
</c:when>
<c:otherwise>
你是谁啊?别随便过来!
</c:otherwise>
</c:choose>
- 效果:
<c:forEach/>
forEach为循环标签,相当于Java中的while和for
之前我们在使用EL表达式获取到集合的数据,遍历集合都是用scriptlet代码循环,现在我们学了forEach标签就可以舍弃scriptlet代码了。
向Session中设置属性,属性的类型是List集合
<%
List list = new ArrayList<>();
list.add("zhongfucheng");
list.add("ouzicheng");
list.add("xiaoming");
session.setAttribute("list", list);
%>
- 遍历session属性中的List集合,items:即将要迭代的集合。var:当前迭代到的元素
<c:forEach var="list" items="${list}" >
${list}<br>
</c:forEach>
- 效果:
- 遍历Map对象有稍微地不一样,我们来看一下,var属性保存的不是每个迭代的对象,而是Map.Entry。
<%
Map map = new HashMap();
map.put("1", "zhongfucheng");
map.put("2", "xiaohong");
map.put("3", "xiaoming");
session.setAttribute("map",map);
%>
<c:forEach var="me" items="${map}" >
${me.key} ${me.value}<br>
</c:forEach>
begin默认从0开始、end默认为集合的最后一个元素、step默认为1
varStatus代表着当前对象被迭代的信息,它有以下的属性。
- index【返回当前是第几个对象,从0开始计数】
- count【已经遍历多少个对象了,从1开始计数】
- first【是否是第一个】
- last【是否是最后一个】
- current【当前被迭代的对象】
- begin【开始的位置】
- end【最后的位置】
- step【步长】
<c:forEach var="list" items="${list}" varStatus="varStatus" >
${list}您的下标是:${varStatus.index}<br>
</c:forEach>
- 效果:
<c:forTokens/>
该标签类似于String类的split()和for循环的一种集合
它与forEach标签非常相似,都有begin、end、step、items、var、varStatus属性,不同的是forTokens标签的items属性里面是字符串,这个字符串会被delims属性的内容分割成多个字符串!
<c:forTokens items="zhongfucheng,ouzicheng,xiaoming,xiaohong" var="name" delims="," >
${name}
</c:forTokens>
- 效果图:
<c:import/>
import标签类似于JSP行为<jsp:include/>
和JSP指令<%include>
import标签的属性:
- url【指定要包含的路径,Internet所有的url都可以】
- context【访问同一个web容器的其他资源,以”/”开头】
- var【保存导入的文件的内容,以String类型存储】
- socpe【保存的范围,默认是page】
- charEncoding【字符编码】
- varReader【保存导入文件的内容,以Reader类型存储】
当然了,import标签功能更加更大!强大在哪里呢?import标签可以引入Internet网页上的内容,也就是说,csdn也可以引入进来!
- 我们来用一下把!
<c:import url="http://www.csdn.net" charEncoding="UTF-8" />
- 我们一看,是没有样式的:
- 打印csdn的源代码:
<c:import url="http://www.csdn.net" charEncoding="UTF-8" var="net"/>
CSDN的源码是:<br><br><br><br><br>
<c:out value="${net}" escapeXml="true"></c:out>
- 效果:
<c:param/>
在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。标签可以嵌套在、或标签内,为这些标签所使用的URL地址附加参数。
标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用标签的最大好处。
<c:url/>
url标签十分实用!在浏览器禁用Cookie的时候,我们之前学Servlet时解决办法是:response.encodeURL()。url标签也可以实现这样的功能,再配合param标签使用,就十分实用了!
- 我们配合param标签来使用一下吧!
<c:url value="2.jsp" var="url">
<c:param name="name" value="中国!">
</c:param>
</c:url>
<a href="${url}">我经过了URL地址重写!</a>
- 效果:
<c:redirect/>
redirect标签用于实现Redirect功能,当然了,此标签也能够配合param标签使用!
- 简单使用一下,重定向到2.jsp,带了一个参数:
<c:redirect url="2.jsp" >
<c:param name="name" value="zhongfucheng">
</c:param>
</c:redirect>
- 在2.jsp中获取到参数
fmt标签库
fmt标签库也叫做国际化标签库。这里就不详细说明了,等我讲到Web 国际化的时候才讲吧!
fn方法库
fn方法库也叫做EL函数库、fn标签库。这个在讲解EL表达式的时候有详细的说明,可转移到我EL表达式的博文中!
JSP第五篇【JSTL的介绍、core标签库、fn方法库、fmt标签库】的更多相关文章
- [应用篇]第五篇 JSTL之fmt标签日期和数字格式化
fmt标签个人用的比较少,但是我还是在这里简单的留一下笔记,也是算是学习了一下!这样方便你们课设的时候能用的上,要学会进步的学习,不要停留! 引入该标签库的方法为: <%@ taglib pre ...
- 第五篇 Getting Started with ORACLE EBS(开始学习ORACLE EBS)
第一篇介绍了ERP软件是供应链管理软件.告诉你这个软件改善或提升企业管理的切入点和着力点.有了着力点才能给力. 第二篇介绍了什么是咨询以及咨询工作共通的章法,告诉了你咨询的套路是什么,就像练习一套拳, ...
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第五篇【AppiumLibrary校验函数介绍】
http://blog.csdn.net/deadgrape/article/details/50619050 以上连作者先跪一下方便面,在上一篇中,作者遗漏了两个常用的函数: 1.长按 Long P ...
- JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】
什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来读取数据,进行内容的 ...
- Python自动化 【第十五篇】:CSS、JavaScript 和 Dom介绍
本节内容 CSS javascript dom CSS position标签 fixed: 固定在页面的某个位置 relative + absolute: 相对定位 opacity:0.5 设置透明度 ...
- [Java] JSP笔记 - EL、JSTL 常用标签
一. 什么是 EL 语言 表达式语言(EL)是 JSP 2.0 引入的一种计算和输出 Java 对象的简单语言. 二.EL 语言的作用 为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMASc ...
- 解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译)
解剖SQLSERVER 第五篇 OrcaMDF里读取Bits类型数据(译) http://improve.dk/reading-bits-in-orcamdf/ Bits类型的存储跟SQLSERVE ...
- javaweb回顾第十篇JSTL
前言:JSTL(JSP Standard Tag Library)JSP标准标签库.它的目的是为了简化JSP的开发,如何没有JSTL可能我们开发的时候就需要写大量的自定义标签,无疑会加大开发难度,有了 ...
- iOS开发UI篇—Quartz2D简单介绍
iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...
随机推荐
- 通过 BitNami 轻松安装 Redmine
一.简介 最近彭老师要我搭建 Redmine 来管理 WPF 项目,至于问什么要选择 Redmine 网上的资料都有说明,在这里就不做过多评论.查阅了好久资料,走了不少弯路,像我这样的新手,如果严格按 ...
- Andoird开发手机壁纸
Android 开发手机壁纸3种方法 首先使用WallpaperManager wpm = (WallpaperManager) getActivity().getSystemService(Cont ...
- BotVS开发基础—2.7 指标MA
代码 #计算一小时 MA5均线 # 时间 2017-06-29 00:00:00 -2017-06-30 00:00:00 1小时 实盘级Tick # 平台 OCKCoin BTC def main( ...
- Ubuntu安装卸载anaconda
安装要点: 1.在Anaconda官网https://www.continuum.io/downloads内下载需要的版本: 2.打开终端--进入下载安装包所在的文件夹(cd 文件名)--输入命令:b ...
- hdu3081 Marriage Match II(二分+并查集+最大流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意: n个女生与n个男生配对,每个女生只能配对某些男生,有些女生相互是朋友,每个女生也可以跟她 ...
- 扩展Python模块系列(四)----引用计数问题的处理
承接上文,发现在使用Python C/C++ API扩展Python模块时,总要在各种各样的地方考虑到引用计数问题,稍不留神可能会导致扩展的模块存在内存泄漏.引用计数问题是C语言扩展Python模块最 ...
- mysql外键
1.直接在SQLyog中创建外键: 在SQLyog中的架构设计器中拖进2张表,然后选择t_book的bookTypeId拖到另一张表t_booktype的ID位置,然后就能创建外键了. MySQL的外 ...
- Python Requests: Invalid Header Name 解决方法
这几天在练习python,并且用到了Requests,不得不说真的比urllib 方便了很多啊,简直有点事半功倍的感觉 言归正传,(好像上面的话也没多歪啦~~~~~) 简单叙述下我的script 流程 ...
- startsWith和endWith方法
startsWith(): 例如:if(a.startsWith(b)) //判断字符串a 是不是以字符串b开头. 语法1 public boolean startsWith(String prefi ...
- C语言中复数运算及调用blas,lapack中复数函数进行科学计算
C语言中常用的数据类型主要int, float ,double ,char 等,但在科学运算中复数扮演着重要角色.这里讲下C语言中的复数运算以及如何调用blas,lapack库中的复数函数来进行科学计 ...