上一篇我们讲解了什么是服务器渲染技术和jsp,今天我来整理一下EL表达式和JSTL的笔记与图解,让我们的jsp页面更加的简洁与可维护。
没看过上一期的小伙伴可以看上一期的笔记:
JavaWeb笔记全整理——JSP服务器渲染技术-CSDN博客
一、EL表达式
1、EL表达式快速入门
EL表达式(Expression language),是种表达式语言。它是为了代替jsp中的<%=%>表达式脚本而出现的。
它使用 ${表达式} 来表示一个参数,或表达式。
看起来这两个式子区别并不大呀,为什么EL表达式可以取代jsp的表达式脚本呢?
别急,后面你就知道它的大用处。
现在我们设置一个参数:
显示结果:
可以看到,我们如果想要在jsp页面上打印出来这个值,那么我们就需要调用request.getAttribute方法,这样的代码是有些繁琐的。
现在我们改用EL表达式:
显示结果:
可以看到,两个表达式的显示是一模一样的,但是EL表达式显然更简洁一些。因为在EL表达式中可以识别到request中设置的参数——key,所以我们直接在EL表达式中填入key即可,而不需要再调用request.getAttribute()方法,所以代码就简单了许多。
还有一点,如果jsp表达式脚本中获取的Attribute值不存在,那么会输出null字符串,而EL表达式则不会输出任何东西(即输出一个 “” 空字符串):
EL表达式输出类信息和集合信息
下面我演示EL表达式的其他输出方式。首先定义Student类和集合用于演示:
import java.util.List;
public class Student {
private String name;
private int age;
private List<Course> courses;
public Student(String name, int age, List<Course> courses) {
this.name = name;
this.age = age;
this.courses = courses;
}
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 List<Course> getCourses() {
return courses;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
}
Course课程类:
public class Course {
private String title;
private String instructor;
public Course(String title, String instructor) {
this.title = title;
this.instructor = instructor;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getInstructor() {
return instructor;
}
public void setInstructor(String instructor) {
this.instructor = instructor;
}
}
我们在jsp页面中创建一些对象,一边后续的输出:
这里如果我们没有设置Attribute的值,而是想使用EL表达式直接输出,那么是不可行的:
结果:
并没有显示Student的信息,所以我们需要调用setAttribute方法先设置一下,才能使用EL表达式来输出:
输出结果:
我们也可以将属性一个一个的输出:
显示结果:
2、EL运算操作
EL表达式中还可以填入运算式子,运算符和Java一致:
EL表达式的empty运算
EL表达式使用empty运算来判断一个值是否为空或0值,以下情况都会返回true
3、EL表达式的隐含对象
我们可以通过以下四个对象来获取jsp页面的域对象的值:
演示一下:注意要写一个字符串
而pageScope中有许多方法,列在下面有个印象即可:
通过 request 对象来获取和 HTTP 协议相关的数据
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext 对象的使用</title>
</head>
<body>
<h1>pageContext 对象的使用</h1>
<%--
//通过 request 对象来获取和 HTTP 协议相关的数据
request.getScheme() 它可以获取请求的协议
request.getServerName() 获取请求的服务器 ip 或域名
request.getServerPort() 获取请求的服务器端口号
getContextPath() 获取当前工程路径
request.getMethod() 获取请求的方式(GET 或 POST)
request.getRemoteHost() 获取客户端的 ip 地址
session.getId() 获取会话的唯一标识
--%>
<hr/>
协议: ${ pageContext.request.scheme }<br>
服务器 ip:${ pageContext.request.serverName }<br>
服务器端口:${ pageContext.request.serverPort }<br>
工程路径:${ pageContext.request.contextPath }<br>
请求方法:${ pageContext.request.method }<br>
客户端 ip 地址:${ pageContext.request.remoteHost }<br>
会话 id :${ pageContext.session.id }<br>
<h1>使用 jsp 表达式脚本获取如上信息</h1>
ip 地址: <%=request.getRemoteHost() %> <br>
<h1>使用 el 表达式形式获取信息</h1>
<%
pageContext.setAttribute("req", request);
%>
ip 地址: ${req.remoteHost} <br>
获取请求方法: ${req.method} <br>
</body>
</html>
二、JSTL
1、JSTL快速入门
EL表达式是为了替换jsp中的表达式脚本,那么JSTL就是为了替换掉jsp中的代码脚本。
JSTL由五个标签库组成:
为了使用jstl我们还需要导入jstl的jar包。
快速入门演示
网页输出:
导入 jstl jar 包后,要重新发布 web 工程,否则不识别!!!会出现500错误代码。
2、jstl核心库
<c:set />标签
这个标签可以设置一些数据相当于setAttribute(key,value);
scope 属性设置保存到哪个域
page 表示 PageContext 域(默认值)
request 表示 Request 域
session 表示 Session 域
application 表示 ServletContext 域
var 属性设置 key 是什么
value 属性设置值
演示一下:
用EL表达式看看是否设置成功:
设置成功:
如果想要设置一个数字作为value而不是字符串,那么需要填入一个EL表达式。
<c:if />标签
if 标签用来做 if 判断。
test 属性表示判断的条件(用 EL表达式)
演示 快速入门演示过了:
<c:choose> <c:when> <c:otherwise>标签
多路判断标签,相当于Java中的Switch case
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl</title>
</head>
<body>
<h3>jstl演示</h3>
<%--这里注意,如果想要将value设置为一个数字,则需要使用EL表达式,不能直接使用字符串--%>
<c:set scope="request" var="key" value="${10001}"/>
<c:choose>
<c:when test="${requestScope.key > 10000}">
工资过万
</c:when>
<c:when test="${requestScope.key > 20000}">
工资过两万
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${requestScope.key > 30000}">
工资过三万
</c:when>
</c:choose>
</c:otherwise>
</c:choose>
</body>
</html>
结果:
这里的<c:choose> 相当于Switch语句
<c:when>相当于case 语句
<c:otherwise>相当于default
<c:foreach>标签
用于遍历输出 i 到 j 、遍历一个数组、遍历一个集合:
<c:forEach items="${ requestScope.sports }" var="item"/>
这里的items相当于Java中的增强for循环中需要遍历取出的集合,而var相当于取出来的其中一个元素。
演示:
<%@ page import="java.util.HashMap" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl</title>
</head>
<body>
<h3>jstl演示</h3>
<%
HashMap<String, String> map = new HashMap<>();
map.put("红楼梦", "曹雪芹");
map.put("西游记", "吴承恩");
map.put("水浒传", "施耐庵");
map.put("三国演义", "罗贯中");
request.setAttribute("books",map);
%>
<c:forEach items="${books}" var="book">
${book.key} - ${book.value} <br/>
</c:forEach>
</body>
</html>
演示结果:
这里有几点需要注意:
在使用foreach标签来遍历的时候,需要先把map放入request中,即,先调用request的setAttribute方法,从而让EL表达式识别,然后再用foreach访问。