JSTL核心标签
认识JSTL
为什么需要学习JSTL
通过之前的案例我们发现,就算在JSP中可以使用EL表达式取出域对象中的数据,但是仍然避免不了还是要在页面中书写一些java代码.这种嵌入JAVA代码的处理比较繁琐,容易出错,且代码不容易维护.
什么是JSTL
JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。
使用JSTL的好处:
开发人员可以利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序的做法,以提高程序的阅读性、维护性和方便性。在jstl中, 提供了多套标签库, 用于方便在jsp中完成或简化相关操作.
JSTL标签库的组成部分
>核心标签库: core, 简称c
>格式化标签库: format, 简称fmt
>函数标签库: function, 简称fn
JSTL的使用前提
1需要在项目中导入jstl-1.2.jar ,jstl在后台由java代码编写, jsp页面中通过标签进行使用, 使用标签时, 会自动调用后台的java方法,
2标签和方法之间的映射关系在对应的tld文件中描述. 需要在页面中通过taglib指令引入对应的标签库, uri可以在对应的tld文件中找到
<%@ taglib uri="标签库的定位" prefix="前缀(简称)" %>
核心标签库导入的语句为:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
操作域对象的标签:
<c:set> 向域对象中放入数据 setAttribute
<c:out> 从域对象中取出数据 getAttribute
<c:remove> 从域对象中移除数据 removeAttribute
c:set/out/remove标签的使用
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--分别向四个域中放入数据--%>
<%--<%
request.setAttribute("msg", "requestMessage");
%>--%>
<%--
c:set
scope 指定放数据的域 可选值 page request session application
var 数据的名称
value 数据
--%>
<c:set scope="page" var="msg" value="pageMessage"></c:set>
<c:set scope="request" var="msg" value="requestMessage"></c:set>
<c:set scope="session" var="msg" value="sessionMessage"></c:set>
<c:set scope="application" var="msg" value="applicationMessage"></c:set>
<%--移除指定域中的值--%>
<%-- <c:remove var="msg" scope="page"></c:remove>
<c:remove var="msg" scope="request"></c:remove>--%>
<c:remove var="msg" scope="session"></c:remove>
<c:remove var="msg" scope="application"></c:remove>
<%--通过EL表达式取出域中的值--%>
<hr/>
${pageScope.msg}<br/>
${requestScope.msg}<br/>
${sessionScope.msg}<br/>
${applicationScope.msg }<br/>
<hr/>
<%--通过c:out标签获取域中的值--%>
<c:out value="${pageScope.msg}" default="page msg not found"/>
<c:out value="${requestScope.msg}" default="request msg not found"/>
<c:out value="${sessionScope.msg}" default="session msg not found"/>
<c:out value="${applicationScope.msg}" default="application msg not found"/>
</body>
</html>
多条件分支标签
c:if和c:choose标签的使用
<%@ page import="java.util.Random" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
随机生成一个分数 0-100
>=90 A
>=80 B
>=70 C
>=60 D
<60 E
--%>
<%
int score =new Random().nextInt(101);
pageContext.setAttribute("score", score);
%>
<%--
test 判断条件
c:if可以将test的结果放入指定的域中
scope 指定存放的域
var 数据名
--%>
分数:${score}<br/> 等级:
<c:if test="${score ge 90}" scope="page" var="f1">A</c:if>
<c:if test="${score ge 80 and score lt 90}" scope="page" var="f2">B</c:if>
<c:if test="${score ge 70 and score lt 80}" scope="page" var="f3">C</c:if>
<c:if test="${score ge 60 and score lt 70}" scope="page" var="f4">D</c:if>
<c:if test="${score lt 60}" scope="page" var="f5">E</c:if>
<hr/>
${f1}
${f2}
${f3}
${f4}
${f5}
<hr/>
<%--输出分数是否及格--%>
<c:if test="${score ge 60}" scope="page" var="flag">及格</c:if>
<c:if test="${!pageScope.flag}">不及格</c:if>
<hr/>
<c:choose>
<c:when test="${score ge 90}">A</c:when>
<c:when test="${score ge 80}">B</c:when>
<c:when test="${score ge 70}">C</c:when>
<c:when test="${score ge 60}">D</c:when>
<c:otherwise>E</c:otherwise>
</c:choose>
</body>
</html>
迭代标签
c:foreach打印99乘法表
c:forEach中的属性
> var: 迭代变量, 存放在pageContext作用域
> begin: 迭代起始值
> end: 迭代结束值
> step: 迭代变量变化的步长
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--
for ( int i =1;i<=9 ;i+=2){
pageContext.setAttribute("i",i)
}
c:foreach 每次执时都会向page域中放入一个名为 i 值为当前值这样的一个操作
--%>
<c:forEach var="i" begin="1" end="9" step="1">
<c:forEach var="j" begin="1" end="${i}" step="1">
${j} * ${i} = ${i*j}
</c:forEach>
<br/>
</c:forEach>
</body>
</html>
c:foreach遍历对象数组/List
items: 要遍历的集合, 需要使用EL表达式取值
varStatus: 迭代变量的状态
index: 索引, 从0开始
count: 计数, 从1开始
first: boolean, 表示是否是第一个
last: boolean, 表示是否是最后一个
current: 对象, 当前迭代的对象值
后台代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
<style>
table{
border: 3px solid blue;
width: 90%;
margin: 0px auto;
}
td,th{
border: 2px solid green;
}
</style>
</head>
<body>
<table cellspacing="0px" cellpadding="0px">
<tr>
<th>序号</th>
<th>索引</th>
<th>isFirst</th>
<th>isLast</th>
<th>工号</th>
<th>姓名</th>
<th>姓名</th>
<th>上级编号</th>
<th>职务</th>
<th>入职日期</th>
<th>薪资</th>
<th>补助</th>
<th>部门号</th>
<th>薪资等级</th>
</tr>
<%--<%
List<Emp> emps = (List<Emp>) request.getAttribute("emps");
for (Emp emp : emps) {
pageContext.setAttribute("emp", emp);//将员工对象放入PageContext 域
%>
c:foreach
items 要遍历的数组/List 可以通过EL表达式取出集合之后给改属性赋值
var 中间变量的名称
varStatus 记录每一个对象状态的设置
count 个数
index 索引
first 如果当前元素是迭代的第一个元素 true 否则为false
last 如果当前元素是迭代的最后一个元素 true 否则为false
current 当前迭代的元素本身
--%>
<c:forEach items="${emps}" var="emp" varStatus="empStatus">
<tr>
<td>${empStatus.count}</td>
<td>${empStatus.index}</td>
<td>${empStatus.first}</td>
<td>${empStatus.last}</td>
<td>${emp.empno}</td>
<td>${emp.ename}</td>
<td>${empStatus.current.ename}</td>
<td>${emp.mgr}</td>
<td>${emp.job}</td>
<td>${emp.hiredate}</td>
<td>${emp.sal}</td>
<td>${emp.comm}</td>
<td>${emp.deptno}</td>
<td>
<c:choose>
<c:when test="${emp.sal le 500}">A</c:when>
<c:when test="${emp.sal le 1000}">B</c:when>
<c:when test="${emp.sal le 1500}">C</c:when>
<c:when test="${emp.sal le 2000}">D</c:when>
<c:when test="${emp.sal le 3000}">E</c:when>
<c:when test="${emp.sal le 4000}">F</c:when>
<c:when test="${emp.sal gt 4000}">G</c:when>
</c:choose>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>