El 表达式学习
什么是 EL 表达式
全称:Expression Language,一种写法非常简介的表达式。语法简单易懂,便于使用。表达式语言的灵感来自于 ECMAScript 和
XPath 表达式语言
EL 表达式的作用
作用:让 jsp 书写起来更加的方便。简化在 jsp 中获取作用域或者请求数据的写法。也会搭配 Jstl 来进行使用
使用 EL 表达式
语法结构:${expression},提供.和[ ]两种运算符来存取数据
- a) 使用 EL 表达式获取请求数据
- i. 获取用户请求数据
- ii. 获取请求头数据
- iii. 获取 Cookie 数据
- b) 使用 EL 表达式获取作用域数据
- i. 获取作用域数据
- ii. 作用域查找顺序
- iii. 获取指定作用域中的数据
- c) 使用 EL 表达式进行运算
- i. 算术运算
- ii. 关系运算
- iii. 逻辑运算
- d) EL 表达式空值判断 empty
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--
传统方法获取作用域的缺点:
1.需要导包
2.需要强转
3.获取数据的代码过于麻烦
使用EL表达式获取作用域数据
作用:获取作用域对象中的数据
注意:获取的是pageContext、request、session、application四个对象中的数据,其他数据一概不加理会
找到了则获取返回,找不到则什么也不做,也不报错
语法:
${表达式}
表达式:
1.获取请求数据(getParameter())
request对象存储了请求数据——》param.键名 返回值
request对象存储了请求数据——》paramValues 返回的是数组
2.通过setAttribution方法存储到作用域对象中的数据
${键名} 返回键名所对应的值
注意:
1。如果存储普通字符串直接返回值
2.如果存储的是对象,返回对象
获取对象中的数据:
1.普通对象:
${键名。属性名。属性名...}
2.集合对象
List集合——》${键名[下标]}
map集合——》${键名.map集合中的键名}
作用域的查找顺序
pageContext——》request——》session——》application
注意:
每次查找都是从小到大进行查找,找到了则获取,不在继续找了
EL表达式 逻辑运算:
${逻辑表达式}
${算术表达式}
${关系表达式}
三目运算
注意:
+表示加法运算,不表示字符连接,使用EL表达式进行字符连接会报错。
EL空值判断
${empty 键名}
作用:
判断键名对象的值是否存在有数据
EL获取请求头信息和Cookie信息
请求头信息
${header}——》返回所有的请求头数据
${header["键名"]}——》返回指定键名的请求头数据
${headerValues["键名"]}——》返回指定的键名(同键不同值)的数据
请求cookie信息
${cookie}——》返回存储了所有 cookie对象的map集合
${cookie。键名}——》返回指定的cookie对象
${cookie.键名.name}——》返回指定的cookie对象的键
${cookie.键名.value}——》返回指定的cookie对象的值
--%>
<%--使用el获取作用域中的数据--%>
<!-- 1.获取请求数据(getParameter()) -->
<b>${param.name}</b></br>
<b>${paramValues.age}</b></br>
<!-- 如果存储普通字符串直接返回值 -->
<b>${names}</b></br>
<!-- 存储的是对象,返回对象 -->
<b>${person.name}</b></br>
<b>${person.addr.country}</b></br>
<!-- List集合 -->
<b>${list[0]}</b></br>
<b>${list[0].addr}</b></br>
<!-- map集合 -->
<b>${map.one}</b></br>
<b>${map.one.age}</b></br>
<h3>EL的作用域查找顺序</h3>
<%
pageContext.setAttribute("hello", "hello page");
request.setAttribute("hello", "hello request");
session.setAttribute("hello", "hello session");
application.setAttribute("hello", "hello application");
%>
${pageScope.hello}——》${requestScope.hello}——》${ssesionScope.hello}——》${applicationScope.hello}
<h3>EL表达式和逻辑运算</h3>
${1+2}——${1*2}——${1-2 }——${1/2}——${4>2 }——${sex == 1?'男':'女'}——————${1+"2" }
<h3>EL的空值判断</h3>
<b>${empty t1}</b><br>
<b>${empty t2}</b><br>
<b>${empty t3}</b><br>
<b>${empty t4}</b><br>
<h3>EL的获取请求头和cookie对象信息</h3>
<b>${header}</b><br>
<b>"User-Agent:" ${header["user-Agent"]} </b><br>
<b>${cookie}</b><br>
<b>${coolie.JSESSIONID}</b><br>
<b></b><br>
<b></b><br>
package com.servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class eltest extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
req.setAttribute("names", "田坤");
Person p = new Person("田坤", 18, new Address("中国", "陕西", "西安"));
req.setAttribute("person", p);
List<Person> lp = new ArrayList<Person>();
lp.add(p);
req.setAttribute("list", lp);
Map<String,Person> map = new HashMap<String, Person>();
map.put("one", new Person("宋旭东", 18, new Address("中国", "陕西", "西安")));
req.setAttribute("map", map);
// / ——》表示该项目
req.getRequestDispatcher("/el.jsp?name=田坤&age=18").forward(req, resp);
//EL的空值判断
req.setAttribute("t1", "");
req.setAttribute("t2", new Person());
req.setAttribute("t3", new ArrayList<String>());
req.setAttribute("t4", new HashMap<String,Person>());
}
}
JSTL标签库
在菜鸟教程里面有详细的说明
使用JSTL需要导入核心标签库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page import="com.servlet.Address"%>
<%@page import="com.servlet.Person"%>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!-- 导入JSTL的jar包 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
JSTL学习:
作用:
提高在jsp中的逻辑代码的编写效率,使用标签。
使用:
JSTL的核心标签库(重点)
JSTL的格式化标签库(讲解)
JSTL的SQL标签库(了解)
JSTL的函数标签库(了解)
JSTL的XML标签库(了解)
JSTL的核心 标签库:
1、导入jar包
2、声明jstl标签库的引入(核心标签库)
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3、内容:
基本标签:
<c:out value="数据" default="默认值"></c:out>
数据可以为常量值也可以是EL表达式。
作用:将数据输出给客户端。
<c:set var="hello" value="hello pageContext" scope="page"></c:set>
作用:存储数据到作用域对象中
var:表示存储的键名
value:表示存储的数据
scope:表示要存储的作用域对象 page request session application
<c:remove var="hello" scope="page"/>
作用:删除作用域中的指定键的数据。
var:表示要删除的键的名字
scope:表示要删除的作用域(可选)
注意:
如果在不指定作用域的情况使用该标签删除数据,会将四个作用域对象中的符合要求的数据全部删除。
逻辑标签:
<c:if test="${表达式}">
前端代码
</c:if>
作用:进行逻辑判断,相当于java代码的单分支判断。
注意:
逻辑判断标签需要依赖于EL的逻辑运算,也就是表达式中涉及到的数据必须从作用域中获取。
<c:choose>
<c:when test="">执行内容</c:when>
<c:when test="">执行内容</c:when>
...
<c:otherwise>执行内容</c:otherwise>
</c:choose>
作用:用来进行多条件的逻辑判断,类似java中的多分支语句
注意:
条件成立只会执行一次,都不成立则执行otherwise
循环标签:
<c:forEach begin="1" end="4" step="2">
循环体
</c:forEach>
作用:
循环内容进行处理
使用:
begin:声明循环开始位置
end:声明循环结束位置
step:设置步长
varStatus:声明变量记录每次循环的数据(角标,次数,是否是第一次循环,是否是最后一次循环)
注意:数据存储在作用域中,需要使用EL表达式获取。
例如:${vs.index}--${vs.count}--${vs.first}--${vs.last}
items:声明要遍历的对象。结合EL表达式获取对象
var:声明变量记录每次循环的结果。存储在作用域中,需要使用EL表达式获取。
--%>
<c:out value="我是OUT"></c:out>
<c:set var="str" value="string" scope="page"></c:set>
<c:out value="${str}"></c:out>
<!-- IF单分支 -->
<c:set var="a" value="12" scope="page"></c:set>
<c:if test="${a>2}">
<b>啦啦啦。。。</b>
</c:if>
<!-- 多分枝逻辑判断 -->
<br>
<c:set var="s1" value="11"></c:set>
<c:choose>
<c:when test="${s1>90}">
<b>大奖励</b>
</c:when>
<c:when test="${s1<=90&&s1>=60 }">
<b>小奖励</b>
</c:when>
<c:when test="${s1<60&&s1>40 }">
<b>男女混合双打</b>
</c:when>
<c:otherwise>
<b>你完了</b>
</c:otherwise>
</c:choose>
<!-- 循环 -->
<br>
<c:forEach begin="1" end="8" step="1" varStatus="s">
<b>${s.index}--- ${s.count} --- ${s.first} --- ${s.last}</b><br>
</c:forEach>
<%
//遍历List
List<Person> lp = new ArrayList<Person>();
lp.add(new Person("田坤",18,new Address("中国","陕西","西安")));
lp.add(new Person("宋旭东",18,new Address("中国","陕西","西安")));
request.setAttribute("lp", lp);
//遍历MAP
Map<String,Person> m = new HashMap();
m.put("one",new Person("田坤",18,new Address("中国","陕西","西安")));
m.put("two",new Person("宋旭东",18,new Address("中国","陕西","西安")));
request.setAttribute("m", m);
%>
<c:forEach items="${lp}" var="l">
${l.name}---${l.age}----${l.addr.country}<br>
</c:forEach>
<br>
<c:forEach items="${m }" var="s">
${s.key}---${s.value}<br>
${s.value.addr.city }<br>
</c:forEach>