[JavaWeb]JSPEL 表达式和 JSTL 标签库
Posted Spring-_-Bear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaWeb]JSPEL 表达式和 JSTL 标签库相关的知识,希望对你有一定的参考价值。
一、JSP
1. JSP 的定义及本质
- jsp 的全称是 java server pages。Java 的服务器页面,主要作用是代替 Servlet 程序回传 html 页面数据
- 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 的三大脚本
-
声明脚本(极少使用):格式是
<%! java 语句 %>
,可以给 jsp 翻译出来的 java 类定义属性和方法甚至是静态代码块、内部类等<%! private Integer a; private static Map<String, String> map; static map.put("bear", "lcx"); public void print() %>
-
表达式脚本(经常使用):格式是
<%= 表达式 %>
,用于在 jsp 页面上输出数据- 所有的表达式脚本都会被翻译到 _jspService() 方法中
- 表达式脚本都会被翻译成内容并通过 out.print() 方法输出到页面上
- 由于表达式脚本翻译的内容都在 _jspService() 方法中,所以 _jspService() 方法中的对象都可以直接使用
<%=request.getParameter("username")%>
- 表达式脚本中的表达式不能以分号结束
-
代码脚本:格式是
<% java 语句 %>
,可以在 jsp 页面中编写自己的 java 语句- 代码脚本翻译之后都在 _jspService() 方法中
- 由于代码脚本翻译到 _jspService() 方法中,所以在 _jspService() 方法中的现有对象都可以直接使用,如 request、response 等
- 可以由多个代码脚本块组合完成一个完整的 java 语句
- 代码脚本还可以和表达式脚本一起组合使用,在 jsp 页面上输出数据
-
JSP 中的三种注释
- html 注释:
<!-- 这是 html 注释 -->
,html 注释会被翻译到 java 源代码中,翻译在 _jspServicde() 方法里,以 out.wirte() 输出到客户端 - java 注释:
<% // 单行 java 注释 /* 多行 java 注释 */ %>
,java 注释会被翻译到 java 源代码中 - jsp 注释:
<%-- 这是 jsp 注释 --%>
,jsp 注释可以注释掉 jsp 页面中所有代码
- html 注释:
4. JSP 中的九大内置对象
jsp 中的内置对象,是指 Tomcat 在翻译 jsp 页面为 Servlet 源代码后,源码中提供的九大对象
对象名 | 对象类型 |
---|---|
request | 请求对象 |
response | 响应对象 |
pageContext | jsp 的上下文对象 |
session | 会话对象 |
application | ServletContext 对象 |
config | ServletConfig 对象 |
out | jsp 输出流对象 |
page | 指向当前 jsp 对象 |
exception | 异常对象 |
5. 四个域对象
域对象是可以像
Map
一样存取数据的对象。四个域对象功能一致,不同的是它们对数据的存取范围
对象名 | 对应类 | 说明 | 作用周期 |
---|---|---|---|
pageContext | PageContextImpl | jsp 的上下文对象 | 当前 jsp 页面范围内有效 |
request | HttpServletRequest | 请求对象 | 一次请求内有效 |
session | HttpSession | 会话对象 | 一次会话范围内有效(打开浏览器访问服务器,直到浏览器关闭) |
application | ServletContext | ServletContext 对象 | 整个 web 工程范围内都有效(只要 web 工程不停止,数据就存在) |
6. out 和 response 输出的区别
- 当 jsp 页面中的所有代码执行完成之后,后执行 out.flush() 操作,将 out 缓冲区的所有数据追加写入到 response 缓冲区末尾,然后再执行 response.flush() 操作,response 缓冲区中的所有内容写给客户端
- 由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。在 jsp 页面中统一使用 out 来进行输出,避免打乱页面输出内容的顺序
7. out.write() 与 out.print() 的区别
- out.write() 输出字符串没有问题,输出整型时会将整型数字转换成对应的 ASCII 表对应字符
cb[nextChar++] = (char) c;
- out.print() 输出任意类型数据都没有问题(源码底层将所有数据都转换成字符串,而后调用 out.write() 输出)
8. JSP 常用标签
-
静态包含:
<%@ include file="/include/footer.jsp"%>
,file 属性指定需要包含的 jsp 页面的路径- 静态包含不会翻译被包含的 jsp 页面
- 静态包含其实是把包含的 jsp 页面的代码拷贝到包含的位置执行
-
动态包含:
<jsp:include page="/include/footer.jsp"></jsp:include>
- 动态包含服务器会把被包含的 jsp 页面翻译为 java 代码
- 动态包含使用以下代码去调用被包含的页面,被包含的页面共享主页面的 request、response 对象
JspRuntimeLibrary.include<request, response, "/include/footer.jsp", out, false);
- 动态包含还可以传递参数,在被包含的页面中可以获取传递的参数
<jsp:include page="/temp.jsp"> <jsp:param name="username" value="Spring-_-Bear"/> </jsp:include>
-
jsp 请求转发标签
<jsp:forward page="/temp.jsp"></jsp:forward>
以替代requeset.getRequestDispatcher("/temp.jsp".forward(request,reponse));
-
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 监听器
- Listener 监听器是 JavaWeb 的三大组件之一。JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器
- Listener 是 JavaEE 的规范,监听器的作用是监听某种事物的变化,然后通过回调函数,反馈给程序去处理一些业务
- 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 表达式的定义及作用
- EL(Expression Language)表达式语言,作用是替代 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出
- EL 表达式的格式是:$expression,EL 表达式在输出 null 值的时候输出的是空串,jsp 表达式脚本输出的是 null 本身
- EL 表达式主要是在 jsp 页面中输出数据,主要是输出域对象中的数据。当四个域中都有相同的 key 数据的时候,EL 表达式会按照四个域作用范围从小到大的顺序获取相关数据,顺序依次是
pageContext
、request
、session
、application
2. EL 表达式的运算符
-
关系运算符
- == 或 eq
- != 或 ne
- < 或 lt
- > 或 gt
- <= 或 le
- >= 或 ge
-
empty(
$empty exp
) 运算可以判断一个数据是否为空,为空则返回 true,不为空返回 false。以下几种情况数据为空即返回 false:- 值为 null
- 值为空串
- 数组、集合元素个数为 0
-
点运算和中括号运算
- . 点运算可以输出 Bean 对象中某个属性的值
- [] 中括号运算可以输出有序集合中某个元素的值,并且 [] 中括号运算还可以输出 map 集合中 key 里含有保留字的对应 value 值
$ map.["a.a.a"]
3. EL 表达式的 11 个隐含对象
变量 | 类型 | 作用 |
---|---|---|
pageContext | PageContextImpl | 获取 jsp 中的九大内置对象 |
pageScope | Map<String,Object> | 获取 PageContext 域中的数据 |
requestScope | Map<String,Object> | 获取 Request 域中的数据 |
sessionScope | Map<String,Object> | 获取 Session 域中的数据 |
applicationScope | Map<String,Object> | 获取 servletContext 域中的数据 |
param | Map<String,String> | 获取请求参数的值 |
paramValues | Map<String,String[]> | 获取请求参数的值,获取多个值时使用 |
header | Map<String,String> | 获取请求头的信息 |
headerValues | Map<String,String[]> | 获取请求头的信息,可以获取多个值 |
cookie | Map<String,Cookie> | 获取当前请求的 Cookie 信息 |
initParam | Map<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 标签库介绍及使用
- JSTL(
JSP Standard Tag Library
) 标签库是一个不断完善的开放源代码的 JSP 标签库。EL 表达式主要是为了替换 jsp 中的表达式脚本,而 JSTL 则是为了替换代码脚本。这样使得整个 jsp 页面更加简洁- 在 jsp 页面中使用 taglib 指令引入 jstl 标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
功能范围 | URI | 前缀 |
---|---|---|
核心标签库(重点) | http://java.sun.com/jsp/jstl/core | c |
格式化 | http://java.sun.com/jsp/jstl/fmt | fmt |
函数 | http://java.sun.com/jsp/jstl/functions | fn |
数据库(不适用) | http://java.sun.com/jsp/jstl/sql | sql |
XML(不适用) | http://java.sun.com/jsp/jstl/xml | x |
2. JSTL 标签库常用标签
-
set 标签:可以往域中保存数据
<%-- page 表示 PageContext 域(默认值) request 表示 Request 域 session 表示 Session 域 application 表示 ServletContext 域 --%> <c:set scope="request" var="username" value="bear"></c:set> $ requestScope.username
-
if 标签:用来进行 if 判断,test 属性表示判断的条件(使用 EL 表达式)
<c:if test="$12==12">Spring-_-Bear</c:if>
-
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>
- 标签中不能使用 html 注释,需要使用 jsp 注释
- when 标签的父标签一定要是 choose 标签
-
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>
-
使用 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>
-
forEach 标签的组合使用
<c:forEach begin="2" end="7" step="2" items="$requestScope.stus" var="stu"></c:forEach>
以上是关于[JavaWeb]JSPEL 表达式和 JSTL 标签库的主要内容,如果未能解决你的问题,请参考以下文章
JAVAWEB开发之JSPEL及会话技术(Cookie和Session)的使用详解