EL表达式(熟悉)
基本概念
EL(Expression Language)表达式提供了在JSP中简化表达式的方法,可以方便地访问各种数据并输出。
主要功能
依次访问pageContext、request、session和application作用域对象存储的数据。
获取请求参数值。
访问Bean对象的属性。
访问集合中的数据。
输出简单的运算结果。
访问内置对象的数据
- 访问方式
- <%=request.getAttribute(“ varName”)%>
- 用EL实现: ${ varName }
- 执行流程
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现从内置对象中获取数据并打印</title>
</head>
<body>
<%
pageContext.setAttribute("name1","pageContext对象中的属性值:zhangfei");
request.setAttribute("name2","request对象中的属性值:guanyu");
session.setAttribute("name3","session对象中的属性值:liubei");
application.setAttribute("name4","session对象中的属性值:zhaoyun");
//pageContext.setAttribute("name", "pageContext对象中的属性值:zhangfei");
//request.setAttribute("name", "request对象中的属性值:guanyu");
//session.setAttribute("name", "session对象中的属性值:liubei");
application.setAttribute("name", "session对象中的属性值:zhaoyun");
%>
<%-- 使用JSP中原始方式获取数据和打印 --%>
<%= "name1的数值为:" + pageContext.getAttribute("name1")%><br/>
<%= "name2的数值为:" + request.getAttribute("name2")%><br/>
<%= "name3的数值为:" + session.getAttribute("name3")%><br/>
<%= "name4的数值为:" + application.getAttribute("name4")%><br/>
<%-- 使用EL表达式实现获取数据和打印 --%>
<h1>name1的数值为:${name1}</h1><br/>
name2的数值为:${name2}<br/>
name3的数值为:${name3}<br/>
name4的数值为:${name4}<br/>
<h1>name的数值为:${name}</h1><br/>
</body>
</html>
访问请求参数的数据
- 在EL之前使用下列方式访问请求参数的数据
request.getParameter(name);
request.getParameterValues(name);
- 在EL中使用下列方式访问请求参数的数据
param:接收的参数只有一个值。
paramValues:接受的参数有多个值。
<!-- 获取指定参数的数值 -->
${param.name}
<!-- 获取指定参数中指定下标的数值 -->
${paramValues.hobby[0]}
param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现一个简单页面负责向JSP页面传递参数</title>
</head>
<body>
<form action="el_param.jsp" method="post">
姓名:<input type="text" name="name"/><br/>
爱好:<input type="checkbox" name="hobby" value="唱歌"/>唱歌<br/>
<input type="checkbox" name="hobby" value="跳舞"/>跳舞<br/>
<input type="checkbox" name="hobby" value="学习"/>学习<br/>
<input type="submit" value="提交"/><br/>
</form>
</body>
</html>
el_param.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现请求参数数值的获取</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
<%-- 使用JSP语法中原始方式获取请求参数值 --%>
<%--<%= "姓名是:" + request.getParameter("name")%><br/>--%>
<%--<%= "爱好是:" + Arrays.toString(request.getParameterValues("hobby"))%><br/>--%>
<%-- 使用EL表达式中的方式获取请求参数 --%>
姓名是:${param.name}<br/>
爱好是:${paramValues.hobby[0]}<br/>
</body>
</html>
访问Bean对象的属性
- 访问方式
- 方式一: $ { 对象名 . 属性名 },例如:${user.name}
- 方式二: $ { 对象名 [“属性名”] },例如:${user[“name”]}
- 主要区别
- 当要存取的属性名中包含一些特殊字符,如: . 或 ,等并非字母或数字的符号,就一定要使用 [ ]而不是.的方式
使用[]的方式可以动态取值,具体方式如下:
<%
request.setAttribute(“prop”,“age”);
%>
<!-- 相当于表达式中写一个变量 -->
${ user[prop] }
```javascript <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>
<%— 使用JSP语法规则中的原始方式实现对象的创建和设置以及输出 —%> <% Person person = new Person(); person.setName(“zhangfei”); person.setAge(30); pageContext.setAttribute(“person”,person); pageContext.setAttribute(“var1”,”name”); pageContext.setAttribute(“var2”,”age”); %> <%= “获取到的姓名为:” + person.getName()%>
<%= “获取到的年龄为:” + person.getAge()%>
<%— 使用EL表达式实现属性的获取和打印 —%> 获取到的姓名是:${person.name}
获取到的年龄是:${person.age}
<%— 另外一种写法 —%> ${person[“name”]}
${person[“age”]}
<%— 测试一下动态取值的效果 —%> 动态取值的结果是:${person[var1]}
<a name="TWn9K"></a>
## 访问集合中的数据
```javascript
<!-- student为ArrayList类型的对象 -->
${student[0].name}
<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现集合中数据内容的获取和打印</title>
</head>
<body>
<%
// 准备一个List集合并添加数据内容
List<String> list = new LinkedList<>();
list.add("two");
list.add("one");
list.add("three");
// 将整个集合放入指定的内置独享中
pageContext.setAttribute("list",list);
// 准备一个Map集合并添加数据
Map<String,Integer> map = new HashMap<>();
map.put("one",1);
map.put("two",2);
map.put("th.ree",3);
// 将整个集合放入指定的内置对象中
pageContext.setAttribute("map",map);
%>
<%-- 使用EL表达式实现集合中数据内容的获取 --%>
集合下标为0的元素是:${list[0]}<br/> <%-- two --%>
集合下标为1的元素是:${list[1]}<br/> <%-- one --%>
集合下标为2的元素是:${list[2]}<br/> <%-- three --%>
<%-- 使用EL表达式实现Map集合中数据内容的获取 不支持下标 --%>
整个Map集合中的元素有:${map}<br/>
获取嗲有特殊字符key对应的数值为:${map["th.ree"]}<br/> <%-- 3 --%>
</body>
</html>
常用的内置对象
类别 | 标识符 | 描述 |
---|---|---|
JSP | pageContext | PageContext 处理当前页面 |
作用域 | pageScope | 同页面作用域属性名称和值有关的Map类 |
requestScope | 同请求作用域属性的名称和值有关的Map类 | |
sessionScope | 同会话作用域属性的名称和值有关的Map类 | |
applicationScope | 同应用程序作用域属性的名称和值有关的Map类 | |
请求参数 | param | 根据名称存储请求参数的值的Map类 |
paramValues | 把请求参数的所有值作为一个String数组来存储的Map类 | |
请求头 | header | 根据名称存储请求头主要值的Map类 |
headerValues | 把请求头的所有值作为一个String数组来存储的Map类 | |
Cookie | cookie | 根据名称存储请求附带的cookie的Map类 |
初始化参数 | initParam | 根据名称存储Web应用程序上下文初始化参数的Map类 |
常用的运算符
常用的算术运算符 | 算术运算符 | 说 明 | 范 例 | 运算结果 | | —- | —- | —- | —- | | + | 加 | ${1+2} | 3 | | - | 减 | ${2-1} | 1 | | | 乘 | ${23} | 6 | | / 或 div | 除 | ${16/5}或${16div5} | 3.2 | | % 或 mod | 取余 | ${16%5}或${16mod5} | 1 |
常用的关系运算符 | 关系运算符 | 说 明 | 范 例 | 运算结果 | | —- | —- | —- | —- | | ==或eq | 等于 | ${1==2}或${1 eq 2} | false | | != 或ne | 不等于 | ${2!=1}或${1 ne 2} | true | | < 或lt | 小于 | ${2<3}或${2 lt 3 } | true | | > 或 gt | 大于 | ${16>5}或${16 gt 5} | true | | <= 或 le | 小于等于 | ${16<=5}或${16 le 5} | false | | >= 或 ge | 大于等于 | ${16>=5}或${16 ge 5} | true |
常用的逻辑运算符 | 逻辑运算符 | 说 明 | 范 例 | 运算结果 | | —- | —- | —- | —- | | && 或 and | 与运算 | ${true&&true}或${true and true} | true | | || 或or | 或运算 | ${true||false}或${true or false} | true | | ! 或not | 非运算 | ${!true}或${not true } | false |
条件运算符
${条件表达式? 语句1 : 语句2}
- 验证运算符
${empty 表达式}
返回布尔值判断表达式是否为”空”值,null值、无元素的集合或数组、长度为零的String被认为是空值。
<%@ page import="java.util.List" %>
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.Arrays" %><%--
Created by IntelliJ IDEA.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现常用运算符的使用</title>
</head>
<body>
<%
// 通过内置对象设置属性的方式来准备操作数
request.setAttribute("ia", 5);
request.setAttribute("ib", 2);
request.setAttribute("b1", true);
request.setAttribute("b2", false);
%>
<%-- 实现上述所有操作数的获取和打印 --%>
ia的数值为:${ia}<br/> <%-- 5 --%>
ib的数值为:${ib}<br/> <%-- 2 --%>
b1的数值为:${b1}<br/> <%-- true --%>
b2的数值为:${b2}<br/> <%-- false --%>
<hr/>
<%-- 实现算术运算符的使用 --%>
ia+ib的结果为:${ia+ib}<br/> <%-- 7 --%>
ia-ib的结果为:${ia-ib}<br/> <%-- 3 --%>
ia*ib的结果为:${ia*ib}<br/> <%-- 10 --%>
ia/ib的结果为:${ia/ib}<br/> <%-- 2.5 --%>
ia%ib的结果为:${ia%ib}<br/> <%-- 1 --%>
<hr/>
<%-- 实现关系运算符的使用 --%>
ia大于ib的结果为:${ia > ib}<br/> <%-- true --%>
ia大于等于ib的结果为:${ia >= ib}<br/> <%-- true --%>
ia小于ib的结果为:${ia < ib}<br/> <%-- false --%>
ia小于等于ib的结果为:${ia <= ib}<br/> <%-- false --%>
ia等于ib的结果为:${ia == ib}<br/> <%-- false --%>
ia不等于ib的结果为:${ia != ib}<br/> <%-- true --%>
<hr/>
<%-- 实现逻辑运算符的使用 --%>
b1并且b2的结果为:${b1 && b2}<br/> <%-- false --%>
b1或者b2的结果为:${b1 || b2}<br/> <%-- true --%>
b1取反的结果为:${ !b1 }<br/> <%-- false --%>
b2取反的结果为:${ !b2 }<br/> <%-- true --%>
<hr/>
<%
String str1 = null;
String str2 = "";
String str3 = "hello";
List<Integer> list1 = new LinkedList<>();
List<Integer> list2 = Arrays.asList(11, 22, 33, 44, 55);
request.setAttribute("str1", str1);
request.setAttribute("str2", str2);
request.setAttribute("str3", str3);
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
%>
<%-- 实现条件运算符和验证运算符的使用 --%>
ia和ib之间的最大值为:${ia>ib? ia: ib}<br/>
判断是否为空的结果是:${empty str1}<br/> <%-- true --%>
判断是否为空的结果是:${empty str2}<br/> <%-- true --%>
判断是否为空的结果是:${empty str3}<br/> <%-- false --%>
判断是否为空的结果是:${empty list1}<br/> <%-- true --%>
判断是否为空的结果是:${empty list2}<br/> <%-- false --%>
</body>
</html>
JSTL标签(熟悉)
基本概念
- JSTL( JSP Standard Tag Library ) 被称为JSP标准标签库。
开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护 难度。
使用方式
“下载JSTL的jar包并添加到项目中,下载地址为:https://tomcat.apache.org/download-taglibs.cg i
- 在JSP页面中使用taglib指定引入jstl标签库,方式为:
<!-- prefix属性用于指定库前缀 -->
<!-- uri属性用于指定库的标识 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用核心标签
- 输出标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现out输出标签的使用</title>
</head>
<body>
<c:out value="Hello World"></c:out>
</body>
</html>
- 设置标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现set标签的使用</title>
</head>
<body>
<%-- 表示设置一个名字为name的属性,对应的数值为zhangfei,有效范围为:page --%>
<%-- pageContext.setAttibute("name", "zhangfei") --%>
<c:set var="name" value="zhangfei" scope="page"></c:set>
<%-- 使用out标签打印出来 --%>
<c:out value="${name}"></c:out>
<hr/>
<%-- 设置一个对象的属性值并打印出来 --%>
<jsp:useBean id="person" class="com.lagou.demo01.Person" scope="page"></jsp:useBean>
<c:set property="name" value="guanyu" target="${person}"></c:set>
<c:set property="age" value="35" target="${person}"></c:set>
<c:out value="${person.name}"></c:out>
<c:out value="${person.age}"></c:out>
</body>
</html>
- 删除标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现remove标签的使用</title>
</head>
<body>
<%-- 设置一个属性值并打印 --%>
<c:set var="name" value="liubei" scope="page"></c:set>
<c:out value="${name}"></c:out>
<hr/>
<%-- 删除这个属性值后再次打印 --%>
<c:remove var="name" scope="page"></c:remove>
<c:out value="${name}" default="无名"></c:out>
</body>
</html>
- 单条件判断标签
满足条件执行
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现if标签的使用</title>
</head>
<body>
<%-- 设置一个变量以及对应的数值 --%>
<c:set var="age" value="17" scope="page"></c:set>
<c:out value="${age}"></c:out>
<hr/>
<%-- 判断该年龄是否成年,若成年则提示已经成年了 --%>
<c:if test="${age >= 18}">
<c:out value="已经成年了!"></c:out>
</c:if>
</body>
</html>
- 多条件判断标签
满足条件执行
…
不满足上述when条件时执行
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现choose标签的使用</title>
</head>
<body>
<%-- 设置一个变量代表考试的成绩并指定数值 --%>
<c:set var="score" value="59" scope="page"></c:set>
<c:out value="${score}"></c:out>
<hr/>
<%-- 进行多条件判断和处理 --%>
<c:choose>
<c:when test="${score > 60}">
<c:out value="成绩不错,继续加油哦!"></c:out>
</c:when>
<c:when test="${score == 60}">
<c:out value="60分万岁,多一份浪费!"></c:out>
</c:when>
<c:otherwise>
<c:out value="革命尚未成功,同志仍需努力!"></c:out>
</c:otherwise>
</c:choose>
</body>
</html>
- 循环标签
…
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现循环标签的使用</title>
</head>
<body>
<%
// 准备一个数组并初始化
String[] sArr = {"11", "22", "33", "44", "55"};
pageContext.setAttribute("sArr", sArr);
%>
<%-- 使用循环标签遍历数组中的所有元素 --%>
<c:forEach var="ts" items="${sArr}">
<c:out value="${ts}"></c:out>
</c:forEach>
<hr/>
<%-- 跳跃性遍历 间隔为2 也就是跳过一个遍历一个 --%>
<c:forEach var="ts" items="${sArr}" step="2">
<c:out value="${ts}"></c:out>
</c:forEach>
<hr/>
<%-- 指定起始和结尾位置 从下标1开始到3结束,包含1和3--%>
<c:forEach var="ts" items="${sArr}" begin="1" end="3">
<c:out value="${ts}"></c:out>
</c:forEach>
</body>
</html>
常用函数标签
<%@ taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions“ %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%--
Created by IntelliJ IDEA.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现常用函数标签的使用</title>
</head>
<body>
<%
pageContext.setAttribute("var", "Hello World!");
%>
原始字符串为:${var}<br/> <%-- HelloWorld --%>
判断该字符串是否包含指定字符串的结果为:${fn:contains(var, "Hello")}<br/> <%-- true --%>
将字符串中所有字符转换为大写的结果为:${fn:toUpperCase(var)}<br/> <%-- HELLO WORLD!--%>
将字符串中所有字符转换为小写的结果为:${fn:toLowerCase(var)}<br/> <%-- hello world!--%>
</body>
</html>
常用格式化标签
<%@ taglib prefix=”fmt” uri=”http://java.sun.com/jsp/jstl/fmt“ %>
<%@ page import="java.util.Date" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%--
Created by IntelliJ IDEA.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现格式标签的使用</title>
</head>
<body>
<%
// 获取当前系统时间
Date date = new Date();
pageContext.setAttribute("date", date);
%>
当前系统时间为:${date}
<hr/>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
</body>
</html>
自定义标签
- 如果上面几个标签不能满足需求,程序员也可以自定义标签,步骤如下:
- 编写标签类继承SimpleTagSupport类或TagSupport类并重写doTag方法或doStartTag方法。
HelloTag.java
package com.lagou.demo01;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
public class HelloTag extends SimpleTagSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void doTag() throws JspException, IOException{
// 获取输出流
JspWriter out = this.getJspContext().getOut();
// 写入数据到浏览器
out.write("自定义标签哦" + name);
// 关闭对象
out.close();
}
}
- 定义标签库文件(tld标签库文件)并配置标签说明文件到到WEB-INF下:
helloTag.tld
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>my</short-name>
<uri>http://lagou.com</uri>
<!-- Invoke 'Generate' action to add tags or functions -->
<tag>
<name>hello</name>
<tag-class>com.lagou.demo01.HelloTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
</tag>
</taglib>
- 在JSP中添加taglib指令引入标签库使用:
<%@ taglib prefix=”hello” uri=”http://lagou.com“ %>
jstl_my.jsp
<%@ taglib prefix="my" uri="http://lagou.com" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>实现自定义标签的使用</title>
</head>
<body>
<my:hello name="zhangfei"/>
</body>
</html>