el表达式的作用、JSTL的概念和作用
el表达式的作用
jsp与EL的区别:
区别 | JSP表达式 | EL表达式 |
---|---|---|
语法 | <%= 变量或表达式 %> | ${变量或表达式} |
输出哪里的值 | Java中脚本变量值 | 作用域中值,任何一个作用域都可以 |
案例:使用JSP和EL取出作用域中的值
分别使用JSP代码和EL从作用域中取数据
从指定的作用域中获取数据
什么是页面域:
- 对象名:pageContext
- 范围:只在一个页面起作用
- 作用域大小比较: 页面域pageContext < 请求域request < 会话域session < 上下文域 application
- 底层数据结构:都是Map结构,都有三个方法:setAttribute() getAttribute() removeAttribute()
四个与页面域有关的方法:
示例:取出不同作用域中的值
效果
代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>四个作用域</title>
</head>
<body>
<%
//页面域
pageContext.setAttribute("name","法海");
//请求域
request.setAttribute("name","许仙");
//会话域
session.setAttribute("name","白素贞");
//上下文域
application.setAttribute("name","小青");
%>
<h2>JSP脚本变量输出</h2>
<%
//删除所有域中同名的键
//pageContext.removeAttribute("name");
//删除其中一个域,指定常量:PAGE_SCOPE页面域
//pageContext.removeAttribute("name", PageContext.PAGE_SCOPE);
%>
页面域: <%=pageContext.getAttribute("name")%><br/>
请求域: <%=request.getAttribute("name")%><br/>
会话域: <%=session.getAttribute("name")%><br/>
上下文域: <%=application.getAttribute("name")%><br/>
自动查找: <%=pageContext.findAttribute("name")%> <br/>
<h2>使用EL输出</h2>
<%--点号后面是键的名字--%>
页面域:${pageScope.name}<br/>
请求域:${requestScope.name}<br/>
会话域:${sessionScope.name}<br/>
上下文域:${applicationScope.name}<br/>
自动查找:${name}
</body>
</html>
在EL中从四个域中取出变量值写法,四个作用域底层都是Map结构
作用域 | EL的写法 |
---|---|
页面域 | ${pageScope.key} |
请求域 | ${requestScope.key} |
会话域 | ${sessionScope.key} |
上下文域 | ${applicationScope.key} |
自动查找 | ${key} |
使用EL取出不同数据类型的值
目标
使用EL,分别从JavaBean,Map,集合List,数组中取出它们的值
效果
代码
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="com.itheima.entity.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL取不同数据类型的值</title>
</head>
<body>
<h2>得到JavaBean中的属性值</h2>
<%
Student student = new Student(100,"猪八戒",true,59);
//把学生放在页面域
pageContext.setAttribute("stu", student);
%>
<%--可以使用三元运算--%>
${stu.name} ${stu.gender?"男":"女"}
<hr>
<h2>得到List集合中的值</h2>
<%
List<String> names = new ArrayList<>();
names.add("孙悟空");
names.add("猪八戒");
names.add("包青天");
//放请求域
request.setAttribute("names", names);
%>
<%--通过索引(下标)来取--%>
${names[0]} ${names[1]} ${names[5]}
<hr>
<h2>得到数组中的值</h2>
<%
int[] nums = {101,35,20,67};
pageContext.setAttribute("nums",nums);
%>
<%--通过索引(下标)来取--%>
${nums[2]}
<hr>
<h2>得到Map中的值</h2>
<%
Map<String, String> map = new HashMap<>();
map.put("item1", "牛魔王");
map.put("item2", "新包青天");
map.put("item3-4", "孙悟空");
pageContext.setAttribute("m",map);
%>
<%--
对象名.键名
如果键中包含特殊字符:对象名["键名"]
--%>
${m.item1} ${m["item3-4"]}
</body>
</html>
键名中有特殊字符的写法
对象名["键"]
使用EL中从域中取出不同数据类型的写法
数据类型 | 写法 |
---|---|
JavaBean | ${对象名.属性} 本质上是调用的get方法 |
List | ${对象[索引]} |
数组 | ${数组对象[索引]} |
Map集合 | ${Map对象.键} 或 ${Map对象[“键”]} |
EL中各种运算符(了解)
算术运算符
算术运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
+ | 加 | ${1+1} | 2 |
- | 减 | ${2-1} | 1 |
* | 乘 | ${1*1} | 1 |
/或div | 除 | ${5 div 2} | 2.5 |
%或mod | 取余 | ${5 mod 2} | 1 |
比较运算符
关系运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
==或 eq | 等于(equal) | ${1 eq 1} | true |
!= 或 ne | 不等于(not equal) | ${1 != 1} | false |
< 或 lt | 小于(Less than) | ${1 lt 2} | true |
<=或 le | 小于等于(Less than or equal) | ${1 <= 1} | true |
> 或 gt | 大于(Greater than) | ${1 > 2} | false |
>=或 ge | 大于等于(Greater than or equal) | ${1 >=1} | true |
逻辑运算符 :
逻辑运算符 | 说明 | 范例 | 结果 |
---|---|---|---|
&& 或 and | 交集(与) | ${true and false} | false |
|| 或 or | 并集(或) | ${true || false } | true |
! 或 not | 非 | ${not true} | false |
三元运算符:
${条件表达式?真值:假值}
判空运算符:
语法:${empty 键} |
---|
1. 判断键是否为NULL,如果为空则返回true |
2. 如果键是一个空字符串,也返回true |
3. 如果键是一个集合,集合中没有元素,返回true |
JSTL的概念和作用
什么是JSTL
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。我们可以在JSP页面上编写各种标签来完成一些复杂的功能,它出现的目的是为了减少JSP页面上的Java代码量,让JSP页面更好维护。它的底层本质上运行的还是Java代码。有如下几类定制标签库:
- core:核心配置库(今天学的内容)
- format:格式化和国际化标签库
- xml:用于XML解析的标签库
- sql:可以在JSP页面上直接访问数据库
- function: 提供了一些函数库
使用核心标签
使用指令:<%@taglib%>
JSTL的标签:if标签
在JSP页面上使用if标签
作用
用于页面判断,如果为真,则执行标签体中内容。
示例:if标签的案例
需求:
如果用户提交的age值大于18,则显示你已经成年,否则显示未成年。
执行效果
代码
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP核心标签库</title>
</head>
<body>
<%--如果用户提交的age值大于18,则显示你已经成年,否则显示未成年。--%>
<c:if test="${param.age >= 18}">
你已经成年
</c:if>
<c:if test="${param.age < 18}">
未成年
</c:if>
</body>
</html>
JSTL的标签:choose标签
使用choose,when,otherwise三个标签的使用
作用
多分支判断的标签,选择其中一个标签主体执行。
属性
案例:通过输入分数,得到评级
需求
在一个表单输入一个分数,提交给自己。然后在同一个页面中根据分数输出相应的等级,80~100优秀 60~80及格 0~60不及格 其它输出分数不正确。
效果
代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>评级</title>
</head>
<body>
<form action="demo09.jsp" method="get">
请输入分数:
<%--将得到的值显示在value中--%>
<input type="text" name="score" value="${param.score}">
<input type="submit" value="评级">
</form>
<%--使用EL和JSTL判断--%>
<c:if test="${not empty param.score}">
<c:choose>
<%--test是判断的条件,要使用EL--%>
<c:when test="${param.score >=80 && param.score<=100}">
优秀
</c:when>
<c:when test="${param.score >=60 && param.score<80}">
及格
</c:when>
<c:when test="${param.score >=0 && param.score<60}">
不及格
</c:when>
<c:otherwise>
错误的分数
</c:otherwise>
</c:choose>
</c:if>
</body>
</html>
- choose:相于switch
- when: 相当于case
- otherwise:相当于default
JSTL的标签:forEach标签(重点)
循环遍历标签的使用
forEach的作用
- 对一个集合或数组进行遍历
- 也有for-i循环的功能
属性
案例:遍历集合
需求:
学生信息:包含编号,姓名,性别,成绩。在Servlet中得到所有的学生信息,转发到JSP页面,在JSP页面上使用forEach标签,从List中输出所有的学生信息。
流程图
放在哪个作用域原则:在满足功能的前提下,使用小的使用域,比较节约资源。
代码
Student.java
package com.itheima.entity;
/**
* 学生对象
*/
public class Student {
private int id; //编号
private String name; //名字
private boolean gender; //true男
private double score; //成绩
public Student(int id, String name, boolean gender, double score) {
this.id = id;
this.name = name;
this.gender = gender;
this.score = score;
}
public Student() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
}
Servlet代码
//假设从数据库读取的List集合
List<Student> students = Arrays.asList(
new Student(1000, "猪八戒", true, 65),
new Student(2000, "白骨精", false, 85),
new Student(3000, "嫦娥", true, 90),
new Student(4000, "唐僧", true, 87),
new Student(5000, "蜘蛛精", false, 85)
);
JSP代码
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>取出所有学生数据</title>
<style type="text/css">
table {
width: 400px;
margin: auto;
border-collapse: collapse;
}
</style>
</head>
<body>
<table border="1">
<caption>学生信息</caption>
<tr>
<th>序号</th>
<th>编号</th>
<th>姓名</th>
<th>性别</th>
<th>成绩</th>
</tr>
<%--
items: 要遍历的集合或数组(必须属性)
var: 代表集合中每个元素JavaBean,这是变量名
begin: 开始集合索引,从0开始,默认就是0
end: 结束的索引
step: 步长,默认是1
varStatus:是一个对象,表示这一行的状态对象,参数值是变量名
又包含4个属性:
index: 表示当前行的索引号,从0开始
count: 表示到当前行为止,一共有多少行记录
first: 第1行为true
last: 最后1行为true
--%>
<c:forEach items="${students}" var="stu" varStatus="row">
<tr>
<td>${row.count}</td>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.gender?"男":"女"}</td>
<td>${stu.score}</td>
</tr>
</c:forEach>
</table>
</body>
</html>