【javaweb】EL表达式和JSTL

笔记输出来源:拉勾教育Java就业急训营

修改时间:2021年2月1日
作者:pp_x
邮箱:[email protected]

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 --%>

常用的内置对象

类别 标识符 描述
JSP pageContext PageContext 处理当前页面
作用域 pageScope 同页面作用域属性名和值有关的Map类
requestScope 同请求作用域属性名和值有关的Map类
sessionScope 同会话作用域属性和值有关的Map类
applicationScope 同应用程序作用域属性和值有关的Map类
请求参数 param 根据名称存储请求参数的Map类
paramValues 把请求参数所有值放入一个String数组的Map类
Header header 根据名称存储请求头的Map类
headerValues 把请求头所有的值放入一个String数组的Map类
Cookie cookie 根据名称存储请求附带的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="${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" %>

猜你喜欢

转载自blog.csdn.net/weixin_46303867/article/details/113525453