JSP学习(四) --------- EL表达式


一、传统JSP文件开发步骤

  • 第一步:从指定的作用域对象读取处理结果
  • 第二步:将得到数据进行类型强转
  • 第三步:将转换后的结果写入到响应体
<% 
    String value = (String)request.getAttribute("key");
%>
<%=value%>

二、EL表达式介绍

EL 的全称为 Expression Language ,即表达式语言。在JSP页面使用 EL 表达式可以获取并显示页面数据,简化对于变量和对象的访问。

  1. 命令格式
${作用域对象别名.共享数据名}
  1. 命令作用
  • EL 表达式是EL工具包提供的一种特殊的命令格式 ------- 表达式命令格式
  • EL 表达式在JSP文件上使用
  • EL 表达式负责在JSP文件从作用域对象读取指定的共享数据并输出到响应体

三、EL表达式作用域对象别名

JSTL名称EL名称中文名称EL表达式
pageContextpageScope当前页作用域对象${ pageScope.共享数据名 }
requestrequestScope请求作用域对象${ requestScope.共享数据名 }
sessionsessionScope会话作用域对象${ sessionScope.共享数据名 }
applicationapplicationScope全局作用域对象${ applicaionScope.共享数据名 }

在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他Servlet或则其他JSP文件。在真实开发过程中,主要用于JSTL标签与JSP文件之间数据共享数据。
JSTL------->pageContext---->JSP

四、EL表达式输出对象属性

  • 命令格式:
${作用域对象别名.共享对象名.属性名}
  • 命令作用:从作用域对象读取指定共享数据关联的引用对象的属性值。并自动将属性的结果写入到响应体

  • 属性名:要跟引用类型的属性名大小写等方面完全一致

  • EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集合内容输出

Student stu = new Student("Mike", 18);
request.setAttribute("key", stu);
request.getRequestDispatcher("/index.jsp").forward(request, response);
<%requestScope.stu.name%>

五、简化版EL表达式

  • 命令格式
${共享数据名}
  • 命令作用 :EL表达式允许开发人员在开发时省略作用域对象别名

  • 工作原理 :

EL表达式简化版由于没有指定作用域对象,所以在执行时采用猜测的算法
首先到 pageContext 定位共享数据,如果存在直接读取输出并结束执行
如果在 pageContext 没有定位成功,到 request 定位共享数据,如果存在直接读取输出并结束执行
如果在 request 没有定位成功,到 session 定位共享数据,如果存在直接读取输出并结束执行
如果在 session 没有定位成功,到 application 定位共享数据,如果存在直接读取输出并结束执行
如果在 application 没有定位成功,返回null

流程 : pageContext—>request—>session—>application

也就是说在session和application添加同一个共享数据,如果用简化版的EL表达式,输出的session中的共享数据

  • 缺点:增加程序运行时间和导致数据定位错误
  • 设计目的:简化版设计之初就是为了从当前页作用域对象读取数据并输出,所以从request,session,application读取数据并输出时应该避免使用简化版
  • 注: EL表达式简化版尽管存在很多隐患,但是在实际开发过程中,开发人员为了节省时间,一般都使用简化版,不使用标准版

六、EL表达式支持运算

  • 背景:在JSP文件有时需要将读取共享数据进行一番运算之后,将运算结果写入到响应体
  • 运算表达式:

(1) 数学运算: + 、-、 * 、/
(2) 关系运算: >、>= 、== 、< 、<= 、!=
                        gt 、ge 、eq 、lt、 le、 !=
(3) 逻辑运算:&&、|| 、 !

  • 使用:
我们已经添加两个数num1和num2作为共享数据,要求将num1和num2进行加和运算并写到响应体中
直接写即可:
${num1 + num2}

七、EL表达式中隐式对象

对象介绍
param将请求参数名称映射到单个字符串参数值,${param . name}相当于 request.getParameter (name)
paramValues将请求参数名称映射到一个数值数组,表达式 ${paramvalues. name} 相当于 request.getParamterValues(name)
cookie将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie. name .value} 返回带有特定名称的第一个 cookie 值
header将请求头名称映射到单个字符串头值,${header. name} 相当于 request.getHeader(name)

我们重点来看一下 param 这个参数

  • 命令格式:${param.请求参数名}
  • 命令作用:通过请求对象读取当前请求包中请求参数内容,并将请求参数内容写入到响应体
  • 使用
请求:http://localhost:8080/myWeb/index.jsp?userName=mike&password=123
用户名:${param.username} <br/>
密码:${param.password}

如果浏览器发送的请求是一个请求参数关联多个值,即这种:

http://localhost:8080/myWeb/index.jsp?deptNo=10&deptNo=20&deptNo=30

可以用 [] 的方式输出对应位置的值

第一个部门编号:${paramValues.deptNo[0]}<br/>
第二个部门编号:${paramValues.deptNo[1]}<br/>
第三个部门编号:${paramValues.deptNo[2]}<br/>

八、EL表达式常见异常

  • 异常:javax.el.PropertyNotFoundException : 在对象中没有找到指定属性
  • 异常分析:EL表达式在读取对象中属性时,通过反射机制调用当前属性对应的get方法得到属性的值,如果当前属性没有声明对应get方法,此时EL表达式认为当前类文件没有这个属性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在森林中麋了鹿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值