EL表达式(9)

EL表达式
1.初识JavaBean
1.1 什么是javaBean:
它是java开发中常用的组件,其实就是一个java类,它的作用就是封装数据。
书写JavaBean需要满足五个规范:
>>>1.这个java类,被public修饰
>>>2.这个java类要提供公共的无参数的构造方法
>>>3.要提供私有的属性
>>>4.要给私有的属性提供公共的set或者get方法
>>>5.要实现Serializable接口
比如:
public class Book implements Serializable{
private String id;
private String name;
public Book(){};
public void set----
public String get—
}
1.2 访问JavaBean的属性:
类的成员变量和属性的一个关系:
在普通的java类里面,成员变量可以说成就是属性。
在JavaBean里面,成员变量和属性就有了区别。
在JavaBean 里面什么是成员变量呢? 比如:private String id; 那么id就是成员变量
在JavaBean 里面什么是属性?就是get或者set后面的字段名称(字段名称的首字母小写),就是属性。
比如:
public class Student {
//一下就是javaBean的四个成员变量
private String sid;//目的就是为了接收外界传递过来的值
private String name;
public Student() {

		}
		//属性由get或者set方法后面的字段首字母小写就是属性,属性就是id
		public String getId() {
			return sid;
		}
		public void setId(String id) {//写方法,给student写一个id
			this.sid = id;
		}
		//属性就是name
		public void setName(String name) {
			this.name = name;
		}
	}
  上面的Student的属性就是id ,name。成员变量就是sid,name.

1.3 BeanUtils 工具
   BeanUtils 工具是由apache软件基金会提供的一套封装数据到JavaBean的工具类,使用简单方便,
   BeanUtils是第三方的工具(插件),所以需要导入jar包。
   常用的api:
   >>> 1.向javaBean的属性设置值: 
	setProperty(javaBean对象,javaBean的属性,javaBean属性的值);
   >>> 2.获取javaBean属性的值:
       getProperty(javaBean对象,javaBean的属性);
   >>> 3.向javaBean的属性设置值:
       populate(javaBean对象,map对象);
       注意:map的对象的key(就是javaBean属性名称),必须和javaBean的属性名一致,才能给javaBean的属性设置值。
	     提交的表单数据想封装到javaBean对象里面,要求表单name属性的值,必须和javaBean属性名称一一对应。

2.EL 表达式
1.1 初识 EL 表达式
EL在开发中,通常是用来获取域对象中保存的值,基本语法:${域对象的名称}。
比如说: request.setAttribute(“key”,“value123”): k e y , 获 取 的 值 就 是 v a l u e 123 如 果 域 对 象 的 名 称 写 错 了 , 使 用 e l 表 达 式 获 取 值 , 获 取 的 是 " " . 1.2 E L 表 达 式 中 的 标 识 符 在 e l 书 写 过 程 中 , 会 用 一 些 符 号 来 标 记 变 量 、 函 数 名 等 , 这 些 符 号 称 之 为 标 识 符 。 书 写 规 范 : 1. 不 能 以 数 字 开 头 2. 不 能 包 含 e l 中 的 关 键 字 : a n d , o r 等 3. 不 能 使 用 e l 表 达 式 的 隐 式 对 象 。 4. 不 能 包 含 特 殊 符 号 , 比 如 正 斜 杠 等 1.3 E L 中 的 变 量 基 本 格 式 : {key},获取的值就是value123 如果域对象的名称写错了,使用el表达式获取值,获取的是"". 1.2 EL表达式中的标识符 在el书写过程中,会用一些符号来标记变量、函数名等,这些符号称之为标识符。 书写规范: 1.不能以数字开头 2.不能包含el中的关键字:and , or 等 3.不能使用el表达式的隐式对象。 4.不能包含特殊符号,比如正斜杠等 1.3 EL中的变量 基本格式: key,value123使el"".1.2ELel1.2.eland,or3.使el4.,1.3EL{域对象的名称},这个域对象的名称可以理解为就是el中的变量,
那这个变量就不需要定义了,可以直接使用。

  1、EL简介

1)语法结构
${expression}
2)[]与.运算符
EL 提供.和[]两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号,就一定要使用 []。
例如:
u s e r . M y − N a m e 应 当 改 为 {user.My-Name}应当改为 user.MyName{user[“My-Name”] }
如果要动态取值时,就可以用[]来做,而.无法做到动态取值。例如:
s e s s i o n S c o p e . u s e r [ d a t a ] 中 d a t a 是 一 个 变 量 3 ) 变 量 E L 存 取 变 量 数 据 的 方 法 很 简 单 , 例 如 : {sessionScope.user[data]}中data 是一个变量 3)变量 EL存取变量数据的方法很简单,例如: sessionScope.user[data]data3EL{username}。它的意思是取出某一范围中名称为
username的变量。
因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、
Application范围查找。
假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,
就回传null。
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
4) 1–EL表达式用 表 示 , 可 用 在 所 有 的 H T M L 和 J S P 标 签 中 作 用 是 代 替 J S P 页 面 中 复 杂 的 J A V A 代 码 . 2 − − E L 表 达 式 可 操 作 常 量 变 量 和 隐 式 对 象 . 最 常 用 的 隐 式 对 象 有 {}表示,可用在所有的HTML和JSP标签中作用是代替JSP页面中复杂的JAVA代码. 2--EL表达式可操作常量 变量 和隐式对象. 最常用的 隐式对象有 ,HTMLJSPJSPJAVA.2EL.{param}和${paramValues}.
${param}表示返回请求参数中单个字符串的值. p a r a m V a l u e s 表 示 返 回 请 求 参 数 的 一 组 值 . p a g e S c o p e 表 示 页 面 范 围 的 变 量 . r e q u e s t S c o p e 表 示 请 求 对 象 的 变 量 . s e s s i o n S c o p e 表 示 会 话 范 围 内 的 变 量 . a p p l i c a t i o n S c o p e 表 示 应 用 范 围 的 变 量 . 止 . J S P 2.0 中 默 认 的 启 用 E L 语 言 . 4 − − E L 语 言 可 显 示 逻 辑 表 达 式 如 {paramValues}表示返回请求参数的一组 值.pageScope表示页面范围的变量.requestScope表示请求对象的变量. sessionScope表示会话 范围内的变量.applicationScope表示应用范围的变量. 止.JSP2.0中默认的启用EL语言. 4-- EL语言可显示 逻辑表达式如 paramValues.pageScope.requestScope.sessionScope.applicationScope..JSP2.0EL.4EL{true and false}结果是false 关系表达式如${5>6} 结
果是false 算术表达式如 ${5+5} 结果是10
5–EL中的变量搜索范围是:page request session application 点运算符(.)和"[ ]"都是
表示获取变量的值.区别是[ ]可以显示非词类的变量

2、EL隐含对象
1)与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和
applicationScope;
它们基本上就和JSP的pageContext、request、session和application一样;
在EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得
其他相关信息。
例如:我们要取得session中储存一个属性username的值,可以利用下列方法:
session.getAttribute(“username”) 取得username的值,
在EL中则使用下列方法
${sessionScope.username}
2)与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
例如我们要取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.name}

   2.web域相关的对象
     域作用范围从小到大:pageContext--->request--->session--->application(servletContext)
     el表达式获取域对象中的值:如果域对象的名称相同,获取的是域作用范围最小的值。
                               和pageContext对象的findAttribute方法的效果是一样的。

   3.param 和 paramValues 对象: 获取表单提交的数据。
    比如:
    	num1:<input type="text" name="num1" /><br/>
	num2:<input type="text" name="num" /><br/>
	num3:<input type="text" name="num" /><br/>
	<input type="submit" value="提交" /> &nbsp;&nbsp;<input type="reset" value="重填" />
	<hr/>
	num1:${param.num1 }<br/>
	num2:${paramValues.num[0] }<br/>
	num3:${paramValues.num[1] }
   4. Cookie 对象:获取cookie的名称,获取cookie的值
	比如:
		<% response.addCookie(new Cookie("userName","itcast")); %>
		获取cookie对象:${cookie.userName }<br/>
		获取cookie的名称:${cookie.userName.name }<br/>
		获取cookie的值:${cookie.userName.value }<br/>

三、EL表达式搜索域数据的顺序
EL表达式主要是输出域对象中的数据,当四个域对象都有同一个key的值时,EL表达式会按照四个域对象的范围从小到大进行搜索,找到就输出,与四个域对象声明的先后顺序无关

代码演示:在web目录下创建Test.jsp

<body>
    <%							  
        //向四个域对象中都保存相同key的值
        request.setAttribute("key", "request");
        session.setAttribute("key", "session");
        application.setAttribute("key", "application");
        pageContext.setAttribute("key", "pageContext");
    %>
    <%--  使用EL表达式输出key的值  --%>
    ${key}
</body>

在这里插入图片描述
四、EL表达式输出Java类的属性
代码演示:创建Person类

public class Person {
    //输出Person类中普通属性,数组属性,list集合属性和map集合属性
    private String name;
    private String[] phones;
    private List<String> cities;
    private Map<String, Object> map;
    //注意:没有声明age属性
    public int getAge() {
        return 18;
    }
    //以及全参、空参构造器,各属性的getter/setter方法
}

代码演示:在web目录下创建Test.jsp

<body>
    <%
        Person person = new Person();
        person.setName("JayChou");
        person.setPhones(new String[]{"123","456","789"});
        //给cities属性赋值
        List<String> cities = new ArrayList<String>();
        cities.add("北京");
        cities.add("上海");
        cities.add("深圳");
        person.setCities(cities);
        //给map属性赋值
        Map<String,Object> map = new HashMap<>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
        person.setMap(map);
        pageContext.setAttribute("p", person);
    %>
    <%--EL表达式中对象名.属性名不找属性的值,而是找名字对应的getXxx方法,没有此方法会报错--%>
    输出Person:${ p }<br/>
    输出Person的name属性:${p.name} <br>
    输出Person的phones数组地址值:${p.phones} <br>
    输出Person的phones数组属性值:${p.phones[2]} <br>
    输出Person的cities集合中的元素值:${p.cities} <br>
    输出PersonList集合中个别元素值:${p.cities[2]} <br>
    输出PersonMap集合: ${p.map} <br>
    输出PersonMap集合中某个key的值: ${p.map.key1} <br>
    <%-- 注意,即使没有age属性,但因为有getAge方法,也可得出结果 --%>
    输出Person的age值:${p.age} <br>
</body>


运行结果:
在这里插入图片描述
五、EL表达式的运算
语法:${运算表达式},EL表达式支持以下运算符

  1. 关系运算
    在这里插入图片描述

  2. 逻辑运算

在这里插入图片描述

  1. 算数运算
    在这里插入图片描述

  2. empty运算
    empty运算可以判断一个数据是否为空,若为空,输出true,不为空,输出false
    以下几种情况为空(在原本的key之前加empty关键字):
    (1)值为null、空串
    (2)值为Object类型的数组且长度为0 (注:其他类型的长度为0的数组值为非空)
    (3)List、Map集合元素个数为0

  3. 三元运算
    表达式 1?表达式 2:表达式 3
    表达式1为真返回表达式2的值,表达式1为假返回表达式3的值

代码演示:在web目录下创建Test.jsp

<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<>();
        request.setAttribute("emptyList", list);
        //5、map集合,元素个数为零
        Map<String,Object> map = new HashMap<String, Object>();
        request.setAttribute("emptyMap", map);
        //6、其他类型数组长度为0
        request.setAttribute("emptyIntArr", new int[]{});
    %>
    ${ empty emptyNull } <br/>
    ${ empty emptyStr } <br/>
    ${ empty emptyArr } <br/>
    ${ empty emptyList } <br/>
    ${ empty emptyMap } <br/>
    ${ empty emptyIntArr} <br/>
    <%-- 三元运算   --%>
    ${ 12 != 12 ? "相等":"不相等" }
</body>


在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值