【JavaWeb】JSP进阶:EL表达式和JSTL标签

本文主要内容:1.EL表达式;2.JSTL:JSP标准标签库



写在前面

JSTL仅是JSP表达式语言,而EL既是HTML也是JSP表达式语言,全称是Expression Language。 在JavaScript中也可以使用EL表达式。

JSP的代码块实在令人不忍直视,拆分标签、嵌入式写代码让人非常不习惯。EL表达式和JSTL出现,让JSP有了一丝顺滑。



一.EL表达式

1.概念

EL:Expression Language 是一种表达式语言。

2.作用

EL是用来替换和简化jsp页面中java代码的编写。

3.语法

语法格式:

${表达式}

4.注意事项

JSP默认支持EL表达式的。如果要忽略EL表达式,有以下两种方法实现:

  1. 设置jsp中page指令中:属性isELIgnored="true" 忽略当前jsp页面中所有的EL表达式
  2. \${表达式} :在$符号前面加上反斜杠\,表示忽略当前这个EL表达式。

5.EL表达式使用

5.1 运算

表达式中支持以下运算符:

  1. 算数运算符: +   -    *    /(或div)    %(或mod)
  2. 比较运算符: >   <    >=   <=    ==    !=
  3. 逻辑运算符: &&(and)    ||(or)    !(not)
  4. 空运算符: empty

空运算符empty的功能比较强大:

  • 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
  • ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
  • ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0

例子:elDemo1.jsp
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式</title>
</head>
<body>

    <%--运算符--%>
    ${3>4};
    <%--忽略EL表达式--%>
    \${3>4};
    <hr/>

    <h3>算数运算符</h3>
    ${3+4}<br>
    ${3/4}<br>
    ${3 div 4}<br>
    ${3 % 4 }<br>
    ${3 mod 4}<br>

    <h3>比较运算符</h3>
    ${3>4 && 3<4}<br>
    ${3>4 and 3<4}<br>

    <h3>empty运算符</h3>
    <%
        String str = "";
        request.setAttribute("str",str);

        List list = new ArrayList<String>();
        request.setAttribute("list",list);
    %>

    ${not empty str}
    ${not empty list}
</body>
</html>

访问elDemo1.jsp

在这里插入图片描述


5.2 获取值

EL表达式只能从域对象中获取值。

语法:

1.${域名称.键名}:从指定域中获取指定键的值。

常见域有:

域名称对应的域
pageScopepageContext域
requestScoperequest域
sessionScopesession域
applicationScopeapplication(ServletContext)全局域

域大小:pageContext < request < session < application(ServletContext)

例子:在request域中存储了【name=张三】的数据。

<!-- JSP中:EL表达式获取name值 -->
${requestScope.name}

整个${requestScope.name}值为张三



2.简化的语法

  • ${键名}:表示依次从最小的域中查找是否有该键名对应的值,直到找到为止。没有则不显示

例子:elDemo2.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL获取域中的数据</title>
</head>
<body>

    <%
        //在域中存储数据
        session.setAttribute("name","李四");
        session.setAttribute("age","23");
        request.setAttribute("name","张三");
        request.setAttribute("str","");
    %>

    <h3>EL获取值</h3>
    ${requestScope.name}
    ${sessionScope.age}
    ${sessionScope.haha}
    <hr>
    简化格式,由域小到大匹配键对应的值。<br>
    ${name}
    ${sessionScope.name}

</body>
</html>

访问elDemo2.jsp

在这里插入图片描述

5.3 获取对象、List集合、Map集合的值

1.获取对象

语法:

  • ${域名称.键名}:域中某个键的值是一个对象。
  • ${域名称.键名.属性名}:获取对象的属性值, 本质上会去调用对象的getter方法。


2.List集合

语法:

  • ${域名称.键名[索引]}:域中某个键的值是一个List对象。加上索引可以获取到集合中对应的值。

3.Map集合

获取Map集合中的值有两种方式:

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

例子:elDemo3.jsp

<%@ page import="com.dong.domain.User" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el获取数据</title>
</head>
<body>

    <%
        //创建User对象
        User user = new User();
        user.setName("董小帅");
        user.setAge(21);
        user.setBirthday(new Date());

        //向域中存储数据
        request.setAttribute("user",user);

        //List集合
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add(user);
        request.setAttribute("list",list);

        //Map集合
        Map map = new HashMap();
        map.put("name","李四");
        map.put("gender","男");
        map.put("user",user);
        request.setAttribute("map",map);
    %>

    <h3>el获取对象中的值</h3>
    ${requestScope.user}

    <%--
        * 通过的是对象的属性来获取
            * setter或getter方法,去掉set或get,在将剩余部分,首字母变为小写。
            * setName --> Name --> name
    --%>
    ${requestScope.user.name}<br>
    ${user.name}<br>
    ${user.age}<br>
    ${user.birthday}<br>
    ${user.birthday.month}<br>
    <%--获取自定义属性--%>
    ${user.birStr}

    <h3>el获取List值</h3>
    ${list}<br>
    ${list[0]}<br>
    ${list[1]}<br>
    ${list[10]}<br>
    ${list[2].name}<br>

    <h3>el获取Map值</h3>
    ${map.gender}<br>
    ${map["gender"]}<br>
    ${map.user.name}<br>
</body>
</html>

访问elDemo3.jsp

在这里插入图片描述


5.4 使用隐式对象

EL表达式中有11个隐式对象,不常用到,了解其中一个就可以了:

  • pageContext:获取JSP其他八个内置对象

pageContext对象常用于动态获取虚拟目录。${pageContext.request.contextPath}:动态获取虚拟目录。


例子:elDemo4.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>el隐式对象</title>
</head>
<body>

    <%--获取request对象--%>
    ${pageContext.request}<br>
    <h3>在jsp页面动态获取虚拟目录</h3>
    ${pageContext.request.contextPath}

</body>
</html>

访问elDemo4.jsp

在这里插入图片描述


二.JSTL标准标签库

1.概念

JSTL:JavaServer Pages Tag Library,JSP标准标签库。

是由Apache组织提供的开源的免费的jsp标签,<标签>。

2.作用

也是用于简化和替换jsp页面上的java代码。

3.使用步骤

  1. 导入jstl相关jar包
  2. 在JSP页面中引入标签库:taglib指令: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. 使用标签

jstl相关jar包下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

拉到下面下最新版

在这里插入图片描述
下完解压后进入lib文件夹把两个jar复制到你项目的lib里面并导入项目
在这里插入图片描述


4.常用的JSTL标签

4.1 if:相当于java代码的if语句

属性有:

  • test :必须属性,接受boolean表达式。
    • 如果boolean表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容。
    • 一般情况下,test属性值会结合el表达式一起使用。

注意事项:c:if标签没有else情况,想要else情况,则可以再定义一个c:if标签,实现else逻辑。

例子:jstlDemo1.jsp

<%@ 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>if标签</title>
</head>
<body>
    
    <c:if test="true">
        <h1>我一直真心</h1>
    </c:if>
    <br>

    <%
        //判断request域中的一个list集合是否为空,如果不为Null则显示遍历集合
        List<String> list = new ArrayList<String>();
        list.add("dong");
        request.setAttribute("list",list);
        request.setAttribute("number",4);
    %>
    <c:if test="${not empty list}">
        我在遍历集合...
    </c:if>
    <br>
    <c:if test="${number % 2 != 0}">
        ${number}为奇数
    </c:if>
    <br>
    <c:if test="${number % 2 ==0}">
        ${number}为偶数
    </c:if>
</body>
</html>

访问jstlDemo1.jsp

在这里插入图片描述



4.2 choose:相当于java代码的switch语句

  • 使用choose标签声明:相当于switch声明
  • 使用when标签做判断:相当于case
  • 使用otherwise标签做其他情况的声明:相当于default

例子:jstlDemo2.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>choose标签</title>
</head>
<body>

    <%--
        完成数字编号对应星期几案例
            1.域中存储一数字
            2.使用choose标签取出数字         相当于switch声明
            3.使用when标签做数字判断         相当于case
            4.otherwise标签做其他情况的声明  相当于default
    --%>
    <%
        request.setAttribute("number",2);
    %>

    <c:choose>
        <c:when test="${number == 1}">星期一</c:when>
        <c:when test="${number == 2}">星期二</c:when>
        <c:when test="${number == 3}">星期三</c:when>
        <c:when test="${number == 4}">星期四</c:when>
        <c:when test="${number == 5}">星期五</c:when>
        <c:when test="${number == 6}">星期六</c:when>
        <c:when test="${number == 7}">星期天</c:when>
        <c:otherwise>数字输入有误</c:otherwise>
    </c:choose>
</body>
</html>

访问jslDemo2.jsp

在这里插入图片描述


4.3 foreach:相当于java代码的for语句

1.完成重复的操作

<c:forEach var="i" begin="1" end="10"  step="1" varStatus="s">循环体代码</c:forEach>

等价于Java中:

for(int i = 0; i < 10; i ++){循环体代码<}

forEach中的属性:
  • begin:开始值
  • end:结束值
  • var:临时变量
  • step:步长
  • varStatus:循环状态对象,状态对象的属性:
    1. index:容器中元素的索引,从0开始
    2. count:循环次数,从1开始

2.遍历容器(集合等)

Java中遍历List集合:

List<User> list;
for(User user : list){//代码}

等价于forEach标签:

<c:forEach var="value" items="${list}" varStatus="s">代码</c:forEach>

属性介绍:
  • items:容器对象
  • var:容器中元素的临时变量
  • varStatus:循环状态对象,状态对象的属性:
    1. index:容器中元素的索引,从0开始
    2. count:循环次数,从1开始

例子:jstlDemo3.jsp

<%@ 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>foreach标签</title>
</head>
<body>
    
    <c:forEach var="i" begin="1" end="10"  step="2" varStatus="s">
        ${i}
        索引值:${s.index}
        循环次数:${s.count}
        <br>
    </c:forEach>
    <hr>

    <h3>遍历集合</h3>
    <%
        List list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        request.setAttribute("list",list);
    %>
    <c:forEach var="value" items="${list}" varStatus="s">
        <%--索引 循环次数 值--%>
        ${s.index} ${s.count} ${value}<br>
    </c:forEach>

</body>
</html>

访问jstlDemo3.jsp

在这里插入图片描述


5.EL和JSTL标签练习

需求:在request域中有一个存有User对象的List集合。需要使用jstl+el技术将List集合数据展示到jsp页面的表格table中。

代码:
User.java

/**
 * 用户的javaBean
 */
public class User {
    private String name;
    private int age;
    private Date birthday;

    public User() {
    }

    public User(String name, int age, Date birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    /**
     * 逻辑视图,增强生日属性方法
     * @return
     */
    public String getBirStr(){
        if(birthday != null){
            //1.格式化日期对象
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //2.返回字符串即可
            return sdf.format(birthday);
        }else{
            return "";
        }
    }
}

代码实现:jstlTest.jsp

<%@ page import="java.util.List" %>
<%@ page import="com.dong.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %>
<%@ 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>

    <%
        List<User> list = new ArrayList<User>();
        list.add(new User("董小帅",21,new Date()));
        list.add(new User("张三",23,new Date()));
        list.add(new User("李四",25,new Date()));

        request.setAttribute("list",list);
    %>

    <table border="1" width="500">
        <%--表格头--%>
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>生日</th>
        </tr>
        <%--数据行--%>
        <c:forEach var="user" items="${list}" varStatus="s">
            <%--奇数行是绿色,偶数行是橘色--%>
            <c:if test="${s.count % 2 != 0}">
                <tr bgcolor="#adff2f">
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.age}</td>
                    <td>${user.birStr}</td>
                </tr>
            </c:if>

            <c:if test="${s.count % 2 == 0}">
                <tr bgcolor="orange">
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.age}</td>
                    <td>${user.birStr}</td>
                </tr>
            </c:if>

        </c:forEach>

    </table>
</body>
</html>

访问jstlTest.jsp

在这里插入图片描述
练习完成,到这对EL表达式和JSTL标签理解应该比较清晰了。


欢迎点赞评论,指出不足,笔者由衷感谢哦!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值