JavaWeb学习----JSTL标签库
一、JSTL简介:
JSTL全名为JavaServer Pages Standard Tag Library,中文名称为JSP标准标签函数库,目前最新的版本为1.2。JSTL是由JCP(Java Community Process)所指定的标准规格,它主要提供给Java Web开发人员一个标准通用的标签函数库。
Web 程序开发人员能够利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序可读性、维护性和方便性。
既然是库文件,那我们就要先下载咯。下载链接:http://tomcat.apache.org/

点击上图中红框部分的Taglibs,进入如下界面:

点击上图中的红框部分,进入如下界面:

上图中,点击最新版本进行下载。
下载完之后,将jar包复制到JavaWeb工程的/WebContent/WEB-INF/lib目录下即可使用。
JSTL所提供的标签函数库主要分为五大类:
- (1)核心标签库 (Core tag library)
- (2)I18N 格式标签库 (I18N-capable formatting tag library)
- (3)SQL 标签库 (SQL tag library)
- (4)XML 标签库 (XML tag library)
- (5)函数标签库 (Functions tag library
最常用的是第一个,其他几个不是很常用。
核心标签库 (Core tag library)主要有以下几种:
1、表达式标签:
- <c:out>:主要用来显示数据的内容,就像是 <%= scripting-language %> 一样
- <c:set>:主要用来将变量储存至JSP范围中或是JavaBean的属性中
- <c:remove>:主要用来移除变量
- <c:catch>:主要用来处理产生错误的异常状况,并且将错误信息储存起来(用的少)
2、流程控制:
- <c:if>:用途和我们一般在程序中用的if 一样
- <c :choose>:本身只当做 <c:when> 和 <c:otherwise> 的父标签
- <c :when>/<c :otherwise>:使用<c:when>和<c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签(类似于switch···case···)
3、迭代操作:
- <c :forEach>:循环遍历,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
- <c :forTokens>:用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。
下面来详细介绍一下这些标签。
二、核心标签库:
包含Web应用的常见工作, 比如:循环、表达式赋值、 基本输入输出等。
1、表达式标签:
- <c:out>:主要用来显示数据的内容,就像是 <%= scripting-language %> 一样
- <c:set>:主要用来将变量储存至JSP范围中或是JavaBean的属性中
- <c:remove>:主要用来移除变量
- <c:catch>:主要用来处理产生错误的异常状况,并且将错误信息储存起来(用的少)
代码举例:
- <c:out>标签
新建JavaWeb工程Test08,index.jsp代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
request.setAttribute("name", "smyhvae");
%>
</head>
<body>
<c:out value="${requestScope.name} "></c:out> </body>
</html>
第03行、10行、14行是我添加的代码。
03行(固定代码):使用JSTL不要忘记引入标签库。prefix="c"是前缀,“c”代表的是“<c:out>”这个表达式。uri中是填入命名空间,可以通过代码提示选择http://java.sun.com/jsp/jstl/core。可以通过下面的方式找到这个uri:在Java Reasources/Libraries/Web App Libraries/jstl.jar/META-INF目录下许多tld格式的文件,这些tld文件指的是标签库的声明文件:

上图中的c.tld文件代表的就是core这个标签库,打开它,能够看到uri:

其实第03行代码是固定写死了的,添加即可,可以不用深究。
一旦引入core标签库,此时在body标签中,只要输入"<c",就可以通过代码提示看到许多标签。

我们在第10行给request添加一个属性,然后就可以在第14行通过out输出标签输出这个值了(当然,也可以用EL表达式来输出),运行程序,效果如下:

- <c:set>标签
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
request.setAttribute("name", "smyhvae");
%>
</head>
<body>
<%--输出标签 --%>
<c:out value="${requestScope.name} "></c:out> <%--定义变量标签 --%>
<c:set var="age" value="22"></c:set>
${age }
</body>
</html>
见18、19行代码。
效果如下:

2、流程控制:
- <c:if>:用途和我们一般在程序中用的if 一样
- <c :choose>:本身只当做 <c:when> 和 <c:otherwise> 的父标签
- <c :when>/<c :otherwise>:使用<c:when>和<c:otherwise>来做流程控制时,两者都必须为<c:choose>的子标签(类似于switch···case···)
新建index2.sp文件。代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%
request.setAttribute("name", "smyhvae");
%>
</head>
<body> <%--流程控制标签if --%>
<c:if test="${not empty requestScope.name }">
欢迎你,${requestScope.name }
</c:if> <c:if test="${empty requestScope.name }">
请登录后操作
</c:if>
<br /> <%--流程控制标签choose --%>
<c:set var="age" value="22"></c:set> <c:choose>
<c:when test="${age<18 }">
未成年,不许进。
</c:when>
<c:when test="${age>=18 && age<50 }">
欢迎光临。
</c:when>
<c:otherwise>
老年人请注意身体。
</c:otherwise>
</c:choose> </body>
</html>
15至22行为if标签(和if语句的功能是一样的),16行中test里面的内容必须为boolean值:我们在第10行添加了name的值,然后在16行、20行判断name的值是否为空,进而做出判断。
25行至38行为choose标签(和switch···case···的功能是一样的)。
运行程序,效果如下:

3、迭代操作:
- <c :forEach>:循环遍历,它可以将集合(Collection)中的成员循序浏览一遍。运作方式为当条件符合时,就会持续重复执行<c:forEach>的本体内容。
- <c :forTokens>:用来浏览一字符串中所有的成员,其成员是由定义符号(delimiters)所分隔的。
代码举例:
- <c :forEach>
新建类User,作为遍历的对象。User.java代码如下:
package com.vae.bean;
public class User {
private String name;
private String sex;
private int age;
public User() {
super();
}
public User(String name, String sex, int age) {
super();
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
新建文件index3.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="com.vae.bean.User,java.util.*"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title> <%
List<User> users = new ArrayList<User>();
User u1 = new User("生命壹号", "男", 22);
User u2 = new User("生命二号", "男", 23);
User u3 = new User("vae", "女", 24);
users.add(u1);
users.add(u2);
users.add(u3);
request.setAttribute("users", users);
%>
</head> <body>
<table border="1">
<tr>
<th>name</th>
<th>sex</th>
<th>age</th>
</tr> <c:forEach items="${requestScope.users }" var="user">
<tr>
<td>${user.name}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
</tr>
</c:forEach>
</body>
</html>
核心代码是31行至37行。
我们在12至19行里,往List中加入多个user对象的值,并放入request中。然后在第24行加入一个表格,在表格里通过<c :forEach>遍历User对象中的内容,这里用到了<c :forEach>中的两个属性:31行的"items"表示需要迭代的集合,"var"表示每次一取,定义的变量。
运行程序,效果如下:

<c :forEach>中的属性:
我们在上面的代码中的31行用到了过<c :forEach>中的两个属性:items和var。接下来来学习一下其他的属性:
- begin:表示从第几个开始索引,一般不写;
- end:表示结束的位置。如果需要遍历十行,在此处写10即可。
- step:增量。
上面的三个属性用的比较少。
- varStatus:当前的状态。它的状态有以下几个:
index 索引 从0开始
count 从1开始 当前遍历次数
current 当前正在迭代的对象
first 是否是第一个
last 是否是最后一个
我们给varStatus举个例子。我们在上面的index3.jsp代码中进一步添加:
index3.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="com.vae.bean.User,java.util.*"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title> <%
List<User> users = new ArrayList<User>();
User u1 = new User("生命壹号", "男", 22);
User u2 = new User("生命二号", "男", 23);
User u3 = new User("vae", "女", 24);
users.add(u1);
users.add(u2);
users.add(u3);
request.setAttribute("users", users);
%>
</head> <body> <table border="1">
<tr>
<th>name</th>
<th>sex</th>
<th>age</th>
<th>状态值</th>
</tr> <c:forEach items="${requestScope.users }" var="user" varStatus="status">
<tr>
<td>${user.name}</td>
<td>${user.sex}</td>
<td>${user.age}</td>
<td>
index :${status.index }<br/>
count :${status.count }<br/>
current :${status.current }<br/>
first :${status.first }<br/>
last :${status.last }<br/>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
加粗部分的30行、33行中的varStatus属性、38行至44行是我进一步添加的代码。运行程序,效果如下:

通过上面的图片,再来回顾一下varStatus的各种状态,就一目了然了:
- index 索引 从0开始
- count 从1开始 当前遍历次数
- current 当前正在迭代的对象
- first 是否是第一个
- last 是否是最后一个
代码举例:
- <c :forTokens>
新建index4.jsp文件,代码如下:
index4.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body> <c:set var="likes" value="羽毛球,摄影,音乐"></c:set>
<c:forTokens items="${likes }" delims="," var="myValue">
${myValue }<br/>
</c:forTokens>
</body>
</html>
12行:字符串的键为likes,值为"羽毛球,摄影,音乐"。
13行:遍历items中的字符串,delims中的逗号是分隔符。
运行程序,效果如下:

【工程文件】
链接:http://pan.baidu.com/s/1qWNU6Xe
密码:itqn
JavaWeb学习----JSTL标签库的更多相关文章
- 【JavaWeb】JSTL标签库
JSTL标签库 JSTL标准标签库: JSTL用于简化JSP开发,提高代码的可读性与可维护性: JSTL由SUN(Oracle)定义规范,由Apache Tomcat团队实现: 引用JSTL核心库 核 ...
- 【JavaWeb】JSTL 标签库
JSTL 标签库 简介 JSTL(JSP Standard Tag Library),即 JSP 标准标签库.标签库是为了替换代码脚本,使得整个 jsp 页面变得更加简洁. JSTL 有五个功能不同的 ...
- Java学习——JSTL标签与EL表达式之间的微妙关系
原文总结的太好了,忍不住记录.转发. 原文地址:http://blog.csdn.net/u010168160/article/details/49182867 目录(?)[-] 一EL表达式 EL相 ...
- JavaWeb学习篇之----自定义标签&&JSTL标签库详解
今天来看一下自定义标签的内容,自定义标签是JavaWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面 ...
- JavaWeb学习笔记(九)—— JSTL标签库
一.JSTL概述 1.1 什么是JSTL JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是 ...
- JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)
1.JSP常用标签 * 只要支持JSP文件,常用标签有可以直接使用 * 格式: jsp:xxxx * jsp:forward ,完成jsp页面的转发 * page属性:转发的地址 <% requ ...
- javaweb学习总结(二十八)——JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- javaWeb学习总结(9)- JSTL标签库之核心标签
一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...
- 重温JSP学习笔记--JSTL标签库
以前写jsp的时候对jstl标签库是有些抵触的,因为我觉得嵌入java代码的方式几乎无往不利,没有必要使用标签库,不过这次复习还是好好地学习了一下,发现这个还是很有用处的,用得好能省不少事,JSTL是 ...
随机推荐
- 设计模式总结篇系列:观察者模式(Observer)
观察者模式中通常有两个基本的概念主题:观察者和被观察者.当被观察者状态发生改变时,需要通知相应的观察者,当然,每个被观察者所对应的观察者可能不知一个,他们之间是1:n的关系.用专业一点的术语对观察者模 ...
- [js开源组件开发]js手机端浮层控件,并有多种弹出小提示,兼容pc端浏览器
js dialog组件,包含alert和confirm的实现 本组件所有的资源均在github上可以查看源代码 GitHub 本dialog的组件的例子请在这里查看 demo dialog js di ...
- How to install and configure Azure PowerShell
https://azure.microsoft.com/en-us/documentation/articles/powershell-install-configure/ In this artic ...
- How to Use Telnet to Test SMTP Communication
Topic Last Modified: 2005-05-24 Telnet is an extremely useful tool for troubleshooting issues relate ...
- 用R语言分析我的fitbit计步数据
目标:把fitbit的每日运动记录导入到R语言中进行分析,画出统计图表来 已有原始数据:fitbit2014年每日的记录电子表格文件,全部数据点此下载,示例如下: 日期 消耗卡路里数 步 距离 攀爬楼 ...
- Android项目实战(九):CustomShapeImageView 自定义形状的ImageView
一个两年前出来的第三方类库,具有不限于圆形ImageView的多种形状ImageView,项目开发必备 github下载地址:https://github.com/MostafaGazar/Custo ...
- Ubuntu下修改system.img 解包system.img、打包system.img
一.准备工作:解压解打包工具,得到三个文件:make_ext4fs.mkuserimg.sh.simg2img,把它们跟要修改的 .img.ext4(或.img)文件放置到同一个目录下 二.转换源文件 ...
- 【读书笔记】iOS-UIFont-动态下载系统提供的字体-官方代码
一,工程目录 二,AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOption ...
- 【转】Windows的多线程编程,C/C++
在Windows的多线程编程中,创建线程的函数主要有CreateThread和_beginthread(及_beginthreadex). CreateThread 和 ExitThread 使 ...
- .net程序员工作两年总结
(2015年9月) 最近换了工作,面试了很多家公司想总结下,以便以后回顾知道自己是怎么走过来的. 入行背景: 我是半路转行做软件开发的,2011年7月大学专科毕业,大学专业是:机械制造及其自动化:20 ...