[有书共享]JavaWeb高级编程

JavaWeb高级编程 -- 篇6

在JSP中使用表达式语言

表达式语言(EL)源于JSP标准库(JSTL)的一部分,用于在不使用脚本、声明或者表达式的情况下,在JSP页面中渲染数据。
EL的基本语法描述了一个必须与其他JSP页面语法分开执行的表达式。基本的EL语法有两种类型:立即执行和延迟执行。
<b>1. 立即执行</b>
立即执行EL表达式将在页面渲染的时候,被JSP引擎解析和执行。因为JSP从上向下执行,这意味着EL表达式将在JSP引擎发现它,并在继续执行其他页面部分之前执行它。如下为一个有效的EL表达式:

${expr}

美元符号和开始/结束花括号定义了EL表达式的边界。
<b>2. 延迟执行</b>
延迟执行EL表达式是统一表达式的一部分,主要用于满足JavaServer Faces的需要。尽管延迟执行语法在JSP中是合法的,但通常不会出现在JSP中。如下,其中expr是一个合法的表达式:

#{expr}

在JSF中,延迟执行表达式将在页面渲染或者回传到页面时执行,或者同时在两个阶段内执行。在JSP中,#{}延迟执行语法只是一个有效的JSP标签特性,用于将EL表达式的执行推迟到标签的渲染过程中。不同于在特性值绑定到标签之前执行EL表达式的方式,该标签的特性将获得一个对未执行EL表达式的引用。该标签可以在之后一个合适的时间,调用一个方法来执行EL表达式。

EL可以直接用在JSP的任何位置,除了少数例外情况。首先,EL表达式不能用在任何指令中。在编译JSP时,指令(<%@ page %>、<%@ inlcude %>和<%@ taglib %>)将会被执行,但EL表达式是在稍后渲染JSP时执行,所以在其中添加EL表达式是无法正常工作的。另外,JSP声明(<%! %>)、脚本(<% %>)或者表达式(<%= %>)中的EL表达式也是无效的。除此之外,EL表达式可以添加到其他任何位置。一种常见的情况是将EL表达式添加到输出到屏幕的简单文本中。:

The user will see ${expr} text and will know that ${expr} is good.

当表达式执行时,结果会内嵌在文本中显示到屏幕。
另外,表达式还可以用在标准的HTML标签特性中:

<input type="text" name="something" value="${expr}" />

表达式也可以使用在JSP标签特性中:

<c:url value="/something/${expr}/${expr}" />

JSP引擎不会解析这些HTML 特性中的内容,它会将其中的内容当作普通文本输出到响应中,所以可以在引用或者文本形式中包含EL表达式。

EL语法是弱类型,并且它包含许多内建的隐式类型转换。表达式主要的规则是执行后要产生某个值。不能在表达式中声明变量、执行赋值语句或者不产生结果的操作。

EL中的保留关键字:

true、false、null、instanceof、empty、div、mod、and、or、not、eq、ne、lt、gt、le、ge

举例:
关键字empty用于验证某些集合、Map或者数组是否含有值,或者某些字符串是否含有一个或多个字符。

${empty x}

eq、ne、lt、gt、le和ge运算符分别是Java关系运算符==,!=,<,>,<=和>=,当然你仍然可以使用传统的关系运算符。

EL表达式中第一个执行的操作符是括号[]和点(.)解析操作符。如:

${mycollection["key"].memberName["anotherKey"]}

引擎首先将解析对象myCollection中映射到key的值。然后在该值中解析memberName方法、字段或者属性。最后在该方法、字段或者属性中再解析anotherKey所对应的值。在这些操作符都执行之后,下面开始解析分组圆括号操作符()。
EL引擎执行的最后一个操作符是分号(;)。该操作看上去与C中的逗号(,)相像,它允许在表达式中同时使用多个表达式,但只有最后一个表达式的值会被保留下来。如:

${x = y + 3; obj.callMethod(x); 'hello, world'}

该表达式最后执行字符串字面量"hello, world"。该表达式的最终结果是最后一个分号之后的表达式"hello, world"。
EL中字符串字面量既可以使用双引号也可以使用单引号。
在EL表达式中,只允许使用十进制字面量,对于其他类型的字面量,EL表达式中没有对应的用法。
无论何时需要,都可以直接在EL表达式中创建集合。
字面量集合中的元素以逗号分隔开。

{1,2,'three',4.00,x}

其中x可以是任何数据类型。
构造列表的方法与构造集合的方法基本一致,区别在于列表使用的是方括号,而集合使用的是花括号。

[1,2,'three',[x,y],{'foo','bar'}]

列表中的元素将以逗号分隔。
HashMap<Object,Object>集合字面量:

{'one':1,2:'two','key':x,'list':[1,2,3]}

EL除了使用公共访问方法访问属性的标准语法,还提供了访问JavaBean中属性的简化语法。假设现在有一个名为Shirt的类,它包含一个公开字段size。现有一个名为shirt的变量,使用EL访问size字段:

${shirt.size}

当使用这种方法时,EL引擎看到该语法,它将寻找shirt中的属性而不是字段。所以需要对Shirt类进行修改,使用标准JavaBean访问和设置方法getSize和setSize将size封装为私有字段。表达式shirt.size就变成了shirt.getSize()的快捷方式。
还可以使用[]操作符访问属性:

${shirt["size"]}

在EL早期版本,只可以访问JavaBean属性,不可以调用对象方法,不过在EL2.1添加了在JSP中调用对象方法的能力。因此,可以通过${shirt.getSize()}访问Shirt的size属性。
在EL中,函数是映射到类中静态方法的一个特殊工具。函数调用的语法如下所示:[ns]是命名空间,[fn]是函数名,从[a1]到[an]都是参数

${[ns]:[fn]([a1[,a2[,a3[,...]]]])}

JSTL函数库的命名空间为fn;不过也可以在taglib指令中使用任何其他命名空间。

与Java访问静态字段和方法的方式相同:在EL中使用完全限定的类名,接着是点操作符,再接着是字段或者方法名。如:

${java.lang.Integer.MAX_VALUE}

除非使用的类已经使用JSP page指令导入,否则必须使用完全限定的类型。在JSP中,如同Java一样,所有在java.lang包中的类都已经被隐式地导入。
在大多数情况下,lambda表达式是一个参数名字的列表,紧接着是某种类型的操作符,最后是函数体。EL中的lambda表达式语法几乎与Java8中的一样。
EL的lambda表达式体中包含的则是另一个EL表达式。
访问Map值的方式:

${map["username"]}
${map.username}

列表访问方式:

${list[0]}
${list{'0'}}

empty操作符使用:

${empty set}
#读书笔记##Java#
全部评论

相关推荐

#春招##阿里云##阿里巴巴#我们是洛神云网络团队,阿里云网络产品团队是阿里云飞天平台的核心,全球超过200个数据中心、19个地域及52个可用区、110个接入点,借助软件定义网络、高性能转发、云原生、分布式、硬件加速、AI调度等关键技术,构建云上云下全球互联的全链路高性能网络,洛神平台构建了超大规模、超高性能、极致弹性的云网络能力,目前支撑了VPC、ECS、SLB等关键产品,提供业内最丰富的网络资源及解决方案,服务阿里巴巴集团业务以及赋能全球数以百万企业客户进行数字化转型,承载了阿里集团云计算、电商、支付、物流等核心业务,也沉淀多篇SIGCOMM顶级会议论文和科技发明奖项。base: 北京-望京工作职责:1.&nbsp;团队核心云网络产品的研发、测试、运维2.&nbsp;网络控制器中台的设计与研发招聘要求1.&nbsp;本科及以上学历,计算机相关专业2.&nbsp;良好的算法、数据结构基础,熟悉网络、数据库等技术3.&nbsp;熟悉Java/Go/C++/python任一门编程语言4.&nbsp;对新技术保持热情,具备良好的分析、解决问题的能力5.&nbsp;仅限25届毕业生,国内外院校皆可最欢乐的团队氛围,最快乐的团建活动;团队一对一培养,帮你快速成长,帮助你在职业生涯中有个好的开端;了解计算机网络、负载均衡、SDN,有分布式开发经验优先;想要投递的同学,先在本帖下回复&quot;阿里云网络春招&quot;,然后简历命名“学校+学历(博士/硕士/本科)+姓名+岗位”发送至评论区邮箱。
点赞 评论 收藏
转发
招聘对象:2025届毕业生(海内外学生)我们是谁:洛神(英文名Achelous)是阿里云IaaS核心系统-云网络的代号,借助软件定义网络、高性能转发、云原生、分布式、硬件加速、AI调度等关键技术,洛神平台构建了超大规模、超高性能、极致弹性的云网络能力,目前支撑了VPC、ECS、SLB等关键产品,承载了阿里集团云计算、电商、支付、物流等核心业务。团队在云网络领域深耕多年,坚持走自主研发的道路,沉淀了诸多核心技术,被顶级会议和各类评奖机构认可。其中Achelous平台和其上的Sailfish网关平台论文分别被顶级会议SIGCOMM’2023和SIGCOMM’2021录用;“大规模高性能云计算网络系统”成果获2021年浙江省技术发明一等奖;“大规模智能云网络关键技术和平台”也荣获2021年CCF科学技术类技术发明一等奖;在2021年国际权威咨询机构Gartner的分析报告中,阿里云洛神云网络力压AWS、Azure和谷歌云,荣获总分第一名。今天是一个万物上云、万物互联的时代,与日俱增的用户规模、浩若繁星的机器节点、错综复杂的业务组网、因时而动的流量突发,在持续给我们带来更高的技术挑战。我们将在新的征程上,为实现更大规模、更高性能、更强弹性、更加智能的云网络能力而努力。如果你基础扎实、动手能力强、充满好奇心、对技术有着执着追求和热情,欢迎联系我们、加入我们。一起打造云计算核心技术,和全球顶尖企业同台竞技,用科技驱动世界创新发展、为社会创造价值、让生活更美好。招聘岗位:&nbsp;C/C++研发工程师,基础平台研发工程师工作地点:杭州、北京基础要求:(1)&nbsp;熟悉一种或多种编程语言,如C/C++、Go(2)&nbsp;熟悉操作系统、计算机网络基础知识;了解基本的数据结构与算法(3)&nbsp;对技术有热情,保持好奇心Tips:有SDN、Openstack、K8S、DPDK、OpenvSwitch、虚拟化等相关项目经验者优先;有网络、系统软件等领域的顶级会议论文者优先。投递邮箱:**********投递格式:姓名_学校_意向岗位.pdf&nbsp;(PDF最优)
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务