JSP中可以使用EL表达式取出域对象中的数据, 但是仍然避免不了还是要在页面中书写一些java代码(如: 集合的遍历), 处理比较繁琐, 且代码不容易维护
使用需要添加两个jar包
作用
开发人员可以利用JSTL和EL来开发Web程序,取代传统直接在页面上嵌入Java程序的做法,以提高程序的阅读性、维护性和方便性。在jstl中, 提供了多套标签库, 用于方便在jsp中完成或简化相关操作
使用方式
需要在项目中导入jstl-1.2.jar ,jstl在后台由java代码编写, jsp页面中通过标签进行使用, 使用标签时, 会自动调用后台的java方法(jar包中的方法)
2)标签库的引入语法格式
<%@ taglib uri=“标签库的定位” prefix=“前缀(简称)” %>
一般都是使用语法之后自动引入
<%--向四个域中放入数据 setAttribute--%>
<c:set var="msg" value="pageScopeMsg" scope="page" ></c:set>
<c:set var="msg" value="requestScopeMsg" scope="request" ></c:set>
<c:set var="msg" value="sessionScopeMsg" scope="session" ></c:set>
<c:set var="msg" value="applicationScopeMsg" scope="application" ></c:set>
<%--从四个域中取出数据 getAttribute--%>
${pageScope.msg}
${requestScope.msg}
${sessionScope.msg}
${applicationScope.msg}
<hr/>
<%--c remove 移除指定域中的数据的 removeAttribute --%>
<c:remove var="msg" scope="page"></c:remove>
<c:remove var="msg" scope="session"></c:remove>
<c:remove var="msg" scope="request"></c:remove>
<c:remove var="msg" scope="application"></c:remove>
<hr/>
<%--c out 输出标签中取出的域对象中的数据 --%>
<c:out value="${pageScope.msg}" default="msg信息未找到"></c:out>
<c:out value="${requestScope.msg}" default="msg信息未找到"></c:out>
<c:out value="${sessionScope.msg}" default="msg信息未找到"></c:out>
<c:out value="${applicationScope.msg}" default="msg信息未找到"></c:out>
单条件判断
<%--
test 相当于 if(判断条件)
var 判断条件的结果 保存到域对象中 数据的名称
scope 控制操作的域
--%>
<c:if test =“EL条件表达式”>
满足条件执行
</c:if >
案例
<%
pageContext.setAttribute("score",99);
%>
分数:${score} 级别:
<c:if test="${score ge 90 and score le 100}" var="f1">A</c:if>
<c:if test="${score ge 80 and score lt 90}" var="f2">B</c:if>
<c:if test="${score ge 70 and score lt 80}" var="f3">C</c:if>
<c:if test="${score ge 60 and score lt 70}" var="f4">D</c:if>
<c:if test="${ score lt 60}" var="f5">E</c:if>
多条件判断
<c:choose >
<c:when test =“EL表达式”>
满足条件执行
</c:when>
…
<c:otherwise>
不满足上述when条件时执行
</c:otherwise>
</c:choose >
<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>
循环标签
<%--相当于for循环--%>
var: 迭代变量
begin: 迭代起始值
end: 迭代结束值
step: 迭代变量变化的步长
<c:forEach var="i" begin="1" end="9" step="1">
...
</c:forEach>
<%--相当于for each循环--%>
var: 迭代变量
items: 集合
<c:forEach var=“循环变量” items=“集合”>
...
</c:forEach>
<%--特殊字符串, 按照指定的分隔符, 分割遍历--%>
<c:forTokens items="集合" delims="特殊字符" var="循环变量">
...
</c:forEach>
<%--打印99乘法表--%>
<c:forEach begin="1" end="9" step="1" var="i">
<c:forEach begin="1" end="${i}" step="1" var="j">
${j} * ${i} = ${j*i}
</c:forEach>
<br>
</c:forEach>
增强循环
打印99乘法表
<%--打印99乘法表--%>
<c:forEach begin="1" end="9" step="1" var="i">
<c:forEach begin="1" end="${i}" step="1" var="j">
${j} * ${i} = ${j*i}
</c:forEach>
<br>
</c:forEach>
案例
<%@page import="java.sql.Date"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.bjsxt.pojo.Employee" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>My JSP 'jstlel.jsp' starting page</title>
</head>
<body>
<%
/*1.准备数据*/
int n=70;//基本类型
double avgScore = 99.45678;//基本类型
Employee emp=new Employee();//引用类型
emp.setEid(1);
emp.setEname("张晓红");
emp.setBirth(Date.valueOf("1999-12-12"));
String [] strs = {"Java","Oracle","JSP","HTML"};//数组
String courses="Java,Oracle,JSP,HTML,Servlet";//特殊的字符串
String courses2="Java#Oracle#JSP#HTML#Servlet";//特殊的字符串
String str = null;
String str3 = "";
List list = new ArrayList();//分配空间,没有元素
list.add(90);
list.add(80);
List list2 =null;//没有分配空间
List list3 =new ArrayList();//分配空间,没有元素 size()==0
Map<String,String> map = new HashMap<String,String>();//Map
map.put("cn", "China");
map.put("fr", "France");
//setAttribute
request.setAttribute("n",n);
request.setAttribute("avgScore",avgScore);
request.setAttribute("emp",emp);
request.setAttribute("strs",strs);
request.setAttribute("courses",courses);
request.setAttribute("courses2",courses2);
request.setAttribute("now",new java.util.Date());
request.setAttribute("list", list);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
request.setAttribute("map", map);
request.setAttribute("str", str);
request.setAttribute("str3", str3);
%>
//2.使用JSTL和EL输出
<h3>JSTL和EL标签的使用</h3>
n:${requestScope.n}
<hr/>
avgScore:${requestScope.avgScore} <br/>
<%--如果分数 90-100 A 80-90 B 80--C --%>
<c:if test="${requestScope.avgScore>=90 && requestScope.avgScore<=100}">A</c:if>
<c:if test="${requestScope.avgScore>=80 && requestScope.avgScore<90}">B</c:if>
<c:if test="${requestScope.avgScore<80}">C</c:if>
<br/>
<%--if()..else if()...else{}--%>
<c:choose>
<c:when test="${requestScope.avgScore>=90}">A</c:when>
<c:when test="${requestScope.avgScore>=80}">B</c:when>
<c:when test="${requestScope.avgScore>=70}">C</c:when>
<c:otherwise>D</c:otherwise>
</c:choose>
<br/>
分数:<fmt:formatNumber maxFractionDigits="2" value="${requestScope.avgScore}"> </fmt:formatNumber>
<hr/>
姓名:${requestScope.emp.ename}<br/>
日期:${requestScope.emp.birth}<br/>
日期:<fmt:formatDate value="${requestScope.emp.birth}" pattern="yyyy年MM月dd日"></fmt:formatDate>
<hr/>
<c:forEach items="${requestScope.strs}" var="s" varStatus="vs">
${s}-->${vs.index}--->${vs.count} <br/>
</c:forEach>
<hr/>
<%--如果字符串是按照逗号进行分割时候,就这种情况是可以直接进行遍历的--%>
<c:forEach items="${requestScope.courses}" var="s">
${s}--->
</c:forEach>
<hr/>
<c:forEach items="${requestScope.courses2}" var="s">
${s}--->
</c:forEach>
<hr/>
<%--进行特殊字符串的分割--%>
<c:forTokens items="${requestScope.courses2}" delims="#" var="s">
${s}--->
</c:forTokens>
<hr/>
<c:forEach items="${requestScope.map}" var="m">
${m.key}--->${m.value}
</c:forEach>
<hr/>
请选择每页显示的条数:
<select>
<c:forEach begin="10" step="10" end="100" var="size">
<option>${size}</option>
</c:forEach>
</select>
</body>
</html>