一、EL 表达式
概述:Expression Language 表达式语言,是一种在 JSP 页面获取数据的简单方式。
只能获取数据,不能设置数据。
语法:在 JSP 页面的任何静态部分均可通过: 来获取到指定表达式的值
开启EL表达式:isELIgnored="false"
(1)获取容器的值
<html>
<head>
<title>EL</title>
</head>
<body>
<h1>之前的写法</h1>
<%
pageContext.setAttribute("A","page内容",1);
pageContext.setAttribute("B","request内容",2);
pageContext.setAttribute("C","session内容",3);
pageContext.setAttribute("D","application内容",4);
Object o1=pageContext.getAttribute("A",1);
Object o2=pageContext.getAttribute("B",2);
Object o3=pageContext.getAttribute("C",3);
Object o4=pageContext.getAttribute("D",4);
out.print(o1+"<br/>");
out.print(o2+"<br/>");
out.print(o3+"<br/>");
out.print(o4+"<br/>");
%>
<h1>EL表达式的写法</h1>
${pageScope.A}<br/>
${requestScope.B}<br/>
${sessionScope.C}<br/>
${applicationScope.D}<br/>
<h1>EL表达式的写法缩写形式</h1>
${A}<br/>
${B}<br/>
${C}<br/>
${D}<br/>
</body>
</html>
(2)获取请求参数的值
<html>
<head>
<title>从请求参数中获取内容</title>
</head>
<body>
<form action="11-1.jsp" method="post">
账号:<input name="name"/><br/>
年龄:<input name="age"/><br/>
爱好:<input type="checkbox" name="love" value="zq"/>⚽️
<input type="checkbox" name="love" value="lq"/>🏀
<input type="checkbox" name="love" value="pq"/>🏐️
<br/>
<button>提交</button>
</form>
</body>
</html>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>过去获取请求参数值的写法:</h1>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String age = request.getParameter("age");
String[] love = request.getParameterValues("love");
out.print(name + "<br/>");
out.print(age + "<br/>");
out.print(Arrays.toString(love) + "<br/>");
%>
<h1>EL获取请求参数值的写法:</h1>
${param.name}<br>
${param.age}<br>
${paramValues.love}
</body>
</html>
(3)如何操纵对象
<html>
<head>
<title>EL表达式操纵对象</title>
</head>
<body>
<%
Student stu=new Student();
stu.setAge(20);
stu.setName("王妍");
stu.setId(19163128);
session.setAttribute("STUDENT",stu);
%>
<h1>EL操作对象</h1>
获取session容器中的内容:${STUDENT}<br/>
之间获取到容器中对象的某个属性:${STUDENT.age}..${STUDENT.id}..${STUDENT.name}
</body>
</html>
(4)如何操纵集合
<html>
<head>
<title>操作集合</title>
</head>
<body>
<%
String[] array={"aa","bb","cc","dd"};
List<String> list=new ArrayList<>();
list.add("王妍");
list.add("张三");
list.add("李四");
Map<String,String[]> map=new HashMap<>();
map.put("A",array);
session.setAttribute("A",array);
session.setAttribute("B",list);
session.setAttribute("C",map);
%>
<h1>通过EL表达式操作集合</h1>
数组:${A[1]}<br><%--获取键值为A,值是array,array的第二个值--%>
list或set集合:${B.get(1)}<br><%--获取键值为B,值是list,list的第二个值--%>
map集合:${C.get('A')[2]}<%--获取map中键值为B,值是array,array的第三个值--%>
</body>
</html>
(5)运算符的使用
<html>
<head>
<title>EL中的运算符</title>
</head>
<body>
<h1>算数</h1>
${3+4}<br/>
<h1>关系</h1>
${8>4} ${5<4}<br/>
<h1>逻辑</h1>
${true&&false}<br/>
<h1>EL特有的判断为空表达式</h1>
判断是否容器中是否存在A :${empty A}<br/> <%--如果是true,则没有值传过来,false则有值传过来,不是空--%>
判断请求参数是否传递了a:${empty param.a}<br/>
</body>
</html>
二、JSTL 的使用
概述:JSTL(Java server pages Standarded Tag Library,JSP 标准标签库)是由 JCP(Javacommunity Proces)所制定的标准规范,它主要提供给 Java Web 开发人员一个标准通用的标签库,并由 Apache 的 Jakarta 小组来维护。开发人员可以利用这些标签取代 JSP 页面上的 Java 代码,从而提高程序的可读性,降低程序的维护难度。
(1)导入 jar 包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
(2)页面引用
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
(3)核心标签
a.对容器操作
<html>
<head>
<title>JSTL对容器的操作</title>
</head>
<body>
<%--形容器中存放内容--%>
<c:set var="A" value="aa" scope="session"/>
<c:set var="B" value="bb" scope="session"/>
<%--删除形容器中内容--%>
<c:remove var="B" scope="session"/>
<%--获取形容器中内容--%>
<c:out value="${A}" default="默认值"/>
<c:out value="${B}" default="默认值"/>
</body>
</html>
b.分支操作
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int random = (int) (Math.random() * 100 + 1);
pageContext.setAttribute("A", random);
%>
<b>单层if</b>
<c:if test="${A%2==0}">
${A}是偶数!
</c:if>
<hr>
<b>多层if</b>
<c:choose>
<c:when test="${A>=90}">
${A}是优秀!
</c:when>
<c:when test="${A<90}">
${A}是良好!
</c:when>
<c:otherwise>
${A}是差!
</c:otherwise>
</c:choose>
</body>
</html>
c.循环操作
<html>
<head>
<title>Title</title>
</head>
<body>
<!--
var:变量名
begin:从几开始
end:到几结束
step:每次增加几(step必须大于0)
-->
<b>for循环</b>
<c:forEach var="i" begin="1" end="9" step="1">
<p>${i}</p>
</c:forEach>
</body>
</html>
<%--迭代器的操作--%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
UserDao dao = new UserDao();
List<Users> list = dao.findAll();
session.setAttribute("USERS", list);
//过去的写法
int i = 1;//迭代序号
for (Users users : list) {
out.print(i + ".." + users + "<br/>");
i++;
}
%>
<hr>
<!--
var:迭代变量
items:集合
迭代序号
-->
<h1>现在的写法</h1>
<c:forEach var="users" items="${USERS}" varStatus="i">
${i.count}..+${i.index}+${users.user_name}<br>
</c:forEach>
</body>
</html>
d.迭代序号
<html>
<head>
<title>Title</title>
</head>
<body>
<%
UserDao dao = new UserDao();
List<Users> list = dao.findAll();
session.setAttribute("USERS", list);
//过去的写法
int i = 1;//迭代序号
for (Users users : list) {
out.print(i + ".." + users + "<br/>");
i++;
}
%>
<hr>
<!--
var:迭代变量
items:集合
迭代序号
-->
<h1>现在的写法</h1>
<c:forEach var="users" items="${USERS}" varStatus="i">
${i.count}..+${i.index}+${users.user_name}<br>
</c:forEach>
</body>
</html>
e.跳转操作
<html>
<head>
<title>跳转标签</title>
</head>
<body>
<c:redirect url="2.jsp">
<c:param name="a" value="abc"/>
<c:param name="b" value="sfsf"/>
</c:redirect>
</body>
</html>
f.格式化标签
页面引用
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
<title>格式化标签</title>
<%
// 设置请求的编码集 处理中文乱码 只针对于post请求
request.setCharacterEncoding("utf-8");
Date date = new Date();
pageContext.setAttribute("DATE", date);
%>
<%--
对日期进行格式化操作
SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
value:需要格式化的日期
var:格式化之后的新名字
scope:存放到那个容器中 默认是page
pattern:格式化的样式
--%>
<fmt:formatDate value="${DATE}" var="format" scope="page" pattern="yyyy年MM月dd日 HH:mm:ss"/>
格式化之后的日期:${DATE}
<hr/>
<%--
对数字进行格式化操作
value:需要格式化的数字
var:格式化之后的新名字
scope:存放到那个容器中 默认是page
pattern:格式化的样式
--%>
<fmt:formatNumber value="${66.6666666}" var="num" scope="request" pattern="##.###"/>
格式化之后的数字:${num}
</head>
<body>
</body>
</html>