JSP学习1:EL表达式

EL工具包介绍

由Java技术开发一个jar包
作用:降低JSP文件开发时Java命令开发强度
Tomcat服务器本身自带了EL工具包(Tomcat安装地址/lib/el-api.jar)

JSP文件作用

代替响应对象 将Servlet中doGet/doPost的执行结果写入到响应体

JSP文件中主要开发步骤

将作用域存放的处理结果读取出来并写入到响应体

<%
    String value = (String)request.getAttribute("key");  
%>
<%=value%>

第一步:从指定的作用域对象读取处理结果
第二步: 将得到数据进行类型强转
第三步: 将转换后的数据写入到响应体

EL表达式

命令格式

${作用域对象别名.共享数据名}

命令作用

执行时从指定的【作用域对象】中读取指定【共享数据】的内容并自动的写入到响应体

1)EL表达式是EL工具包提供一种特殊命令格式【表达式命令格式】
2)EL表达式在JSP文件上使用
3)负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体

EL表达式作用域对象别名

作用域对象别名.png

JSP文件可以使用的作用域对象

  1. ServletContext application: 全局作用域对象

  2. HttpSession session: 会话作用域对象

  3. HttpServletRequest request: 请求作用域对象

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

image.png

EL表达式提供作用域对象别名

          JSP                       EL表达式

      application               ${applicationScope.共享数据名}

      session                   ${sessionScope.共享数据名}

      request                   ${requestScope.共享数据名}

      pageContext               ${pageScope.共享数据名}

EL表达式将引用对象属性写入到响应体

命令格式:
${作用域对象别名.共享数据名.属性名}

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

属性名:
一定要去引用类型属性名完全一致(大小写)

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

.与 [ ] 运算符

EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:

${sessionScope.user.sex}
         等于
${sessionScope.user["sex"]}

. 和 [ ] 也可以同时混合使用,如下:

${sessionScope.shoppingCart[0].price}

不过,以下两种情况,两者会有差异:
当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ]
例如:

${user.My-Name }

上述是不正确的方式,应当改为:

${user["My-Name"] }

我们来考虑下列情况:

${sessionScope.user[data]}

此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于:

${sessionScope.user.sex};

假若data 的值为"name"时,它就等于

${sessionScope.user.name}

因此,如果要动态取值时,就可以用上述的方法来做,但. 无法做到动态取值

简化版EL表达式

命令格式

${共享数据名}

命令作用

EL表达式允许开发人员开发时省略作用域对象别名

工作原理

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

pageContext--->request--->session--->application

存在弊端

增加程序运行时间
导致定位数据错误

使用场景

简化版设计之初就是为了从当前页作用域对象读取数据并输出。所以从request,session,application读取数据并输出时应该避免使用简化版

EL表达式简化版尽管存在很多隐患,但是在实际开发过程中,开发人员为了节省时间,一般都使用简化版,拒绝使用标准版

EL表达式支持运算表达式

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

EL表达式允许开发人员将读取共享数据进行相关运算之后,再进行输出

EL表达式支持运算:
数学运算表达式
关系运算表达式
逻辑运算表达式

表达式.png

数学运算

关系运算:

= == < <= !=
gt ge eq lt le !=

逻辑运算: && || !

EL表达式将高级类型对象的属性输出

命令格式

${作用域对象别名.共享数据名.属性名}

命令作用

从作用域对象读取到指定的高级类型对象,并将高级类型对象中指定属性内容写入到响应体

EL表达式专有异常

异常描述

javax.el.PropertyNotFoundException:类型【xxxx】不存在【属性名】既在某个类中没有找到对应的属性

异常原因分析

EL表达式在读取对象中属性时,通过【反射机制】调用当前属性对应的get方法得到属性的值,如果当前属性没有声明对应get方法,此时EL表达式认为当前类文件没有这个属性

隐式对象

定义

在EL表达式中可以直接使用的一组工具对象,用于提供对EL表达式功能扩充

详解

详解.png

EL表达式禁用

在当前JSP文件中禁用EL表达式

<%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止

在整个项目中禁用EL表达式

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>

EL表达式提供内置对象

命令格式: ${param.请求参数名}

命令作用: 通过请求对象读取当前请求包中请求参数内容并将请求参数内容写入到响应体

代替命令: index.jsp
发送请求: Http://localhost:8080/myWeb/index.jsp?userName=mike&password=123

           <%
             String userName =   request.getParameter("userName");
             String password =   request.getParameter("password");
           %>
           <%=userName%>
           <%=password%>

命令格式:${paramValues.请求参数名[下标]}

命令作用: 如果浏览器发送的请求参数是[一个请求参数关联多个值]此时可以通过paramVaues读取请求参数下指定位置的值并写入到响应体

代替命令: http://localhost:8080/myWeb/index_2.jsp?pageNo=1&pageNo=2&pageNo=3

此时pageNo请求参数在请求包以数组形式存在:pageNo:[1,2,3]

          <%
              String  array[]= request.getParameterValues("pageNo");
          %>
          第一个值:<%=array[0]%>
          第二个值:<%=array[1]%>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容