对于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><el-ignored></code>标签为true,来决定不使用el。例如:
以上标签用来设置符合<code><url-pattern></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><context-param></code>中设置的初始参数。
算数运算符
<code>+ - * (/或div) (%或mod) ?:</code>
逻辑运算符
<code>and or not</code>
关系运算符
小于:<code>< 或 lt</code>
小于或等于:<code><= 或le</code>
大于:<code>> 或 gt</code>
大于或等于:<code>>=或 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><name></code>标签的设置,而实际上eval名称背后执行的类与真正的静态方法,分别是由<code><function-class></code>和<code><functio-signature></code>设置的。
可以将这个tld文件直接放在web-inf文件夹下,容器会自动找到tld文件并将其加载。现在可以编写一个jsp来使用这个自定义的el函数,例如:
express.jsp:
taglib指示元素告诉容器在转译jsp时,会用到对应uri属性的自定义函数,prefix则用来设置前置名称。当jsp中有来自多个不同设计者的el自定义函数时,就可以避免名称冲突问题。