众所周知,在JSP中编写代码就像是在HTML中写Java代码一样。在HTML中有"body"标签,"font"标签,"title"标签,那么在JSP中也应该有属于它的一“标签”。
Table of Contents
JSTL:JSP Standard Tag Library JSP标准标签库,由Apache的jakarta小组开发并维护。
JSTL功能:
- 简化JSP代码的编写。
- 替换 <%%> 写法,也即不在JSP页面中写Java代码。
- 一般与EL表达式配合。
- 在JSP页面中使用标签的形式完成业务逻辑等功能。
JSTL库含有哪些标签:
- 核心标签库(c标签库):Core
- 国际化标签(fmt标签库):I18N
- EL函数库(fn函数库)
- xml标签库(x标签库)
- sql标签库(sql标签库)意味着能够在JSP中直接连接数据库,但是建议不使用!
第一个JSTL实例
想要使用JSTL标签,需要先获取到相应的jar包:
- 从以下网址中获得:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
- 从页面中选择Jakarta-taglib-standard-1.1.2.zip
3. 打开压缩包,可以获取以下内容:
- tld目录下可以获取约束
- lib目录下可以获得jstl.jar和standard.jar两个包,将其复制到Web项目下的WEB-INF目录下,就可以使用JSTL标签了;
- 如果想要在Tomcat服务器的所有Web应用都能使用JSTL,则需要将这两个jar复制到Tomcat安装目录lib下即可。
这里以JSTL的核心标签库为例:
1. 导入jar文件到工程的WebContent/WEB-INF/lib jstl.jar standard.jar
2. 在jsp页面上,使用taglib 指令,来引入标签库
3. 注意:如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
第一个JSTL实例
<!-- File Name: helloJSTL.jsp -->
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSTL</title>
</head>
<body>
<h2>第一个JSTL实例</h2>
<div style="text-align:center">
<c:out value="hello, JSTL"></c:out>
<br/>
<c:out value="hello, Kyle."></c:out>
</div>
</body>
</html>
在Tomcat中执行后的结果:
JSTL核心标签
要需要使用标签的JSP页头出导入标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签概览:
- 保存数据:<c:set></c:set>
- 获取数据:<c:out value=""></c:out>
- 单条件判断:<c:if test=""></c:if>
- 多条件判断:
- <c:choose></c:choose>
- <c:when test=""></c:when>
- <c:otherwise></c:otherwise>
- 循环数据:
- <c:forEach></c:forEach>
- <c:forTokens items="" delims=""></c:forTokens>
- 重定向
- <c:redirect></c:redirect>
定义变量set和删除变量remove
set标签功能:保存数据(保存到域中), 默认保存到page域;scope指定保存在那个域中;
语法格式:
<c:set value=”表达式” var=”变量名” scope=”page|request|session|application”/>
或者:<c:set var=”变量名”>EL表达式</c:set>
参数解析:
- var:存储数据的变量;
- value:要存储的具体内容;
- target:要修改属性的所属对象;
- property:要修改的属性;
- scope:var属性的作用域;
remove标签功能:用于移除一个变量
语法格式:
<c:remove var="<string>" scope="<string>"/>
参数解析:
- var:表示要移除的变量名称
- scope:表示var属性的作用域;
实例:
<!-- <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>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 声明一个对象name, 对象的值zhangsan, 存储到了page(默认),指定是session -->
<c:set var="name" value="zhangsan" scope="session"></c:set>
${sessionScope.name }
</body>
</html>
输出变量out
<c:out>标签功能:
- 用来显示一个表达式的结果,在页面上直接输出变量内容;即获取数据(从域中),然后输出;
- 与<%= %>作用相似;
- 它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。
语法格式:
<c:out value=”表达式” escapeXML=”true|false” />
参数解析:
- default: 当value值为null时,使用默认值,value的属性值为EL表达式;
- escapeXml: 是否对value值进行转义,false表不转义(即把value值当做代码去执行);true,转义(默认),即把value值当做字符串输出即可;
out标签的使用
<body>
<c:set var="i" value="10" scope="page"></c:set>
<c:out value="${i}"></c:out>
</body>
单条件判断if
标签语法:
<c:if test="判断条件" var=”这个变量保存判断条件的执行结果” scope=”var变量保存在哪里”>
判断条件为真时执行的语句
</c:if>
参数解析:
- test:要判断的条件,就像是if()里面的参数一样;
- var:存储条件结果的变量;
- scope:var属性的作用域;可选值有page、request、session、appliance
<c:if>标签实例
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>第一个EL表达式程序</title>
</head>
<body>
<h2> 单条件if的用法 </h2> <br/>
<!-- 从请求的URL中获取参数是"num"的值 -->
<c:set var="paramNum" value="${param.num }" scope="page"></c:set>
从请求的URL中获取参数是"num"的值:${pageScope.paramNum } <br/> <br/>
<c:if test="${pageScope.paramNum > 50 }" var="result" scope="page">
${pageScope.paramNum }大于50!<br/>
</c:if>
<c:if test="${pageScope.paramNum < 50 }" var="result" scope="page">
${pageScope.paramNum }小于50 <br/>
</c:if>
</body>
</html>
注意:if标签可以叠加:
<%--if标签 :单条件判断,test的参数可以是EL表达式 --%>
<c:if test="${!empty msg}"> 判断msg是否为空
<c:if test="${ “hah” = msg}"> 判断msg是否等于“hah”
条件成立
</c:if>
多条件判断choos-when
语法格式:
<c:choose>
<c:when test=”条件表达式”>
如果条件表达式为真时执行
</c:when>
<c:otherwise>
条件为假时执行
</c:otherwise>
</c:choose>
解释:
- 类似于Java中的If_else表达式;
- when和otherwise标签可以有多组;
- otherwise标签可有可无;
实例:
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>第一个EL表达式程序</title>
</head>
<body>
<h2>choose标签+when标签+otherwirse标签: 多条件判断</h2>
<br />
<!-- 从请求的URL中获取参数是"num"的值 -->
<c:set var="score" value="${param.num}" scope="page"></c:set>
你的分数是:${pageScope.score }
<c:choose>
<c:when test="${score>=90 && score<=100}">
<%-- else if 的意思 --%>
优秀
</c:when>
<c:when test="${score>=80 && score<90}">
良好
</c:when>
<c:when test="${score>=70 && score<80}">
一般
</c:when>
<c:when test="${score>=60 && score<70}">
及格
</c:when>
<c:otherwise>
<%-- else的意思 --%>
不及格
</c:otherwise>
</c:choose>
</body>
</html>
循环forEach
普通forEach:
<c:forEach var=”你要迭代谁” varStatus=”临时变量” begin=”” end=”到哪里结束” step=”步长”>
迭代需要执行的代码:Java代码、HTML代码
</c:forEach>
遍历集合的forEach:
<c:forEach item=”集合名” var=”你要迭代谁” varStatus=”临时变量” begin=”” end=”到哪里结束” step=”步长”>
迭代需要执行的代码:Java代码、HTML代码
</c:forEach>
参数解析:
- begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
- end="": 到哪个元素结束。默认到最后一个元素
- step="" : 步长(每次加几) ,默认1
- items="": 需要遍历的数据(集合):<c:forEach item=”集合名”></c:forEach>
- var="": 迭代目标
- varStatus="":当前正在遍历元素的状态对象,即位置。(count属性:当前位置,从1开始)
- 理解:for(varStatus=0; varStatus<items; varStatus++) { printf(“%d ”,var); }
forEach普通遍历
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>第一个EL表达式程序</title>
</head>
<body>
<h2>forEach使用示例</h2> <br />
<!-- 相当于Java中的:for(int i=0; i<10; i++) {} -->
<c:forEach begin="${1 }" end="${10 }" step="${1 }" >
连续执行10次循环体,相当于Java中的:for(int i=0; i<10; i++) {} <br/>
</c:forEach>
</body>
</html>
<c:forEach>遍历集合
<%
//List
List<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",28));
list.add(new Student("lucy",38));
//放入域中
pageContext.setAttribute("list",list);
//Map
Map<String,Student> map = new HashMap<String,Student>();
map.put("100",new Student("mark",20));
map.put("101",new Student("maxwell",30));
map.put("102",new Student("narci",40));
//放入域中
pageContext.setAttribute("map",map);
%>
<%-- List的遍历 --%>>
<c:forEach items="${list}" var="student" varStatus="varSta">
序号:${varSta.count} - 姓名:${student.name } - 年龄:${student.age}<br/>
</c:forEach>
<%-- Map的遍历 --%>>
<c:forEach items="${map}" var="entry">
${entry.key } - 姓名: ${entry.value.name } - 年龄:${entry.value.age }<br/>
</c:forEach>
forToken
功能:对字符串进行分割,类似于Java中的split方法。
语法格式:
<c:forTokens items=“字符串” delims=”分隔符” var=”你要迭代谁” varStatus=”临时变量” begin=””
end=”到哪里结束” step=”步长”>
迭代需要执行的代码
</c:forTokens>
参数解析:
- 比<for:Each>多一个:delime:以什么去作为切的标志;
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>第一个EL表达式程序</title>
</head>
<body>
<h2>forToken标签</h2> <br />
<%-- forToken标签: 循环特殊字符串 --%>
<%
String str = "java-php-net-平面";
pageContext.setAttribute("str",str);
%>
<%--参数解析:比<for:Each>多一个:delime:以什么去作为切的标志;--%>
<c:forTokens items="${str}" delims="-" var="s">
${s }<br/>
</c:forTokens>
</body>
</html>
重定向redirect
功能:把客户端发送过来的请求,重新定向的另一个页面。
语法格式:
<c:redirect url=”url表达式” context=”制定重定向到另一个页面的类型”>
<c:param name=”” value=””/>
<c:param name="" value=""/>
</c:redirect>
实例:
hello.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>
<html>
<head>
<meta charset="UTF-8">
<title>第一个EL表达式程序</title>
</head>
<body>
<h2>redirect标签</h2> <br />
<c:set var="redirectParam" value="${param.rp }" scope="request"></c:set>
<c:if test="${redirectParam == \"first\" }" var="result" scope="request">
<c:redirect url="first.jsp">
<c:param name="name01" value="value01" />
<c:param name="name02" value="value02" />
</c:redirect>
</c:if>
</body>
</html>
first.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>First-JSP</title>
</head>
<body>
<h3> 从重定向过来的页面中获取参数 </h3>
参数“name01”的值为:${param.name01 } <br/>
参数“name02”的值为:${param.name02 } <br/>
</body>
</html>
在浏览器中执行以下URL:http://localhost:8080/K-JSP/hello.jsp?rp=first