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] }
<%— 使用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()%>
```javascript
<%@ page contentType=”text/html;charset=UTF-8” language=”java” %>
<%= “获取到的年龄为:” + 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;}@Overridepublic 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>
