JSP EL表达式
Posted chy18883701161
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP EL表达式相关的知识,希望对你有一定的参考价值。
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
以上是关于JSP EL表达式的主要内容,如果未能解决你的问题,请参考以下文章