[JavaWeb]JSPEL 表达式和 JSTL 标签库

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaWeb]JSPEL 表达式和 JSTL 标签库相关的知识,希望对你有一定的参考价值。

一、JSP

1. JSP 的定义及本质

  1. jsp 的全称是 java server pages。Java 的服务器页面,主要作用是代替 Servlet 程序回传 html 页面数据
  2. jsp 页面本质是一个 Servlet 程序,当我们第一次访问 jsp 页面的时候,Tomcat 服务器会自动把相应的 jsp 页面翻译成为一个 java 源文件,并且编译成为 .class 字节码文件(jsp.java extends org.apache.jasper.runtime.HttpJspBasae extends HttpServlet

2. JSP 的page 指令

jsp 的 page 指令可以修改 jsp 页面中的一些重要属性或者行为 <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

key含义
language表示 jsp 翻译后是什么语言文件,暂时只支持 java
contentType表示 jsp 返回的数据类型是什么,也是源码中 response.setContentType() 参数值
pageEncoding表示当前 jsp 页面文件本身的字符集
import跟 java 源代码一样,用于导包、导类
autoFlush给 out 输出流使用,设置当 out 输出流缓冲区满了之后,是否自动刷新缓冲区,默认值是 true
buffer给 out 输出流使用,设置 out 缓冲区的大小,默认是 8kb
errorPage当 jsp 页面运行出错时,自动跳转的路径,这个路径一般都是以斜杆打头,它表示请求地址为 http://ip:port/工程路径/,映射到代码的 web 目录
isErrorPage设置当前 jsp 页面是否是错误信息页面。默认是 false。如果是 true 可以获取异常信息
session设置访问当前 jsp 页面,是否会创建 HttpSession 对象。默认是 true
extends设置 jsp 翻译出来的 java 类默认继承的类

3. JSP 的三大脚本

  1. 声明脚本(极少使用):格式是 <%! java 语句 %> ,可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块、内部类等

    <%!
        private Integer a;
        private static Map<String, String> map;
    
        static 
            map.put("bear", "lcx");
        
    
        public void print() 
        
    %>
    
  2. 表达式脚本(经常使用):格式是 <%= 表达式 %> ,用于在 jsp 页面上输出数据

    1. 所有的表达式脚本都会被翻译到 _jspService() 方法中
    2. 表达式脚本都会被翻译成内容并通过 out.print() 方法输出到页面上
    3. 由于表达式脚本翻译的内容都在 _jspService() 方法中,所以 _jspService() 方法中的对象都可以直接使用 <%=request.getParameter("username")%>
    4. 表达式脚本中的表达式不能以分号结束
  3. 代码脚本:格式是 <% java 语句 %>,可以在 jsp 页面中编写自己的 java 语句

    1. 代码脚本翻译之后都在 _jspService() 方法中
    2. 由于代码脚本翻译到 _jspService() 方法中,所以在 _jspService() 方法中的现有对象都可以直接使用,如 request、response 等
    3. 可以由多个代码脚本块组合完成一个完整的 java 语句
    4. 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
  4. JSP 中的三种注释

    1. html 注释: <!-- 这是 html 注释 --> ,html 注释会被翻译到 java 源代码中,翻译在 _jspServicde() 方法里,以 out.wirte() 输出到客户端
    2. java 注释:<% // 单行 java 注释 /* 多行 java 注释 */ %> ,java 注释会被翻译到 java 源代码中
    3. jsp 注释: <%-- 这是 jsp 注释 --%>,jsp 注释可以注释掉 jsp 页面中所有代码

4. JSP 中的九大内置对象

jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面为 Servlet 源代码后,源码中提供的九大对象

对象名对象类型
request请求对象
response响应对象
pageContextjsp 的上下文对象
session会话对象
applicationServletContext 对象
configServletConfig 对象
outjsp 输出流对象
page指向当前 jsp 对象
exception异常对象

5. 四个域对象

域对象是可以像 Map 一样存取数据的对象。四个域对象功能一致,不同的是它们对数据的存取范围

对象名对应类说明作用周期
pageContextPageContextImpljsp 的上下文对象当前 jsp 页面范围内有效
requestHttpServletRequest请求对象一次请求内有效
sessionHttpSession会话对象一次会话范围内有效(打开浏览器访问服务器,直到浏览器关闭)
applicationServletContextServletContext 对象整个 web 工程范围内都有效(只要 web 工程不停止,数据就存在)

6. out 和 response 输出的区别

  1. 当 jsp 页面中的所有代码执行完成之后,后执行 out.flush() 操作,将 out 缓冲区的所有数据追加写入到 response 缓冲区末尾,然后再执行 response.flush() 操作,response 缓冲区中的所有内容写给客户端
  2. 由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。在 jsp 页面中统一使用 out 来进行输出,避免打乱页面输出内容的顺序

7. out.write() 与 out.print() 的区别

  1. out.write() 输出字符串没有问题,输出整型时会将整型数字转换成对应的 ASCII 表对应字符 cb[nextChar++] = (char) c;
  2. out.print() 输出任意类型数据都没有问题(源码底层将所有数据都转换成字符串,而后调用 out.write() 输出)

8. JSP 常用标签

  1. 静态包含:<%@ include file="/include/footer.jsp"%>,file 属性指定需要包含的 jsp 页面的路径

    1. 静态包含不会翻译被包含的 jsp 页面
    2. 静态包含其实是把包含的 jsp 页面的代码拷贝到包含的位置执行
  2. 动态包含:<jsp:include page="/include/footer.jsp"></jsp:include>

    1. 动态包含服务器会把被包含的 jsp 页面翻译为 java 代码
    2. 动态包含使用以下代码去调用被包含的页面,被包含的页面共享主页面的 request、response 对象 JspRuntimeLibrary.include<request, response, "/include/footer.jsp", out, false);
    3. 动态包含还可以传递参数,在被包含的页面中可以获取传递的参数
    <jsp:include page="/temp.jsp">
     <jsp:param name="username" value="Spring-_-Bear"/>
    </jsp:include>
    
  3. jsp 请求转发标签 <jsp:forward page="/temp.jsp"></jsp:forward> 以替代 requeset.getRequestDispatcher("/temp.jsp".forward(request,reponse));

  4. JSP 练习之九九乘法口诀表

    <%--
      Created by IntelliJ IDEA.
      User: SpringBear
      Date: 2022/2/20
      Time: 11:56
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
        <style>
            table 
                width: 650px;
            
        </style>
    </head>
    <body>
    <h1 align="center">九九口诀乘法表</h1>
    <table align="center">
        <% for (int i = 1; i <= 9; i++)  %>
        <tr>
            <% for (int j = 1; j <= i; j++)  %>
            <td><%=j + " x " + i + " = " + (i * j) %></td>
            <%  %>
        </tr>
        <%  %>
    </table>
    </body>
    </html>
    

9. Listener 监听器

  1. Listener 监听器是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
  2. Listener 是 JavaEE 的规范,监听器的作用是监听某种事物的变化,然后通过回调函数,反馈给程序去处理一些业务
  3. ServletContextListener 它可以监听 ServletContext 对象的销毁和创建,ServletContext 对象在 web 工程启动时创建,在 web 工程停止时销毁,使用 ServletContextListener 监听器监听 ServletContext 对象步骤如下:
<!-- 1. 编写一个类去实现 ServletContextListener 接口 -->
<!-- 2. 实现接口中的两个方法处理自己的业务 -->
<!-- 3. 到 web.xml 文件中配置监听器路径 -->
<listener>
        <listener-class>com.bear.MyServletContextListener</listener-class>
</listener>

二、EL 表达式

1. EL 表达式的定义及作用

  1. EL(Expression Language)表达式语言,作用是替代 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出
  2. EL 表达式的格式是:$expression,EL 表达式在输出 null 值的时候输出的是空串,jsp 表达式脚本输出的是 null 本身
  3. EL 表达式主要是在 jsp 页面中输出数据,主要是输出域对象中的数据。当四个域中都有相同的 key 数据的时候,EL 表达式会按照四个域作用范围从小到大的顺序获取相关数据,顺序依次是 pageContextrequestsessionapplication

2. EL 表达式的运算符

  1. 关系运算符

    1. == 或 eq
    2. != 或 ne
    3. < 或 lt
    4. > 或 gt
    5. <= 或 le
    6. >= 或 ge
  2. empty( $empty exp) 运算可以判断一个数据是否为空,为空则返回 true,不为空返回 false。以下几种情况数据为空即返回 false:

    1. 值为 null
    2. 值为空串
    3. 数组、集合元素个数为 0
  3. 点运算和中括号运算

    1. . 点运算可以输出 Bean 对象中某个属性的值
    2. [] 中括号运算可以输出有序集合中某个元素的值,并且 [] 中括号运算还可以输出 map 集合中 key 里含有保留字的对应 value 值 $ map.["a.a.a"]

3. EL 表达式的 11 个隐含对象

变量类型作用
pageContextPageContextImpl获取 jsp 中的九大内置对象
pageScopeMap<String,Object>获取 PageContext 域中的数据
requestScopeMap<String,Object>获取 Request 域中的数据
sessionScopeMap<String,Object>获取 Session 域中的数据
applicationScopeMap<String,Object>获取 servletContext 域中的数据
paramMap<String,String>获取请求参数的值
paramValuesMap<String,String[]>获取请求参数的值,获取多个值时使用
headerMap<String,String>获取请求头的信息
headerValuesMap<String,String[]>获取请求头的信息,可以获取多个值
cookieMap<String,Cookie>获取当前请求的 Cookie 信息
initParamMap<String,String>获取在 web.xml 中配置的 <context-param> 上下文参数

利用 pageContext 获取 jsp 九大内置对象从而获取相关信息

<%-- 1. 协议 -->
$ pageContext.request.scheme<br/>
<%-- 2. 服务器 ip -->
$pageContext.request.serverName<br/>
<%-- 3. 服务器端口 -->
$pageContext.request.serverPort<br/>
<%-- 4. 获取工程路径 -->
$pageContext.request.contextPath<br/>
<%-- 5. 获取请求方法 -->
$pageContext.request.method<br/>
<%-- 6. 获取客户端 ip -->
$pageContext.request.remoteHost<br/>
<%-- 7. 获取会话 id 编号 -->
$pageContext.session.id<br/>

三、JSTL 标签库

1. JSTL 标签库介绍及使用

  1. JSTL(JSP Standard Tag Library) 标签库是一个不断完善的开放源代码的 JSP 标签库。EL 表达式主要是为了替换 jsp 中的表达式脚本,而 JSTL 则是为了替换代码脚本。这样使得整个 jsp 页面更加简洁
  2. 在 jsp 页面中使用 taglib 指令引入 jstl 标签库 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
功能范围URI前缀
核心标签库(重点)http://java.sun.com/jsp/jstl/corec
格式化http://java.sun.com/jsp/jstl/fmtfmt
函数http://java.sun.com/jsp/jstl/functionsfn
数据库(不适用)http://java.sun.com/jsp/jstl/sqlsql
XML(不适用)http://java.sun.com/jsp/jstl/xmlx

2. JSTL 标签库常用标签

  1. set 标签:可以往域中保存数据

    <%--
        page 表示 PageContext 域(默认值)
        request 表示 Request 域
        session 表示 Session 域
        application 表示 ServletContext 域
    --%>
    <c:set scope="request" var="username" value="bear"></c:set>
    $ requestScope.username
    
  2. if 标签:用来进行 if 判断,test 属性表示判断的条件(使用 EL 表达式)

    <c:if test="$12==12">Spring-_-Bear</c:if>
    
  3. choose、when、otherwise 标签

    <%-- 多路选择,类似 switch case default,当存在符合条件的 test 时,后序语句不再执行--%>
    <% request.setAttribute("height", 143); %>
    <c:choose>
        <c:when test="$requestScope.height  > 180 ">小巨人</c:when>
        <c:when test="$requestScope.height  > 170 ">还可以</c:when>
        <c:otherwise>小矮子</c:otherwise>
    </c:choose>
    
    1. 标签中不能使用 html 注释,需要使用 jsp 注释
    2. when 标签的父标签一定要是 choose 标签
  4. forEach 标签:遍历

    <%-- 使用 forEach 遍历 1 到 10 --%>
    <c:forEach var="i" begin="1" end="100">$ i <br/></c:forEach>
    
    <%-- 使用 forEach 遍历 Object 数组 --%>
    <% request.setAttribute("phone", new String[]"110", "119", "120"); %>
    <c:forEach items="$requestScope.phone" var="item">$ item  <br/></c:forEach>
    
    <%-- 使用 forEach 遍历 Map 集合 --%>
    <%
        HashMap<String, String> map = new HashMap<>();
        map.put("Hospital", "120");
        map.put("Police", "110");
        request.setAttribute("map", map);
    %>
    <c:forEach items="$ requestScope.map" var="entry">
        key = $entry.key  value = $entry.value <br/>
    </c:forEach>
    
  5. 使用 forEach 遍历 List 集合并以表格显示

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ page import="com.bear.Student" %>
    <%@ page import="java.util.List" %>
    <%@ page import="java.util.ArrayList" %><%--
      Created by IntelliJ IDEA.
      User: SpringBear
      Date: 2022/2/25
      Time: 21:38
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
        <style type="text/css">
            table 
                width: 500px;
                border: 1px solid blue;
                border-collapse: collapse;
            
    
            th, td 
                border: 1px solid blue;
                align-content: center;
                text-align: center;
            
        </style>
    </head>
    <body>
    <%
        List<Student> studentList = new ArrayList<>();
        studentList.add(new Student(1, "bear", 18, "1901"));
        studentList.add(new Student(2, "cat", 2, "1902"));
        studentList.add(new Student(3, "dog", 12, "1905"));
        request.setAttribute("stuList", studentList);
    %>
    <table>
        <tr>
            <th>id</th>
            <th>姓名</th>
            <th>年龄</th>
            <th>班级</th>
        </tr>
        <c:forEach items="$requestScope.stuList" var="stu">
            <tr>
                <td>$ stu.id </td>
                <td>$ stu.name </td>
                <td>$ stu.age </td>
                <td>$ stu.classNum </td>
            </tr>
        </c:forEach>
    </table>
    </body>
    </html>
    
  6. forEach 标签的组合使用

    <c:forEach begin="2" end="7" step="2" items="$requestScope.stus" var="stu"></c:forEach>
    

以上是关于[JavaWeb]JSPEL 表达式和 JSTL 标签库的主要内容,如果未能解决你的问题,请参考以下文章

JSPEL表达式语言

JSP

JAVAWEB开发之JSPEL及会话技术(Cookie和Session)的使用详解

JavaWeb:理解JSP以及原理,能在JSP中使用 EL表达式和JSTL标签

javaweb part6---jstl以及el表达式

JavaWeb基础—EL表达式与JSTL标签库