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>