EL表达式

一.简介

概念

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类中的静态方法的签名,方法签名必须指明方法的返回值类型及各个参数的类型,各个参数之间用逗号分隔。
内容概要:本文档详细介绍了基于Google Earth Engine (GEE) 构建的阿比让绿地分析仪表盘的设计与实现。首先,定义了研究区域的几何图形并将其可视化。接着,通过云掩膜函数和裁剪操作预处理Sentinel-2遥感影像,筛选出高质量的数据用于后续分析。然后,计算中值图像并提取NDVI(归一化差异植被指数),进而识别绿地及其面积。此外,还实现了多个高级分析功能,如多年变化趋势分析、人口-绿地交叉分析、城市热岛效应分析、生物多样性评估、交通可达性分析、城市扩张分析以及自动生成优化建议等。最后,提供了数据导出、移动端适配和报告生成功能,确保系统的实用性和便捷性。 适合人群:具备一定地理信息系统(GIS)和遥感基础知识的专业人士,如城市规划师、环境科学家、生态学家等。 使用场景及目标:①评估城市绿地分布及其变化趋势;②分析绿地与人口的关系,为城市规划提供依据;③研究城市热岛效应及生物多样性,支持环境保护决策;④评估交通可达性,优化城市交通网络;⑤监测城市扩张情况,辅助土地利用管理。 其他说明:该系统不仅提供了丰富的可视化工具,还集成了多种空间分析方法,能够帮助用户深入理解城市绿地的空间特征及其对环境和社会的影响。同时,系统支持移动端适配,方便随时随地进行分析。用户可以根据实际需求选择不同的分析模块,生成定制化的报告,为城市管理提供科学依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值