`
www-hello
  • 浏览: 98801 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

EL表达式

    博客分类:
  • java
阅读更多

    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 如今已经是一项成熟、标准的技术。
    假若您所用的Container 只支持Servlet 2.3/JSP 1.2,如:Tomcat 4.1.29,您就不能在JSP 网页中直接使用EL,必须安装支持Servlet 2.4 / JSP 2.0 的Container
    EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL 主要的语法结构:
    ${sessionScope.user.sex}
    所有EL都是以 ${ 为起始、以} 为结尾的。上述EL范例的意思是:从Session的范围中,取得用户的性别。假若依照之前JSP Scriptlet的写法如下:
    User user = (User)session.getAttribute("user");
    String sex = user.getSex( );
    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 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null

自动转变类型
    EL 除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:
    ${param.count + 20}
    假若窗体传来count的值为10时,那么上面的结果为30
    下面是之前的做法:
    String str_count = request.getParameter("count");
    int count = Integer.parseInt(str_count);
    count = count + 20;
    JSP有9 个隐含对象,EL有隐含对象总共有11 个
    这11 个隐含对象(Implicit Object),将它分成三类:
    1. 与范围有关的隐含对象
    applicationScope
    sessionScope
    requestScope
    pageScope
    2. 与输入有关的隐含对象
    param
    paramValues
    3. 其他隐含对象
    cookie
    header
    headerValues
    initParam
    pageContext
    与范围有关的EL 隐含对象包含以下四个:pageScope、requestScope、sessionScope 和
    applicationScope,它们基本上就和JSP的pageContext、request、session和application一样,
    不过必须注意的是,这四个隐含对象只能用来取得范围属性值,即JSP中的getAttribute(String name),却不能取得其他相关信息,
    例如:JSP中的request对象除可以存
    取属性之外,还可以取得用户的请求参数或表头信息等等。但是在EL中,它就只能单纯用来取得对应范围的属性值,
    例如:我们要在session 中储存一个属性,它的名称为username,在JSP 中使用
    session.getAttribute("username") 来取得username 的值, 但是在EL 中, 则是使用
    ${sessionScope.username}来取得其值的
    与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。一般而言,我们在取得用户的请求参数时,可以利用下列方法:
    request.getParameter(String name)
    request.getParameterValues(String name)
    在EL中则可以使用param和paramValues两者来取得数据。
    ${param.name}
    ${paramValues.name}
    这里param 的功能和request.getParameter(String name) 相同,
    而paramValues 和request.getParameterValues(String name)相同。如果用户填了一个表格,表格名称为username,则我们就可以使用${param.username}来取得用户填入的值。
    由Param.html 窗体传过来的值,我们必须指定编码方式,才能够确保Param.jsp能够顺利接收中
    文,传统的做法为:
    <%
    request.setCharacterEncoding("GB2312");
    %>
    假若是使用JSTL写法时,必须使用I18N 格式处理的标签库,如下:
    <fmt:requestEncoding value="GB2312" />
    Param.jsp主要使用EL的隐含对象param来接收数据。但是必须注意:假若要取得多重选择的复
    选框的值时,必须使用paramValues,
    例如:使用paramValues 来取得“兴趣”的值,不过这里笔者
    最多只显示两笔“兴趣”的值:
    ${param.username}
    ………
    ${paramValues.habit[0]}
    ${paramValues.habit[1]}

cookie
    所谓的cookie是一个小小的文本文件,它是以key、value的方式将Session Tracking的内容记录在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL并没有提供设定cookie的动作,
    因为这个动作通常都是后端开发者必须去做的事情,而不是交给前端的开发者。假若我们在cookie 中设定一个名称为userCountry的值,那么可以使用${cookie.userCountry}来取得它。
   
header 和headerValues
    header 储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记载要求信息的标头文件.
    例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。假若要取得用户浏览器的版本,即${header[“User-Agent”]}。另外在鲜少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。

initParam
    就像其他属性一样,我们可以自行设定web 站台的环境参数(Context),当我们想取得这些参数时,可以使用initParam 隐含对象去取得它,例如:当我们在web.xml 中设定如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
    :
    <context-param>
    <param-name>userid</param-name>
    <param-value>mike</param-value>
    </context-param>
    :
    </web-app>
    那么我们就可以直接使用 ${initParam.userid}来取得名称为userid,其值为mike 的参数。下面是之前的做法:
    String userid = (String)application.getInitParameter("userid");

pageContext
    我们可以使用 ${pageContext}来取得其他有关用户要求或页面的详细信息
${pageContext.request.queryString},
${pageContext.request.requestURL},
${pageContext.request.contextPath}


EL 算术运算符
+、-、*、/ 或div、%或 mod

EL 关系运算符
    == 或eq、!= 或 ne、< 或lt、> 或gt、<= 或le、>= 或ge

    注意
    在使用EL 关系运算符时,不能够写成:
    ${param.password1} = = ${param.password2}
    或者
    ${ ${param.password1 }==${ param.password2 } }
    而应写成
    ${ param.password1 = = param.password2 }

EL 逻辑运算符
 && 或and 、|| 或or 、! 或not

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics