JavaWeb(三)------EL和JSTL技术

EL表达式(取代JSP中的表达式和取值)
概念
  • EL(Expression Language)表达式提供了在JSP中简化表达式的方法,可以方便地访问各种数据并输出。
主要功能(访问数据以及计算)
  • 依次访问pageContext、request、session和application作用域对象存储的数据。
  • 获取请求参数值。
  • 访问Bean对象的属性。
  • 访问集合中的数据。
  • 输出简单的运算结果。
访问内置对象的数据
  1. 访问方式

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

    示例

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现从内置对象中获取数据并打印</title>
    </head>
    <body>
    <%
        /*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/>
    
    </body>
    </html>
    
  2. 执行流程
    在这里插入图片描述

访问请求参数的数据
  • 在EL之前使用下列方式访问请求参数的数据
    request.getParameter(name);
    request.getParameterValues(name);
  • 在EL中使用下列方式访问请求参数的数据
    param:接收的参数只有一个值。
    paramValues:接受的参数有多个值。
    <!-- 获取指定参数的数值 -->
    ${param.name}
    <!-- 获取指定参数中指定下标的数值 -->
    ${paramValues.hobby[0]}
    
  • 示例
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现一个简单页面负责向JSP页面传递参数</title>
    </head>
    <body>
    <form action="el_param.jsp" method="post">
        姓名:<input type="text" name="name"/><br/>
        爱好:<input type="checkbox" name="hobby" value="唱歌"/>唱歌<br/>
             <input type="checkbox" name="hobby" value="跳舞"/>跳舞<br/>
             <input type="checkbox" name="hobby" value="学习"/>学习<br/>
        <input type="submit" value="提交"/><br/>
    </form>
    </body>
    </html>
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现请求参数数值的获取</title>
    </head>
    <body>
    <%
        request.setCharacterEncoding("utf-8");
    %>
    <%-- 使用JSP语法中的原始方式获取请求参数值 --%>
    <%--<%= "姓名是:" + request.getParameter("name") %><br/>
    <%= "爱好是:" + Arrays.toString(request.getParameterValues("hobby")) %><br/>--%>
    
    <%-- 使用EL表达式中的方式获取请求参数值 --%>
    姓名是:${param.name}<br/>
    爱好是:${paramValues.hobby[0]}<br/>
    </body>
    </html>
    
访问Bean对象的属性
  • 访问方式
    方式一: $ { 对象名 . 属性名 },例如:${user.name}
    方式二: $ { 对象名 [“属性名”] },例如:${user[“name”]}
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现Bean对象中属性的获取和打印</title>
    </head>
    <body>
    <%-- 使用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>
    </html>
    
  • 主要区别
  • 当要存取的属性名中包含一些特殊字符,如: . 或 ,等并非字母或数字的符号,就一定要使用 [ ]而不是.的方式
  • 使用[]的方式可以动态取值,具体方式如下:
    <%
    request.setAttribute(“prop”,“age”);
    %>
    <!-- 相当于表达式中写一个变量 -->
    ${ user[prop] }
    
访问集合中的数据
<!-- student为ArrayList类型的对象 -->
${student[0].name}

示例

<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现集合中数据内容的获取和打印</title>
</head>
<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 --%>
</body>
</html>
常用内置对象
类别标识符描述
JSP pageContextPageContext处理当前页面
作用域pageScope同页面作用域属性名称和值有关的Map类
requestScope同请求作用域属性的名称和值有关的Map类
sessionScope同会话作用域属性的名称和值有关的Map类
applicationScope同应用程序作用域属性的名称和值有关的Map类
请求参数param根据名称存储请求参数的值的Map类
paramValues把请求参数的所有值作为一个String数组来存储的Map类
请求头header根据名称存储请求头主要值的Map类
headerValues把请求头的所有值作为一个String数组来存储的Map类
Cookiecookie根据名称存储请求附带的cookie的Map类
初始化参数initParam根据名称存储Web应用程序上下文初始化参数的Map类
常用的运算符
  • 算术运算符

    算术运算符说 明范 例运算结果
    +${1+2}3
    ${2-1}1
    *${2*3}6
    / 或 div 16 / 5 或 {16/5}或 16/5{16div5}3.2
    % 或 mod取余KaTeX parse error: Expected '}', got 'EOF' at end of input: {16%5}或{16mod5}1
  • 关系运算符

    关系运算符说 明范 例运算结果
    ==或eq等于 1 = = 2 或 {1==2}或 1==2{1 eq 2}false
    != 或ne不等于 2 ! = 1 或 {2!=1}或 2!=1{1 ne 2}true
    < 或lt小于 2 < 3 或 {2<3}或 2<3{2 lt 3 }true
    > 或 gt大于 16 > 5 或 {16>5}或 16>5{16 gt 5}true
    <= 或 le小于等于 16 < = 5 或 {16<=5}或 16<=5{16 le 5}false
    >= 或 ge大于等于 16 > = 5 或 {16>=5}或 16>=5{16 ge 5}true
  • 常用的逻辑运算符

    逻辑运算符说 明范 例运算结果
    && 或 and与运算$ {true&&true}或${true and true}true
    || 或or或运算$ {true ||false } 或 $ {true or false}true
    ! 或not非运算${!true}或 $ {not true }false
  • 条件运算符

    ${条件表达式? 语句1 : 语句2}
    
  • 验证运算符

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

    <%@ page import="java.util.List" %>
    <%@ page import="java.util.LinkedList" %>
    <%@ page import="java.util.Arrays" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现常用运算符的使用</title>
    </head>
    <body>
    <%
        // 通过内置对象设置属性的方式来准备操作数
        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 --%>
    
    </body>
    </html>
    
JSTL标签(取代JSP页面上的Java代码)
概念
  • JSTL( JSP Standard Tag Library ) 被称为JSP标准标签库。
  • 开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
使用方式
  • 下载JSTL的jar包并添加到项目中,下载地址为:https://tomcat.apache.org/download-taglibs.cgi
  • 在JSP页面中使用taglib指定引入jstl标签库,方式为:
    <!-- prefix属性用于指定库前缀 -->
    <!-- uri属性用于指定库的标识 -->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
常用核心标签
  1. 输出标签
    <c:out></c:out> 用来将指定内容输出的标签
    
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ 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" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现set标签的使用</title>
    </head>
    <body>
    <%-- 表示设置一个名字为name的属性,对应的数值为zhangfei,有效范围为:page --%>
    <%-- pageContext.setAttibute("name", "zhangfei") --%>
    <c:set var="name" value="zhangfei" scope="page"></c:set>
    <%-- 使用out标签打印出来 --%>
    <c:out value="${name}"></c:out>
    <hr/>
    
    <%-- 设置一个对象的属性值并打印出来 --%>
    <jsp:useBean id="person" class="com.nxy.demo01.Person" scope="page"></jsp:useBean>
    <c:set property="name" value="guanyu" target="${person}"></c:set>
    <c:set property="age" value="35" target="${person}"></c:set>
    <c:out value="${person.name}"></c:out>
    <c:out value="${person.age}"></c:out>
    
    </body>
    </html>
    
  3. 删除标签
    <c:remove></c:remove> 用来删除指定数据的标签
    
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现remove标签的使用</title>
    </head>
    <body>
    <%-- 设置一个属性值并打印 --%>
    <c:set var="name" value="liubei" scope="page"></c:set>
    <c:out value="${name}"></c:out>
    <hr/>
    
    <%-- 删除这个属性值后再次打印 --%>
    <c:remove var="name" scope="page"></c:remove>
    <c:out value="${name}" default="无名"></c:out>
    
    </body>
    </html>	
    
  4. 单条件判断标签
    <c:if test =“EL条件表达式”>
    满足条件执行
    </c:if >
    
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现if标签的使用</title>
    </head>
    <body>
    <%-- 设置一个变量以及对应的数值 --%>
    <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>
    
    </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" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现choose标签的使用</title>
    </head>
    <body>
    <%-- 设置一个变量代表考试的成绩并指定数值 --%>
    <c:set var="score" value="59" scope="page"></c:set>
    <c:out value="${score}"></c:out>
    <hr/>
    
    <%-- 进行多条件判断和处理 --%>
    <c:choose>
        <c:when test="${score > 60}">
            <c:out value="成绩不错,继续加油哦!"></c:out>
        </c:when>
        <c:when test="${score == 60}">
            <c:out value="60分万岁,多一份浪费!"></c:out>
        </c:when>
        <c:otherwise>
            <c:out value="革命尚未成功,同志仍需努力!"></c:out>
        </c:otherwise>
    </c:choose>
    </body>
    </html>
    
  6. 循环标签
    <c:forEach var=“循环变量” items=“集合”>
    …
    </c:forEach>
    
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ 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);
    %>
    
    <%-- 使用循环标签遍历数组中的所有元素 --%>
    <c:forEach var="ts" items="${sArr}">
        <c:out value="${ts}"></c:out>
    </c:forEach>
    <hr/>
    
    <%-- 跳跃性遍历 间隔为2  也就是跳过一个遍历一个 --%>
    <c:forEach var="ts" items="${sArr}" step="2">
        <c:out value="${ts}"></c:out>
    </c:forEach>
    <hr/>
    
    <%-- 指定起始和结尾位置 从下标1开始到3结束,包含13--%>
    <c:forEach var="ts" items="${sArr}" begin="1" end="3">
        <c:out value="${ts}"></c:out>
    </c:forEach>
    
    </body>
    </html>
    
常用函数标签
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现常用函数标签的使用</title>
</head>
<body>
<%
    pageContext.setAttribute("var", "Hello World!");
%>
原始字符串为:${var}<br/>    <%-- HelloWorld --%>
判断该字符串是否包含指定字符串的结果为:${fn:contains(var, "Hello")}<br/>   <%-- true --%>
将字符串中所有字符转换为大写的结果为:${fn:toUpperCase(var)}<br/>           <%-- HELLO WORLD!--%>
将字符串中所有字符转换为小写的结果为:${fn:toLowerCase(var)}<br/>           <%-- hello world!--%>
</body>
</html>
常用格式化标签
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page import="java.util.Date" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现格式标签的使用</title>
</head>
<body>
<%
    // 获取当前系统时间
    Date date = new Date();
    pageContext.setAttribute("date", date);
%>

当前系统时间为:${date}
<hr/>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
</body>
</html>

自定义标签
  • 如果上面几个标签不能满足需求,程序员也可以自定义标签,步骤如下:

  • 编写标签类继承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下:
    helloTag.tld

    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <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://nxy.com</uri>
    
        <!-- Invoke 'Generate' action to add tags or functions -->
        <tag>
            <name>hello</name>
            <tag-class>com.nxy.demo01.HelloTag</tag-class>
            <body-content>empty</body-content>
            <attribute>
                <name>name</name>
                <required>true</required>
            </attribute>
        </tag>
    </taglib>
    
  • 在JSP中添加taglib指令引入标签库使用:

    <%@ taglib prefix="my" uri="http://lagou.com" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>实现自定义标签的使用</title>
    </head>
    <body>
    <my:hello name="zhangfei"/>
    </body>
    </html>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值