14.EL表达式&JSTL标签库

EL表达式


1.概念:Expression language (表达式语言)。

2.作用:替换和简化jsp页面中的java代码编写。

3.语法:${表达式}

4.注意:

1.jsp语言中默认可以使用EL表达式
2.有两种忽略EL表达式的方法
  • 1,在page指令中添加isELignore属性,忽略全局EL表达式,默认为false,设置为true的时候忽视之间将其以字符串的形式打印出来
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true" %>
  • 2,在EL表达式的前面添加"",忽略单个EL表达式
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title></title>
</head>
<body>
<%--
在jsp页面中忽视EL表达式的方法2.单个EL表达式的忽略
--%>
${1}
\${2}
</body>
</html>

页面效果:


页面效果

5.使用:

1.运算符
  • 1,算术运算法:+ - * /(div) %(mod)
  • 2,比较运算符: > ,<, >= ,<=,==,!=
  • 3,逻辑运算符:&&(and),||(or),!(not)
  • 4,空运算符:empty ,not empty
    功能:判断字符串,集合数组对象是否为NULL或者是长度是否为 0
    如:${empty list} 如果list对象为NULL并且是长度为0,返回true,不是返回false
    在使用它进行条件判断的时候,需要直接获取boolean值,可以使用empty ,not empty直接判断字符串对象集合数组对象是否为NULL并且长度是否为0
    演示
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title>EL表达式运算法</title>
</head>
<body>
<h3>算术运算法</h3>
${1+2}<br>
${1-2}<br>
${1*2}<br>
${1/2}<br>
${1 div 2}<br>
${1%2}<br>
${1 mod 2}<br>
<h3>比较运算符</h3>
${1>2}<br>
${1<2}<br>
${1>=2}<br>
${1<=2}<br>
${1==2}<br>
${1!=2}<br>
<h3>逻辑运算符</h3>
${1>2 && 3>2}<br>
${1>2 and 3>2}<br>
${1>2 || 3>2}<br>
${1>2 or 3>2}<br>
${!(3>2)}<br>
${not(3>2)}<br>
${(3>2)}<br>
<h3>空运算法</h3>
<%
//创建list对象
List list = new ArrayList();
list.add("xzw");
list.add("ysj");
//添加list到request域对象之中
request.setAttribute("list",list);
List list1 = new ArrayList();
request.setAttribute("list1",list1);
%>
${empty list}
${empty list1}<br>
${not empty list}
${not empty list1}
</body>
</html>

结果


图片结果
2.获取值
  • 1,EL表达式只能从域对象中获取值
  • 2,语法:语法有两种

1.${域名称.键名}:从指定域中获取指定键值
域名称(和jsp中的域对象名称不一致,属于EL表达式的隐式对象,在后面会说)

域名称 获取域的名称
pageScope pageContext
requestScope request
sessionScope Session
applicationScope application(servletContext)

2.${键名}:表示依次从最小的域中寻找是否有该键对应的值,直到找到为止,有一个查找的动作。但是只要我们在存储数据的时候不改重复的名字,就可以直接使用键名,来获取值,这种方法很常用。
如查找request域对象中的name的值,有两种方法

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true" %>
<html>
<head>
    <title></title>
</head>
<body>
<%
//在request域对象中存入数据
    request.setAttribute("name","xzw");
%>
<%--获取值方法1.${域名称.键名}--%>
${requestScope.name}
<%--获取值方法2.${键名}--%>
${name}
</body>
</html>

结果:


两种方法获取成功

  • 在获取对象,List集合,Map集合的值时怎么获取?
    1.获取对象:(获取对象是通过对象的属性来获取的,对象属性,setter&getter方法去掉get&set,小写首字母获取).
    方法:${域名称.键名.属性名},本质上是调用对象的get方法
<%@ page import="com.xzw.entity.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title></title>
</head>
<body>
<%--获取对象的值--%>
<%
    //1.创建对象
    User user = new User("xzw",21,"男",new Date());
    //2.将对象存放在域对象之中
    request.setAttribute("user",user);
%>
<%--使用El表达式获取对象值,这里是使用属性进行获取的--%>
${requestScope.user.name}<br>
${requestScope.user.age}<br>
${requestScope.user.gender}<br>
${requestScope.user.birthday}<br>
<%--在实际开发的时候我们需要获得正常的时间显示格式,我们一般会使用逻辑视图的方法
1.在javaBean中设置获取正常格式的getter方法
2.在使用获取对象属性的方法获取值
如:
--%>
${requestScope.user.birthStr}
</body>
</html>

页面:


页面效果

逻辑视图:在开发的时候我们会经常使用这种逻辑视图的方式,其目的是在页面中能获得更好的格式
方法,创建一个获取更好格式的getter方法,然后调用属性,直接获取其返回的字符串


2.获取List集合值
方法:${域名称.键名[索引值]},通过索引获取List集合中的单个元素,如果元素是对象可以直接使用元素。
注意:如果下标越界不会报错,直接打印空字符串。

<%@ page import="java.util.ArrayList" %>
<%@ page import="com.xzw.entity.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title>使用EL表达式获取list集合中的值</title>
</head>
<body>
<%--获取List集合中的数据--%>
<%
    //1.创建List集合
    List<User> list = new ArrayList<User>();
    //2.在list集合中存放数据
    list.add(new User("xzw",21,"男",new Date()));
    list.add(new User("ysj",22,"男",new Date()));
    list.add(new User("hhy",23,"男",new Date()));
    //3.将list集合存放在request域对象之中
    request.setAttribute("list",list);
%>
<%--使用EL表达式获取List集合中的值--%>
${requestScope.list[0].name}<br>
${requestScope.list[1].name}<br>
${requestScope.list[2].name}<br>
<%--索引下标越界之后不会出现错误,直接打印空字符串--%>
<p>越界打印空字符串</p>
${requestScope.list[10].name}
</body>
</html>

页面:


页面效果

3.获取Map集合的值
方法:有两种方法,通过key获取Map集合中的值。
1,${域名称.键名.key名称}

2,${域名称.键名称["key名称"]}

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="com.xzw.entity.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title></title>
</head>
<body>
<%--使用EL表达式获取Map集合中的值--%>
<%
    //1.创建Map集合
    Map<String,User> map = new HashMap();
    //2.在map集合中存储值
    map.put("user1",new User("xzw",21,"男",new Date()));
    map.put("user2",new User("hhy",22,"男",new Date()));
    map.put("user3",new User("ysj",23,"男",new Date()));
    //3.将map集合存放在request域对象之中
    request.setAttribute("map",map);
%>
<%--使用EL表达式获取map集合中的user对象的name属性--%>
<%--方法一,比较好写--%>
${requestScope.map.user1.name}<br>
<%--方法二,不是很好写--%>
${requestScope.map["user1"].name}<br>
</body>
</html>

我自己觉得使用第一种方式比较简单


6.隐对象

概念:在EL表达式中直接拿来使用不用创建和获取的对象,和jsp中的内置对象十分相似
使用:EL表达式中一共有14个隐式对象,经常使用的有5个,我们了解常用的
  • 1.域对象
域对象 获取
pageScope 获取存放在pageContext中的数据,jsp中的当前页面
requestScope 获取request域对象中存放的数据
SessionScope 获取session域对象中存放的数据
applicationScope 获取application域对象中存放的数据,或者是Servlet中的ServletContext
  • 2.pageContext对象
    作用:可以获取jsp中其余的8个内置对象,还可以获取pageContext中的数据
    最常用的使用方法,我们以后在开发的时候经常会使用到。通过pageContext获取request对象然后在获取虚拟目录,动态获取项目虚拟目录,在开发的时候会经常使用
${pageContext.request.contextPath}
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>
<html>
<head>
    <title>隐式对象</title>
</head>
<body>
<%--在pageCntext对象中存放数据,测试EL表达式中pageContext能不能获取到域中的数据--%>
<%
//在pageContext中存放数据
pageContext.setAttribute("name","xzw");
%>
${pageScope.name}<br>
<%--动态获取项目的虚拟目录--%>
${pageContext.request.contextPath}
</body>
</html>

页面:


页面效果

JSTL标签库

1.概念: Java Server page Tag library(jsp标准标签库)

2.作用:用于简化和替换jsp中的java代码

3.使用步骤:

  • 1.导入jstl相关的jar包
  • 2.引入标签库使用taglib指令
<%@taglib prefix="自定义名字" uri="http://java.sun.com/jsp/jstl/core"  %>

我们在使用JSTL标签库的时候经常都把前缀(prefix)设置成C这是一种默认的规则

  • 3.使用标签

4.经常使用的标签(分类)通常与EL表达式配合使用

1.条件标签
    1. if:相当于java中的if语句
      属性:test(必须属性),接收boolean值
      当值是true的时候,显示标签体的内容,当值是false的时候不显示标签体的内容
      注意:经常与EL表达式配合使用,没有else,需要else的时候写多重if
      如:
      1.判断request中存放的list集合数据是否为null,如果不是null就显示遍历集合
      2.判断是奇数的时候打印,偶数的时候不打印
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<html>
<head>
    <title>JSTL使用</title>
</head>
<body>
<%
    //1.创建List集合,添加数据
    List list = new ArrayList();
    list.add("xzw");
    list.add("hhy");
    list.add("ysj");
    //2.将获取的list集合添加在request域对象之中
    request.setAttribute("list",list);

    //设置一个值,将其存在request域对象之中
    Integer a = 4;
    request.setAttribute("number",a);
%>
<%--使用JSTL标签库进行判断--%>
<c:if test="${ not empty list}">
    <h3>遍历list集合</h3>
</c:if>
<c:if test="${empty list}">

</c:if>

<br>
<%--奇偶数判定--%>
<c:if test="${(number % 2)!= 0}">
    <h3>奇数</h3>
</c:if>

<c:if test="${(number % 2 == 0)}">
    <h3>偶数</h3>
</c:if>

</body>
</html>
    1. choose:相当于java中的switch语句
    1. when:和choose配合使用相当于case
    1. otherwise:和choose配合使用相当于default
      如:完成一个数字编号对应星期几案例
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSTL中choose使用</title>
</head>
<body>
<%--存放一个数字--%>
<%
int i = 11;
request.setAttribute("i",i);
%>
<%--使用JSTL--%>
<c:choose>
    <c:when test="${i==1}"><h3>星期一</h3></c:when>
    <c:when test="${i==2}"><h3>星期二</h3></c:when>
    <c:when test="${i==3}"><h3>星期三</h3></c:when>
    <c:when test="${i==4}"><h3>星期四</h3></c:when>
    <c:when test="${i==5}"><h3>星期五</h3></c:when>
    <c:when test="${i==6}"><h3>星期六</h3></c:when>
    <c:when test="${i==7}"><h3>星期日</h3></c:when>
    <c:otherwise ><h3>数字有误</h3></c:otherwise>
</c:choose>
</body>
</html>
2.迭代标签
  • foreach:相当于java中的for语句
    使用方式:
    1,完成重复操作
    属性:
    开始值,begin
    结束值,end
    var ,临时变量
    step,步长
    varstatus,循环状态对象
    (index:容器中元素索引)
    (count:循环次数)

2,遍历容器

属性:
iterm,获取容器变量
var,临时变量
varstatus,循环状态对象,在遍历的时候使用的更多
(index:容器中元素索引)
(count:循环次数)

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.xzw.entity.User" %>
<%@ page import="java.util.Date" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>foreach使用</title>
</head>
<body>
<%

    List list = new ArrayList();
    list.add(new User("xzw",21,"nan",new Date()));
    list.add(new User("hhy",21,"nan",new Date()));
    list.add(new User("ysj",21,"nan",new Date()));
    list.add(new User("lfb",21,"nan",new Date()));
    request.setAttribute("list",list);

%>
<%--第一种使用方法:进行重复操作--%>

<c:forEach begin="1" end="10" var="i" varStatus="s">
    <h5>var:${i}--index:${s.index}--count:${s.count} </h5>
</c:forEach>
<hr>
<%--第二种使用方法:遍历容器--%>
<c:forEach items="${list}" var="user" varStatus="s">
    <h3>${s.count}&nbsp;&nbsp;${user.name}</h3>
</c:forEach>

</body>
</html>

页面效果:


页面效果

经常使用,这两个知识点非常简单

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容