07 EL表达式

1. EL工具包介绍

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

JSP文件作用:代替响应对象 将Servlet中doGet/doPost的执行结果写入到响应体

JSP文件中主要开发步骤

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

2. EL表达式

2.1 EL表达式的命令格式

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

事例: 普通类型的读取

假设不采用EL表达式时:
    在JSP文件中如果需要将数据写入响应体中需要做如下操作:
   		 <%
        	第一步:获取到作用域对象中的数据并做强制类型转换
        		类型名	value = (类型名)JSP中作用域对象别名.getAttribute(" 共享数据名")
   		%>
    	第二步: 将值写入到响应体中
    		<%=value%>
缺点:
	从上述可以看出,不适用EL表达式时其命令操作较为繁琐,且可读性差。需要时候用<%%>写入java命令,使用<%=%>写入值

使用EL表达式的方式只需要如下操作:
	${EL表达式中作用域对象别名.共享数据名}
	
	只需要上述一行命令即可将数据写入响应体中。

2.2 EL表达式的命令格式之引用类型读取

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

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

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

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

事例: 如将作用域对象中引用数据类型学生对象属性值写入响应体中

假设不采用EL表达式时:
	    <%
        	第一步:获取到作用域对象中的数据并做强制类型转换
        		Student	stu = (Student)JSP中作用域对象别名.getAttribute(" 共享数据名")
      	%>
   			第二步: 将值写入到响应体中
    		<%=stu.getId()%>
    		<%=stu.getName()%>
 采用EL表达式时
 	${EL表达式中作用域对象.共享数据名.id}
 	${EL表达式中作用域对象.共享数据名.name}  			

2.3 作用域对象的别名

作用域对象 名称 JSP中的别名 EL表达式中的别名
全局作用域对象 ServletContext application applicationScope
回话作用域对象 HttpSession session sessionScope
请求作用域对象 HttpServletRequest request requestScope
当前页作用域对象 PageContext rageContext pageScope

2.4 EL表达式简化版

命令格式:

${共享数据名}

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

工作原理:

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

	  查找过程:pageContext--->request--->session--->application

.存在隐患: 容易降低程序执行速度【南辕北辙】 容易导致数据定位错误

**应用场景:**从pageContext中读取数据时使用。

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

2.5 EL表达式支持运算表达式

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

EL表达式支持运算:

  • 数学运算表达式
  • 关系运算表达式
  • 逻辑运算表达式
    在这里插入图片描述

2.6 EL表达式提供内置对象

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

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

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

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

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

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

  3.代替命令: 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]%>

3. EL表达式专有异常

异常描述: javax.el.PropertyNotFoundException:类型【xxxx】不存在【属性名】既在某个类中没有找到对应的属性。
异常原因分析:EL表达式在读取对象中属性时,通过【反射机制】调用当前属性对应的get方法得到属性的值,如果当前属性没有声明对应get方法,此时EL表达式认为当前类文件没有这个属性

おすすめ

転載: blog.csdn.net/qq_28384023/article/details/116887148