EL即Expression  Language(表达式语言),是一种简单的数据访问语言。
	EL和输出表达式<%=  %>的功能差不多,都是输出表达式的值,但二者使用的对象有所不同。
	 
	 
	EL表达式语法:
	 ${表达式}       //表达式后面不能加分号。
	 
	 
	访问常量:
	${1}    //int 
	${"ok"}   //String,要加引号
	${false}   //boolean
	${null}    //null
	 
	 
	访问变量:
	${name=1}    //1。EL表达式中的变量不用先声明|定义,可直接使用。比如此处未声明 int name 。
	${name}    //访问变量的值
	以Java获取值,如果变量不存在或值是null,,会报空指针异常。El表达式则不会,EL表达式会输出空串。
	 
	 
	算术运算符:
	${a+b}  //加
	${a-b}   //减
	${a*b}   //乘
	${a/b}   或  ${a div b}    //除
	${a%b}  或  ${a mod b}   //取模
	 
	 
	比较运算符:
	返回boolean值,为避免与html标签<>冲突,可使用英文简写。
	${a==b}    或  ${a eq b}      equals
	${a!=b}  或  ${a nq b}      not equals
	${a<b}  或  ${a lt b}     less  than
	${a<=b}  或  ${a  le  b}     less equals
	${a>b}  或  ${a gt  b}     greater  than
	${a>=b}  或  ${a ge b}     greater  equals
	 
	 
	逻辑运算符:
	${a && b}  或   ${a and b}
	${a || b}   或  ${a or b}
	${!a}   或   ${not  a}
	 
	 
	三目运算符:
	${a?b:c}
	 
	 
	empty运算符:
	${empty  a}     //判断变量a是否为空,返回boolean值
	若变量a不存在,返回true;
	若变量a存在,但值为null,返回true;
	若变量a是集合类型(List、Set、Map),值不为null,但却是空集合,返回true。
	 
	 
	不确定运算符的优先级时,加()。
	 
	 
	 
	EL取对象的属性(成员变量)
	- 
		${ 对象名.属性名 }    //属性名不加引号。属性一般是private,不能直接访问,实质还是调用getter()方法。
	
- 
		${ 对象名.getXxx() }   //使用getter()方法
	
- 
		${ 对象名["属性名"] }    //属性名要加引号
	
	 
	 
	EL取数组元素
	 
	 
	 
	 
	EL表达式与输出表达式<%=   %>的异同点
	- 
		使用位置相同。放置位置和html标签相同,此外还能放在html标签的属性中,比如<form action="${ }"></form>。
	
- 
		输出表达式可以访问JSP的内置对象,可以访问<%!   %>、<%   %>中定义的变量,可以调用<%!  %>中定义的方法,可以访问<jsp:useBean />定义的对象。
	
- 
		EL表达式不能访问JSP的内置对象,不能访问<%!   %>、<%   %>中定义的变量,不能调用<%!  %>中定义的方法,可以访问<jsp:useBean />定义的对象。
	
	EL表达式那么多数据都不能访问,为什么是数据访问语言?
	EL表达式有自己的内置对象,一般地,EL表达式使用自己的内置对象来访问数据。
	 
	 
	 
	 
	EL表达式的11个内置对象|隐式对象
	- 
		pageScope    
	
- 
		requestScope
	
- 
		sessionScope
	
- 
		applicationScope
	
	- 
		pageContext    //相当于JSP内置的pageContext,常用于获取其他对象
	
	- 
		param    //所有的请求参数(表单数据、url中?后面的部分)
	
- 
		paramValues
	
	- 
		header    //HTTP请求头的所有字段
	
- 
		headerValues
	
	- 
		cookie
	
- 
		initParam    //整个web应用的初始化参数
	
	这些内置对象都是使用Map来存储数据。
	 
	 
	EL表达式虽然不能访问<%  %>中定义的变量,比如 <% Student student=new Student(); %> ,在EL表达式中不能访问student对象。
	但Servlet、JSP可以使用setAttribute()把数据(变量)放到4个域中,EL表达式从域中取出数据。
 1 <%  2 pageContext.setAttribute("id","01"); //page域  3 request.setAttribute("name","chy"); //request域  4 session.setAttribute("age",20); //session域  5 application.setAttribute("score",100); //application域  6 %>  7  8 <%--  2种写法等效--%>  9 ${pageScope.get("id")} 10 ${pageContext.getAttribute("id")} 11 12 ${requestScope.get("name")} 13 ${pageContext.request.getAttribute("name")} 14 15 ${sessionScope.get("age")} 16 ${pageContext.session.getAttribute("age")} 17 18 ${applicationScope.get("score")} 19 ${pageContext.servletContext.getAttribute("score")}
	 
	 
	(1)pageScope、requestScope、sessionScope、applicationScope这4个域对象的常用方法
	- 
		get(key)    //获取属性值
	
- 
		getOrDefault(key, defaultValue)   //若域中没有name属性,则返回设置的默认值
	
- 
		clear()    //清空整个域
	
- 
		remove(key)   //删除某个属性
	
- 
		remove(key,value)
	
- 
		replace(key, oldValue, newValue)   //替换某个属性的值
	
- 
		containsKey(key)   //是否包含指定的key,返回boolean
	
- 
		keySet()    //获取域中key的集合,返回Set
	
- 
		values()   //获取值的集合,返回Collection
	
- 
		entrySet()    //获取entry(一个键值对)的集合,返回Set
	
	这4个域只有取数据的方法,没有设置数据的setXxx()方法。
	 
	 
	 
	(2)pageContext的常用方法
	- 
		.servletContext
	
- 
		.servletConfig
	
- 
		.out
	
- 
		.session
	
- 
		.request
	
- 
		.response
	
- 
		.exception
	
	这些获取其他对象的方式,表面上是通过成员变量来获取,实际仍是调用getXxx()来获取。
	pageContext相当于一个大Map,里面还装了些小Map。
	 
	EL内置的4个域对象没有设置数据的setXxx()方法。设置数据可以用上面pageContext的几个成员变量来实现:
${pageContext.request|session|servletContext.set|remove|getAttribute()   }
	上面只有三个域,page域呢?
	pageContext本身就是page域: pageContext.set|get|removeAttribute() 
	 
	此外pageContext还有2个常用方法:
	- 
		forward(String url)    //请求转发
	
- 
		include(String url)   //请求包含
	
	均是服务器内部行为,浏览器总的只发送一次HTTP请求,可以看到地址栏是没有变的。
	 
	 
	 
	EL表达式从域中取数据的方法总结
	- 
		${ pageScope.get("age") }     //xxxScope.get("xxx")
	
- 
		${ pageScope.age }    //直接以属性名来取,属性名不加引号。十分方便,推荐。
	
- 
		${ age }   //直接以属性名来取。向这种没有指定域的,默认从page、request、session、applicaiotn依次找,找到一个就返回,不再继续往下找。
	
- 
		${ pageContext.request.getAttribute("age") }   //先通过pageContext获取指定的域,再获取数据
	
- 
		${pageContext.getAttribute("age") }   //特殊:pageContext本身就表示page域
	
	 
	 
	 
	(3)param、paramValues
	param、paramValues中保存的是请求参数(表单数据、url中?后面的部分)。
	请求参数会存储为2份:
	- 
		param。key是String(字段名),value是String。因为使用Map存储,key不能重复,所以有相同的字段名时,比如?hobby="running"&hobby="swimming",只存储第一个,不会存储后面相同的。
	
- 
		paramValues。key是String(字段名),value是String[]。不管有没有相同的字段名,值都是存储为String[]形式,比如?hobby="running",存储为{"running"}。
	
<form method="post" action="handle.jsp"> 姓名:<input type="text" name="name" /><br /> 爱好:<input type="checkbox" name="hobby" value="running" >跑步 <input type="checkbox" name="hobby" value="swimming" >游泳<br />
     <button type="submit">提交</button>
 </form>
	 
<% request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8"); %>
<p>姓名:${param.name}</p>
<p>爱好:${paramValues.hobby[0]}、${paramValues.hobby[1]}</p>
	 
	param是Map<Stirng,String>类型、paramValues是Map<Stirng,String[]>类型,这2个EL内置对象都可以使用Map的方法。
	 
	 
	 
	(4)cookie对象
	cookie对象表示存储请求头中所有Cookie的Map集合。
	${cookie.JSESSIONID}    //获取JSESSIONID这个Cookie
	${cookie.JSESSIONID.name}   //获取JSESSIONID这个Cookie的name
	${cookie.JSESSIONID.value}   //获取JSESSIONID这个Cookie的value
	 
	 
	 
	 
	除了EL表达式,JSP中还有JSTL标签库。
	JSTL是Sun给JSP制定的一套标准标签库,JS代表JSP,TL即Tag Library。
	JSTL很古老,很多东西不再适用,现在基本不用了。
                    	
                    	
                    	  
                    	    
                    	    
                    	    
                    	 
    如果您觉得本文的内容对您的学习有所帮助:
     
                    	
                    	   
                    	   关键字:
equals和==