EL表达式
EL表达式:
最初出现的目的是用来取代jsp页面中的jsp脚本表达式.但是随着el的发展el的功能已经不限于此了
替代<%= %>脚本表达式,在j2ee1.4以前默认是不支持el,如果需要需要指定page指令[isELIgnored="true | false" ]为false,j2ee4.0后默认支持el
${el表达式}
(1)获取数据:
使用中括号的地方都可以使用点号替代,除了中括号中是数字或者中括号中包含特殊字符(-.)的情况除外
在中括号中如果不用双引号引起来则是变量,先找变量的值再拿变量的值使用.如果用双引号则是常量,直接使用常量的值
~获取常量
字符串/数字/布尔类型,直接写在el表达式中,el直接进行输出
~获取域中的变量
如果el中写的是一个变量的名,则el会调用pageContext的findAttribute方法,在四大作用域中以给定的名字找对应的属性值,找到后进行输出,如果四个域中都找不到,什么都不输出
~获取数组中的数据
~获取集合中的数据
~获取Map中的数据
~获取javabean的属性
获得域中的属性(~获取域中的变量)
${propName}在四个域中搜寻proName属性,输出该值到输出流中
${pageScope/requestScope/sessionScope/applicationScope.proName}获取指定域中的属性
${attr[0]}获取域中的集合的指定元素
${list[0]}获取list中的指定位置元素
${map.keyName}获取map中指定键的值
${bean.propName}获取javaBean的属性,可以认为是调用了javaBean的getXXX方法,
~最重要的一个应用场景:在写路径的时候最好不要把web应用名称写死,java中应该用request.getContextPath去获取。jsp中就用el获取:${pageContext.request.contextPth}
~.和[]区别使用点的地方都可以用中括号,如果属性名是数字或包含特殊符号(.-)就必须使用中括号。例子:${map["first.name"]}
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2 <%@page import="com.itheima.domain.Person"%> 3 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 4 <html> 5 <head> 6 </head> 7 <body> 8 <h1>获取javabean的属性</h1><hr> 9 <% 10 Person p = new Person(); 11 p.setName("芙蓉姐姐"); 12 p.setAge(17); 13 pageContext.setAttribute("p",p); 14 %> 15 ${p.name }${p.age } ${p.name }//这里的p.name 中的name不是name属性,而且它被private修饰;其实el表达式底层调用了getName() 16 <img src="${pageContext.request.contextPath }/1.jpg"/> 17 18 <h1>获取Map中的数据</h1><hr> 19 <% 20 Map<String,String> map = new HashMap(); 21 map.put("name","奥巴马"); 22 map.put("age","17"); 23 map.put("gender","男"); 24 map.put("addr","白宫"); 25 map.put("name.xiao","小黑黑"); 26 pageContext.setAttribute("map",map); 27 pageContext.setAttribute("name","age"); 28 %> 29 ${map["name"] }${map["addr"] } 30 ${map.gender }${map.age } 31 ${map["name.xiao"] } 32 33 <h1>获取集合中的数据</h1><hr> 34 <% 35 List<String> list = new ArrayList<String>(); 36 list.add("甄嬛"); 37 list.add("安玲荣"); 38 list.add("凤姐"); 39 pageContext.setAttribute("list",list); 40 %> 41 ${list[2] } 42 43 <h1>获取数组数据</h1><hr> 44 <% 45 String [] names = {"容嬷嬷","紫薇","金锁","小燕子"}; 46 pageContext.setAttribute("names",names); 47 %> 48 ${names[2]} 49 <h1>获取域中的变量数据</h1><hr> 50 <% 51 String name = "灭绝师太"; 52 pageContext.setAttribute("name",name); 53 %> 54 ${name } 55 <h1>获取常量数据</h1><hr> 56 ${"阿萨德发射点发" } ${199 } ${true } 57 </body> 58 </html>
Person.java
1 package com.itheima.domain; 2 3 public class Person { 4 private String name; 5 private int age; 6 public String getName() { 7 return name; 8 } 9 public void setName(String name) { 10 this.name = name; 11 } 12 public int getAge() { 13 return age; 14 } 15 public void setAge(int age) { 16 this.age = age; 17 } 18 19 }
!!! EL表达式不能设置数据
(2)执行运算:
算数运算
+-*/
逻辑运算
比较运算
三元运算符
empty运算符
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <head> 5 </head> 6 <body> 7 <h1>empty 运算符 : 判断一个对象是否为null或字符串是否为空字符串或集合内容是否为空或域中是否没有任何属性</h1><hr> 8 <% 9 String str = "aaaa"; 10 pageContext.setAttribute("str",str); 11 List list = new ArrayList(); 12 list.add(""); 13 pageContext.setAttribute("list",list); 14 %> 15 ${empty str } 16 ${empty list} 17 ${empty pageScope } 18 19 20 <h1>三元运算</h1><hr> 21 ${10>9? "yes" : "no" } 22 23 <h1>逻辑运算</h1><hr> 24 && and 25 || or 26 ! not 27 28 ${not (3>2 and 1<2 or 10>3) } 29 30 31 <h1>比较运算</h1><hr> 32 > gt 33 < lt 34 >= ge 35 <= le 36 != ne 37 ==eq 38 ${1 eq 1 } ${3 ge 2 } ${5+3 lt 3 } 39 <h1>算术运算:如果有非数字参与算数运算,el表达式会试图将非数字转换为数字后参与运算</h1><hr> 40 ${1+1 } 41 ${1-2 } 42 ${1+"2" } 43 </body> 44 </html>
(3)获取常用开发对象:el中内置了11个内置对象,这些对象el内置的,不需要提前定义就可以直接在el中使用
!pageContext -- 有了它可以很方便的获取jsp页面中的9大隐式对象
!pageScope -- page域中属性组成的Map
!requestScope -- request域中属性组成的Map
!sessionScope -- session域中属性组成的Map
!applicationScope --application域中属性组成的Map
!param -- 所有请求参数组成的Map<String,String>
paramValues -- 所有请求参数组成的Map<String,String[]>
header -- 所有请求头组成的Map<String,String>
headerValues -- 所有请求头组成的Map<String,String[]>
!cookie -- 所有cookie信息组成的Map<String,Cookie>
initParam -- 所有web应用的初始化参数组成Map
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3 <html> 4 <head> 5 </head> 6 <body> 7 <% 8 pageContext.setAttribute("name","wang"); 9 request.setAttribute("name","li"); 10 %> 11 ${requestScope.name} 12 13 ${param.name } ${paramValues.like[2] }${header["Accept-Language"] } 14 ${cookie.JSESSIONID.name }${cookie.JSESSIONID.value } 15 ${initParam.name2 } 16 17 </body> 18 </html>
(4)调用java方法: -- 不需要大家自己会写调用方法的过程,只要会调用别人写好的标签库就可以了 fn标签库
~写一个类其中包含要被el调用的方法,这个方法必须是静态的方法
~写一个tld文件在其中对要被调用的静态方法进行一下描述
~在jsp页面中taglib指令将tld文件引入当前jsp页面,从而在jsp页面中就可以调用描述好的方法
URI里面的内容是名称空间,全世界独一无二大的,通过URI内容 被其他文件引用
Shortname为名称空间的缩写,为了引入方便
ELFunc.java
1 package com.itheima.util; 2 3 import java.io.UnsupportedEncodingException; 4 import java.net.URLEncoder; 5 6 public class ELFunc { 7 public static String myEncode(String str,String encode){ 8 try { 9 return URLEncoder.encode(str, encode); 10 } catch (UnsupportedEncodingException e) { 11 e.printStackTrace(); 12 throw new RuntimeException(e); 13 } 14 } 15 }
el4.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@page import="java.net.URLEncoder"%> 3 <%@ taglib uri="http://www.itheima.com/MyELFunc" prefix="MyELFunc" %> 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 5 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 6 <html> 7 <head> 8 </head> 9 <body> 10 ${MyELFunc:URLEnc("北京","utf-8") } 11 ${fn:toUpperCase("asdfasdfKJKJKJdsagHIHidsfgGUGu") } 12 </body> 13 </html>
MyELFunc.tld
1 <?xml version="1.0" encoding="UTF-8"?> 2 <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> 5 <tlib-version>1.0</tlib-version> 6 <short-name>MyELFunc</short-name> 7 <uri>http://www.itheima.com/MyELFunc</uri> 8 <function> 9 <name>URLEnc</name> 10 <function-class>com.itheima.util.ELFunc</function-class> 11 <function-signature> java.lang.String myEncode(java.lang.String,java.lang.String)</function-signature> 12 </function> 13 </taglib>