• JSP系列教材 (十一)- EL表达式语言


    EL表达式非常好用,好用的吓死人 ~ 

    步骤1:取值
    步骤2:作用域优先级
    步骤3:JavaBean概念
    步骤4:获取JavaBean的属性
    步骤5:结合JSTL的<c:forEach
    步骤6:取参
    步骤7:eq

    示例 1 : 取值

    不同版本的tomcat是否默认开启对EL表达式的支持,是不一定的。

    所以为了保证EL表达式能够正常使用,需要在<%@page 标签里加上isELIgnored="false"

    使用EL表达式,非常简单

    比如使用JSTL输出要写成

    <c:out value="${name}" /> 



    但是用EL只需要

    ${name}

    取值

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8" isELIgnored="false"%>

      

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

      

    <c:set var="name" value="${'gareen'}" scope="request" />

      

    通过标签获取name: <c:out value="${name}" /> <br>

    通过 EL 获取name: ${name}

    示例 2 : 作用域优先级

    EL表达式可以从pageContext,request,session,application四个作用域中取到值,如果4个作用域都有name属性怎么办? 

    EL会按照从高到低的优先级顺序获取 
    pageContext>request>session>application

    作用域优先级

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8" isELIgnored="false"%>

      

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

      

    <c:set var="name" value="${'gareen-pageContext'}" scope="page" />

    <c:set var="name" value="${'gareen-request'}" scope="request" />

    <c:set var="name" value="${'gareen-session'}" scope="session" />

    <c:set var="name" value="${'gareen-application'}" scope="application" />

      

    4个作用域都有name,优先获取出来的是 : ${name}

    示例 3 : JavaBean概念

    EL可以很方便的访问JavaBean的属性,那么JavaBean是什么呢? 

    JavaBean的标准
    1. 提供无参public的构造方法(默认提供)
    2. 每个属性,都有public的getter和setter
    3. 如果属性是boolean,那么就对应is和setter方法

    比如示例代码中的Hero类,默认提供了一个无参的public的构造方法。 同时每个属性都有getter和setter

    package bean;

    public class Hero {

        public int id;

        public String name;

        public float hp;

        public int damage;

        public int getId() {

            return id;

        }

        public void setId(int id) {

            this.id = id;

        }

        public String getName() {

            return name;

        }

        public void setName(String name) {

            this.name = name;

        }

        public float getHp() {

            return hp;

        }

        public void setHp(float hp) {

            this.hp = hp;

        }

        public int getDamage() {

            return damage;

        }

        public void setDamage(int damage) {

            this.damage = damage;

        }

         

    }

    示例 4 : 获取JavaBean的属性

    获取JavaBean的属性,只需要通过.符号操作就可以了。

    像这样 ${hero.name} ,就会自动调用getName方法了

    注: 如果属性是boolean类型,那么就会自动调用isXXX方法了

    获取JavaBean的属性

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8" isELIgnored="false" import="bean.*"%>

      

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

      

    <%

        Hero hero =new Hero();

        hero.setName("盖伦");

        hero.setHp(616);

         

        request.setAttribute("hero", hero);

    %>

      

    英雄名字 : ${hero.name} <br>

    英雄血量 : ${hero.hp}

    示例 5 : 结合JSTL的<c:forEach

    EL还可以结合  JSTL的<c:forEach 使用,进一步简化代码

    原代码中的 

    <c:out value="${hero}" /> 


    可以简写为

    ${hero}

    结合JSTL的<c:forEach

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8" import="java.util.*"%>

      

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

      

    <%

        List<String> heros = new ArrayList<String>();

        heros.add("塔姆");

        heros.add("艾克");

        heros.add("巴德");

        heros.add("雷克赛");

        heros.add("卡莉丝塔");

        request.setAttribute("heros",heros);

    %>

      

    <table width="200px" align="center" border="1" cellspacing="0">

    <tr>

        <td>编号</td>

        <td>英雄</td>

    </tr>

        

    <c:forEach items="${heros}" var="hero" varStatus="st"  >

        <tr>

            <td>${st.count}</td>

            <td>${hero}</td>

        </tr>

    </c:forEach>

    </table>

    示例 6 : 取参

    EL表达式还可以做到request.getParameter("name") 这样的形式获取浏览器传递过来的参数
    先把jstl.jsp代码改为如例所示,然后访问如下地址

    http://127.0.0.1/jstl.jsp?name=abc


    可以观察到获取了参数 name

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>

    ${param.name}

    示例 7 : eq

    进行条件判断,大大简化了 JSTL的 c:if 和 c:choose 代码

    如例,一行代码就能起到其他好几行代码的效果

    ${killNumber ge 10"超神":"还没超神" }



    例子中讲的是大于等于,除此之外的其他用法如下:
    eq相等 ne、neq不相等,
    gt大于, lt小于
    gt大于, lt小于
    gte、ge大于等于  
    lte、le 小于等于  
    not非 mod求模  
    is [not] div by是否能被某数整除  
    is [not] even是否为偶数  
    is [not] odd是否为奇

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8" import="java.util.*"%>

      

    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

    <%

    request.setAttribute("killNumber""10");

    %>

    c:if 的用法,运行结果:

    <c:if test="${killNumber>=10}">

    超神

    </c:if>

    <c:if test="${killNumber<10}">

    还没超神

    </c:if>

    <br>

    c:choose 的用法,运行结果:

    <c:choose>

        <c:when test="${killNumber>=10}">

            超神

        </c:when>

        <c:otherwise>

            还没超神

        </c:otherwise>

    </c:choose>

    <br>

    EL表达式eq的用法,运行结果:

    ${killNumber ge 10"超神":"还没超神" }


    更多内容,点击了解: https://how2j.cn/k/jsp/jsp-el/579.html

  • 相关阅读:
    spock2.x结合mockito静态mock
    线程池的拒绝策略及常见线程池
    正确关闭线程池
    对线面试官 | 字节跳动一面
    记一次oom问题排查
    MySQL索引下推,原来这么简单!
    vs2019 编译 protocol buffers
    每日一库:classList.js
    每日一库:tinycon.js
    算法: 有效的括号
  • 原文地址:https://www.cnblogs.com/Lanht/p/12789446.html
Copyright © 2020-2023  润新知