EL & JSTL

1、JSP

1.1、指令

作用:用于配置 JSP 页面,导入资源文件。

格式<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>

分类

  1. page:配置 JSP 页面的

    • contentType:等同于 response.setContentType()
      1. 设置响应体的 mime 类型以及字符集;
      2. 设置当前 jsp 页面的编码(只能是高级的 IDE 才能生效,如果使用低级工具,则需要设置 pageEncoding 属性设置当前页面的字符集)。
    • import:导包
    • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
    • isErrorPage:标识当前也是是否是错误页面
      • true:是,可以使用内置对象 exception
      • false:否。默认值。不可以使用内置对象 exception

    创建一个 index.jsp:

    <%@ page errorPage="500.jsp" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" buffer="16kb" %>
    <%@ page import="java.util.ArrayList" %>
    <%@ page import="java.util.List" %>
    <!DOCTYPE html>
    <html>
    <head>
        <title>JSP - Hello World</title>
    </head>
    <body>
    
        <%
            List list = new ArrayList();
            int i = 3/0;
        %>
    
    <h1><%= "Hello World!" %>
    </h1>
    <br/>
    <a href="hello-servlet">Hello Servlet</a>
    </body>
    </html>
    

    创建一个 500.jsp:

    <%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>服务器正忙...</h1>
        <%
            String message = exception.getMessage();
            out.print(message);
        %>
    </body>
    </html>
    
  2. include:页面包含的。导入页面的资源文件

    创建一个 top.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <h1>页面logo页面标题</h1>
    

    创建一个 home.jsp:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ include file="top.jsp"%>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h3>主体信息</h3>
    </body>
    </html>
    
  3. taglib:导入资源

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    prefix:前缀,自定义的,以后使用的时候直接使用。

1.2、注释

  1. html 注释:

    <!-- -->:只能注释 html 代码片段

  2. jsp 注释:推荐使用

    <%-- --%>:可以注释所有

1.3、内置对象

内置对象:在 jsp 页面中不需要创建,直接使用的对象。

一共有 9 个:

变量名真实类型作用
pageContextPageContext当前页面共享数据,还可以获取其他八个内置对象
requestHttpServletRequest一次请求访问的多个资源(转发)
sessionHttpSession一次会话的多个请求间
applicationServletContext所有用户间共享数据
responseHttpServletResponse响应对象
pageObject当前页面(Servlet)的对象 this
outJspWriter输出对象,数据输出到页面上
configServletConfigServlet 的配置对象
exceptionThrowable异常对象

2、MVC 开发模式

  1. jsp 演变历史

    1. 早期只有 servlet,只能使用 response 输出标签数据,非常麻烦;
    2. 后来又 jsp,简化了 Servlet 的开发,如果过度使用 jsp,在 jsp 中即写大量的 java 代码,又写 html 表,造成难于维护,难于分工协作;
    3. 再后来,java 的 web 开发,借鉴 mvc 开发模式,使得程序的设计更加合理性。
  2. MVC:

    • M:Model,模型。JavaBean

      完成具体的业务操作,如:查询数据库,封装对象

    • V:View,视图。JSP

      展示数据

    • C:Controller,控制器。Servlet

      • 获取用户的输入
      • 调用模型
      • 将数据交给视图进行展示

    在这里插入图片描述

    优缺点:

    1. 优点:

      • 耦合性低,方便维护,可以利于分工协作
      • 重用性高
    2. 缺点:

      使得项目架构变得复杂,对开发人员要求高


3、EL 表达式

概念:Expression Language 表达式语言

作用:替换和简化 jsp 页面中 java 代码的编写

语法${表达式}

注意

  • jsp 默认支持 el 表达式的。如果要忽略 el 表达式
    1. 设置 jsp 中 page 指令中:isELIgnored="true" 忽略当前 jsp 页面中所有的 el 表达式;
    2. \${表达式} :忽略当前这个 el 表达式。

使用

  1. 运算:

    运算符:

    1. 算数运算符: + - * /(div) %(mod)
    2. 比较运算符: > < >= <= == !=
    3. 逻辑运算符: &&(and) ||(or) !(not)
    4. 空运算符: empty
      • 功能:用于判断字符串、集合、数组对象是否为 null或者长度是否为 0
      • ${empty list}:判断字符串、集合、数组对象是否为null 或者长度为 0
      • ${not empty str}:表示判断字符串、集合、数组对象是否不为 null 并且 长度>0
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
        ${
            3 > 4
        }<br>
    
        \${
            3 > 4
        }
    
        <h3>算术运算符</h3>
        ${3 + 4}<br>
        ${3 / 4}<br>
        ${3 div 4}<br>
        ${3 mod 4}<br>
    
        <h3>比较运算符</h3>
        ${3 == 4}<br>
        
        <h4>empty运算符</h4>
        <%
            String str = null;
            request.setAttribute("str", str);
    
            List list = new ArrayList();
            request.setAttribute("list", list);
        %>
        ${not empty str}<br>
        ${not empty list}
    
    </body>
    </html>
    
  2. 获取值

    1. el 表达式只能从域对象中获取值

    2. 语法:

      • ${域名称.键名}:从指定域中获取指定键的值

        域名城:

        pageScopepageContext
        requestScoperequest
        sessionScopesession
        applicationScopeapplication(ServletContext)

        举例:在 request 域中存储了 name=张三

        获取:${requestScope.name}

      • ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    
        <%
            //在域中存储数据
            session.setAttribute("name", "李四");
            request.setAttribute("name", "张三");
            session.setAttribute("age", "23");
        %>
    
        <h3>获取值</h3>
        ${requestScope.name}
        ${sessionScope.age}
        ${sessionScope.hh} <%--没有这个键,什么也不显示--%>
    
        ${name}<%--张三--%>
        ${sessionScope.name}<%--李四--%>
    
    </body>
    </html>
    
  3. 获取对象、List 集合、Map 集合的值

    1. 对象:${域名称.键名.属性名}

      本质上会去调用对象的 getter 方法

      创建 User 类:

      package com.example.domain;
      
      import java.text.SimpleDateFormat;
      import java.util.Date;
      
      public class User {
      
          private String name;
          private int age;
          private Date birthday;
      
          /**
           * 逻辑视图
           * @return
           */
          public String getBitStr(){
              if (birthday != null) {
                  //1.格式化日期对象
                  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                  //2.返回字符串即可
                  return sdf.format(birthday);
              }else {
                  return "";
              }
          }
      
          public String getName() {
              return name;
          }
      
          public int getAge() {
              return age;
          }
      
          public Date getBirthday() {
              return birthday;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
      
          public void setBirthday(Date birthday) {
              this.birthday = birthday;
          }
      }
      
      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
          <title>获取数据</title>
      </head>
      <body>
      
          <%
              User user = new User();
              user.setName("张三");
              user.setAge(23);
              user.setBirthday(new Date());
      
              request.setAttribute("u", user);
          %>
      
          <h3>获取对象中的值</h3>
          ${requestScope.u}
          <br>
      
          <%--
              通过的是对象的属性来获取
                  setter或getter方法,去掉set或get,在剩余部分,首字母变为小写
                  setName --> Name --> name
          --%>
      
          ${requestScope.u.name}<br>
          ${u.name}<br>
          ${u.age}<br>
          ${u.birthday}<br>
          ${u.birthday.month}<br>
      
          ${u.bitStr}<br>
      </body>
      </html>
      

      在这里插入图片描述

    2. List 集合:${域名称.键名[索引]}

    3. Map 集合:

      • ${域名称.键名.key名称}
      • ${域名称.键名["key名称"]}
  4. 隐式对象

    • el 表达式中有 11 个隐式对象

    • pageContext:

      获取 jsp 其他八个内置对象:

      ${pageContext.request.contextPath}:动态获取虚拟目录

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>隐式对象</title>
    </head>
    <body>
    
        ${pageContext.request}<br>
        <h4>在 jsp 页面动态获取虚拟目录</h4>
        ${pageContext.request.contextPath}
    
        <%
    //        response.sendRedirect(request.getContextPath() + "");
    
            
        %>
    
    </body>
    </html>
    

4、JSTL 标签

4.1、概念

JavaServer Pages Tag Library :JSP 标准标签库

  • 是由 Apache 组织提供的开源的免费的 jsp 标签 <标签>

4.2、作用

用于简化和替换 jsp 页面上的 java 代码。

4.3、使用步骤

  1. 导入 jstl 相关 jar 包;
  2. 引入标签库:taglib 指令: <%@ taglib %>
  3. 使用标签

4.4、常用的 JSTL 标签

  1. if:相当于 java 代码的 if 语句

    • 属性:

      test 必须属性,接受 boolean 表达式

      • 如果表达式为 true,则显示 if 标签体内容,如果为 false,则不显示标签体内容;
      • 一般情况下,test 属性值会结合 el 表达式一起使用。
    • 注意:

      c:if 标签没有 else 情况,想要 else 情况,则可以在定义一个 c:if 标签。

    <%@ 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>
    
        <%--
            c:if标签
                1.属性
                    test 必须属性,接受boolean表达式
                        如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容
                        一般情况下,test属性值会结合el表达式一起使用
                2.注意
                    c:if 标签没有 else 情况,想要 else 情况,则可以在定义一个 c:if 标签。
        --%>
    
        <c:if test="true">
            <h1>我是"真"...</h1>
        </c:if>
        <br>
    
        <%
            //判断request域中的一个list集合是否为空,如果不为空,则显示遍历集合
            List list = new ArrayList();
            list.add("aaaa");
            request.setAttribute("list", list);
    
            request.setAttribute("number", 4);
        %>
    
        <c:if test="${not empty list}">
            <h2>遍历集合</h2>
        </c:if>
    
        <c:if test="${number % 2 != 0}">
            ${number}为奇数
        </c:if>
    
        <c:if test="${number % 2 == 0}">
            ${number}为偶数
        </c:if>
    </body>
    </html>
    
  2. choose:相当于 java 代码的 switch 语句

    1. 使用 choose 标签声明 相当于 switch 声明
    2. 使用 when 标签做判断 相当于 case
    3. 使用 otherwise 标签做其他情况的声明 相当于 default
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>choose标签</title>
    </head>
    <body>
        <%--
            完成数字编号对应星期几的案例
                1.域中存储一个数字;
                2.使用choose标签取出数字;   相当于switch声明
                3.使用when标签做数字判断;   相当于case
                4.otherwise标签做一个其他情况的声明  相当于default
        --%>
    
        <%
            request.setAttribute("number", 54);
        %>
    
        <c:choose>
            <c:when test="${number == 1}">星期一</c:when>
            <c:when test="${number == 2}">星期二</c:when>
            <c:when test="${number == 3}">星期三</c:when>
            <c:when test="${number == 4}">星期四</c:when>
            <c:when test="${number == 5}">星期五</c:when>
            <c:when test="${number == 6}">星期六</c:when>
            <c:when test="${number == 7}">星期天</c:when>
    
            <c:otherwise>数字输入有误</c:otherwise>
        </c:choose>
    
    </body>
    </html>
    
  3. foreach:相当于 java 代码的 for 语句

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>foreach标签</title>
    </head>
    <body>
        <%--
            foreach:相当于 java 代码的 for 语句
                1.完成重复的操作;
                    for(int i=0; i<10; i++){...}
                    属性:
                        begin:开始值
                        end:结束值
                        var:临时变量
                        step:步长
                        varStatus:循环状态对象
                            index:容器中元素的索引,从0开始
                            count:循环次数,从1开始
                2.遍历容器;
                    List<User> list;
                    for(User user : list){...}
                    属性:
                        items:容器对象
                        var:容器中元素的临时变量
        --%>
    
        <c:forEach begin="1" end="10" var="i" step="1">
            ${i}<br>
        </c:forEach>
    
        <hr>
    
        <c:forEach begin="1" end="10" var="i" step="2">
            ${i}<br>
        </c:forEach>
    
        <hr>
    
        <c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
            ${i} <h3>${s.index}</h3> <h4>${s.count}</h4><br>
        </c:forEach>
    
        <hr>
    
        <%
            List list = new ArrayList<>();
            list.add("aaa");
            list.add("bbb");
            list.add("ccc");
    
            request.setAttribute("list", list);
        %>
    
        <c:forEach items="${list}" var="str" varStatus="s">
            ${s.index} ${s.count} ${str}<br>
        </c:forEach>
    </body>
    </html>
    

4.5、案例

需求:在 request 域中有一个存有 User 对象的 List 集合。需要使用 jstl+el 将 list 集合数据展示到 jsp 页面的表格 table 中。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.example.domain.User" %>
<%@ page import="java.util.Date" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        List list = new ArrayList<>();
        list.add(new User("张三", 23, new Date()));
        list.add(new User("李四", 24, new Date()));
        list.add(new User("王五", 25, new Date()));

        request.setAttribute("list", list);
    %>

    <table border="1" width="500" align="center">
        <tr>
            <th>编号</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>生日</th>
        </tr>
        <%--数据行--%>
        <c:forEach items="${list}" var="user" varStatus="s">

            <c:if test="${s.count % 2 == 0}">
                <tr bgcolor="#00ffff">
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.age}</td>
                    <td>${user.getBitStr()}</td>
                </tr>
            </c:if>

            <c:if test="${s.count % 2 != 0}">
                <tr bgcolor="#fff8dc">
                    <td>${s.count}</td>
                    <td>${user.name}</td>
                    <td>${user.age}</td>
                    <td>${user.getBitStr()}</td>
                </tr>
            </c:if>
        </c:forEach>
    </table>
</body>
</html>

5、三层架构

5.1、界面层(表示层)

用户看的得界面。用户可以通过界面上的组件和服务器进行交互。

5.2、业务逻辑层

处理业务逻辑的。

5.3、数据访问层

操作数据存储文件。

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐