天天看点

[Servlet&JSP] 表达式语言ELEL简介使用EL访问属性EL隐含对象EL运算符EL自定义函数

对于jsp中一些简单的属性、请求参数、标头与cookie等信息的取得,一些简单的运算或判断,可以使用表达式语言来处理,还可以将一些常用的功用函数编写为el函数,这样可以减少网页上一部分的scriptlet。

例如,对于以下的scriptlet:

如果使用el,则可以只用一行程序代码来改写,甚至加强这段scriptlet。例如:

el使用<code>${</code>和<code>}</code>来包括要进行处理的表达式。可使用点运算符(.)指定要访问的属性,使用加号(+)运算符进行加法运算。param是el的隐含对象之一,表示用户的请求参数,param.a表示取得用户所发出的请求参数a的值,所输入的请求参数自动转换为基本类型并进行运算。

在参数为null时,el直接以空字符串表示,不会直接显示null值,在进行运算是时,也不会因此发生错误而抛出异常。

el的点运算符可以连续访问对象,就如同在java程序代码中一样。例如,原来需要这样写:

使用el,则可以这样编写:

pagecontext也是el的隐含对象之一。通过点运算符之后街上xxx名称,表示嗲用调用getxxx()方法。如果必须转换类型,el也会自行处理。

可以使用page指示元素的iselignored属性(默认为true),来设置jsp网页是否使用el。会这样做的原因可能在于,网页中已含有与el类似的<code>${}</code>语法功能。例如,使用了某个模板(template)框架之类。

也可以在web.xml中设置<code>&lt;el-ignored&gt;</code>标签为true,来决定不使用el。例如:

以上标签用来设置符合<code>&lt;url-pattern&gt;</code>的jsp网页是否使用el。如果jsp网页使用page命令元素的iselignored来设置是否支持el,则以page命令元素的设置为主。

在el中,可以使用el隐含对象指定范围来访问属性。如果不指定属性的存在范围,则默认是以page、request、session、application的顺序来寻找el中所指定的属性。

如果el所访问的对象是一个数组对象或者list类型对象,则可以使用<code>[]</code>运算符来指定索引以访问数组中的元素。

使用点运算符与<code>[]</code>运算符的总结:

如果使用点运算符,则左边可以是javabean或map对象。

如果使用<code>[]</code>运算符,则左边可以是javabean、map、数组或list对象。

当左边是map对象时,建议使用<code>[]</code>运算符,因为设置map时键(key)名称可能有空白或点字符。

在el中提供了11个隐含对象,其中除了pagecontext银行对象对应pagecontext之外,其他隐含对象都对应map类型。

对应于pagecontext类型,pagecontext本身就是一个javabean,只要是<code>getxxx()</code>方法,就可以用<code>${pagecontext.xxx}</code>来取得。

与属性范围相关的隐含对象由pagescope、requestscope、sessionscope与applicationscope,分别可以取得使用jsp隐含对象pagecontext、request、session与application的setattribute()方法所设置的属性对象。如果不使用el隐含对象指定作用范围,则默认从pagescope的属性开始查找。

el隐含对象pagescope、requestscope、sessionscope与applicationscope不等同于jsp隐含对象pagecontext、request、session与application。el隐含对象仅仅代表作用范围。

与请求参数相关的el隐含对象由param与paramvalues。对应request的getparameter()和getparametervalues()方法。

如果要取得用户请求的标头数据,则可以使用header或headrvalues隐含对象。对应request的getheader()和getheaders()方法。

cookie隐含对象可以用来取得用户的cookie设置值。如果在cookie中设置了username属性,则可以使用<code>${cookie.username}</code>来取得值。

initparam可以用来取得web.xml中设置的servletcontext初始参数,也就是在<code>&lt;context-param&gt;</code>中设置的初始参数。

算数运算符

<code>+ - * (/或div) (%或mod) ?:</code>

逻辑运算符

<code>and or not</code>

关系运算符

小于:<code>&lt; 或 lt</code>

小于或等于:<code>&lt;= 或le</code>

大于:<code>&gt; 或 gt</code>

大于或等于:<code>&gt;=或 ge</code>

等于:<code>== 或 eq</code>

el运算符的优先级与java运算符对应

自定义函数的第一步是编写类,它必须是一个公开类,而想要调用的方法也必须是公开的且为静态方法。例如:

web容器必须知道如何将这个类的eval()方法当做el函数来使用,所以必须编写一个标签链接库描述文件(tag library descriptor, tld)文件,这个文件是个xml文件,扩展名为<code>*.tld</code>。

infix.tld:

在<code>${infix:eval(...)}</code>中,eval名称就对应于<code>&lt;name&gt;</code>标签的设置,而实际上eval名称背后执行的类与真正的静态方法,分别是由<code>&lt;function-class&gt;</code>和<code>&lt;functio-signature&gt;</code>设置的。

可以将这个tld文件直接放在web-inf文件夹下,容器会自动找到tld文件并将其加载。现在可以编写一个jsp来使用这个自定义的el函数,例如:

express.jsp:

taglib指示元素告诉容器在转译jsp时,会用到对应uri属性的自定义函数,prefix则用来设置前置名称。当jsp中有来自多个不同设计者的el自定义函数时,就可以避免名称冲突问题。