10019---JavaWeb基础--EL

EL简介

EL 全名为Expression Language,它原本是JSTL 1.0为方便存取数据所自定义的语言。

当时EL只能在JSTL 标签中使用,如下: <c:out value="${ 3 + 7}">

程序执行结果为10。但是你却不能直接在JSP 网页中使用:<p>Hi ! ${ username }</p>

到了JSP 2.0 之后,EL 已经正式纳入成为标准规范之一。因此,只要是支持Servlet 2.4 / JSP2.0 的Container,

就都可以在JSP 网页中直接使用EL 了。除了JSP 2.0 建议使用EL 之外,JavaServer Faces( JSR-127 ) 也考虑将EL 纳入规范,

由此可知,EL 如今已经是一项成熟、标准的技术。

EL 语法

EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL 主要的语法结构:
          ${sessionScope.user.sex}
所有EL都是以${ 为起始、以} 为结尾的。上述EL范例的意思是:从Session的范围中,取得
用户的性别。假若依照之前JSP Scriptlet的写法如下:

      User user = (User)session.getAttribute("user");
      String sex = user.getSex( );

两者相比较之下,可以发现EL 的语法比传统JSP Scriptlet 更为方便、简洁。

.与 [ ] 运算符

EL 提供 . [ ] 两种运算符来存取数据。下列两者所代表的意思是一样的:
    ${sessionScope.user.sex}   等于   ${sessionScope.user["sex"]}
 . [ ] 也可以同时混合使用,如下:
    ${sessionScope.shoppingCart[0].price}  回传结果为shoppingCart中第一项物品的价格。

不过,以下两种情况,两者会有差异:

(1) 当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ],例如:

     ${user.My-Name } 上述是不正确的方式,应当改为: ${user["My-Name"] }
(2) 我们来考虑下列情况:

     ${sessionScope.user[data]}
     此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};
     假若data 的值为"name"时,它就等于${sessionScope.user.name}。

     因此,如果要动态取值时,就可以用上述的方法来做,但.无法做到动态取值。
接下来,我们更详细地来讨论一些情况,首先假设有一个EL:

   ${expr-a[expr-b]}
   (1) 当expr-a 的值为null时,它会回传null。
   (2) 当expr-b的值为null时,它会回传null。
   (3) 当 expr-a 的值为一Map 类型时:
    ● 假若 !value-a.containsKey(value-b)为真,则回传null。
    ● 否则回传value-a.get(value-b)。
   (4) 当expr-a 的值为List 或array 类型时:
   ● 将 value-b 的值强制转型为int,假若不能转型为int 时,会产生error。
   ● 然后, 假若value-a.get(value-b) 或Array.get(value-a, value-b) 产生
   ArrayIndexOutOfBoundsException 或IndexOutOfBoundsException 时,则回传null。
   ● 假若 value-a.get(value-b)或Array.get(value-a, value-b)产生其他的异常时,则会产生error。
   ● 最后都没有任何异常产生时,回传value-a.get(value-b)或Array.get(value-a, value-b)。
   (5) 当expr-a 的值为JavaBean 对象时:
   ● 将 value-b 的值强制转型为String。
   ● 假若 getter 产生异常时,则会产生error。若没有异常产生时,则回传getter 的结果。

EL 变量

EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username
的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如
找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,
不再继续找下去,但是假如全部的范围都没有找到时,就回传null(见表6-1)

  

                                             自动搜索顺序

我们也可以指定要取出哪一个范围的变量(见表6-2)

其中,pageScope、requestScope、sessionScope和applicationScope都是EL 的隐含对象,由
它们的名称可以很容易猜出它们所代表的意思,例如:${sessionScope.username}是取出Session
范围的username 变量。这种写法是不是比之前JSP 的写法:

            String username = (String) session.getAttribute("username");
容易、简洁许多。有关EL 隐含对象在6-3 节中有更详细的介绍。

数组的长度:

 ${team.members.size()}

自动转变类型

EL 除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看
下面这个范例: ${param.count + 20}
假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP 的读者可能会认为
上面的例子是理所当然的,但是在JSP 1.2 之中不能这样做,原因是从窗体所传来的值,它们的类
型一律是String,所以当你接收之后,必须再将它转为其他类型,如:int、float 等等,然后才能执行一些数学运算。

接下来再详细说明EL类型转换的规则:

  (1) 将A 转为String 类型
    ● 假若 A 为String 时:回传A
    ● 否则,当A 为null 时:回传 ""
    ● 否则,当A.toString( )产生异常时:错误!
    ● 否则,回传 A.toString( )

(2) 将A 转为Number 类型的N
   ● 假若 A 为null 或 "" 时:回传0
   ● 假若 A 为Character 时:将A 转为 new Short((short)a.charValue( ))
   ● 假若 A 为Boolean 时:错误!
   ● 假若 A 为Number 类型和N 一样时:回传A
   ● 假若 A 为Number 时:

     ·假若N 是BigInteger 时:
     ·假若A 为BigDecimal 时:回传 A.toBigInteger( )
     ·否则,回传 BigInteger.valueOf(A.longValue( ))
     ·假若N 是BigDecimal 时:
     ·假若A 为BigInteger 时:回传 A.toBigDecimal( )
     ·否则,回传 BigDecimal.valueOf(A.doubleValue( ))
     ·假若N 为Byte 时:回传 new Byte(A.byteValue( ))
     ·假若N 为Short 时:回传 new Short(A.shortValue( ))
     ·假若N 为Integer 时:回传 new Integer(A.intValue( ))
     ·假若N 为Long 时:回传 new Long(A.longValue( ))
     ·假若N 为Float 时:回传 new Float(A.floatValue( ))
     ·假若N 为Double 时:回传 new Double(A.doubleValue( ))
     ·否则,错误!

    ● 假若 A 为String 时:
     ·假若N 是BigDecimal 时:
     ·假若 new BigDecimal(A)产生异常时:错误!
     ·否则,回传 new BigDecimal(A)
     ·假若N 是BigInteger 时:
     ·假若 new BigInteger(A)产生异常时:错误!
     ·否则,回传 new BigInteger(A)
     ·假若N.valueOf(A)产生异常时:错误!
     ·否则,回传 N.valueOf(A)
    ● 否则,错误!
(3) 将A 转为Character 类型
    ● 假若 A 为null 或 "" 时:回传 (char)0
    ● 假若 A 为Character 时:回传 A
    ● 假若 A 为Boolean 时:错误!
    ● 假若 A 为Number 时:转换为Short 后,然后回传Character
    ● 假若 A 为String 时:回传 A.charAt(0)
    ● 否则,错误!
(4) 将A 转为Boolean 类型
    ● 假若 A 为null 或 "" 时:回传 false
    ● 否则,假若A 为Boolean 时:回传 A
    ● 否则,假若A为String,且Boolean.valueOf(A)没有产生异常时:回传Boolean.valueOf(A)
    ● 否则,错误!

EL 保留字

隐含对象

隐含对象(Implicit Object)”中,曾经介绍过9 个JSP 隐含对象,而EL本身也有自己的隐含对象。

EL 隐含对象总共有11 个(见表6-4):

这 11 个隐含对象(Implicit Object),笔者将它分成三类:

1. 与范围有关的隐含对象
  applicationScope
  sessionScope
  requestScope
  pageScope

2. 与输入有关的隐含对象
  param
  paramValues

3. 其他隐含对象
  cookie
  header
  headerValues
  initParam
  pageContext

属性(Attribute)与范围(Scope)

  与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和
  applicationScope
,它们基本上就和JSP的pageContext、request、sessionapplication一样,
  所以笔者在这里只稍略说明。不过必须注意的是,这四个隐含对象只能用来取得范围属性值,即JSP
  中的getAttribute(String name),却不能取得其他相关信息,例如:JSP中的request对象除可以存
  取属性之外,还可以取得用户的请求参数或表头信息等等。但是在EL中,它就只能单纯用来取得对应
  范围的属性值,例如:我们要在session 中储存一个属性,它的名称为username,在JSP 中使用
  session.getAttribute("username") 来取得username 的值, 但是在EL 中, 则是使用
  ${sessionScope.username}来取得其值的。接下来分别对这四个隐含对象做简短的说明:

● pageScope
范围和JSP 的Page 相同,也就是单单一页JSP Page 的范围(Scope)。

requestScope
范围和JSP 的Request 相同,requestScope 的范围是指从一个JSP 网页请求到另一个JSP 网页
请求之间,随后此属性就会失效。

● sessionScope
范围和JSP Scope 中的session 相同,它的属性范围就是用户持续在服务器连接的时间。
● applicationScope
范围和JSP Scope 中的application 相同,它的属性范围是从服务器一开始执行服务,到服务
器关闭为止。

与输入有关的隐含对象

与输入有关的隐含对象有两个:paramparamValues,它们是EL中比较特别的隐含对象。一般
而言,我们在取得用户的请求参数时,可以利用下列方法:

  request.getParameter(String name)
  request.getParameterValues(String name)

在 EL中则可以使用param和paramValues两者来取得数据。
  ${param.name}
  ${paramValues.name}

这里param 的功能和request.getParameter(String name) 相同, 而paramValuesrequest.getParameterValues(String name)相同。

如果用户填了一个表格,表格名称为username,则我们就可以使用${param.username}来取得用户填入的值。

        为了让读者更加了解param 和paramValues 隐含对象的使用,再来看下面这个范例。此范例共有两个文件,

分别为给用户输入值用的Param.html 和显示出用户所传之值的Param.jsp。

Param.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>CH6 - Param.html</title>
</head>
<body>
	<h2>EL 隐含对象 param、paramValues</h2>
	<form method="post" action="param.jsp">
		<p>
			姓名:<input type="text" name="username" size="15" />
		</p>
		<p>
			密码:<input type="password" name="password" size="15" />
		</p>
		<p>
			性别:<input type="radio" name="sex" value="Male" checked /> 男 <input
				type="radio" name="sex" value="Female" /> 女
		</p>
		<p>
			年龄: <select name="old">
				<option value="10">10 - 20</option>
				<option value="20" selected>20 - 30</option>
				<option value="30">30 - 40</option>
				<option value="40">40 - 50</option>
			</select>
		</p>
		<p>
			兴趣: <input type="checkbox" name="habit" value="Reading" />看书 <input
				type="checkbox" name="habit" value="Game" />玩游戏 <input
				type="checkbox" name="habit" value="Travel" />旅游 <input
				type="checkbox" name="habit" value="Music" />听音乐 <input
				type="checkbox" name="habit" value="Tv" />看电视
		</p>
		<p>
			<input type="submit" value="传送" /> <input type="reset" value="清除" />
		</p>
	</form>
</body>
</html>


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据来源:中经数据库 主要指标110多个(全部都是纯粹的 市辖区 指标),大致是: GDP GDP增速 第一产业增加值占GDP比重 第二产业增加值占GDP比重 第三产业增加值占GDP比重 人均GDP 社会消费品零售总额 固定资产投资(不含农户) 新设外商投资企业数_外商直接投资 实际利用外资金额(美元) 一般公共预算收入 一般公共预算支出 一般公共预算支出_教育 一般公共预算支出_科学技术 金融机构人民币各项存款余额_个人储蓄存款 金融机构人民币各项存款余额 金融机构人民币各项贷款余额 规模以上工业企业单位数 规模以上工业企业单位数_内资企业 规模以上工业企业单位数_港澳台商投资企业 规模以上工业企业单位数_外商投资企业 规模以上工业总产值 规模以上工业总产值_内资企业 规模以上工业总产值_港澳台商投资企业 规模以上工业总产值_外商投资企业 规模以上工业企业流动资产合计 规模以上工业企业固定资产合计 规模以上工业企业利润总额 规模以上工业企业应交增值税 规模以上工业企业主营业务税金及附加 户籍人口数 年均户籍人口数 户籍人口自然增长率 第一产业就业人员占全部城镇单位就业人员比重 第二产业就业人员占全部城镇单位就业人员比重 第三产业就业人员占全部城镇单位就业人员比重 城镇非私营单位就业人员数 城镇非私营单位就业人员数_第一产业 城镇非私营单位就业人员数_第二产业 城镇非私营单位就业人员数_第三产业 城镇非私营单位就业人员数_农、林、牧、渔业 城镇非私营单位就业人员数_采矿业 城镇非私营单位就业人员数_制造业 城镇非私营单位就业人员数_电力、热力、燃气及水生产和供应业 城镇非私营单位就业人员数_建筑业 城镇非私营单位就业人员数_批发和零售业 城镇非私营单位就业人员数_交通运输、仓储和邮政业 城镇非私营单位就业人员数_住宿和餐饮业 城镇非私营单位就业人员数_信息传输、软件和信息技术服务业 城镇非私营单位就业人员数_金融业 城镇非私营单位就业人员数_房地产业 城镇非私营单位就业人员数_租赁和商务服务业 城镇非私营单位就业人员数_科学研究和技术服务业 城镇非私营单位就业人员数_水利、环境和公共设施管理业 城镇非私营单位就业人员数_居民服务、修理和其他服务业 城镇非私营单位就业人员数_教育 城镇非私营单位就业人员数_卫生和社会工作 城镇非私营单位就业人员数_文化、体育和娱乐业 城镇非私营单位就业人员数_公共管理、社会保障和社会组织 城镇非私营单位在岗职工平均人数 城镇就业人员数_私营企业和个体 城镇非私营单位在岗职工工资总额 城镇非私营单位在岗职工平均工资 城镇登记失业人员数 建成区面积 建设用地面积 建设用地面积_居住用地 液化石油气供气总量 液化石油气供气总量_居民家庭 人工煤气、天然气供气总量 人工煤气、天然气供气总量_居民家庭 液化石油气用气人口 人工煤气、天然气用气人口 城市公共汽电车运营车辆数 城市出租汽车运营车辆数 城市公共汽电车客运总量 道路面积 排水管道长度 建成区绿化覆盖面积 建成区绿化覆盖率 绿地面积 公园绿地面积 维护建设资金支出 土地面积 生活用水供水量 供水总量 全社会用电量 城乡居民生活用电量 工业生产用电量 房地产开发投资 房地产开发投资_住宅 限额以上批发和零售业法人单位数 限额以上批发和零售业商品销售总额 普通中学学校数 中等职业教育学校数 普通小学学校数 普通高等学校专任教师数 普通中学专任教师数 中等职业教育专任教师数 普通小学专任教师数 普通高等学校在校生数 普通中学在校生数 中等职业教育在校生数 普通小学在校生数 电视节目综合人口覆盖率 公共图书馆总藏量_图书 医疗卫生机构数_医院和卫生院 卫生人员数_执业(助理)医师 医疗卫生机构床位数_医院和卫生院 城镇职工基本养老保险参保人数 职工基本医疗保险参保人数 失业保险参保人数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值