EL表达式

EL表达式

  • EL(Expression Language):EL是一种表达式语言(访问作用域对象、获取对象属性的值,执行简单的运算)

  • JSP2.0后作为JSP规范的一部分(早期包含在JSTL中)

  • 语法: expr e x p r 。 如 : {user.name}、 user[name] u s e r [ ′ n a m e ′ ] 、 {2+3}。不能调用对象的方法。

    除了用.方式获得对象的属性,也可以用[ ]方式,当然遇到键值名字中有-的,如mike-abc,或者key值为数字开头,则只能用[ ]方式。

  • 保留字

    • and、or、not

    • eq(等于)、ne(不等)、gt(大于)、ge(大于等于)、lt(小于)、le(小于等于)

    • true、false

    • instanceof、empty、null

    • mod、div

EL中的运算符

  • 算术运算符

    加(+)减(-)乘(*)除(/)、取模(mod)

  • 关系运算符

    eq(==)、ne(!=)、gt(>)、ge(>=)、lt(<)、le(<=)

  • 逻辑运算符

    not(!)、and(&&)、or(||)

  • empty判断为null或者为空(A不存在则${empty A}为true)

EL中的函数

函数的定义和使用分为以下3个步骤:

(1)编写一个Java类,并在该类中编写公用(public)的静态(static)方法,用于实现自定义EL函数的具体功能。

(2)编写标签库描述文件,对函数进行声明。该文件的扩展名为.tld,被保存到Web应用的WEB-INF文件夹下。

(3)在JSP页面中引用标签库,并调用定义的EL函数,实现相应的功能。

示例

  1. 定义

    编写一个Java类,名称为StringDeal,将其保存在com.el包中,在该类中添加一个公用的静态方法shiftEnter(),在该方法中替换输入字符串中的回车换行符
    ,空格符为&nbsp;,最后返回新替换后的字符串。StringDeal类的完整代码如下:

    package com.el;
    
    public class StringDeal {
        public static String shiftEnter(String str){  //定义公用的静态方法
            String newStr = str.replaceAll("\r\n", "<br>"); //替换回车换行符
            newStr = str.replaceAll(" ", "&nbsp;"); //替换空格符
            return newStr;
        }
    }
  2. 编写标签

    编写标签库描述文件,名称为stringDeal.tld,并将其保存到WEB-INF文件夹下。关键代码如下:

    <taglib>
     <tlib-version>1.0</tlib-version>
     <jsp-version>1.2<jsp-version>
     <uri>http://com.el/myfun</uri>
         <function>
            <name>shiftEnter</name>
            <function-class>
            com.el.StringDeal
            </function-class>
            <function-signature>
            java.lang.String shiftEnter(java.lang.String)
            </function-signature>
        </function>
    </taglib>

    参数说明:

    < uri >标记:用于指定tld文件的映射路径。在应用EL函数时,需要使用该标记指定的内容。

    < name >标记:用于指定EL函数说对应方法的方法名,通常与Java文件中方法名相同。

    < function-class >标记:用于指定EL函数所对应的Java文件,这里需要包括包名和类名,例如,上面的的代码中,包名为com.el,类名为StringDeal。

    < function-signature >标记:用于指定EL函数所对应的静态方法,这里包括返回值的类型和入口参数的类型。在指定这些类型时,需要使用完整的类型名。

  3. 调用

    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ taglib prefix="f" uri="http://com.el/myfun" %>
    <%request.setCharacterEncoding("UTF-8"); %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>显示结果</title>
    </head>
    <body>
        内容为:<br>
        ${f:shiftEnter("一个简单的EL测试")}
    </body>
    </html>

访问隐式对象

  • pageContext

    • 通过pageContext来获取ServletContext、request、response、session等对象

    • 格式:${pageContext.request.locale}

    <%-- 此种方式不能访问 --%>
    ${request }<br/>
    <%-- 可以访问,输出当前设置的地区zh_CN或en等 --%>
    ${pageContext.request.locale }</br>
    <%-- 获取当页面的上下文的路径 --%>
    ${pageContext.servletContext.contextPath }
    • 获取request中用户请求的值:${param.name}

    例如通过URL传参或者表单提交,在JSP页面获取参数,这种参数不是通过request.setAttribute()方法设置的。

    ${param.name }<br/>
    ${param['user-pwd'] }
    • 获取请求头信息:${headers[‘Content-Type’]}
    user-agent: <%=request.getHeader("user-agent") %><br/>
    user-agent: ${header['user.agent'] }
    • 获取cookie的值:${cookie.cookieName.value}
    <%
    Cookie cookie=new Cookie("cookietest", "123456");
    response.addCookie(cookie);
    %>
    
    <%-- 获取cookie --%>
    JSESSIONID: ${cookie.JSESSIONID.value }<br/>
    cookie: ${cookie.cookietest.value }
    • 获取context-param:${initParam.name},获取为整个web应用配置的初始化参数
    /*在web.xml中配置*/
    <context-param>
    <param-name>test</param-name>
    <param-value>Context Param!</param-value>
    </context-param>
    
    <%-- 获取 --%>
    Context-param: ${initParam.test }
  • 获取隐式作用域对象中的属性

    属性名称(下面的user)都是通过setAttribute方法设置

    • ${user.name}:按照pageScope、requestScope、sessionScope、applicationScope的顺序查找。

      其中user是通过隐式对象的setAttribute方法添加的属性,可以是一个类,而name可以是这个类的一个属性,并不是必须的,实际上,获取name属性时调用的是user类的一个getName()方法,即我们要取的属性名(name)将其首字母大写再在前面加get单词,user里需要有这个方法,具体可参考JavaBean。或者可以直接使用user类的方法来调用属性(${user.getName() })。

    • ${pageScope.uesr.name}:只在pageContext中查找

    • 如果没有查找到,则都返回空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值