一.EL表达式
1.概念
EL表达式全称:Expression Language
,可用于替换和简化jsp
页面的java
代码。
2.语法与使用
I.语法
EL表达式语法十分简单:${表达式}
我们先来看一个简单的例子有一个直观的概念:
访问结果:
这说明表达式被解析了,当然如果不想被解析我们有两种方式:
1.方式1
访问结果:
2.方式2
访问结果:
II.使用
他的使用分为运算
与获取值
1.运算
- 算数运算符: + - * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
* ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
* ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且长度
关于空运算符我们在获取值这一块来演示
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
1.算数运算符: + - * /(div) %(mod)<br>
${1+1}<br>
${1-1}<br>
${2*2}<br>
${3/3} ${3 div 3}<br>
${9%2} ${9 mod 2}<br>
2.比较运算符: > < >= <= == != <br>
${1>2}<br>
${1<2}<br>
${2>=2}<br>
${2<=2}<br>
${2==2}<br>
${2!=2}<br>
3. 逻辑运算符: &&(and) ||(or) !(not) <br>
${true&&false}<br>
${2==0 and 2==1}<br>
${2==1 || 2==2}<br>
${2==1 or 2==2}<br>
${!(2==2)}<br>
${not(2!=2)}<br>
</body>
</html>
2.获取值
el表达式只能从域对象中获取值,这里推荐先学习jsp四大作用域和九大内置对象再看下面的内容。
2. 语法:
1. ${域名称.键名}:从指定域中获取指定键的值
* 域名称:
1. pageScope --> pageContext
2. requestScope --> request
3. sessionScope --> session
4. applicationScope --> application(ServletContext)
2. ${键名}:表示依次从最小的域(就是从上面的顺序依次找)中查找是否有该键对应的值,直到找到为止。
3. 获取对象、List集合、Map集合的值
1. 对象:${域名称.键名.属性名}
* 本质上会去调用对象的getter方法
2. List集合:${域名称.键名[索引]}
3. Map集合:
* ${域名称.键名.key名称}
* ${域名称.键名["key名称"]}
4. 隐式对象:
* el表达式中有11个隐式对象
* pageContext:
* 获取jsp其他八个内置对象
* ${pageContext.request.contextPath}:动态获取虚拟目录
下面我们来看几个例子即可。
1.${域名称.键名}
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<!--写java代码-->
<%
//在域中存储数据
request.setAttribute("name","jack");
session.setAttribute("age", "125");
%>
${requestScope.name}
${sessionScope.age}
${sessionScope.salkska}
</body>
</html>
上面我们发现 ${sessionScope.salkska}
是不存在的但是没有报错
2.${键名}
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//在域中存储数据
request.setAttribute("name","jack");
session.setAttribute("name","rose");
%>
${name}<br>
${name}
</body>
</html>
我们发现显示了jack
而非rose
,原因在于依次从最小的域中查找是否有该键对应的值,直到找到为止。
3.获取对象、List集合、Map集合的值
首先我们新建一个User
类:
public class User {
private String name;
private int age;
private Date birthday;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
获取对象
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="domain.User" %>
<%@ page import="java.util.Date" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//在域中存储数据
User user = new User();
user.setBirthday(new Date());
user.setName("jack");
user.setAge(22);
request.setAttribute("user",user);
%>
${requestScope.user}<br>
${requestScope.user.name}<br>
${requestScope.user.birthday}<br>
${requestScope.user.age}<br>
</body>
</html>
获取List集合
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//在域中存储数据
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
request.setAttribute("list",list);
%>
${requestScope.list}<br>
${requestScope.list[0]}<br>
${requestScope.list[1]}<br>
${requestScope.lsit[2]}<br>
</body>
</html>
获取Map集合
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//在域中存储数据
Map<String,String> map = new HashMap<>();
map.put("name","jack");
request.setAttribute("map",map);
%>
${requestScope.map["name"]}<br>
</body>
</html>
4.空运算符演示
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
//在域中存储数据
Map<String,String> map = null;
List list = new ArrayList();
int []nums = null;
String s1 = "";
String s2 = null;
request.setAttribute("map",map);
request.setAttribute("list",list);
request.setAttribute("nums",nums);
request.setAttribute("s1",s1);
request.setAttribute("s2",s2);
%>
${requestScope.map["name"]}<br>
</body>
用于判断字符串、集合、数组对象是否为null或者长度是否为0 <br>
map:${empty map}<br>
list:${empty list}<br>
nums:${empty nums}<br>
s1:${empty s1}<br>
s2:${empty s2}<br>
</html>
5.隐式对象
el表达式中有11个隐式对象。其中pageContext
最常用,我们重点掌握它,pageContext
可以获取jsp其他八个内置对象。
举例:${pageContext.request.contextPath}:动态获取虚拟目录,这里不演示。
二.JSTL标签
1.概念与作用
全称为:JavaServer Pages Tag Library JSP
即标准标签库。可用于用于简化和替换jsp
页面上的java
代码。
2.使用
使用前我么需要导入jar包
链接:https://pan.baidu.com/s/1OR-s_JjYsNkCZX7khZCW2Q
提取码:rfug
使用语法是引入标签库:taglib指令:<%@ taglib %>
I.if标签
注意事项:test 必须属性,接受boolean表达式。一般情况下,test属性值会结合el表达式一起使用
<%@ 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>
</head>
<body>
<c:if test="true">
<h1>I am Jack</h1><br>
</c:if>
<c:if test="false">
<h1>I am Rose</h1>
</c:if>
</body>
</html>
II.choose标签
相当于java代码的switch语句
<%@ 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>
</head>
<body>
<%
request.setAttribute("num",1);
%>
<c:choose>
<c:when test="${num == 1}">I am Jack</c:when>
<c:when test="${num == 2}">I am Rose</c:when>
<c:otherwise>你啥也不是</c:otherwise>
</c:choose>
<c:if test="false">
<h1>I am Rose</h1>
</c:if>
</body>
</html>
III.foreach标签
相当于java代码的for语句
,foreach标签的使用分为两种用法。
1.用法一:完成重复的操作:
相当于
for(int i=0;i< 10;i++){
}
1.begin:开始值
2.end:结束值
3.var:临时变量
4.step:步长
5.varStatus:循环的状态对象
index:容器里元素的索引,从1开始
count:循环的次数,从1开始
第一个例子:
<%@ 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>
</head>
<body>
<c:forEach begin="1" end="3" var="num" step="1">
${num}
</c:forEach>
</body>
</html>
第二个例子:
<%@ 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>
</head>
<body>
<c:forEach begin="1" end="3" var="num" step="1" varStatus="s">
${num} ${s.index} ${s.count}<br>
</c:forEach>
</body>
</html>
2.用法二:遍历容器
相当于:
List<User> list;
for(User user:list){
}
1.var:临时变量
2.varStatus:循环的状态对象
index:容器里元素的索引,从0开始
count:循环的次数,从1开始
3.items:容器对象
例子:
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
${str} ${s.index} ${s.count}<br>
</c:forEach>
</body>
</html>