Servlet&JSP的那些事儿(十七)

本篇我们讨论表达式语言(Expression Language,EL)。我们先论述一下它的语法。

EL语法

EL语法很简单,所有EL表达式都以${开始,以}结束。例如${expr}。

“[]”和“.”操作符

EL使用“[]”和“.”操作符来访问数据,${expr.identifier}等价于${expr[i"dentifier"]}。例如,访问javabean对象user的属性name,可以写成如下两种形式。

${user.name};
${user["name"]};
如果使用"."操作符,要求点号左边是一个Map或javabean。例如,在servlet中

Map names = new HashMap();
names.put("one","shan");
names.put("tow","dong");
request.setAtrribute("names",names);

在jsp中,第一个姓名是:${names.one},如果使用“[]”,左边可以使Map,javabean,List或数组。例如在servlet中,

String names = {"shan","dong"};
requset.setAttribute("names",names);
在jsp中,第一个姓名是:${names[0]},也可以用${names["0"]}。在EL中,数组和List中的String类型的索引会被强制转换为int。

算数操作符

在EL中,共有5个算数操作符+,-,*,/(或div),%(或mod)。分别代表加,减,乘,除,取模。

注意,对于除法运算,如A/B。如果A和B为null,则返回(Long)0,如果A和B类型是BigDecimal或BigInteger,将被强制转换为BigDecimal,然后返回A.divide(B,BigDecimal.ROUND_HALF_UP),其他情况下,则将A和B强制转换为Double,然后相除。

关系运算符

在EL中,有6个关系运算符等于(==或eq),不等于(!=或ne),小于(<或lt),大于(>或gt),小于等于(<=或le),大于等于(>=或ge)。

逻辑操作符

在EL中,共有3个逻辑操作符。逻辑与(&&或and),逻辑或(||或or),逻辑非(!或not)。

Empty操作符

Empty操作符是一个前缀操作符,用于检测一个值是否为null或empty。例如,变量A不存在时,${empty A}返回true。

条件操作符

EL中的条件操作符为“?:”,用法等同于java中的"?:"。

圆括号

用于改变执行的优先级。

操作符优先级(从高到低,从做到右)

[] .
()
-(unary) not ! empty
* / div % mod
+ -(binary)
< > <= >= lt gt le ge
== != eq ne
&& and
|| or
?:

隐含对象

EL 表达式定义了11个隐含对象,使用这11个对象可以很方便的读取到session,cookie,HttpHeader,用户提交表单(param)等。具体内容如下表。

隐含对象 内容
applicationScope应用程序范围内的scoped变量组成的集合
cookie所有cookie组成的集合
headerHTTP请求头部,字符串
headerValuesHTTP请求头部,字符串集合
initParam全部应用程序参数名组成的集合
pageContext当前页面的javax.servlet.jsp.PageContext对象
pageScope页面范围内所有对象的集合
param所有请求参数字符串组成的集合
paramValues所有作为字符串集合的请求参数
requestScope所有请求范围的对象的集合
sessionScope所有会话范围的对象的集合
下面是获取HTTP访问头部数据和用户提交数据的示例。

${header["host"]},得到HTTP连接头部的host值

${header["accept"]} ,获得HTTP头部的accept值

${header["user-agent"]},获得HTTP头部的user-agent值

注意,对于包含连字符“-”和其他一些特殊字符的字符串只能使用“[]”操作符,而不能使用"."操作符。所以,上面的两个例子可以改用${header.host},但是最后的例子只能使用上面的方式。

假设用户提交信息为 ?name=shan&alies=shan.net.cn(这里有两种访问方式,一种是使用"[]"来进行访问,另外一种是使用". "来进行访问,两种访问效果是一样的。)
${param["name"] } j结果为shan
${param.name}结果为shan
${param["alies"] } 结果为shan.net.cn
${param.alies} 结果为shan.net.cn

命名变量

在EL中,对于命名变量值的查找是通过PageContext.findAttribute(String)方法来完成的。例如,${user}。这个表达式将按照page,request,session,application范围的顺序查找命名的属性user,如果没找到,返回null。我们也可以利用pageScope,requestScope,sessionScope,applicationScope指定范围,如${sessionScope.user}。

函数

在EL中,允许定义和使用函数,函数的语法如下:

ns:func(a1,a2,...,an)

其中前缀ns必须匹配包含了函数的标签库的前缀,func是函数的名字,n1,n2等是函数的参数。

函数的定义和使用机制类似于标签库,例如,编写一个转换编码格式的函数,将字符串从一种字符集转换到GBK编码。首先编写一个java类,将该函数声明为静态函数。代码如下:

package com.shan.el;

import java.io.*;

public class MyFunc {
	public static toGBK(String str, String charset) 
	throws UnsupportedEncodingException {
		return new String(str.getBytes(charset),"GBK")
	}
}

然后在标签库描述符文件中对函数进行声明

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
        "http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>

  <tlib-version>1.0</tlib-version>
  <jsp-version>1.2</jsp-version>
  <uri>myfunc</uri>

  <function>
    <name>toGBK</name>
    <function-class>com.shan.el.MyFunc</function-class>
    <function-signature>
      java.lang.String toGBK(java.lang.String, java.lang.String)
    </function-signature>
</taglib>

最后编写一个测试页面

<%@ page contentType="text/html;charset=gb2312" %>
<%@ taglib uri="/myfunc" prefix="myfn"%>
欢迎,${myfn:toGBK(param.username,"ISO-8859-1") }!

最后在浏览器网址栏输入对应的url(如http://localhost:8080/Test/test.jsp?username="张三"),就可以看到最后结果。

转载请注明出处:http://blog.csdn.net/iAm333

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值