【javaweb】EL表达式和JSTL

本文详细介绍了EL表达式的基本用法及其在JSP中的应用,包括访问内置对象、请求参数、Bean属性和集合数据等内容,并探讨了JSTL标签库的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如有侵权,私信立删

修改时间:2021年2月1日
作者:pp_x
邮箱:pp_x12138@163.com

EL表达式

简介

  • EL(Expression Language)表达式提供了在JSP中简化表达式的方法,可以方便地访问各种数据并输出

主要功能

  • 依次访问pageContextrequestsessionapplication作用域对象存储的数据。
  • 获取请求参数值。
  • 访问Bean对象的属性。
  • 访问集合中的数据。
  • 输出简单的运算结果。

访问内置对象的数据

语法

  • 传统jsp:<%=request.getAttribute(“ varName”)%>
  • EL表达式: ${ varName }
  • 如果遇到同名参数,表达式以作用域从小到大查询。

示例代码

<%
    /*pageContext.setAttribute("name1", "pageContext对象中的属性值:zhangfei");
    request.setAttribute("name2", "request对象中的属性值:guanyu");
    session.setAttribute("name3", "session对象中的属性值:liubei");
    application.setAttribute("name4", "session对象中的属性值:zhaoyun");*/
    //pageContext.setAttribute("name", "pageContext对象中的属性值:zhangfei");
    //request.setAttribute("name", "request对象中的属性值:guanyu");
    //session.setAttribute("name", "session对象中的属性值:liubei");
    application.setAttribute("name", "session对象中的属性值:zhaoyun");
%>

<%-- 使用JSP中原始方式获取数据和打印 --%>
<%--<%= "name1的数值为:" + pageContext.getAttribute("name1") %><br/>   &lt;%&ndash; zhangfei &ndash;%&gt;
<%= "name2的数值为:" + request.getAttribute("name2") %><br/>       &lt;%&ndash; guanyu &ndash;%&gt;
<%= "name3的数值为:" + session.getAttribute("name3") %><br/>       &lt;%&ndash; liubei &ndash;%&gt;
<%= "name4的数值为:" + application.getAttribute("name4") %><br/>   &lt;%&ndash; zhaoyun &ndash;%&gt;--%>
<%-- 使用EL表达式实现获取数据和打印 --%>
<h1>name1的数值为:${name1}</h1><br/>
name2的数值为:${name2}<br/>
name3的数值为:${name3}<br/>
name4的数值为:${name4}<br/>
<h1>name的数值为:${name}</h1><br/>

访问请求参数的数据

访问方式

  • 传统方式
    • request.getParameter(name);
    • request.getParameterValues(name);
  • EL表达式
    • param:接收的参数只有一个值。
    • paramValues:接受的参数有多个值。

示例代码

<%
    request.setCharacterEncoding("utf-8");
%>
<%-- 使用JSP语法中的原始方式获取请求参数值 --%>
<%--<%= "姓名是:" + request.getParameter("name") %><br/>
<%= "爱好是:" + Arrays.toString(request.getParameterValues("hobby")) %><br/>--%>

<%-- 使用EL表达式中的方式获取请求参数值 --%>
姓名是:${param.name}<br/>
爱好是:${paramValues.hobby[0]}<br/>

访问bean对象的属性

访问方式

  • $ { 对象名 . 属性名 },例如:${user.name}
  • $ { 对象名 [“属性名”] },例如:${user["name"]}
  • 两者区别:如果属性名中含有特殊字符(.,)等就一定要使用[]的方式,[]的方式可以动态的取值

示例代码

<%-- 使用JSP语法规则中的原始方式实现对象的创建和设置以及输出 --%>
<%
    Person person = new Person();
    person.setName("zhangfei");
    person.setAge(30);
    pageContext.setAttribute("person", person);

    pageContext.setAttribute("var1", "name");
    pageContext.setAttribute("var2", "age");
%>

<%--<%= "获取到的姓名为:" + person.getName() %><br/>
<%= "获取到的年龄为:" + person.getAge()  %><br/>--%>
<%-- 使用EL表达式实现属性的获取和打印 --%>
<%--获取到的姓名是:${person.name}<br/>
获取到的年龄是:${person.age}<br/>--%>
<%-- 另外一种写法 --%>
${person["name"]}<br/>
${person["age"]}<br/>
<%-- 测试一下动态取值的效果 --%>
动态取值的结果为:${person[var1]}

访问集合中的数据

<body>
<%
    // 准备一个List集合并添加数据内容
    List<String> list = new LinkedList<>();
    list.add("two");
    list.add("one");
    list.add("three");
    // 将整个集合放入指定的内置对象中
    pageContext.setAttribute("list", list);

    // 准备一个Map集合并添加数据
    Map<String, Integer> map = new HashMap<>();
    map.put("one", 1);
    map.put("two", 2);
    map.put("th.ree", 3);
    // 将整个集合放入指定的内置对象中
    pageContext.setAttribute("map", map);
%>

<%-- 使用EL表达式实现集合中数据内容的获取 --%>
集合中下标为0的元素是:${list[0]}<br/>    <%-- two --%>
集合中下标为1的元素是:${list[1]}<br/>    <%-- one --%>
集合中下标为2的元素是:${list[2]}<br/>    <%-- three --%>
<hr/>
<%-- 使用EL表达式实现Map集合中数据内容的获取 不支持下标 --%>
整个Map集合中的元素有:${map}<br/>
获取带有特殊字符key对应的数值为:${map["th.ree"]}<br/>   <%-- 3 --%>

常用的内置对象

类别标识符描述
JSPpageContextPageContext 处理当前页面
作用域pageScope同页面作用域属性名和值有关的Map类
requestScope同请求作用域属性名和值有关的Map类
sessionScope同会话作用域属性和值有关的Map类
applicationScope同应用程序作用域属性和值有关的Map类
请求参数param根据名称存储请求参数的Map类
paramValues把请求参数所有值放入一个String数组的Map类
Headerheader根据名称存储请求头的Map类
headerValues把请求头所有的值放入一个String数组的Map类
Cookiecookie根据名称存储请求附带的cookie的Map类
初始化参数initParam根据名称存储Web应用程序上下文初始化参数的Map类

常用的运算符

算术运算符

符号含义范例结果
+${1+2}3
-${2-1}1
*${2*3}6
/或div${16/5}${16div5}3.2
%或mod取余${16%5}${16mod5}1

关系运算符

符号含义范例结果
==或eq等于${1==2}${1 eq 2}false
!= 或ne不等于${2!=1}${1 ne 2}true
< 或lt小于${2<3}${2 lt 3 }true
> 或 gt大于${16>5}${16 gt 5}true
<= 或 le小于等于${16<=5}${16 le 5}false
>= 或 ge大于等于${16>=5}${16 ge 5}true

逻辑运算符

- and 或 &&
- or 或 ||
- not 或 !

条件运算符

${条件表达式? 语句1 : 语句2}

验算运算符

  • 返回布尔值判断表达式是否为"空"值,null值、无元素的集合或数组、长度为零的String被认为是空值。
    ${empty 表达式}
<%
    // 通过内置对象设置属性的方式来准备操作数
    request.setAttribute("ia", 5);
    request.setAttribute("ib", 2);
    request.setAttribute("b1", true);
    request.setAttribute("b2", false);
%>

<%-- 实现上述所有操作数的获取和打印 --%>
ia的数值为:${ia}<br/>      <%-- 5 --%>
ib的数值为:${ib}<br/>      <%-- 2 --%>
b1的数值为:${b1}<br/>      <%-- true --%>
b2的数值为:${b2}<br/>      <%-- false --%>
<hr/>

<%-- 实现算术运算符的使用 --%>
ia+ib的结果为:${ia+ib}<br/>    <%-- 7 --%>
ia-ib的结果为:${ia-ib}<br/>    <%-- 3 --%>
ia*ib的结果为:${ia*ib}<br/>    <%-- 10 --%>
ia/ib的结果为:${ia/ib}<br/>    <%-- 2.5 --%>
ia%ib的结果为:${ia%ib}<br/>    <%-- 1 --%>
<hr/>

<%-- 实现关系运算符的使用 --%>
ia大于ib的结果为:${ia > ib}<br/>  <%-- true --%>
ia大于等于ib的结果为:${ia >= ib}<br/>  <%-- true --%>
ia小于ib的结果为:${ia < ib}<br/>  <%-- false --%>
ia小于等于ib的结果为:${ia <= ib}<br/>  <%-- false --%>
ia等于ib的结果为:${ia == ib}<br/>  <%-- false --%>
ia不等于ib的结果为:${ia != ib}<br/>  <%-- true --%>
<hr/>

<%-- 实现逻辑运算符的使用 --%>
b1并且b2的结果为:${b1 && b2}<br/>  <%-- false --%>
b1或者b2的结果为:${b1 || b2}<br/>  <%-- true --%>
b1取反的结果为:${ !b1 }<br/>  <%-- false --%>
b2取反的结果为:${ !b2 }<br/>  <%-- true --%>
<hr/>

<%
    String str1 = null;
    String str2 = "";
    String str3 = "hello";

    List<Integer> list1 = new LinkedList<>();
    List<Integer> list2 = Arrays.asList(11, 22, 33, 44, 55);

    request.setAttribute("str1", str1);
    request.setAttribute("str2", str2);
    request.setAttribute("str3", str3);
    request.setAttribute("list1", list1);
    request.setAttribute("list2", list2);

%>
<%-- 实现条件运算符和验证运算符的使用 --%>
ia和ib之间的最大值为:${ia>ib? ia: ib}<br/>
判断是否为空的结果是:${empty str1}<br/>    <%-- true --%>
判断是否为空的结果是:${empty str2}<br/>    <%-- true --%>
判断是否为空的结果是:${empty str3}<br/>    <%-- false --%>
判断是否为空的结果是:${empty list1}<br/>    <%-- true --%>
判断是否为空的结果是:${empty list2}<br/>    <%-- false --%>

JSTL标签

基本概念

  • JSTL( JSP Standard Tag Library ) 被称为JSP标准标签库。
  • 开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。

需要的jar包

在这里插入图片描述

引入方式

<!-- prefix属性用于指定库前缀 --> 
<!-- uri属性用于指定库的标识 --> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

常用标签

  • <c:out></c:out>: 用来将指定内容输出的标签
  • <c:set></c:set>:用来设置属性范围值的标签
  • <c:remove></c:remove>:用来删除指定数据的标签
<%--设置一个属性值并打印--%>
<c:set var="name" value="liuxiao" scope="page"></c:set>
<c:out value="${name}"></c:out>
<c:remove var="name"></c:remove>
<c:out value="${name}" default="无名"></c:out>
  • <c:if test =“EL条件表达式”> 满足条件执行 </c:if >:单条件判断
<%-- 设置一个变量以及对应的数值 --%>
<c:set var="age" value="17" scope="page"></c:set>
<c:out value="${age}"></c:out>
<hr/>

<%-- 判断该年龄是否成年,若成年则提示已经成年了 --%>
<c:if test="${age >= 18}">
    <c:out value="已经成年了!"></c:out>
</c:if>
  • <c:choose><c:when test="EL条件表达式"></c:when></c:choose>多条件判断标签
<c:choose>
    <c:when test="${score>60}">
        <c:out value="牛"></c:out>
    </c:when>
    <c:when test="${score==60}">
        <c:out value="一般"></c:out>
    </c:when>
    <c:otherwise>
        <c:out value="不行"></c:out>
    </c:otherwise>
</c:choose>
  • 循环标签:<c:forEach var=“循环变量” items=“集合”> … </c:forEach>

自定义标签

  • 编写标签类继承SimpleTagSupport类agSupport类并重写doTag方法或doStartTag方法。
  • 标签类:
public class HelloTag extends SimpleTagSupport {
    private String name;

    public String getName() {
        return name;
    }

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

    @Override
    public void doTag() throws JspException, IOException {
        // 获取输出流
        JspWriter out = this.getJspContext().getOut();
        // 写入数据到浏览器
        out.write("自定义标签哦!" + name);
        // 关闭流对象
        out.close();
    }
}
  • 定义标签库文件(tld标签库文件)并配置标签说明文件到WEB-INF下:
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">

    <tlib-version>1.0</tlib-version>
    <short-name>my</short-name>
    <uri>http://lagou.com</uri>

    <!-- Invoke 'Generate' action to add tags or functions -->
    <tag>
        <name>hello</name>
        <tag-class>com.lagou.demo01.HelloTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>name</name>
            <required>true</required>
        </attribute>
    </tag>
</taglib>
  • 在JSP中添加taglib指令引入标签库使用
    <%@ taglib prefix="hello" uri="http://lagou.com" %>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值