JSP、EL、JSTL的系统学习与配合使用

JSP、EL、JSTL的系统学习与配合使用

  • JSP、EL与JSTL
  • JSP入门
    • 1.概念
    • 2.原理
    • 3.JSP的脚本
    • 4.JSP的内置对象
  • JSP进阶
    • 1.指令
    • 2.注释
    • 3.内置对象
  • EL表达式
    • 1.概念
    • 2.作用
      • 3.语法格式
    • 4.注意事项
    • 5.EL表达式的使用
  • JSTL
    • 1.概念
    • 2.作用
    • 3.使用步骤
    • 4.常用的JSTL标签
      • 1.if
      • 2.choose
      • 3.foreach
    • 5.小练习

JSP、EL与JSTL

JSP入门

JSP、EL、JSTL的系统学习与配合使用_第1张图片

1.概念

Java Server Pages:Java服务器页面

  • 一个比较特殊的页面:可以定义html标签在前端页面展示 还可以定义java代码
  • 简化书写操作

2.原理

  • JSP实质上就是一个Servlet
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
public abstract class HttpJspBase extends HttpServlet implements HttpJspPage

3.JSP的脚本

JSP定义Java代码的方式

  1. <% 代码 %>: 定义Java代码 在service方法中定义 —>service方法可以定义什么,该脚本中就可以定义什么.
  2. <%! 代码 %>: 定义Java代码 定义的代码的位置转换成java文件后 会在java类中的成员变量的位置处
  3. <%= 代码 %>: 定义Java代码 会直接输出到页面上, 输出语句定义什么 该脚本中可以定义什么

4.JSP的内置对象

含义: 在jsp页面中不需要获取和创建,可以直接使用的对象

jsp中共有 9 个内置对象

  1. pageContext

  2. request

  3. session

  4. application

  5. response

  6. page

  7. out

  8. config

  9. exception

先学习其中三个:

  • request:request.setAttribute(“msg”,“hello jsp111”);

  • response:response.getWriter().write((String) request.getAttribute(“msg”));

  • out: 本质是一个jspWriter对象 字符输出流对象 可以将数据输出到页面上 和 response.getWriter() 比较相似

    • out和response.getWriter() 的区别:

      在tomcat服务器做出响应之前,永远会先去找response缓冲区的数据 再去找out缓冲区的数据

      response.getWriter()数据输出永远在out之前

<%
    out.write("我是第一行写的000"+"
"); out.write("我是第一行写的111"+"
"); out.write("我是第一行写的222"+"
"); response.getWriter().write("我是第二行写的"+"
"); response.getWriter().write("我是第二行写的222"+"
"); %>
//页面输出  注意输出顺序
我是第二行写的
我是第二行写的222
我是第一行写的000
我是第一行写的111
我是第一行写的222

<%
      System.out.println("我这话是在jsp里面写的....");
      int i = 5;
      System.out.println(i++);
      out.write("我输出一句话试试");

      request.setAttribute("msg","hello jsp111");
      out.write((String) request.getAttribute("msg"));
      response.getWriter().write((String) request.getAttribute("msg"));

      String contextPath = request.getContextPath();
      out.write("----->虚拟目录为:"+contextPath+"<-------------");
%>      

JSP、EL、JSTL的系统学习与配合使用_第2张图片


JSP进阶

1.指令

  • 作用:用于配置当前的JSP页面的

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

  • 分类:

    1. page: 用于配置当前jsp页面的指令

      属性名分类:

      1. contentType:等同于response.setContentType()

        • 设置响应体的mime类型以及字符集
        • 设置当前jsp页面的编码(只有一些特定的高级浏览器(chrome)才可以生效,如果使用ie之类的低级浏览器不生效,需要单独指定pageEncoding="UTF-8"才可以)
        <%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp"%>
        
      2. language:设置当前jsp页面所支持的编程语言

      3. import:用于导入相关包

        <%@ page import="java.util.ArrayList" %>
        
      4. errorPage:当前页面发生异常后,会自动跳转到指定的错误页面.

      5. isErrorPage:标识当前页面是否为错误页面

        • true:当前页面是错误页面 可以直接使用exception内置对象
        • false(默认值):当前页面不是错误页面 不可以使用exception内置对象
        <%@ page isErrorPage="true" %>
        
    2. include: 页面包含 在当前页面导入特定页面的指令

//header.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"  %>

logo

<%@ include file="header.jsp" %>

  
    jsp进阶
  
  
    空空如也
  

页面输出:

JSP、EL、JSTL的系统学习与配合使用_第3张图片

  1. taglib: 导入资源的指令(类似于Java中的导包机制) 一旦引入了该资源 我们就可以使用该资源

    <%@taglib prefix=""%>
    
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    • prefix:自定义的标签前缀
    • uri:引入的外部资源

2.注释

  1. html注释: :只能注释html代码片段
  2. jsp注释:推荐使用

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

  • 当页面运行时,html代码注释会显示在页面中 而 jsp注释 加载页面时会被直接忽略(运行效率更高)

3.内置对象

  • 所谓的内置对象 指的是 可以直接在jsp页面中直接使用的对象 不需要手动创建

  • jsp中共有9个内置对象(前4个为域对象 有作用范围的可以存储数据的对象)

    变量名 真实类型 作用
    PageContext PageContext 用于当前页面共享数据,还可以获取其他八个内置对象
    request HttpServletRequest 用于一次请求访问的多个资源之间的数据共享(转发)
    session HttpSession 用于一次会话间多次请求间的数据共享
    application ServletContext 用于所有用户之间数据共享(全局)
    response HttpServletResponse 响应对象
    page Object 当前页面(Servlet)的对象 this
    out JspWriter 输出对象,用于将数据信息输出到页面上展示
    config ServletConfig Servlet的配置对象
    exception Throwable 异常对象

  • 如果四个域对象 存储了相同name值的数据 会显示哪个呢??

    依次从最小的域中去查找是否有该键对应的值,直到找到位置。

    作用范围由小到大:

    ​ PageContext、request、session、application


EL表达式

1.概念

Expression Language:表达式语言

2.作用

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

3.语法格式

${表达式}

4.注意事项

  • jsp默认支持el表达式.如果要忽略el表达式有两种方式:

    1. 设置jsp中page指令的属性 isELIgnored=“true” 忽略当前页面中所有的el表达式.

      <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="true" %>
      
    2. \${表达式内容}:忽略当前这个el表达式

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      
        
          $Title$
        
        
          ${"你好啊"}
          \${3>4}
        
      
      

在这里插入图片描述

5.EL表达式的使用

  1. 运算符

  2. 算术运算符

    + - * /(div) %(mod)

  3. 比较运算符

    > < >= <= !=

  4. 逻辑运算符

    &&(and) ||(or) !(not)

  5. 空运算符: empty

  • 功能:用于判断字符串 集合 数组对象是否为null或者长度为0 返回值 ture|false
    • ${empty list}:判断字符串 集合 数组对象是否为null或者长度为0
      • ${not empty list}:判断字符串 集合 数组对象是否不为null并且长度>0
  1. 获取值:

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

    域对象有哪些?内置对象

  3. 语法:

    1. ${域名.键名}:从指定域中获取指定的键的值
       * 域名称:
         1. pageScope------>pageContext
         2. requestScope------>request
         3. sessionScope----session
         4. applicationScope--->application(ServletContext)
    2. ${键名}:表示可以不写前面的域对象,可以直接定位域对象的属性名
       * 如果在不同的域对象中定义了相同的属性名称,最终获取到的是哪个值
       * 结论:依次从最小的域中去查找是否有该键对应的值,直到找到位置
    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    
        Title
    
    

        <%
        //域对象中存储数据
        request.setAttribute("name","张张撒");
        pageContext.setAttribute("age",18);

        pageContext.setAttribute("msg","pageContextData"); /*1:当前页面*/
        request.setAttribute("msg","requestData");/*2:一次请求间访问的多个资源*/
        session.setAttribute("msg","sessionData");/*3:一次会话中的多次请求*/
        application.setAttribute("msg","applicationData");/*4:全局*/
        %>

        

el中获取域对象存储的值

${sessionScope.msg} ${requestScope.name} ${pageScope.age} ${msg} ${name} ${age}
${msg} <%--此处的msg输出的结果应该是哪个? pageContextData --%> ${msg01} <%--如果找不到对应的键,会不显示但不会报错--%>
  1. 获取对象 List集合 Map集合中的值

    1. 对象: ${域名称.键名.属性名} 简写${键名.属性名}
    • 本质上会去调用对象中的getXxx()方法
    1. List集合:${域名称.键名[索引值]}
    2. Map集合:
    • ${域名称.键名[“key名称”]}

    • ${域名称.键名.key名称}

    • 变量 与 属性 的本质区别:

      • 成员变量:在类中定义的变量—作用于本类的.

      • 属性: 不是所有的成员变量都是属性的.

        对象的属性是这么来的:

        • 通过拆分而来: setXxx()方法和getXxx()方法—>去掉set或者get(Xxx())—>首字母变为小写
        • 例如: setName—>Name—>name
  2. 隐式对象:

  • pageContext:可以通过该隐式对象获取其他八个内置对象

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

JSTL

1.概念

JavaServer Tag Library JSP标准标签库

  • Apache组织提供的一个免费的开源的jsp标签库 <标签名>

2.作用

用于简化和替换jsp中的java代码的

3.使用步骤

  1. 引入jar包 jstl相关 2个

JSP、EL、JSTL的系统学习与配合使用_第4张图片

  1. 在jsp页面中引入标签库 taglib <%@ taglib %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  1. 使用标签

    
        

    相信我 我是真的...

    别信我 我是假的...

4.常用的JSTL标签

1.if

相当于java代码中的if条件判断语句

属性:

  • test(必须属性):接受一个boolean类型的值或表达式
    • true:则显示if标签体中的内容
    • false:不显示if标签体中的内容
  • 注意:一般情况下,该属性的值为一个boolean类型的表达式 该表达式会结合el表达式一起使用
  • 需求1:request域中存有一个list集合 判断集合是否为空并且长度>0,如果满足,遍历集合中的元素
  • 需求2:往request中存入一个数字,判断该数字为偶数或者奇数,
    如果为偶数,则打印 xx为偶数
    如果为奇数, 则打印 xx为奇数
<%
    List list = new ArrayList();
    list.add("aaa");
    list.add("bbb");
    request.setAttribute("list",list);

    Random random = new Random();
    int i = random.nextInt(100);
    request.setAttribute("i",i);
%>


    遍历集合.....${list}


${i}为奇数 ${i}为偶数

2.choose

:相当于java代码中的switch语句

  • c:choose:父标签 相当于 switch
    c:when:子标签:相当于 case
    属性:test—case标签中的判断语句
    c:otherwise:子标签—相当于default
    需求:在request中存入一个随机数(0~10) 如果随机数为1~7之间的数字 就输出对应的星期几 否则显示数字有误
<%
int num = new Random().nextInt(10);
request.setAttribute("num",num);
%>


    

${num}对应的是星期一

${num}对应的是星期二

${num}对应的是星期三

${num}对应的是星期四

${num}对应的是星期五

${num}对应的是星期六

${num}对应的是星期日

随机数${num}生成有误,请重新生成

3.foreach

c:forEach:相当于java代码中的for循环语句

  1. 完成重复性的操作: 比如打印1~10的所有整数

    for(int i = 1; i<=10;i++){}

    属性名 含义 代表的java语句
    begin 开始值 int i = 1
    end 结束值 i<=10
    var 临时变量 相当于i值
    step 步长 i的自增操作
    varStatus 循环状态对象
    
        
    i=${i}
    s.begin=${s.begin}
    s.end=${s.end}
    s.step=${s.step}
    s.count=${s.count}
    <%-- 循环次数 从1 开始 --%>
    s.index=${s.index}
    <%-- index:索引值 和本身的值一致 --%>
    s.current=${s.current}
    s.first=${s.first}
    <%-- first:判断是不是第一个 返回boolean --%>
    s.last=${s.last}
    <%-- first:判断是不是最后一个 返回boolean --%>

    运行结果的一部分:

JSP、EL、JSTL的系统学习与配合使用_第5张图片

  1. 遍历集合(容器)

    List list;
    for(User user:list){}

    属性名 含义 代表的java语句
    items 要遍历的数据源(集合) int i = 1
    var 容器内元素的临时变量 i<=10
    varStatus 循环状态对象 相当于i值
    • 属性:
      1.items:要遍历的数据源(集合)
      2.var:容器内元素的临时变量
      3.varStatus:循环状态对象
      index:容器内元素的索引值 从0开始
      count:循环次数 从1 开始
<%
    List list = new ArrayList();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    request.setAttribute("list",list);
%>


    
str--->${str}
s.index--->${s.index}
<%-- 容器内元素的索引值 从0开始 --%>
s.count--->${s.count}
<%-- 循环次数 从1开始 --%>

JSP、EL、JSTL的系统学习与配合使用_第6张图片

5.小练习

  • 需求: 在request域中存有一个list集合 集合中元素为User对象(4个user对象)
    需要使用jstl+el 将list集合数据动态展示到jsp页面的表格table中
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.huike.javabean.User" %>
<%@ page import="java.util.Date" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    
        案例
    
    

        <%
            List list = new ArrayList();
            list.add(new User("汤姆",23,new Date()));
            list.add(new User("杰瑞",13,new Date()));
            list.add(new User("肉丝",18,new Date()));
            list.add(new User("杰克",22,new Date()));
            list.add(new User("大力水手",28,new Date()));
            request.setAttribute("list",list);
        %>

        

            <%--数据行 采用 jstl+el--%>
            

                
                    
                       <%-- 区分好这里的s和user --%>
                        
用户信息表
编号 姓名 年龄 生日
${s.count} ${user.name} ${user.age} ${user.birStr}
${s.count}${user.name} ${user.age} ${user.birStr}

JSP、EL、JSTL的系统学习与配合使用_第7张图片

你可能感兴趣的:(Java)