how2j.cn


工具版本兼容问题
EL表达式非常好用,好用的吓死人 ~


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

不同版本的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}
<%@ 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 :

作用域优先级

edit edit
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}
<%@ 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}
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的属性

edit edit
获取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}
<%@ 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

edit edit
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>
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}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>

${param.name}
进行条件判断,大大简化了 JSTL的 c:ifc: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? "超神":"还没超神" }


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 J2EE-JSP-EL表达式语言 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 982790551
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图