JSTL简介
JSTL全称: JSP Standard Tag Library ,JSP标准库
JSTL的作用:
- 提供给java web 开发人员一个标准通用的标签函数库
- 和EL来取代传统直接在页面上嵌入java程序(Scripting)的做法,以提高程序可读性,维护性和方便性(和EL表达式一起取代
<% %>
)
JSTL的版本
- JSTL 的主要版本是1.0 1.1和1.2(区别不大)
- 1.0版本EL表达式还没有纳入官方赋范
- 1.1和1.2版本EL表达式已经纳入了官方规范
JSTL的下载
- JSTL 由Apache组织的Jakarta Project实现
- http://tomcat.apache.org/taglibs/stanard/
- 容器必须支持Servlet2.4且JSP2.0以上版本
- JavaEE1.4
导入jar包
- jstl.jar
- standard.jar
JSTL 标签库
- 核心标签库(core)—c
- XML(x:操作xml的标签库)
- SQL(sql标签库)
- FMT(fmt:国际化标签库)
- JSTL函数(EL 函数)el
在jar包 WETA-INF下的标签库
- c.tld :核心的标签库
- fn.tld: EL表达式标签库
JSTL快速入门
- 导入jar包
- jstl.jar和stansard.jar
- 新建jsp的页面
- 在页面中引入核心标签库
- 注意引入
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- JSTL标签库关于导入版本问题
- http://java.sun.com/jsp/jstl/core 1.1或者1.2版本(使用该版本)
- http://java.sun.com/jstl/core 1.0版本(不支持EL表达式)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>传统方式</h3>
<%
int a =10;
if(a==10){
%>
<%= a = 10 %>
<%
}
%>
<h3>jstl方式</h3>
<!--域中存入值-->
<c:set var="i" value="10" scope="page"></c:set>
<!--if判断,获取域中的值-->
<c:if test="${ i eq 10}">
<!--HTML文本,加入标签可以设置样式-->
<font color = "red" >i=10</font>
</c:if>
</body>
</html>
<c: out >
标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
Value | true | Object | 指定要输出的内容(常量或变量) |
escapeXml | true | Boolean | 指定是否将>,&,”等特殊字符进行 HTML编码转换后再输出,默认值为true,转义。 |
default | true | Object | 指定如果value属性的值为null时所输出的默认值 |
value属性
<h4>传统方式</h4>
<!--输出常量-->
<%= "hello" %>
<!--输出变量-->
<%
int a = 10;
%>
<%= a %>
<h4>JSTL的方式</h4>
<!--输出的内容都是存在某个域中的-->
<c:out value="hello"></c:out>
<!--在request域中存入值-->
<c:set var="i" value="23" scope="request" ></c:set>
<!--通过EL表达式取出值,然后再通过out输出-->
<c:out value="${ii}"></c:out>
default属性
<!--通过EL表达式取一个不存在的属性-->
<c:out value="city"></c:out>
<!--out输出应该是一个空的字符串 “ ”-->
<!--加入default属性后-->
<c:out value="city" dafault="xian"></c:out>
<!--EL表达式取到的属性值为空时,out输出默认是xian-->
escapeXml属性
<!-- 默认情况下-->
<c:out value="<a href='#'>超链接</a>"></c:out>
<!--输出是<a href='#'>超链接</a> 是一个普通的字符串形式-->
<!--源码:<a href= '#'>超链接</a>-->
<!--默认是进行转义的-->
<!--使用属性-->
<c:out value="<a href='#' escapaXml="false">超链接</a>"></c:out>
<!--输出是超链接形式-->
<c:set>
标签
- 向4个域中存入值(var value scope)
- 设置Web域中的java,util,Map类型的属性对象或者JavaBean类型的属性对象的属性。(target property value属性)
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
Value | true | Object | 指定存入的属性值 |
var | false | String | 用于指定要设置的Web域的属性的名称 |
scope | false | String | 指定属性所在的Web域 |
target | true | Object | 指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象 |
property | true | String | 指定当前要为对象设置的属性名称 |
向4个域中存入值
<!--set.jsp-->
<h4>传统的方式</h4>
<%
pageContext.setAttribute("name","10",pageContext.REQUEST_SCOPE);
%>
<h4>jstl方式</h4>
<!--在request域中存入属性name1,值为10-->
<c:set var="name1" value="10" scope="request"></c:set>
<!--通过EL表达式取出request域中的属性name1-->
${requestScope.name1}
修改JavaBean对象的属性值
<!--已创建JavaBean工具类User-->
<%
<!--创建User对象-->
User user = new User();
<!--将数据封装到对象中-->
user.setUsername("xiaomei");
user.setPassword("123");
<!--经封装的数据存储到域中-->
reuqest.setAttribute("user",user);
%>
<!--EL表达式获取数据-->
${user.username}
<!--通过EL表达式获取目标对象-->
<!--将User对象的username属性修改为xioafeng-->
<c:set target="${user}" property = "username" value="xioaofeng" ></c:set>
<!--EL表达式获取修改后的属性值-->
${user.uername}
<c:remove>
标签
- 用于删除各种web域中的属性
- 属性
- var : 删除的属性
- scope:在域的范围
- 语法格式:
<c:remove var="varName" [scope="{page|request|session|application}"]/>
<h4>传统方式</h4>
<%
request.setAttribute("age",20);
request.removeAttribute("age");
%>
<h4>jstl方式</h4>
<c:set var="age" value="20" scope="request"></c:set>
<c:remove var="age" scope="request"/>
<c:catch>
标签
- 用于捕获嵌套在标签体中的内容抛出的异常
- 语法:
<c:catch [var="varName"]>nested actions</c:catch>
- 属性
- var:表示
<c:catch>
标签捕获的异常对象,它将保存在page域。
<h4>传统方式</h4>
<%
try{
}catch(Exception e){
e.peintStackTrace();
}
%>
<h4>jstl方式</h4>
<!--抛出的异常存入到e中-->
<c:catch var="e">
<%
int a = 10/0;
%>
</c:catch>
<!--通过message获取异常信息 /by zero-->
${e.message}
<c:if>
标签
标签<c:if test="">
可以构造简单的“if-then”结构的条件表达式,没有<c:else>
标签
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
test | true | Boolean | 决定是否处理标签体中的内容的条件表达式 |
var | false | String | 指定将test属性的执行结果保存到某个web域中的某个属性的名称 |
scope | false | String | 指定将test属性的执行结果保存到哪个web域中 |
<h4>传统方式</h4>
<%
int a=10;
if(a>=10){
out.print("a>=10");
}else{
out.print("a<10");
}
%>
<h4>jstl方式</h4>
<!--在page域中存入属性t-->
<c:set var="t" value="10" scope="page"></c:set>
<!--Test中要通过el表达式获取数据-->
<!--将test的运算结果保存到var中-->
<c:if test="${t le 10}" var="l" scope="page">
t<=10
</c:if>
<!--输出test的运算结果-->
${l}
<c:if test="${t gt 10}">
t>10
</c:if>
<c:choose>
标签
标签<c:choose>
用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>
标签一起使用。以上三个标签可以构造类似于“if-else if -else”的复杂条件判断结构。
标签<c:choose>
是父标签,<c:when>和<c:otherwise>
是内部的子标签。
<c:set var="i" value="10" scope="page"></c:set>
<c:choose>
<c:when test="${i ge 10}">
i >= 10
</c:when>
<c:when test ="${i lt 10}">
i<10
</c:when>
<c:otherwise>
其他
</c:otherwise>
</c:choose>
<c:forEach>
标签
该标签用于对一个集合对象中的元素进行循环迭代操作。或者按指定的次数重复迭代执行标签体中的内容。
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
varstatus | false | String | 记住用于保存迭代信息的对象 |
var | false | String | 指定将当前迭代到的元素保存到page域中的属性名称 |
items | true | 任何支持的类型 | j将要迭代的集合对象 |
begin | true | int | 如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始编号;如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代 |
end | true | int | 参看begin属性的描述 |
step | true | int | 指定迭代的步长,即迭代因子的迭代增量 |
遍历功能
<h4>遍历数组</h4>
<%
String[] arrs = {"青","红","黄","绿"};
request.setAttribute("arrs",arrs);
%>
<!--for(String s: arrs){ }-->
<c:forEach var="s" items="${arrs}">
${s}
</c:forEach>
<h4>遍历集合</h4>
<%
List<String> list = new ArrayList<String>();
list.add("紫");
list.add("黑");
list.add("白");
list.add("金");
request.setAttribute("list",list);
%>
<c:forEach var="s" items="list">
${s}
</c:forEach>
<h4>遍历Map集合</h4>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("a","青");
map.put("b","蓝");
map.put("r","红");
request.setAttribute("map",map);
%>
<!--entry是集合对象-->
<c:forEach var="entry" items="map">
${map.key}-----${map.value}
</c:forEach>
<h4>遍历对象的集合</h4>
<%
List<User> uList=new ArrayList<User>();
uList.add(new User("青","234"));
uList.add(new User("绿","239"));
uList.add(new User("红","274"));
request.setAttribute("uList",uList);
%>
<c:forEach var="user" items="${uList}">
${user.username}----${user.password}
</c:forEach>
迭代数据
<!--迭代1~10-->
<c:forEach var="i" begin="1" end="10" >
${i}
<!--输出1,2,3,4,5,6,7,8,9,10-->
</c:forEach>
<c:forEach var="i" begin="1" end="10" step="2">
${i}
<!--输出1,3,5,7,9-->
</c:forEach>
<!--计算从1到100的和-->
<h4>计算从1到100的和</h4>
<c:set var="sum" value="0" scope="page"></c:set>
<c:forEach var="i" begin="1" end="100" step="1">
<c:set var="sum" value="${sum+i}"></c:set>
</c:forEach>
${sum}
varStatus属性
记录迭代的相关信息
属性名 | 类型 | 意义 |
---|---|---|
index | number | 现在指到成员的索引 |
count | number | 总共指到成员的总数 |
first | boolean | 现在指到的成员是否为第一个成员 |
last | boolean | 现在指到的成员是否为最后一个成员 |
<h4>遍历10到100的偶数,每到第3个数,显示红色</h4>
<c:forEach var="i" begin="10" end="100" step="2" varStatus="status">
<!--varStatus的属性封装在status中-->
<c:choose>
<c:when test="${status.first}">
<font color="blue">${i}</font>
<!--第一个元素显示蓝色-->
</c:when>
<c:when test="${status.count %3 eq 0}">
<font color="red">${i}</font>
</c:when>
<c:otherwise>
${i}
</c:otherwise>
</c:choose>
</c:forEach>
<c:param>
标签
- 在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。
<c:param>标签可以嵌套在<c:import>,<c:url>或<c:redirect>
标签内,为这些标签所使用的URL地址附加参数。<c:param>
标签在为一个URL地址附加参数时,将自动对参数值进行URL编码。例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>
标签最大的好处。- 属性
- name :参数名称
- value : 参数的值
<c:import>
标签
名称 | 说明 | EL | 类型 | 必须 | 默认值 |
---|---|---|---|---|---|
url | 包含文件的地址 | Y | String | 是 | 无 |
context | 相同Container下,其他web站台必须以“/”开头 | Y | String | 否 | 无 |
var | 储存被包含的文件的内容(以String类型存入) | N | String | 否 | 无 |
scope | var变量的JSP范围 | N | String | 否 | Page |
charEncoding(了解) | 被包含文件之内容的编码格式 | Y | String | 否 | 无 |
varReader(了解) | 存储被包含文件的内容 | N | String | 否 | 无 |
<!--import.jsp-->
<c:import url="/jsp/choose.jsp" context="/JSTL" var="i" scope="page">
<!--将包含的页面信息保存到变量i中-->
<!--在包含的页面中传递参数-->
<c:param name="username" value="qingse"></c:param>
</c:import>
<!--通过EL表达式输出页面内容-->
${i}
<!--获取传递的参数-->
<!--choose.jsp中-->
<%
request.getParameter("username");
%>
<c:url>
标签
用于在jsp页面中构造一个URL地址,其主要目的是实现URL重写,URL重写就是将会话(session和cookie)标识号以参数形式附加在URL地址后面
http://localhost/JSTL/demo1?jsessionid=xxxx;
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
vlue | true | String | 指定要构造的URL |
var | false | String | 指定将构造出的URL结果保存到Web域中的属性名称 |
scope | false | String | 指定将构造出的URL结果保存到哪个web域中 |
<!--将URL封装在i中-->
<c:url var="i" value="/jstl/choose.jsp" scope="request" context="/jstl">
<!--传递参数-->
<c:param name="username" value="xiaofeng"></c:param>
<!--在choose.jsp中可以获取传递的参数-->
</c:url>
<!--赋值给超链接choose-->
<a href="${i}">choose</a>
<!--如果cookie被禁用,可以通过这种方式重写jsessionid-->
<!--获取传递的参数-->
<!--choose.jsp中-->
<%
request.getParameter("username");
%>
<c:redirect>
标签
用于实现请求重定向
属性名 | 是否支持EL | 属性类型 | 属性描述 |
---|---|---|---|
url | true | String | 指定要转发或重定向到的目标资源的URL地址 |
context | true | String | 当要使用相对路径重定向到同一个服务器下的其他web应用程序中的资源时,context属性指定其他web应用程序的名称 |
<!--重定向-->
<c:redirect url="/jstl/choose.jsp" context="/JSTL">
<!--传递参数-->
<c:param name="username" value="xioagua">
</c:redirect>
<c:forTokens>
分割字符串标签(了解)
<c:set var="i" value="aa,bb,cc" scope="page"></c:set>
<c:forTokens items="${i}" delims="," var="x">
${x}
</c:forTokens>
<!--输出aa bb cc-->