EL表达式

来源:互联网 发布:去男朋友的城市 知乎 编辑:程序博客网 时间:2024/06/11 04:27

一.简介

概念

EL全称 Expression Language,为方便操作JSP而存在的一种简单语言。

语法

${expression}

二.作用

1. 获取数据

EL表达式用于替换JSP页面中的脚本表达式,从各种类型的web域中检索java对象、获取数据    <%@page import="java.util.HashMap"%>    <%@page import="java.util.Map"%>    <%@page import="java.util.ArrayList"%>    <%@page import="java.util.List"%>    <%@page import="gz.bean.Address"%>    <%@page import="gz.bean.Person"%>    <%@ page language="java" contentType="text/html; charset=utf-8"        pageEncoding="utf-8"%>    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>      <!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=ISO-8859-1">    <title>EL表达式测试页</title>    </head>    <body>        <% request.setAttribute("name","test"); %>        <%--${name}等同于pageContext.findAttribute("name") --%>        使用EL表达式获取数据:${name }        <hr>        <% Person p = new Person();            p.setAge(10);            request.setAttribute("person", p);        %>         <!-- 在jsp页面中,使用el表达式可以获取bean的属性 -->        使用EL表达式获取bean的属性:${person.age }        <hr>        <% Person p2 = new Person();            p2.setAge(10);            Address addr = new Address();            addr.setName("北京");            p2.setAddr(addr);            request.setAttribute("person",p2);        %>         <!-- 在jsp页面中,使用el表达式可以获取bean中的属性的属性 -->        使用EL表达式获取bean的属性:${person.addr.name }        <hr>        <!-- 在jsp页面中,使用el表达式获取list集合中指定位置的数据 -->        <%  List<Person> list = new ArrayList<Person>();            Person p3 = new Person();            p3.setName("赵丽颖");            Person p4 = new Person();            p4.setName("杨颖");            list.add(p3);            list.add(p4);            request.setAttribute("list", list);        %>          <!-- 取list指定位置的数据 -->          ${list[1].name }           <!-- 迭代List集合 -->          <c:forEach items="${list}" var="person">          ${person.name }          </c:forEach>          <hr>          <!-- 在jsp页面中,使用el表达式获取map集合的数据 -->        <%            Map<String, String> map = new HashMap<String, String>();            map.put("a", "aaaa");            map.put("b", "bbbb");            map.put("c", "cccc");            map.put("1", "1111");            request.setAttribute("map", map);        %>        <!-- 根据关键字取map集合的数据 -->        ${map.c }        ${map["1"] }        <hr>         <!-- 迭代Map集合 -->         <c:forEach items="${map }" var="m">         key:${m.key } -- value:${m.value }<br>         </c:forEach>    </body>    </html>

2.执行运算

利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算

1. 关系运算
2. 逻辑运算
3. empty运算
4. 二元表达式
5. []和.运算

    <%@page import="gz.bean.Person"%>    <%@ page language="java" contentType="text/html; charset=UTF-8"        pageEncoding="UTF-8"%>        <%@page import="java.util.*" %>    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>        <!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>EL运算</title>    </head>    <body>        <h3>el表达式进行四则运算:</h3>             加法运算:${365+24}<br/>             减法运算:${365-24}<br/>             乘法运算:${365*24}<br/>             除法运算:${365/24}<br/>        <h3>el表达式进行关系运算:</h3>        <%--${user == null}和 ${user eq null}两种写法等价--%>            ${user == null}<br/>            ${user eq null}<br/>        <h3>el表达式使用empty运算符检查对象是否为null(空)</h3>        <%            List<String> list = new ArrayList<String>();            list.add("a");            list.add("b");            request.setAttribute("list", list);        %>        <%--使用empty运算符检查对象是否为null(空) --%>        <c:if test="${!empty(list) }">            <c:forEach items="${list }" var="str">                ${str }<br>            </c:forEach>        </c:if>        <%--对于EL的empty运算符,null对象与空字符串“”、空数组、空list等是等价的--%>        <%        request.setAttribute("emptyString","");        request.setAttribute("nullObject",null);        request.setAttribute("emptyList",new ArrayList<String>());        request.setAttribute("emptyMap",new HashMap<String,String>());        %>        <h2>${empty emptyString}</h2>        <h2>${empty nullObject}</h2>        <h2>${empty emptyList}</h2>        <h2>${empty emptyMap}</h2>        <h3>EL表达式中使用二元表达式</h3>        <% session.setAttribute("person", new Person("赵丽颖")); %>        ${person==null?"查无此人":person.name}        <hr>        <h3>EL表达式数据回显</h3>        <%            Person p = new Person();            p.setGender("female");            //数据回西显            request.setAttribute("person", p);        %>        <input type="radio" name="gender" value="male" ${person.gender=="male"?"checked":""}>男        <input type="radio" name="gender" value="female" ${person.gender=="female"?"checked":""}>女     </body>    </html>

3.获取web开发常用对象

  • EL定义了一些隐式对象,通过这些对象可获取对web常用对象的引用,从而获取对象中的数据
  • EL的内置对象与JSP的内置对象并不相同(除了pageContext对象),两者关系是:EL的内置对象可以访问对应的JSP内置对象通过setAttribute方法存储的值
  • 通过pageContext可以获取的对象有page、resquest、response、session、out、exception、servletContext

    序号  隐含对象名称  描       述1   pageContext         对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)   2   pageScope           代表page域中用于保存属性的Map对象3   requestScope        代表request域中用于保存属性的Map对象4   sessionScope        代表session域中用于保存属性的Map对象5   applicationScope    代表application域中用于保存属性的Map对象6   param               表示一个保存了请求参数的Map对象7   paramValues         表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]8   header              表示一个保存了http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”]9   headerValues        表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]10  cookie              表示一个保存了所有cookie的Map对象11  initParam           表示一个保存了所有web应用初始化参数的map对象



    <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="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>EL隐式对象</title></head><body>    <br />---------------1、pageContext对象:获取JSP页面中的pageContext对象------------------------ <br />     ${pageContext}    <br />---------------2、pageScope对象:从page域(pageScope)中查找数据------------------------<br />    <%         pageContext.setAttribute("name","哈喽");  //map    %>    ${pageScope.name}    <br />---------------3、requestScope对象:从request域(requestScope)中获取数据------------------------<br />    <%            request.setAttribute("name","沃德");  //map       %>    ${requestScope.name}    <br />---------------4、sessionScope对象:从session域(sessionScope)中获取数据------------------------<br />    <%            session.setAttribute("user","xdp");  //map       %>    ${sessionScope.user}    <br />---------------5、applicationScope对象:从application域(applicationScope)中获取数据------------------------<br />    <%            application.setAttribute("user","gacl");  //map       %>    ${applicationScope.user}    <br />--------------6、param对象:获得用于保存请求参数map,并从map中获取数据------------------------<br />    <!-- 如:http://localhost:8090/web_test/demo3.jsp?name="aaa" -->    ${param.name }    <!-- 此表达式会经常用在数据回显上 -->       <form action="re.do" method="post">           <input type="text" name="username" value="${param.username}">           <input type="submit" value="注册">       </form>       <!-- http://localhost:8090/web_test/demo3.jsp?like=aaa&like=bbb -->           ${paramValues.like[0]}  <br>           ${paramValues.like[1]} <br>       <br/>--------------8、header对象:header获得请求头------------------------<br/>           header.Accept:${header.Accept}<br/>           <%--${header.Accept-Encoding} 这样写会报错                测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]           --%>           header.Accept-Encoding:${header["Accept-Encoding"]}       <br/>--------------9、headerValues对象:headerValues获得请求头的值------------------------<br/>           <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组            例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值           --%>           headerValues.Accept:${headerValues.Accept[0]}<br/>           <%--${headerValues.Accept-Encoding} 这样写会报错                测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]                headerValues["Accept-Encoding"]返回的是一个string[]数组,headerValues["Accept-Encoding"][0]取出数组中的第一个值           --%>           headerValues.Accept-Encoding:${headerValues["Accept-Encoding"][0]}            <br/>--------------10、cookie对象:cookie对象获取客户机提交的cookie------------------------<br/>       <!-- 从cookie隐式对象中根据名称获取到的是cookie对象,要想获取值,还需要.value -->           ${cookie.JSESSIONID.value}  //保存所有cookie的map       <br/>--------------11、initParam对象:initParam对象获取在web.xml文件中配置的初始化参数------------------------<br/>       <%--        <!-- web.xml文件中配置初始化参数 -->      <context-param>          <param-name>xxx</param-name>          <param-value>yyyy</param-value>      </context-param>      <context-param>          <param-name>root</param-name>          <param-value>/web_test</param-value>      </context-param>        --%>       <%--获取servletContext中用于保存初始化参数的map --%>           ${initParam.xxx}<br/>           ${initParam.root}</body></html>




    servlet中的代码:

    import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@WebServlet("/re.do")public class ResisterServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    response.setCharacterEncoding("UTF-8");String uname = request.getParameter("username");/** * 直接跳转回/demo3.jsp页面,没有使用request.setAttribute("userName", userName)将userName存储到request对象中 * 但是在demo3.jsp页面中可以使用${param.username}获取到request对象中的username参数的值 */request.getRequestDispatcher("/demo3.jsp").forward(request, response);}}

4. 调用java类方法

  • EL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。语法:${prefix:method(params)}

  • 在EL表达式中调用的只能是Java类的静态方法,这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。

  • EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。

EL自定义函数开发步骤

一般来说, EL自定义函数开发与应用包括以下三个步骤:

  1. 编写一个Java类的静态方法

    public class ElUtils {/** *  * @param msg 需转义处理的html标签信息 * @return 转义后的内容 */public static String htmlFilter(String msg){    if (msg == null){        return null;    }    char content[] = new char[msg.length()];    msg.getChars(0, msg.length(), content, 0);    StringBuffer result = new StringBuffer(msg.length()+50);    for(int i=0;i<content.length;i++){        switch(content[i]){        case '<':            result.append("&lt;");            break;        case '>':            result.append("&gt;");            break;        case '&':            result.append("&amp;");            break;        case '"':            result.append("&quot;");            break;        default:            result.append(content[i]);            break;        }    }    return result.toString();//返回}}
  2. 编写标签库描述符(tld)文件,在WEB-INF目录下编写标签库描述符(tld)文件,在tld文件中描述自定义函数。

    <?xml version="1.0" encoding="UTF-8"?><taglib version="2.0" 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-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>EL Function</short-name> <!--      自定义EL函数库的引用URI,     在JSP页面中可以这样引用:<%@taglib uri="/ELFunction" prefix="fn" %>  --> <uri>/ELFunction</uri> <!--<function>元素用于描述一个EL自定义函数 -->  <function>        <description>html标签转义处理方法</description>        <!--<name>子元素用于指定EL自定义函数的名称-->        <name>filter</name>        <!--<function-class>子元素用于指定完整的Java类名-->        <function-class>gz.util.ElUtils</function-class>        <!--<function-signature>子元素用于指定Java类中的静态方法的签名,            方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。-->        <function-signature>java.lang.String htmlFilter(java.lang.String)</function-signature>    </function></taglib>
  3. 在JSP页面中导入和使用自定义函数

     <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>    <!-- 引入自定义EL标签 -->   <%@taglib uri="/ELFunction"  prefix="fn" %><!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>自定义html转义工具测试</title></head><body>     <%--使用EL调用filter方法--%>     ${fn:filter("<a href=''>测试</a>") }</body></html>

注意事项

  • 编写完标签库描述文件后,需要将它放置到:项目名\WEB-INF目录中或WEB-INF目录下的除了classes和lib目录之外的任意子目录中。
  • TLD文件中的 元素用指定该TLD文件的URI,在JSP文件中需要通过这个URI来引入该标签库描述文件。
  • 元素用于描述一个EL自定义函数,其中:
  • 子元素用于指定EL自定义函数的名称。
  • 子元素用于指定完整的Java类名,
  • 子元素用于指定Java类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。
原创粉丝点击