EL表达式和JSTL标签库

第一章 EL表达式

第01节 基础理论

1、概念描述

1. 什么是 EL 表达式?
    EL  表达式是两个单词的缩写:Expression Language  表达式语言。
    
2. EL表达式有什么作用呢?
    为了使JSP写起来更加简单
​
3. EL表达式的基础格式?
    ${表达式}

2、快速入门

位置 web/expression/el01_door.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式的快速入门</title>
</head>
<body>

<%
    //这里写的是 Java代码,可以在这里存放域对象数据。
    request.setAttribute("name","zhangsan");
%>


<%-- 在页面当中快速展示效果 --%>
<%-- 写法格式一 --%>
<%
    out.print(request.getAttribute("name"));
%>

<hr>

<%-- 写法格式二 --%>
<%= request.getAttribute("name") %>

<hr>

<%-- 写法格式三:EL表达式 --%>
${name}

</body>
</html>

第02节 基础用法

1、禁用EL表达式

情况一:禁用所有的EL表达式

位置 web/expression/el02_banall.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
    可以增加一个 page 指令isELIgnored=true 表示禁用EL表达式, 默认是 false
--%>
<%@ page isELIgnored="true" %>
<html>
<head>
    <title>禁用所有的EL表达式</title>
</head>
<body>

<%-- 存放数据 --%>
<%
    request.setAttribute("name","zhangsan");
    request.setAttribute("age",23);
%>

<%-- 采用EL表达式,展示数据 --%>
${name} <br>  ${age}

</body>
</html>

情况二:禁用单个的EL表达式

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>禁用单个的EL表达式</title>
</head>
<body>

<%-- 存放数据 --%>
<%
    request.setAttribute("name","zhangsan");
    request.setAttribute("age",23);
%>

<%-- 采用EL表达式,展示数据 --%>
<%-- 如果想要不展示其中一个EL表达式,只需要添加\ 表示转义字符 --%>
${name} <br>  \${age}

</body>
</html>

2、五类数据获取

情况一:基本数据的获取

位置 web/expression/el04_data.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取基本类型数据</title>
</head>
<body>
    <%-- 往域对象当中存放数据 --%>
    <%
        pageContext.setAttribute("name","zhangsan");
        pageContext.setAttribute("age",23);
        pageContext.setAttribute("gender",'男');
        pageContext.setAttribute("score",99.9);
        pageContext.setAttribute("isStudent",true);
    %>

    <%-- 采用EL表达式获取数据 --%>
    ${name}
    <hr>
    ${age}
    <hr>
    ${gender}
    <hr>
    ${score}
    <hr>
    ${isStudent}
</body>
</html>

情况二:自定义对象类型的获取

位置 src/blb.chc01.Student

//定义学生类
public class Student {

    private String name;
    private int age;
    private boolean gender;
    private Date birthday;


    /***
     * 定义一个方法,专门用来展示 日期格式的数据
     * 将日期格式,进行日期格式化,格式化成为好看的日期格式
     *
     * 专业词汇: 逻辑视图
     * 目的:为了给 JSP页面当中的 EL表达式快速展示
     */
    public String getBirthdayMessage(){
        //想办法去格式化时间
        if (birthday!=null){
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String text = sdf.format(birthday);
            return text;
        }
        return null;
    }


    public Student() {
    }

    public Student(String name, int age, boolean gender, Date birthday) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

位置 web/expression/el05_data.jsp

<%@ page import="blb.chc01.Student" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取自定义对象类型数据</title>
</head>
<body>
    <%-- 定义域对象,存放数据 --%>
    <%
        //准备对象
        Student stu = new Student();
        stu.setName("lisi");
        stu.setAge(23);
        stu.setGender(true);
        stu.setBirthday(new Date());
        //存放到域对象
        pageContext.setAttribute("student",stu);
    %>

    <%--
        采用EL表达式去获取到数据
        注意事项:底层找到的是 getXxx() 方法
        但是对于 boolean类型而言,找到是 isXxx() 方法
    --%>
    ${student}  <br>
    ${student.name}  <br>
    ${student.age}  <br>
    ${student.gender}  <br>
    ${student.birthday}  <br>
    ${student.birthdayMessage} <br>
</body>
</html>

情况三:数组类型的获取

位置 web/expression/el06_data.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>数组类型数据的获取</title>
</head>
<body>

    <%-- 准备数据,存放到域对象当中 --%>
    <%
        String[] array = {
                "hello",
                "world",
                "java",
                "迪丽热巴",
                "古力娜扎"
        };
        //将数据,存放到域对象当中
        pageContext.setAttribute("nameArray",array);
    %>

    <%-- 采用EL表达式获取到数据 --%>
    ${nameArray}  <br>
    ${nameArray[0]}   <br>
    ${nameArray[1]}   <br>
    ${nameArray[2]}   <br>
    ${nameArray[3]}   <br>
    ${nameArray[4]}   <br>
    ${nameArray[10]}   <br>

</body>
</html>

情况四:单列集合类型的获取

位置 web/expression/el07_data.jsp

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>单列集合类型的数据获取</title>
</head>
<body>
    <%-- 准备数据,存放到域对象当中 --%>
    <%
        //准备单列集合数据
        ArrayList<String> mList = new ArrayList<>();
        mList.add("hello");
        mList.add("world");
        //将集合存放到域对象当中
        pageContext.setAttribute("mlist",mList);
    %>

    <%--
        采用EL表达式去获取到数据
        如果采用的是 get(索引) 超过范围的情况下,会出现索引越界异常
        如果采用的是 [索引] 超过范围的情况下, 不会出现索引越界异常
    --%>
    ${mlist}   <br>
    ${mlist.get(0)}  <br>
    ${mlist.get(1)}  <br>
    <%--${mlist.get(5)}  <br>--%>
    ${mlist[0]} <br>
    ${mlist[1]} <br>
    ${mlist[5]} <br>

</body>
</html>

情况五:双列集合类型的获取

位置 web/expression/el08_data.jsp

<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>双列集合的数据获取</title>
</head>
<body>
    <%-- 准备数据,存放到域对象当中 --%>
    <%
        HashMap<String,String> map = new HashMap<>();
        map.put("name","zhangsan");
        map.put("age","23");
        map.put("gender","男");
        //存放到域对象当中
        pageContext.setAttribute("hashmap",map);
    %>
    <%--
        获取到数据
        注意事项:在map集合当中,如果不存在的键,获取值也不会报错,不展示而已
    --%>
    ${hashmap}   <br>
    ${hashmap.name} <br>
    ${hashmap.age} <br>
    ${hashmap.gender} <br>
    ${hashmap.xxx} <br>

</body>
</html>

3、常见运算符

情况一:算数运算符

位置 web/expression/el09_calc.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>算数运算符</title>
</head>
<body>
    <%-- 直接写算数运算符,+ - * / % --%>
    加法操作:
    ${3+5} <br>
    <hr>
    减法操作:
    ${3-5} <br>
    <hr>
    乘法操作:
    ${3*5} <br>
    <hr>
    除法操作
    ${7/3} <br>
    ${Math.ceil(7/3)} <br>
    ${7 div 3} <br>
    <hr>
    取余数的操作
    ${7%3} <br>
    ${7 mod 3} <br>

</body>
</html>

情况二:比较运算符

位置 web/expression/el10_calc.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>比较运算符</title>
</head>
<body>

    <%-- 直接写代码 --%>
    大于:
    ${5>3}
    ${5 gt 3}
    <br><hr>
    小于:
    ${5<3}
    ${5 lt 3}
    <br><hr>
    等于:
    ${5 == 3}
    ${5 eq 3}
    <br><hr>
    大于等于:
    ${5 >= 3}
    ${5 ge 3}
    <br><hr>
    小于等于:
    ${3 <= 5}
    ${3 le 5}
    <br><hr>
    不等于:
    ${ 5 != 5}
    ${ 5 ne 5}
</body>
</html>

情况三:逻辑运算符

位置 web/expression/el11_calc.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>逻辑运算符的使用</title>
</head>
<body>
    <%-- 直接使用逻辑运算符 与或非 --%>
    逻辑与运算:
    ${ 5>3 && 9>4 }
    ${ 5>3 and 9>4 }
    <br><hr>
    逻辑或运算:
    ${ 5>3 || 4>9 }
    ${ 5>3 or 4>9 }
    <br><hr>
    逻辑非运算:
    ${ !true }
    ${ not true }
    ${ not not true }

</body>
</html>

情况四:其他运算符

位置 web/expression/el12_calc.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>其他运算符</title>
</head>
<body>
    <%-- 其他运算符包含两部分: 三元和empty --%>
    三元运算符:
    ${ 5<3?"hello":"world" }
    <br>
    <hr>

    <%--
        empty 运算符,用于判断对象是否为空
        作用1: 判断对象是否为null
        作用2:  判断字符串是否为空字符串
        作用3:  判断容器对象是否为null
    --%>
    <%
        Object obj1 = null;
        Object obj2 = new Object();
        String str1 = null;
        String str2 = "";
        String str3 = "xixi";
        int[] array1 = null;
        int[] array2 = new int[0];
        int[] array3 = new int[2];
        //将数据全部添加到页面域当中
        pageContext.setAttribute("obj1",obj1);
        pageContext.setAttribute("obj2",obj2);
        pageContext.setAttribute("str1",str1);
        pageContext.setAttribute("str2",str2);
        pageContext.setAttribute("str3",str3);
        pageContext.setAttribute("array1",array1);
        pageContext.setAttribute("array2",array2);
        pageContext.setAttribute("array3",array3);
    %>
    1、对象类型的判断empty的语法:
    ${ empty obj1}
    ${ empty obj2}
    <br><hr>
    2、字符串类型的判断empty的语法:
    ${ empty str1 }
    ${ empty str2 }
    ${ empty str3 }
    <br><hr>
    3、容器类型的判断 empty的语法:
    ${ empty array1 }
    ${ empty array2 }
    ${ empty array3 }
</body>
</html>

4、注意事项

说明

在 EL 表达式当中, 没有字符串的+ 操作(拼接操作)
如果想要实现字符串的拼接操作,应该使用 concat() 方法实现

代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式的注意事项字符串拼接</title>
</head>
<body>

    <%-- 原始的字符串拼接方式,加法拼接 --%>
    <%-- 原始的+ 拼接字符串的操作,会报错的 --%>
    ${ "hello" }    <br>

    <%--${ "hello" + "world" }   <br>--%>
    <%--
        如果我们现在就想要实现字符串的拼接,应该怎么办呢?
        很简单,直接采用 concat 进行字符串的拼接
    --%>
    ${ "hello".concat("world") }  <br>

    ${ "川哥".concat("你是").concat("真的").concat("帅") }

</body>
</html>

第03节 内置对象

1、表格说明

内置对的名称内置对象的类型内置对象的说明
PageContextjavax.servlet.PageContext表示的是 JSP 当中的 PageContext 可以获取 JSP的其他八个内置对象
pageScopejava.util.Map可以获取页面域 PageContext 的数据值
requestScopejava.util.Map可以获取请求域 Request 的数据值
sessionScopejava.util.Map可以获取会话域 Session 的数据值
applicationScopejava.util.Map可以获取应用域 ServletContext 的数据值
paramjava.util.Map相当于是 request.getParameter("xx") 方法
paramValuesjava.util.Map相当于是 request.getParameterValues("xx") 方法
headerjava.util.Map相当于是 request.getHeader("xx") 方法
headervaluesjava.util.Map相当于是 request.getHeaders("xx") 方法,返回的是数组
cookiejava.util.Map相当于是 request.getCookies() 方法, 返回的是数组
initParamjava.util.Map相当于是 servletConfig.getInitParameter("xx") 方法

2、四个域对象

说明

在这里,我们的 四个域对象:
    pageScope
    requestScope
    sessionScope
    applicationScope
他们都可以去调用  setAttribute(键,值) 去存放数据,也可以调用 getAttribute(键) 获取数据
当然在我们的 EL 表达式当中, 对于他们来说,写法如下:
    ${pageScope.键}
    ${requestScope.键}
    ${sessionScope.键}
    ${applicationScope.键}
其中域对象,可以省略不写,获取的范围会依次从 pageScope>requestScope>sessionScope>applicationScope

情况一:获取值方式,键非同名情况

位置:web/expression/el13_scope.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>四种域对象的获取值</title>
</head>
<body>

    <%-- 存值的操作 --%>
    <%
        pageContext.setAttribute("namePage", "页面域");
        request.setAttribute("nameRequest", "请求域");
        session.setAttribute("nameSession", "会话域");
        application.setAttribute("nameApplication", "应用域");
    %>
    <%-- 采用EL表达式获取数据值--%>
    页面域的获取值方式
    ${ pageScope.namePage }
    ${ namePage }
    <br>
    <hr>
    请求域的获取值方式
    ${ requestScope.nameRequest }
    ${ nameRequest }
    <br>
    <hr>
    会话域获取值的方式
    ${ sessionScope.nameSession }
    ${ nameSession }
    <br>
    <hr>
    应用域获取值的方式
    ${ applicationScope.nameApplication }
    ${ nameApplication }

</body>
</html>

情况二:获取值方式,键同名情况

位置 web/expression/el14_scope.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>四种域对象的获取值</title>
</head>
<body>

    <%-- 存值的操作 --%>
    <%
        pageContext.setAttribute("namePage", "页面域");
        request.setAttribute("nameRequest", "请求域");
        session.setAttribute("nameSession", "会话域");
        application.setAttribute("nameApplication", "应用域");
    %>
    <%-- 采用EL表达式获取数据值--%>
    页面域的获取值方式
    ${ pageScope.namePage }
    ${ namePage }
    <br>
    <hr>
    请求域的获取值方式
    ${ requestScope.nameRequest }
    ${ nameRequest }
    <br>
    <hr>
    会话域获取值的方式
    ${ sessionScope.nameSession }
    ${ nameSession }
    <br>
    <hr>
    应用域获取值的方式
    ${ applicationScope.nameApplication }
    ${ nameApplication }

</body>
</html>

情况二:获取值方式,键同名情况

位置 web/expression/el14_scope.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>四种域对象的获取值</title>
</head>
<body>

    <%-- 存值的操作 --%>
    <%
        pageContext.setAttribute("name", "页面域");
        request.setAttribute("name", "请求域");
        session.setAttribute("name", "会话域");
        application.setAttribute("name", "应用域");
    %>

    <%-- 采用EL 表达式简化的方式获取值,省略键 --%>
    当键的名称相同的情况下,省略键的方式获取值: 依次从页面域开始到应用为止
    ${ name }
    <br>
    <hr>
    <%-- 采用EL表达式获取数据值--%>
    页面域的获取值方式
    ${ pageScope.name }
    <br>
    <hr>
    请求域的获取值方式
    ${ requestScope.name }
    <br>
    <hr>
    会话域获取值的方式
    ${ sessionScope.name }
    <br>
    <hr>
    应用域获取值的方式
    ${ applicationScope.name }
</body>
</html>

3、虚拟路径获取

说明

在我们 表单提交的过程当中,form 的属性 action 需要写虚拟路径 和 servlet 路径,才能完成提交。
一般情况下,我们的虚拟路径在各个设备上面,可能设置方式不统一。
​
为了统一表单提交当中 action 当中的虚拟路径的写法,就需要采用 el 表达式里面的 PageContext 获取虚拟路径
语法格式:
       ${pageContext.request.contextPath}

代码

位置 web/expression/el15_form.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>

<h1> 超神登录界面 </h1>
<form method="get" action="${pageContext.request.contextPath}/ChaoShenServlet">
    <input type="text" name="username" placeholder="请输入账号">
    <input type="text" name="password" placeholder="请输入密码">
    <input type="submit" value="登录按钮">
</form>

</body>
</html>

位置 src/blb.chc02.ChaoShenServlet

/***
 * 超神的Servlet
 */
@WebServlet("/ChaoShenServlet")
public class ChaoShenServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ChaoShenServlet.doGet");
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("ChaoShenServlet.doPost");
        //直接获取到数据
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username = " + username);
        System.out.println("password = " + password);
    }
}

第二章 JSTL标签库

第01节 基础理论

1、概念描述

1. 什么是 JSTL 标签库? 有啥作用呢?
    概念: JSTL 是 Java server pages standarded tag library 即JSP标准标签库, 由 Apache 提供的
    作用: 利用这些标签取代JSP页面上的Java代码。 
    例如: if语句、switch语句、for循环遍历
​
2. 如何使用呢? 操作步骤?
    第一步: 导入jar包   
            javax.servlet.jsp.jstl.jar
            jstl-impl.jar
    第二步: 采用 taglib 引入标签库
    第三步: 完成JSP页面当中标签的使用

2、快速入门

位置: web/taglibrary/jstl_01door.jsp

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--
    需要使用 taglib 指令,去引入标签库
    prefix="c"  表示的是前缀的写法,c是程序员约定的,这里可以随便写,建议写c
    uri="http://java.sun.com/jsp/jstl/core"  引入核心库  core 核心
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>JSTL的快速入门</title>
</head>
<body>
    <%--
        准备数据,ArrayList集合,去遍历集合
    --%>
    <%
        ArrayList<String> mList = new ArrayList<>();
        mList.add("hello");
        mList.add("world");
        mList.add("java");
        //将数据存放到域对象当中
        pageContext.setAttribute("mlist", mList);
    %>
    <%--
        获取到数据
    --%>
    <c:forEach items="${mlist}" var="str">
        ${str}
    </c:forEach>
</body>
</html>

第02节 常用操作

1、if 语句的使用

位置: web/taglibrary/jstl_02if.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>if语句的基础用法</title>
</head>
<body>

<%-- 定义数据,放在域对象 --%>
<%
    pageContext.setAttribute("num",5);
%>

<%-- 关于if语句的使用方式 --%>
<c:if test="${ num%2 ne 0 }">
    这个数据是 奇数
</c:if>

<%-- 在if语句当中,没有else,需要在写一次 --%>
<c:if test="${ num%2 eq 0 }">
    这个数据是 偶数
</c:if>

</body>
</html>

2、switch语句的使用

位置: web/taglibrary/jstl_03switch.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
    <title>switch语句的使用</title>
</head>
<body>

<%-- 存放数据到域对象当中 --%>
<%
    pageContext.setAttribute("num",8);
%>

<%--
    采用switch语句进行分支选择
--%>
<c:choose>
    <c:when test="${num eq 1}">
        星期一 Monday
    </c:when>
    <c:when test="${num eq 2}">
        星期二 Tuesday
    </c:when>
    <c:when test="${num eq 3}">
        星期三 Wednesday
    </c:when>
    <c:when test="${num eq 4}">
        星期四 Thursday
    </c:when>
    <c:otherwise>
        输入的信息有误,嘻嘻
    </c:otherwise>
</c:choose>

</body>
</html>

3、for语句的使用

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>for循环的使用</title>
</head>
<body>

<%
    String[] array = {
            "hello","world","java"
    };
    pageContext.setAttribute("array",array);
%>

<%--
    需要采用for循环进行操作
    begin: 表示从哪里开始
    end: 表示到哪里结束
    step: 每次递增多少
    var:  每个元素的变量名称是什么
    items: 表示需要遍历的对象是谁
    varStatus: 可以用于表示 循环的对象(获取到个数 count 和下标 index)
--%>
<c:forEach begin="0" end="10" step="1" var="v" items="${array}" varStatus="vs">
    ${v} , ${vs.count} , ${vs.index}<br>
</c:forEach>

</body>
</html>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柚几哥哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值