目录
9.3:EL表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性
9.4.4:empty运算:可以判断一个数据是否为空,如果为空,则输出为true;不为空,输出为false
EL表达式
9.1:什么是EL表达式?EL表达式的作用?
EL表达式的全称:Expression Language,是表达式语言
作用:EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出
因为EL表达式在输出数据的时候,要比jsp的表达式简洁很多
<%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 12:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("key","值");
%>
表达式脚本输出key的值是:<%=request.getAttribute("key1") == null? "" : request.getAttribute("key1")%><br/>
EL表达式输出key的值是:${key1}
</body>
</html>
EL表达式的格式:${表达式}
EL表达式在输出null值的时候,输出的是空串
JSP表达式在输出null值的时候,输出的是null字符串
9.2:EL表达式搜索域数据的顺序
EL表达式主要是在JSP页面中输出数据
主要是输出域对象中的数据
当四个域中都有相同的key的数据的时候,EL表达式会按照四个域从小到大的顺序去进行搜索,找到就输出。
9.3:EL表达式输出Bean的普通属性,数组属性,List集合属性,map集合属性
需求:输出Person类中普通属性,数组属性,list集合属性和map集合属性
<%@ page import="com.jiayifeng.pojo.Person" %>
<%@ page import="java.util.*" %>
<%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 13:53
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Person</title>
</head>
<body>
<%--需求:输出Person类中普通属性,数组属性,list集合属性和map集合属性--%>
<%
Person person = new Person();
person.setName("小贾");
person.setPhones(new String[]{"15191963371","18629673395","15091706985"});
List<String> cities = new ArrayList<String>();
cities.add("北京");
cities.add("上海");
cities.add("西安");
person.setCities(cities);
Map<String,Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
person.setMap(map);
pageContext.setAttribute("person",person);
%>
输出Person:${person}<br/>
输出Person的name属性:${person.name}<br/>
输出Person的phones数组属性值:${person.phones[1]}<br/>
输出Person的cities集合中的元素值:${person.cities[1]}<br/>
输出Person的Map集合:${person.map.key1}<br/>
</body>
</html>
9.4:EL表达式——运算
9.4.1:关系运算
9.4.2:逻辑运算
9.4.3:算数运算
<%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 14:22
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>运算</title>
</head>
<body>
1、等于
${12 == 12} 或 ${12 eq 12}<br/>
2、不等于
${12 != 12} 或 ${12 ne 12}<br/>
3、小于
${12 < 12} 或 ${12 lt 12}<br/>
4、大于
${12 > 12} 或 ${12 gt 12}<br/>
5、小于等于
${12 <= 12} 或 ${12 le 12}<br/>
6、大于等于
${12 >= 12} 或 ${12 ge 12}<br/>
<hr>
${12 == 12 && 12 > 11} 或 ${12 == 12 and 12 > 11}<br/>
${12 == 12 || 12 > 11} 或 ${12 == 12 or 12 > 11}<br/>
${!true} 或 ${not true}<br/>
<hr>
${12 + 12}<br/>
${12 * 12}<br/>
${12 - 12}<br/>
${12 / 12} 或 ${12 div 12}<br/>
${18 % 12} 或 ${18 mod 12}<br/>
</body>
</html>
9.4.4:empty运算:可以判断一个数据是否为空,如果为空,则输出为true;不为空,输出为false
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 14:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>empty运算</title>
</head>
<body>
<%
//1、值为null值的时候,为空
request.setAttribute("emptyNull",null);
//2、值为空串的时候,为空
request.setAttribute("emptyStr","");
//3、值为Object类型数组,长度为零的时候,为空
request.setAttribute("emptyArr",new Object[]{});
//4、list集合,元素个数为零的时候,为空
List<String> list = new ArrayList<String>();
request.setAttribute("emptyList",list);
//5、map集合,元素个数为零的时候,为空
Map<String,Object> map = new HashMap<>();
request.setAttribute("emptyMap",map);
%>
${empty emptyNull}<br/>
${empty emptyStr}<br/>
${empty emptyArr}<br/>
${empty emptyList}<br/>
${empty emptyMap}<br/>
</body>
</html>
9.4.5:"."运算&&"[]"中括号运算
.点运算:可以输出Bean对象中某个属性的值
[]中括号运算:可以输出有序集合中某个元素的值,还可以输出map集合中key里面含有特殊字符的key值
9.5:EL表达式的11个隐含对象
EL表达式中的11个隐含对象,是EL表达式中自己定义的,可以直接使用
变量 | 类型 | 作用 |
pageContext | PageContextImpl | 它可以获取JSP中的九大内置对象 |
pageScope | Map<String,Object> | 它可以获取pageContext域中的数据 |
requestScope | Map<String,Object> | 它可以获取Request域中的数据 |
sessionScope | Map<String,Object> | 它可以获取Session域中的数据 |
applicationScope | Map<String,Object> | 它可以获取ServletContext域中的数据 |
param | Map<String,String> | 它可以获取请求参数的值 |
paramValues | Map<String,String[]> | 它可以获取请求参数的值;获取多个值的时候使用 |
header | Map<String,String[]> | 它可以获取请求头的信息 |
headerValues | Map<String,String[]> | 它可以获取请求头的信息;可以获取多个值的情况 |
cookie | Map<String,Cookie> | 它可以获取当前请求的Cookie信息 |
initParam | Map<String,String> | 它可以获取在web.xml中配置的<context-param>上下文参数 |
9.5.1:EL获取四个特定域中的属性
<%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 15:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>scope作用域</title>
</head>
<body>
<%
pageContext.setAttribute("key1","pageContext1");
pageContext.setAttribute("key2","pageContext2");
request.setAttribute("key2","request");
session.setAttribute("key2","session");
application.setAttribute("key2","application");
%>
${applicationScope.key2}
</body>
</html>
9.5.2:pageContext对象的使用
<%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 15:16
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext</title>
</head>
<body>
<%=request.getServerName()%>
1、协议:${pageContext.request.scheme}<br/>
2、服务器ip:${pageContext.request.serverName}<br/>
3、服务器端口号:${pageContext.request.serverPort}<br/>
4、获取工程路径:${pageContext.request.contextPath}<br/>
5、获取请求方法:${pageContext.request.method}<br/>
6、获取客户端ip地址:${pageContext.request.remoteHost}<br/>
7、获取会话的id编号:${pageContext.session.id}<br/>
</body>
</html>
9.5.3:El表达式其它隐含对象的使用
<%--
Created by IntelliJ IDEA.
User: 22455
Date: 2023/11/20
Time: 15:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>other_el_obj</title>
</head>
<body>
输出请求参数username的值:${param.username}<br/>
输出请求参数username的值:${paramValues.username[0]}<br/>
<hr>
输出请求头[User-Agent]的值:${header['User-Agent']}<br/>
输出请求头[User-Agent]的值:${headerValues['User-Agent'][0]}<br/>
<hr>
获取Cookie的名称:${cookie. JSESSIONID.name}<br/>
获取Cookie的值:${cookie. JSESSIONID.value}<br/>
<hr>
输出<Context-param>的username的值:${initParam.username}
</body>
</html>
JSTL标签库
9.6:什么是JSTL标签库?JSTL的作用是什么?
JSTL标签库全称是指:JSP Standard Tag Library,JSP标准标签库。是一个不断完善的开放源代码的JSP标签库
El表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本;这样使得整个jsp页面变得更加简洁
- Core支持JSP中的一些基本的操作;
- XML processing支持XML文档的处理;
- I18N capable formatting支持对JSP页面的国际化;
- Database access (SQL)支持JSP对数据库的操作。
9.7:JSTL标签库的使用步骤
1、先导入jstl标签库的jar包
2、使用taglib指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
9.8:core核心库使用
9.8.1:表达式标签
1、<c:out>
用来显示数据对象(字符串、表达式)的内容或结果,输出值
使用Java脚本的方式为:<% out.println("hello") %> <% =表达式 %>
使用JSTL标签:<c:out value="字符串">,
<c:out>标签用于在JSP中显示数据,它有如下属性:例子: 您的用户名是: <c:out value=”${user.username}” default=”guest”/> 显示用户的用户名,如为空则显示guest <c:out value="${sessionScope.username}"/> 指定从session中获取username的值显示 <c:out value="${username}" /> 显示username的值,默认是从request(page)中取,如果request中没有名为username的对象则从session中取,session中没有则从application(servletContext)中取,如果没有取到任何值则不显示。
2、<c:set>
用于将变量存取于 JSP 范围中或 JavaBean 属性中
<c:set>标签用于往域中保存数据,它有如下属性:
如果指定了target属性, 那么property属性也必须指定
3、<c:remove>
主要用来从指定的 jsp 范围内移除指定的变量。
<c:remove>标签用于删除数据,它有如下属性
使用类似,下面只给出语法:
<c:remove var="变量名" [scope="page|request|session|application"]></c:remove>
4、<c:catch>
用来处理 JSP 页面中产生的异常,并存储异常信息
<c:catch var="name1"> 容易产生异常的代码 </c:catch> 如果抛异常,则异常信息保存在变量 name1 中。
9.8.2:流程控制标签
1、<c:if>
<c:if>标签有如下属性
<c:if test="条件1" var="name" [scope="page|request|session|application"]></c:remove>
2、<c:choose>
3、<c:when>
4、<c:otherwise>
例子: <c:if test="${user.wealthy}"> user.wealthy is true. </c:if> 如果user.wealthy值true,则显示user.wealthy is true. <c:choose> <c:when test="${user.generous}"> user.generous is true. </c:when> <c:when test="${user.stingy}"> user.stingy is true. </c:when> <c:otherwise> user.generous and user.stingy are false. </c:otherwise> </c:choose> 只有当条件user.generous返回值是true时,才显示user.generous is true. 只有当条件user.stingy返回值是true时,才显示user.stingy is true. 其它所有的情况(即user.generous和user.stingy的值都不为true)全部显示user.generous and user.stingy are false. 由于JSTL没有形如if (){…} else {…}的条件语句,所以这种形式的语句只能用<c:choose>、<c:when>和<c:otherwise>标签共同来完成了。
9.8.3:循环标签
1、<c:forEach>
<c:forEach>标签用于通用数据,它有以下属性
语法:
<c:forEach var="name" items="Collection" varStatus="statusName" begin="begin" end="end" step="step"></c:forEach>
例子: <c:forEach items="${vectors}" var="vector"> <c:out value="${vector}"/> </c:forEach> 相当于java语句 for (int i=0;i<vectors.size();i++) { out.println(vectors.get(i)); } 在这里vectors是一个java.util.Vector对象,里面存放的是String数据,vector是当前循环条件下String对象。实际上这里的vectors可以是任何实现了java.util. Collection接口的对象。 <c:forEach begin="0" end="100" var="i" step="1"> count=<c:out value="${i}"/><br> </c:forEach> 输出: count=0 ... count=100
2、<c:forTokens>
<c:forTokens>标签有以下属性
语法:
<c:forTokens items="stringOfTokens" delims="delimiters" [var="name" begin="begin" end="end" step="len" varStatus="statusName"]></c:forTokens>
例子: <c:forTokens items="a:b:c:d" delims=":" var="token"> <c:out value="${token}"/> </c:forTokens>
这个标签的使用相当于java.util.StringTokenizer类。在这里将字符串a:b:c:d以:分开循环四次,token是循环到当前分割到的字符串。
9.8.4:URL相关标签
1、<c:import>
<c:import>标签包含另外一个页面代码到当前页,它有以下属性
语法:
<c:import url="url" [context="context"] [value="value"] [scope="..."] [charEncoding="encoding"]></c:import>
<c:import url="url" varReader="name" [context="context"][charEncoding="encoding"]></c:import>
2、<c:url>
<c:url>标签输出一个url地址,它有以下属性
语法:
<c:url value="value" [var="name"] [scope="..."] [context="context"]>
<c:param name="name1" value="value1">
</c:url>
或:
<c:url value="value" [var="name"] [scope="..."] [context="context"]/>例子: <c:import url="http://www.url.com/edit.js" var="newsfeed"/> 将url http://www.url.com/edit.js包含到当前页的当前位置,并将url保存到newsfeed变量中 <a href="<c:url url="/index.jsp"/>"/> 在当前页的当前位置输出 <a href="http://www.yourname.com/index.jsp"/> http://www.yourname.com是当前页的所在的位置。
3、<c:redirect>
<c:redirect>标签将请求重新定向到另外一个页面,它有以下属性
例子: <c:redirect url="http://www.yourname.com/login.jsp"/> 将请求重新定向到http://www.yourname.com/login.jsp页,相当于response.setRedirect("http://www.yourname.com/login.jsp");
4、<c:param>
<c:param>标签用来传递参数给一个重定向或包含页面,它有以下属性l
例子: <c:redirect url="login.jsp"> <c:param name="id" value="888"/> </c:redirect> 将参数888以id为名字传递到login.jsp页面,相当于login.jsp?id=888