how2j.cn


工具版本兼容问题
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}
<%@ 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}
<%@ 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}
<%@ 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}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>

${param.name}
示例 7 :

eq

进行条件判断,大大简化了 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公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-05-23 EL表达式无法获取到对象属性
新手菜鸟java



照着老师的代码,无法获取hero对象的name,hp属性
JAVA代码就不上了,太简单了就是一个hero类里面有3个属性id,name,hp,加上了set和get方法。直接上JSP中的代码,顺便帮我分析下JSTL的foreach遍历没效果是什么原因
<%@page import="com.test.demo.hero"%>
<%@page import="java.util.List"%>
<%@page import="java.util.ArrayList"%>
<%@page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<%
	pageContext.setAttribute("weapon", null);
	pageContext.setAttribute("lastwords", "");
	pageContext.setAttribute("items", new ArrayList());
	
%>

<% 
	List<String> list = new ArrayList<String>();
	list.add("艾希");
	list.add("蛮王");
	list.add("盖伦");
	list.add("赵信");
	list.add("不详");
%>
<%
	hero h = new hero();
	h.setId(1);
	h.setName("赵菊花");
	h.setHp(550);
	request.setAttribute("hero",h);
%>
英雄编号:${h.id}<br/>
英雄名字:${h.name}<br/>
英雄血量:${h.hp}<br/>
<body>
<c:set var="name" value="${'teemo'}" scope="request"></c:set>
通过标签获取name:<c:out value="${name}"></c:out><br/>
通过EL获取name:${name}
<c:remove var="name" scope="request"/>
通过标签获取name:<c:out value="${name}"></c:out><br/>
<c:set var="hp" value="${'100'}" scope="request"></c:set>
<c:if test="${hp<200}">
	<span>这个英雄快挂了</span>
</c:if>

<c:if test="${!(hp<200)}">
	<p>还可以再抢救一下</p>
</c:if>
<c:if test="${empty weapon}">
	<p>没有武器</p>
</c:if>
<c:if test="${empty lastwords}">
	<p>没有遗言</p>
</c:if>
<c:if test="${empty items}">
	<p>物品栏没有物品</p>
</c:if>
<table width="200px" align="center" cellspacing="0" border="1">
<tr>
	<td>编号</td>
	<td>英雄</td>
</tr>
<c:forEach items="${list}" var="hero" varStatus="st">
		<tr>
			<td><c:out value="${st.count}"></c:out></td>
			<td><c:out value="${hero}"></c:out></td>
		</tr>
	</c:forEach>
</table>
</body>
</html>

							


1 个答案

夜神1997 答案时间:2018-05-28




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2017-11-16 javabean的私有属性
无敌无图
用el表达式访问javabean的私有属性直接实例名称.属性名????是不是哪一步做了什么中转哦,是不是哪一步转换成get方法了?








答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2017-11-08 ${killNumber ge 10? "超神":"还没超神" } 为啥没输出超神
2017-09-23 el表达式隐式对象
2017-09-16 获取参数
2017-07-13 import="bean.*"报错
2017-01-08 javaBean
2016-11-02 c:set中value赋值




提问之前请登陆
关于 J2EE-JSP-EL表达式语言 的提问

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

上传截图