EL和JSTL核心技术

一、El表达式(熟悉)

1、基本概念

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

2、主要功能

  • 依次访问pageContext、request、session和application作用
  • 域对象存储的数据。
  • 获取请求参数值。
  • 访问Bean对象的属性。
  • 访问集合中的数据。
  • 输出简单的运算结果。
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/17
  Time: 14:37
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现从内置对象中获取数据并打印</title>
</head>
<body>
<%
    /*pageContext.setAttribute("name1", "pageContext对象中的属性值:赵云");
    request.setAttribute("name2", "request对象中的属性值:吕布");
    session.setAttribute("name3", "session对象中的属性值:典韦");
    application.setAttribute("name4", "application对象中的属性值为:马超");*/

    session.setAttribute("name", "session对象中的属性值:典韦");
    request.setAttribute("name", "request对象中的属性值:吕布");
    application.setAttribute("name", "application对象中的属性值为:马超");
    pageContext.setAttribute("name", "pageContext对象中的属性值:赵云");
%>
<%--使用jsp中原始方式获取数据并打印--%>
<%--<%= "name1的数值为:" + pageContext.getAttribute("name1") %><br/>
<%= "name2的数值为:" + request.getAttribute("name2") %><br/>
<%= "name3的数值为:" + session.getAttribute("name3") %><br/>
<%= "name4的数值为:" + application.getAttribute("name4") %><br/>--%>

<%-- 使用EL表达式十三年获取数据和打印 --%>
<%--<h1>name1的数值为:${name1}</h1><br/>
name2的数值为:${name2}<br/>
name3的数值为:${name3}<br/>
name4的数值为:${name4}<br/>--%>
<%--当name值相同时:依次访问pageContext、request、session和application作用--%>
name的数值为:${name} <%-- 输出:pageContext对象中的属性值:赵云 --%>
</body>
</html>

3、访问内置对象的数据

1.访问方式

  • <%=request.getAttribute(“ varName”)%>
  • 用EL实现: ${ varName }

2.执行流程

image-202108161520508754、访问请求参数的数据

  • 在EL之前使用下列方式访问请求参数的数据
    request.getParameter(name);
    request.getParameterValues(name);
  • 在EL中使用下列方式访问请求参数的数据
    param:接收的参数只有一个值。
    paramValues:接受的参数有多个值。
<!-- 获取指定参数的数值 -->
${param.name}
<!-- 获取指定参数中指定下标的数值 -->
${paramValues.hobby[0]}

5、访问Bean对象的属性

1.访问方式

  • 方式一: $ { 对象名 . 属性名 },例如:${user.name}
  • 方式二: $ { 对象名 [“属性名”] },例如:$​{user["name"]}

2.主要区别

  • 当要存取的属性名中包含一些特殊字符,如: . 或 ,等并非字母或数字的符号,就一定要使用 [ ]而不是.的方式
  • 使用[]的方式可以动态取值,具体方式如下:
<%
    request.setAttribute(“prop”,“age”);
%>
<!-- 相当于表达式中写一个变量 -->
${ user[prop] }
<%@ page import="com.soldier.demo.Person" %><%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/17
  Time: 15:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现bean对象中属性的获取和打印</title>
</head>
<body>
<%-- 使用JSP语法规则中的原始方式实现对象的创建、设置以及输出 --%>
<%
    Person person = new Person();
    person.setName("吕布");
    person.setAge(30);
    pageContext.setAttribute("person", person);

    /*pageContext.setAttribute("var", "name");*/
    pageContext.setAttribute("var", "age");
%>
<%--<%= "获取到的姓名为:" + person.getName() %><br/>
<%= "获取到的年龄为:" + person.getAge() %><br/>--%>

<%-- 使用El表达式实现属性的获取并打印 --%>
<%--获取到的姓名为:${person.name}<br/>
获取到的年龄为:${person.age}<br/>--%>
<%-- 另一种方式--%>
姓名:${person["name"]}<br/>
年龄:${person["age"]}<br>

<%-- 测试一下动态取值的效果 --%>
<%--动态取值的结果为:${person[var]} &lt;%&ndash; 输出:吕布 &ndash;%&gt;--%>
动态取值的结果为:${person[var]} <%-- 输出:30 --%>
</body>
</html>

6、访问集合中的数据

<!-- student为ArrayList类型的对象 -->
${student[0].name}
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/17
  Time: 17:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现集合中的数据获取和打印</title>
</head>
<body>
<%
    // 准备一个集合添加数据内容
    List<String> list = new ArrayList();
    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);

    // 将整个Map集合放入指定的内置对象中
    pageContext.setAttribute("map", map);
%>

<%-- 使用EL表达式实现集合中数据内容的获取 --%>
集合中下标为0的元素为:${list[0]}<br/>
集合中下标为1的元素为:${list[1]}<br/>
集合中下标为2的元素为:${list[2]}<br/>

<hr/>

map集合中所有元素为:${map}<br/>
获取带有特殊字符key的map:${map["th.ree"]}<br/>

</body>
</html>

7、常用的内置对象

image-20210816152408577

8、常用的运算符

1.常用的算术运算符

image-20210816152451187

2.常用的关系运算符

image-20210816152511988

3.常用的逻辑运算符

image-20210816152541870

4.条件运算符

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

5.验证运算符

${empty 表达式}
返回布尔值判断表达式是否为"空"值,null值、无元素的集合或数组、长度为零的String被认为是空值。

二、JSTL标签(熟悉)

1、基本概念

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

2、使用方式

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

3、常用的核心标签

1.输出标签

<c:out></c:out> 用来将指定内容输出的标签
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 15:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现out输出标签的使用</title>
</head>
<body>
<c:out value="Hello World"></c:out>
</body>
</html>

2.设置标签

<c:set></c:set> 用来设置属性范围值的标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 16:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现set标签的使用</title>
</head>
<body>
<%-- 设置一个名字为name的属性,对应的数值为赵云,有效范围page--%>
<%-- pageContext.setAttibute("name", "赵云") --%>
<c:set var="name" value="赵云" scope="page"></c:set>
<%-- 使用out标签打印出来 --%>
<c:out value="${name}"></c:out>

<hr/>
<%-- 设置一个对象的属性值并打印出来 --%>
<jsp:useBean id="person" class="com.soldier.demo.Person" scope="page"></jsp:useBean>
<c:set property="name" value="吕布" target="${person}"></c:set>
<c:set property="age" value="30" target="${person}"></c:set>

<c:out value="${person.name}"></c:out><br/>
<c:out value="${person.age}"></c:out><br/>
</body>
</html>

3.删除标签

<c:remove></c:remove> 用来删除指定数据的标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 16:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现remove标签的使用</title>
</head>
<body>
<%-- 设置一个属性值并打印 --%>
<jsp:useBean id="person" class="com.soldier.demo.Person" scope="page"></jsp:useBean>
<c:set property="name" value="典韦" target="${person}"></c:set>
<c:set property="age" value="35" target="${person}"></c:set>

属性name值为:<c:out value="${person.name}"></c:out><br/>
属性age值为:<c:out value="${person.age}"></c:out><br/>

<hr/>
<%-- 删除属性值后并打印 --%>
<c:remove var="person"></c:remove>

删除后属性name值为:<c:out value="${person.name}"></c:out><br/>
删除后属性name值为:<c:out value="${person.age}"></c:out><br/>
</body>
</html>

4.单条件判断标签

<c:if test =“EL条件表达式”>
    满足条件执行
</c:if >
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 16:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现if标签的使用</title>
</head>
<body>
<%-- 设置一个变量已经对应的数值 --%>
<c:set var="age" value="17"></c:set>
<c:out value="${age}"></c:out>
<hr/>
<c:if test="${age >= 18}">
    <c:out value="已经成年"></c:out>
</c:if>
</body>
</html>

5.多条件判断标签

<c:choose >
    <c:when test =“EL表达式”>
        满足条件执行
    </c:when>
    …
    <c:otherwise>
        不满足上述when条件时执行
    </c:otherwise>
</c:choose >
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 16:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现choose标签的使用</title>
</head>
<body>
<c:set var="score" value="95"></c:set>
<c:out value="${score}"></c:out><br/>
<hr/>
<%-- 实现choose考试成绩的判断 --%>
<c:choose>
    <c:when test="${score < 60 }">
        <c:out value="不及格"></c:out><br/>
    </c:when>
    <c:when test="${score >= 60 && score < 75}">
        <c:out value="及格"></c:out><br/>
    </c:when>
    <c:when test="${score>=75 && score<90}">
        <c:out value="良好"></c:out><br/>
    </c:when>
    <c:otherwise>
        <c:out value="优秀"></c:out><br/>
    </c:otherwise>
</c:choose>
</body>
</html>

6.循环标签

<c:forEach var=“循环变量” items=“集合”>
    …
</c:forEach>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 17:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现循环标签的使用</title>
</head>
<body>
<%
    // 准备一个数组并初始化
    String[] sArr = {"11", "22", "33", "44", "55"};
    pageContext.setAttribute("sArr", sArr);
%>

<%-- 使用for循环标签遍历数组中所有元素 --%>
<c:forEach var="ts" items="${sArr}">
    <c:out value="${ts}"></c:out><br/>
</c:forEach>

<hr/>
<%-- 跳跃性遍历 --%>
<c:forEach var="ts" items="${sArr}" step="2">
    <c:out value="${ts}"></c:out><br/>
</c:forEach>

<hr/>
<%-- 指定起始位置循环 --%>
<c:forEach var="ts" items="${sArr}" begin="1" end="3">
    <c:out value="${ts}"></c:out><br/>
</c:forEach>
</body>
</html>

4、常用的函数标签

<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 17:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现常用函数的使用</title>
</head>
<body>
<%
    pageContext.setAttribute("var", "Hello World!");
%>
原始字符串为:${var}<br/> <%-- Hello World --%>
判断该字符串是否包含自定字符串的结果为:${fn:contains(var, "Hello")}<br/> <%-- true --%>
将字符串中所有字符转换为大写的结果为:${fn:toUpperCase(var)}<br> <%-- HELLO WORLD! --%>
将字符串中所有字符转换为小写的结果为:${fn:toLowerCase(var)}<br> <%-- hello world! --%>
</body>
</html>

5、常用格式化标签

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="java.util.Date" %><%--
  Created by IntelliJ IDEA.
  User: Soldier
  Date: 2021/8/18
  Time: 18:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现格式标签的使用</title>
</head>
<body>
<%
    // 获取当前系统时间
    Date date = new Date();
    pageContext.setAttribute("date", date);
%>
当前系统时间为:${date}<br/>
<hr>
格式化后的当前系统时间:<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate><br/>
</body>
</html>

6、自定义标签

  • 如果上面几个标签不能满足需求,程序员也可以自定义标签,步骤如下:
  • 编写标签类继承SimpleTagSupport类或TagSupport类并重写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.println("自定义标签的参数为:" + name);
    }
}
  • 定义标签库文件(tld标签库文件)并配置标签说明文件到到WEB-INF下:
<tag>
    <name>helloTag</name>
    <tag-class>com.lagou.demo02.HelloTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
        <name>name</name>
        <required>true</required>
    </attribute>
</tag>
  • 在JSP中添加taglib指令引入标签库使用:
<%@ taglib prefix="hello" uri="http://lagou.com" %>

本文来自博客园,作者:寒露凝珠,转载请注明原文链接:https://www.cnblogs.com/china-soldier/p/15158274.html

原文地址:https://www.cnblogs.com/china-soldier/p/15158274.html