目录
EL表达式(取代JSP中的表达式和取值)
概念
- 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/> <%– zhangfei –%> <%= "name2的数值为:" + request.getAttribute("name2") %><br/> <%– guanyu –%> <%= "name3的数值为:" + session.getAttribute("name3") %><br/> <%– liubei –%> <%= "name4的数值为:" + application.getAttribute("name4") %><br/> <%– zhaoyun –%>--%> <%-- 使用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]}
- 示例
<%@ 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>
<%@ 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”]}<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>实现Bean对象中属性的获取和打印</title> </head> <body> <%-- 使用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() %><br/> <%= "获取到的年龄为:" + person.getAge() %><br/>--%> <%-- 使用EL表达式实现属性的获取和打印 --%> <%--获取到的姓名是:${person.name}<br/> 获取到的年龄是:${person.age}<br/>--%> <%-- 另外一种写法 --%> <%--${person["name"]}<br/> ${person["age"]}<br/>--%> <%-- 测试一下动态取值的效果 --%> 动态取值的结果为:${person[var1]} </body> </html>
- 主要区别
- 当要存取的属性名中包含一些特殊字符,如: . 或 ,等并非字母或数字的符号,就一定要使用 [ ]而不是.的方式
- 使用[]的方式可以动态取值,具体方式如下:
<% request.setAttribute(“prop”,“age”); %> <!-- 相当于表达式中写一个变量 --> ${ user[prop] }
访问集合中的数据
<!-- student为ArrayList类型的对象 -->
${student[0].name}
示例
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ 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 --%>
<hr/>
<%-- 使用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 * 乘 ${2*3} 6 / 或 div 除 16 / 5 或 {16/5}或 16/5或{16div5} 3.2 % 或 mod 取余 KaTeX parse error: Expected '}', got 'EOF' at end of input: {16%5}或{16mod5} 1 -
关系运算符
关系运算符 说 明 范 例 运算结果 ==或eq 等于 1 = = 2 或 {1==2}或 1==2或{1 eq 2} false != 或ne 不等于 2 ! = 1 或 {2!=1}或 2!=1或{1 ne 2} true < 或lt 小于 2 < 3 或 {2<3}或 2<3或{2 lt 3 } true > 或 gt 大于 16 > 5 或 {16>5}或 16>5或{16 gt 5} true <= 或 le 小于等于 16 < = 5 或 {16<=5}或 16<=5或{16 le 5} false >= 或 ge 大于等于 16 > = 5 或 {16>=5}或 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" %> <%@ 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标签(取代JSP页面上的Java代码)
概念
- JSTL( JSP Standard Tag Library ) 被称为JSP标准标签库。
- 开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
使用方式
- 下载JSTL的jar包并添加到项目中,下载地址为:https://tomcat.apache.org/download-taglibs.cgi
- 在JSP页面中使用taglib指定引入jstl标签库,方式为:
<!-- prefix属性用于指定库前缀 --> <!-- uri属性用于指定库的标识 --> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
常用核心标签
- 输出标签
<c:out></c:out> 用来将指定内容输出的标签
<%@ 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>
- 设置标签
<c:set></c:set> 用来设置属性范围值的标签
<%@ 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.nxy.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>
- 删除标签
<c:remove></c:remove> 用来删除指定数据的标签
<%@ 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>
- 单条件判断标签
<c:if test =“EL条件表达式”> 满足条件执行 </c:if >
<%@ 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>
- 多条件判断标签
<c:choose > <c:when test =“EL表达式”> 满足条件执行 </c:when> … <c:otherwise> 不满足上述when条件时执行 </c:otherwise> </c:choose >
<%@ 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>
- 循环标签
<c:forEach var=“循环变量” items=“集合”> … </c:forEach>
<%@ 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" %>
<%@ 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" %>
<%@ 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方法。
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.println("自定义标签的参数为:" + name); } }
-
定义标签库文件(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://nxy.com</uri> <!-- Invoke 'Generate' action to add tags or functions --> <tag> <name>hello</name> <tag-class>com.nxy.demo01.HelloTag</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>true</required> </attribute> </tag> </taglib>
-
在JSP中添加taglib指令引入标签库使用:
<%@ 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>