先废话两句,今天把实习的事定下来了,今后有人指点,实乃幸事。
我在看EL表达式的时候查资料,发现为毛好的资料老是这么难找╮(╯▽╰)╭,这更加坚定了我建立一个博客字典的决心,懒是驱动我前进的动力。。。
对了,资料收集来源于网络。。。由于太多,就不给链接了。
EL表达式
存在意义
目的:为了使JSP写起来更加简单。
EL是ExpressionLanguage的缩写,它是jsp内置的表达式语言,从jsp2.0开始,就不让再使用java脚本,而是使用el表达式或动态标签来代替java脚本,它提供了在 JSP 中简化表达式的方法,让JSP的代码更加简化。
注意:
1.假若您所用的容器只支持 Servlet2.3/JSP1.2 ,如: Tomcat4.1.29 ,您就不能在 JSP 网页中直接使用 EL ,必须安装支持 Servlet2.4/JSP2.0 的容器。
2.注意 <%@ page isELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。
EL语法
EL表达式的语法如下:
${表达式}
EL表达式代替的是java脚本中的<%= …%>,也就是说EL表达式也是向浏览器端输出数据。例如${1+2}会向浏览器端输出3。
EL提供“.“和“[ ]“两种运算符来存取数据。
当要存取的属性名称中包含一些特殊字符,如 . 或 - 等并非字母或数字的符号,就一定要使用“[ ]“。例如:
${user. My-Name}应当改为${user["My-Name"]}
如果要动态取值时,就可以用“[ ]“来做,而“.“无法做到动态取值。例如:
${sessionScope.user[data]}中data 是一个变量
EL用法
获取数据
EL表达式取值必需是servlet四大域(application>session>request>pageContext)中有的值,这四个域都有setAttribute("",object)方法和getAttribute("")方法,EL表达式会自动从四大域中按作用范围从小到大寻找搜寻对应名字的值,其内部调用的就是findAttribute("")方法。
如果要想在页面通过el表达式得到值就必需先调用域的setAttribute方法把值设置进去,不需要什么配置,直接写EL表达式就可以如下代码
<%
application.setAttribute("name","zhangsan");//Context域
session.setAttribute("name","lisi");//session域
request.setAttribute("name","wangwu"); //request域
pageContext.setAttribute("name","zhaoliu");//page域
%>
${name }
输出结果是page域中的zhaoliu 如果将page域删掉则输出wangwu 依次类推。
但需注意如果这四个域中都没有,那么EL表达式就返回一个空字符串(不是NULL),即在页面上什么也不显示。
如果要指定从哪个域中获取数据,一定要在指定的域名称后面加上“Scope“,否则不能从指定的域中获取数据。例:
<body>
This is my JSP page. <br>
<%
application.setAttribute("name","zhangsan");//Context域
session.setAttribute("name","lisi");//session域
request.setAttribute("name","wangwu"); //request域
pageContext.setAttribute("name","zhaoliu");//page域
%>
<p>全域查找:${name}</p>
<p>从page域中查找:${pageScope.name}</p>
<p>从request域中查找:${requestScope.name}</p>
<p>从session域中查找:${sessionScope.name }</p>
<p>从application域中查找:${applicationScope.name}</p>
</body>
其实,使用EL表达式获取jsp四个域中的数据:
pageScope:${pageScope.name}等同于pageContext.getAttribute(“name”);
requestScope:${requestScope.name}等同于request.getAttribute(“name”);
sessionScoep:${sessionScope.name}等同于session.getAttribute(“name”);
applicationScope:${applicationScope.name}等同于application.getAttribute(“name”);
javaBean导航
如果在域中保存的是javaBean对象,那么也可以使用EL表达式来访问javaBean的属性,因为EL表达式只做读操作,所以javaBean一定要为属性提供get方法,而对set方法没有要求。使用EL表达式获取javaBean属性就是javaBean导航。
若某类中虽然没有名称为”name”的成员变量,但是提供了getname()方法,因此name就是该类的属性,那么在jsp页面中就能通过EL表达式${people.name}输出该方法的返回值(若类名为people),进一步说明该EL表达式底层就是调用javaBean的get方法。
EL表达式运算符
EL是表达式语言,它可以进行一些运算,可使用的运算符如表所示:
内置对象
我们知道jsp有九个内置对象,而EL表达式有11个对象,这些内置对象无需创建可直接使用。11个内置对象如下所示:
pageScope
requestScope
sessionScope
applicationScope
param;
paramValues;
header;
headerValues;
initParam;
cookie;
pageContext;
其中,pageScope,requestScope,sessionScope,applicationScope是域相关的内置对象,这里我们就不再多说。这11个内置对象中,有10个内置对象的类型是Map类型,只有pageContext的类型不是Map类型,它的类型是PageContext。下面我们来一一介绍其他的内置对象,如下:
param:该内置对象的类型是Map<String,String>,可以用来获取值为单值的请求参数,其中key指的是请求参数的名称,value指的是请求参数的值,使用param获取请求参数与request.getParameter()方法一样。
paramValues:该内置对象的类型是Map<String,String[]>,可以用来获取值为多值的请求参数,其中key是参数名,value是多个参数值组成的字符串数组。
header:该内置对象的类型是Map<String,String>,用来获取值为单值的请求头信息,其中key代表的是请求头名称,value代表的是请求头的值;
headerValues:该内置对象的类型是Map<String,String[]>,用来获取值为多值的请求头信息,key代表的是请求头名称,value代表的是请求头的多个值。(不常用)
initParam:该内置对象的类型是Map<String,String>,用来获取web.xml文件中<context-param>标签的参数值,其中key代表的是参数名,value代表的是参数值。
cookie:该内置对象的类型为Map<String,Cookie>,其中key是Cookie的名字,value是Cookie对象本身。
pageContext内置对象可获取jsp文件在服务器上的参数(路径之类),也可以获取jsp的其他内置对象,所以通过pageContext对象可以获取其他内置对象的任意的属性值。