11.表达式语言
1.EL简介
EL(Expression Language): 表达式语言
在JSP2.0之后,EL正式纳入标准,只要是支持Servlet2.4/JSP2.0的容器,可以直接在JSP页面中使用EL
EL语法简单,使用方便,在很多地方可代替JSP标签
输出page、request、session、application范围的数据
JSP表达式的代码:
The outside temperature is<%= temp%> degrees
表达式语言(EL)表达式的代码:
The outside temperature is ${temp} degrees‘
EL是一个完全独立的拥有操作符、语法和保留字的编程语言
’
EL隐含对象:
EL隐含对象有11个,与JSP的9个隐含对象区分开
与范围有关的
applicationScope:
sessionScope:
requestScope:
pageScope:
与输入有关的
param:
paramValues:
其他隐含对象
cookie:
header:
headerValues:
initParam:
pageContext
*通过pageContext对象可以访问到 application、session、request 等对象,如:
${pageContext.out.bufferSize}
${pageContext.request.method}
但是,表达式限制开发人员调用Java方法,所以下面的表示是非法的:
${pageContext. request.getMethod()}
但用JSP表达式是合法的:
<%= request.getMethod()%>
EL中的隐含对象:
内置对象 | 描述 |
pageContext | 用于访问JSP内置对象 |
pageScope | 代表page作用域对象 |
requestScope | 代表request作用域对象 |
sessionScope | 代表session作用域对象 |
applicationScope | 代表application作用域对象 |
param | 代表请求参数对象 |
paramValues | 代表所有请求参数对象 |
header | 代表请求头对象 |
headerValues | 代表所有请求头对象 |
cookie | 代表Cookie对象 |
initParam | 相当于ServletContext.getInitParameter(String name) |
EL变量:
EL存取变量数据的方法很简单,如${user}
意思是取出某一范围中名称为user的变量
默认的范围查找顺序(自动搜索顺序)
Page Request Session Application
也可以指定范围
${pageScope.user}
${requestScope.user}
${sessionScope.user}
${applicationScope.user}
EL保留字:
变量命名不得使用EL保留字,以免程序编译时发生错误
and | eq | gt | true |
or | ne | le | false |
no | lt | ge | null |
instanceof | empty | div | mod |
2.表达式语言运算符
属性访问运算符.
例如a.b代表a对象的名为b的属性
${header.host}
集合访问运算符[]
例如a[b]代表集合a的关键字为b所指向的元素
${header[“host”]}
有时两者所代表的意思是一样的,如
${sessionScope.user.sex} 等价于${sessionScope.user[“sex”]}
两者也可混合使用,如
${sessionScope.shoppingCart[0].price}
以下两种情况,两者会有差异
当要存取的属性名称中包含一些特殊字符,象”.”或”-”等并非字母或数字的符号,一定要用[],如
${user.My-Name}应写为${user[“My-Name”]}
如想动态的取值时,也要使用[],如
${user[data]},data相当于一个变量
算术运算符
运算符名称 | 符号 |
加运算 | + |
减运算 | - |
乘运算 | * |
除运算 | div和/ |
取余运算 | mod和% |
关系与逻辑运算符:
关系运算 | 运算符 | 注意 |
相等 | == 和 eq | 使用EL关系运算符, 不可以写成: ${a.pass}==${a.pass2} 或 ${ ${a.pass}==${a.pass2}} 应该写成 ${a.pass == a.pass2} 示例:Demo 04-02示例 |
不相等 | != 和 ne | |
小于 | < 和 lt | |
大于 | > 和 gt | |
小于或等于 | <= 和 le | |
大于或等于 | >= 和 ge |
逻辑运算 | 运算符 |
逻辑与 | && 和and |
逻辑或 | || 和or |
逻辑非 | !和not |
其他运算符:
empty: 判断值是否为null或空的
${ empty param.name}
条件运算符: 三元运算符,A? B:C
也就是当A为true时,执行B,否则执行C
${A? B:C}
括号运算符: 用来改变执行优先权
${A *(B+C)}
3.表达式语言函数
自定义EL语言函数需要包括创建、修改以下四个文件
1.编写方法所在源文件.java文件 该文件包含EL函数实现
2.编写标签库描述符.tld文件 定义EL函数名
3.修改部署描述符 web.xml 定义标签库描述符地址
4.编写JSP文件
使用EL函数
具体实现步骤实例:
编写一个EL函数,接收一个字符串参数,函数的返回结果是字符串大写
编写一个EL函数,输入一个字符串,返回该字符串的长度,如:输入abc,输出3
1、编写方法所在源文件
方法声明为public、static,不需要创建类的实例就可以访问方法
方法的返回值和参数必须是EL内有效的
public class StrMethods { public static String upper(String x) { return x.toUpperCase(); } public static int length(String x) { return x.length(); } }
2.编写标签库描述符
<function></function>必须成对出现
<name></name>用于指定EL语言函数名称
<function-class></function-class>用于指定Java方法所在的类名
<function-signature></function-signature>用于指定静态方法及其参数和返回类型
tld文件通常放在/WEB-INF子目录下
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2eeweb-jsptaglibrary_2_0.xsd" version="2.0"> <tlib-version>1.0</tlib-version> <function> <name>upper</name> <function-class>com.StrMethods</function-class> <function-signature>java.lang.String upper(java.lang.String) </function-signature> </function> <function> <name>length</name> <function-class>com.StrMethods</function-class> <function-signature>java.lang.int length(java.lang.String) </function-signature> </function> </taglib>
3.修改部署描述符
web.xml文件中<web-app></web-app>节点内加入jsp-config 标签,然后在其中加入<taglib></taglib>标签(新版本的Servlet规范中<taglib>标签被包含在<jsp-config>标签内)
<taglib-uri></taglib-uri>用于描述JSP文件中使用的标签库描述符的URI地址
<taglib-location></taglib-location>用于描述标签库描述符的实际物理位置
<jsp-config> <taglib> <!-- 配置标签的引用地址 JSP页面中引用时使用--> <taglib-uri>/Functions</taglib-uri> <!-- 配置标签的TLD文件地址 --> <taglib-location> /WEB-INF/Functions.tld </taglib-location> </taglib> </jsp-config>
4.编写JSP文件调用EL函数
使用taglib指令访问tld文件,并添加一个代表标签库的前缀名
使用tld前缀和函数名创建EL的表达式,使用正确数据类型参数
<%@ taglib uri="/Functions" prefix="el" %> … <body> ${el:upper(param.userName)} </body>
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python 查找目录中的重复文件脚本
!/usr/bin/python coding=utf-8 from hashlib from sys from os from fnmatch CHUNK_SIZE=8192 def find_specific_files(root,patterns=['*'],exclude_dirs=[]): pass def get_chunk(filename): with open(filename) as f: while True: chunk=f.read(CHUNK_SIZE) if not chunk: break else: yield chunk def get_file_checksum(filename): h=hashlib.md5() for chunk in get_chunk(filename): h.update(chunk) return h.hexdigest() def main(): sys.argv.append("") directory=sys.argv[1] if not os.path.isdir(directory) raise System...
- 下一篇
python 部署mongodb脚本
image.png image.png image.png
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Windows10,CentOS7,CentOS8安装Nodejs环境