java之学习记录 4 - 2 - EL和JSTL核心技术(javaweb核心下)

EL表达式(熟悉)

1 基本概念
  • ELExpression Language)表达式提供了在JSP中简化表达式的方法,可以方便地访问各种数据并输出。
2 主要功能
  • 依次访问pageContextrequestsessionapplication作用域对象存储的数据。
  • 获取请求参数值。
  • 访问Bean对象的属性。
  • 访问集合中的数据。
  • 输出简单的运算结果。
3 访问内置对象的数据
 
1 )访问方式
  • <%=request.getAttribute(“ varName”)%>
  • EL实现: ${ varName }
2 )执行流程
<%@ 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","application对象中的属性值:zhaoyun");*/

    pageContext.setAttribute("name","pageContext对象中的属性值:zhangfei");
    request.setAttribute("name","request对象中的属性值:guanyu");
    session.setAttribute("name","session对象中的属性值:liubei");
    application.setAttribute("name","application对象中的属性值:zhaoyun");
%>
<%--使用jsp中原始方式获取数据和打印--%>
<%--<%= "name1的数值为:"+ pageContext.getAttribute("name1")%><br>
<%= "name2的数值为:"+ request.getAttribute("name2")%><br>
<%= "name3的数值为:"+ session.getAttribute("name3")%><br>
<%= "name4的数值为:"+ application.getAttribute("name4")%><br>--%>
<hr>
<%--使用EL表达式实现获取数据和打印--%>
<%--name1的数值为:${name1}<br>
name2的数值为:${name2}<br>
name3的数值为:${name3}<br>
name4的数值为:${name4}<br>--%>
name的数值为:${name}
</body>
</html>

4 访问请求参数的数据

  • 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="提交">
</form>
</body>
</html>

接收请求参数

<%@ page import="java.util.Arrays" %>
<%@ 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"))%>
<hr>
<%--使用el表达式中的方式获取请求参数值--%>
姓名是:${param.name}<br>
爱好是:${paramValues.hobby[0]}
</body>
</html>

5 访问Bean对象的属性

 
1 )访问方式
  • 方式一: $ { 对象名 . 属性名 },例如:${user.name}
  • 方式二: $ { 对象名 [“属性名”] },例如:${user["name"]}
2 )主要区别
 
  • 当要存取的属性名中包含一些特殊字符,如: . ,等并非字母或数字的符号,就一定要使用 [ ]不是.的方式
  • 使用[]的方式可以动态取值,具体方式如下:
<% request.setAttribute("prop","age"); %>
<!-- 相当于表达式中写一个变量 --> 
${ user[prop] }
<%@ 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("var","name");
%>
<%--使用原始的方式实现属性的获取和打印--%>
<%= "获取到的姓名为:"+ person.getName()%><br>
<%= "获取到的年龄为:"+ person.getAge()%><br>
<hr>
<%--使用el表达式实现属性的获取和打印--%>
姓名为:${person.name}<br>
年龄为:${person.age}<br>
<%--另外一种写法--%>
<hr>
${person["name"]}<br>
${person["age"]}<br>

<%--测试一下动态取值的效果--%>
<hr>
动态取值的结果为:${person[var]}
</body>
</html>

6 访问集合中的数据

<!-- student为ArrayList类型的对象 --> 
${student[0].name}
<%@ page import="java.util.LinkedList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2020/12/31 0031
  Time: 11:30
  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集合并添加数据内容
    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>
集合中下标为1的元素是:${list[1]}<br>
集合中下标为2的元素是:${list[2]}<br>
<hr>
<%--使用el表达式实现Map集合中数据内容的获取  不支持下标--%>
整个Map集合中的元素有:${map}<br>
获取带有特殊字符key对应的数值为:${map["th.ree"]}<br>
</body>
</html>

7 常用的内置对象

类别
标识符
描述
JSP
pageContext
PageContext 处理当前页面
作用域
pageScope
同页面作用域属性名称和值有关的 Map
requestScope
同请求作用域属性的名称和值有关的 Map
sessionScope
同会话作用域属性的名称和值有关的 Map
applicationScope
同应用程序作用域属性的名称和值有关的 Map
请求参数
param
根据名称存储请求参数的值的 Map
paramValues
把请求参数的所有值作为一个 String 数组来存储的 Map
请求头
header
根据名称存储请求头主要值的 Map
headerValues
把请求头的所有值作为一个 String 数组来存储的 Map
Cookie
cookie
根据名称存储请求附带的 cookie Map
初始化参数
initParam
根据名称存储 Web 应用程序上下文初始化参数的 Map
8 常用的运算符
 
1 )常用的算术运算符
算术运算符
说 明
范 例
运算结果
+${1+2}3
-${2-1}1
*${2*3}6
/ 或 div${16/5} 或 ${16div5}3.2
% 或 mod取余${16%5}或${16mod5}1
2 )常用的关系运算符
关系运算符
说 明
范 例
运算结果
== 或 eq等于${1==2}或${1 eq 2}false
!= 或 ne不等于${2!=1}或${2 ne 1}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
3 )常用的逻辑运算符
逻辑运算符
说 明
范 例
运算结果
&& 或 and与运算${true && true} 或 ${true and true}true
|| 或 or或运算${true || false} 或 ${true or false}true

! 或 not

非运算${!true} 或 ${not true}false
4 )条件运算符
 
${条件表达式? 语句1 : 语句2}

5)验证运算符

${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>
ib的数值为:${ib}<br>
b1的数值为:${b1}<br>
b2的数值为:${b2}<br>
<hr>
<%--实现算术运算符的使用--%>
ia+ib的结果为:${ia+ib}<br>
ia-ib的结果为:${ia-ib}<br>
ia*ib的结果为:${ia*ib}<br>
ia/ib的结果为:${ia/ib}<br>
ia%ib的结果为:${ia%ib}<br>
<hr>
<%--实现关系运算符的使用--%>
ia > ib的结果为:${ia > ib}<br>
ia >= ib的结果为:${ia >= ib}<br>
ia < ib的结果为:${ia < ib}<br>
ia <= ib的结果为:${ia <= ib}<br>
ia == ib的结果为:${ia == ib}<br>
ia != ib的结果为:${ia != ib}<br>
<hr>
<%--实现逻辑运算符的使用--%>
b1并且b2的结果为:${b1 && b2}<br>
b1或者b2的结果为:${b1 || b2}<br>
b1取反的结果为:${!b1}<br>
b2取反的结果为:${!b2}<br>
<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>
判断是否为空的结果是:${empty str2}<br>
判断是否为空的结果是:${empty str3}<br>
判断是否为空的结果是:${empty list1}<br>
判断是否为空的结果是:${empty list2}<br>
</body>
</html>

JSTL标签(熟悉)

1 基本概念

  • JSTL( JSP Standard Tag Library ) 被称为JSP标准标签库。
  • 开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
2 使用方式
  • 下载JSTLjar包并添加到项目中,下载地址为:https://tomcat.apache.org/download-taglibs.cgi
  • JSP页面中使用taglib指定引入jstl标签库,方式为:
<!-- 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/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.lagou.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>
<%--使用out标签打印出来--%>
<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"></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="20" 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结束 包含1和3--%>
<c:forEach var="ts" items="${sArr}" begin="1" end="3">
    <c:out value="${ts}"></c:out>
</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" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>实现常用函数标签的使用</title>
</head>
<body>
<%
    pageContext.setAttribute("var","Hello World!");
%>
原始字符串为:${var}<br>
判断该字符串是否包含指定字符串的结果为:
${fn:contains(var,"Hello")}<br>
将字符串中所有字符转换为大写的结果为:
${fn:toUpperCase(var)};<br>
将字符串中所有字符转换为小写的结果为:
${fn:toLowerCase(var)}
</body>
</html>

5 常用格式化标签

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

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

自定义标签练习:

在src下创建自定义类(HelloTag.java)

package com.lagou.demo01;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

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();
    }
}

在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://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>

在web下创建jsp文件(jstl_my.jsp)写<my:时  就会自己弹出提示

<%@ 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
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值