Fork me on GitHub

EL 表达式

1. EL 表达式简介

  • EL 是 JSP 内置的表达式语言!!!表达式末尾没有";", 语句末尾需要";"
  • jsp 2.0 开始, 不让再使用 java 脚本,而是使用 EL 表达式和动态标签来替代 java 脚本;
  • EL 表达式只能做输出, 替代的是 <%=....%>

2. EL 表达式来读取四大域

  • ${xxx} 表示全域查找名为 xxx 的属性, 如果不存在, 输出空字符串,而不是 null;
  • 获取指定域的属性: ${pageScope.xxx}, ${requestScope.xxx}
    ${sessionScope.xxx} ${applicationScope.xxx}

3. JavaBean 导航

// it.cast.domain 包下
    public class Employee{
        private String name;
        private double salary;
        private Address address;

        public String getName(){
            return name;
        }
        public void setName(String name){
            this.name = name;
        }

        public double getSalary(){
            return salary;
        }
        public void setSalary(double salary){
            this.salary = salary;
        }

        public Address getAddress(){
            return address;
        }
        public void setAddress(Address address){
            this.address=address;
        }

        public String toString(){
            return "Employee [name="+name+",salary="+salary+", address="+address+"]";
        }
    }

    // Address 类
    public class Address{
        private String city;
        private String street;

        public String getCity(){
            return city;
        }
        public void setCity(String city){
            this.city = city;
        }

        public String getStreet(){
            return street;
        }
        public void setStreet(String street){
            this.street = street;
        }

        public String toString(){
            return "Address [city="+city+",street="+street+"]";
        }
    }


// 在 a.jsp 中获取地址中的 street
    // 导包

    <%@page import="cn.itcast.domain.*" %>
    <body>
        <%
            Address addr = new Address();
            addr.setCity("北京");
            addr.setStreet("西三旗");

            Employee emp = new Employee();
            emp.setName("张三");
            emp.setSalary(1234);
            emp.setAddress(addr);

            request.setAttribute("emp",emp);
        %>

        // 使用 el 表达式获取 street
        // 相当于: <% ((Employee)request.getAttribute("emp")).getAddress().getStreet()  %>
        ${requestScope.emp.address.street}
    </body>

4. EL 表达式的11个内置对象

  1. 无需创建即可使用, 这 11 个内置对象中有 10 个是 Map 类型的;
  2. pageContext 不是 Map 类型, 而是 pageContext 类型;
  3. 11 个内置对象
    • pageScope
    • requestScope
    • sessionScope
    • applicationScope
    • param : 获取请求参数, 它是一个 Map, 其中 key 是参数名, value 是参数值, 适用于单值的参数;
    • paramValues: 适用于多值的参数; value 对应的是数组;
    • header: 获取请求头, 适用于单值请求头; ${header.Host}
    • headerValues: 适用于多值请求头; ${header['User-Agent']}
    • initParam: 获取 web.xml 中的<context-param> 内的参数;
    • cookie: Map<String, Cookie> 类型, 其中 key是cookie 的name, value 是 cookie 对象;
      例如: 获取 JSESSIONID 的值: ${cookie.JSESSIONID.value}
    • pageContext: 它是 PageContext 类型, 可以使用 pageContext 对象调用 getXXX() 方法.
      例如, 获取项目名: ${pageContext.request.contextPath}
      其实就是: pageContext.getRequest.getContextPath()

5. EL 函数库 (由 JSTL 提供)

1. EL 函数库概述

  1. EL 函数库是由第三方对 EL 的扩展.
  2. EL 函数库就是定义一些有返回值的静态方法.
  3. EL 函数库中包含了很多对字符串的操作方法, 以及对集合对象的操作.
    例如, ${fn:length("abc")}, 表示字符串的长度

2. 导入函数库

  • 需要导入标签库: jstl-1.2.jar
  • 格式: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

3. EL 函数库介绍

  • String toUpperCase(String input);
  • String toLowerCase(String input);
  • boolean contains(String input, String substring);
  • String escapeXml(String input); 把 input 中的 "<", ">", "&"等符合进行转义.
    例如: ${fn:escapeXml("<html></html>")} 输出结果:

4. 自定义函数库

  1. 步骤:
    • 写一个 java 类, 类中可以定义 0~N 个方法, 但必须是 Static, 而且有返回值;
    • 在 WEB-INF 目录下创建一个 tld 文件;
    • 在 jsp 页面导入标签库: <%@ taglib prefix="it" uri="/WEB-INF/tlds/myfn.tld" %>
    • 在 jsp 页面中使用自定义的函数 ${it:test()}
// java 类
    public class MyFunction{
        // 静态方法
        public static String test(){
            return "这是自定义方法";
        }
    }

// WEB-INF 目录下创建 myfn.tld 文件
    <?xml version="1.0" encoding="UTF-8" ?>

    <taglib 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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <tlib-version>1.0</tlib-version>
    <short-name>myfn</short-name>
    <uri>http://www.cnbologs.com/link-world/jsp/functions</uri>

    <function>
        <name>test</name>
        <function-class>cn.itcast.fn.MyFunction</function-class>
        <function-signature>java.lang.String test()</function-signature>
    </function>
    </taglib>

参考资料:

posted @ 2017-09-26 17:27  小a的软件思考  阅读(148)  评论(0编辑  收藏  举报