- Tomcat 9
- EL Expression Language,表达式语言
- JSTL JSP Standard Tag Library,JSP 标准标签库
JSP 代码并不好写,因为包含前端代码与 Java 代码(两种语言风格不统一),为了解决这个问题,EL、JSTL 诞生了(将两种语言风格统一)
JSP 本质上是给浏览器做响应的,所以保留前端代码风格,并将 Java 代码风格改为标签格式
EL
Expression Language
- 代替原来 Java 程序取值的过程,比如
request.getParameter("key");
、request.getAttribute("key");
,常用 - 处理一些简单的计算(算数 逻辑 比较)
- 调用方法(通常是有返回值),不常用
EL 语法结构
${xxxx}
EL 属性取值(重要)
JSP 中的四种作用域 page(pageContext) request session application,对应到 EL 的域对象为:
${pageScope.xxx}
${requestScope.xxx}
//request.getAttribute("xxx");
${sessionScope.xxx}
${applicationScope.xxx}
- 取不到属性值,浏览器不显示(不报错)
简写模式
${xxx}
- pageContext request session application 四个作用域中,从左到右开始找,都没有则浏览器不显示
- 不推荐使用,性能慢
xxx
- 上述取值方式对于(基本数据类型、包装类、String)可以直接取值,而其余对象还需要进一步的操作,以 domain 对象举例:
- 下述代码第一行必须要提供该属性对应的非私有getXXX方法,不然会报错(找不到属性)
- 下述两种写法实质上底层都是通过反射调用非私有方法
${requestScope.user.uname}
${requestScope.user.getUname()}
//(User) request.getAttribute("user").getUname();
- 如果 xxx 是数组,若数组越界则浏览器不予展示(不报错)
- 如果 xxx 是 List 集合,若集合越界是会报错的
- 如果 xxx 是 Map 集合,若集合取值的key不存在则浏览器不予展示(不报错)
EL 参数取值(重要)
${param.xxx}
//request.getParameter("xxx");
${paramValues.xxx)
//request.getParameterValues("xxx");
El 其余操作
配置文件取值
${initParam.xxx}
//application.getInitParameter("xxx");
请求头信息取值
${header.xxx}
${header[xxx]}
//request.getHeader("xxx");
Cookie
${cookie}
//request.getCookies();
做简单运算
运算 | Java | EL |
---|---|---|
算数运算 | + - * / % mod | + - * / % mod |
比较运算 | > >=,< <=,!= == | gt ge,lt le,ne eq |
逻辑运算 | && || ! | and or not |
- EL 运算符号的两种写法都可以
JSTL
这是一个开源项目,由 apache 组织的一个小组负责维护
JSP Standard Tag Library
- 控制流程(判断 循环 输出),常用
- 处理字符串,不常用
- 格式化(日期 时间),不常用
JSTL 的使用步骤(仅供参考)
- 编辑器:intelliJ IDEA 2020.1
- Web容器:Tomcat 9.0.37
- 下载两个 jar 包
- 导包(将上述两个jar包导入项目)
- 直接将两个 jar 包存放到 Tomcat 根路径下 lib 文件夹中
- 或者在工程内 web\WEB-INF 文件夹下再创建一个文件夹,存放两个 jar 包
- 工程关联,比如:重启 idea 编辑器 > File > Project Structure > Modules > Dependencies > 鼠标左键双击Tomcat x.x.x > +
- JSP 文件头部配置指令标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/xxxx" prefix=""%>
JSTL 核心标签库(重要)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
一:循环遍历(重要!)
<c:forEach begin="" end="" step="" varStatus="" var="" items="">
</c:forEach>
- begin、end、step 为起点、终点、步长
- varStatus 是一个对象,有一个属性 index 可以获取索引
- var 接收值的变量
- items 遍历的元素
上述写法很复杂,增强 for 循环的写法:
<c:forEach var="" items=""></c:forEach>
一:循环拆分
<c:forTokens var="" items="" delims="">
- delims 属性值拆分 items 属性值
- var 接收值
二:判断 - if
<c:if test=""></c:if>
- test 属性值中一般写 EL
- 如果条件满足,就输出标签内内容
二:判断 - switch
<c:choose>
<c:when test="">
</c:when>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
- 可以实现 switch 的效果,每个 when 标签自带 break 效果
- 可以实现 if else 的效果
三:输出
<c:out value=""></c:out>
- value 属性值可以写字符串或者 EL
- 没啥用
JSTL 函数标签库与格式化标签库
JSTL 函数标签库
- 用来处理字符串,功能等效于 Java 中的 String 类常用方法
- 通常在业务层已经处理掉了字符的所有信息,所以函数标签库不常用
<%@ taglib uri="http://java.sun.com/jsp/jstl/fucntions" prefix="fn"%>
写法:${fn:xxx()}
JSTL 格式化标签库
- 格式化日期,功能等效于 Java 中的 Date 类、SimpleDateFormat 类
- 通常在业务层处理,所以格式化标签库不常用
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
写法:<fmt:xxx></fmt:xxx>
- JSTL 1.2 版本还有两个几乎不使用的标签库
- SQL标签库、XML标签库
JSTL 自定义
补充知识:xml、tld 文件格式相同,它们之间的关系相当于注解与元注解的关系,即 tld 文件作用是解释 xml 文件
一:JSP可以使用标签,自定义函数(类似函数标签库)
- 描述一个类
- 类中描述的方法必须是静态的,并且方法通常有返回值
- 配置一个"说明书"(tld 配置文件)
- 当前工程下 web\WEB-INF 文件夹下创建一个新的 xxx.tld 文件
- xxx.tld 文件中先描述两个重要的标签
uri
short-name
;然后每个function
标签对应一个函数
JSP头引用该指令标签时<%@ taglib uri="" prefix="" %>
<uri></uri>
标签内内容与指令标签中 uri 属性值相同<short-name></short-name>
标签内内容与指令标签中 prefix 属性值相同
<short-name>xxx</short-name>
<uri>http://www.zgh.com</uri>
<function>
<name>一般写为函数名</name>
<function-class>类全名</function-class>
<function-signature>函数声明</function-signature>
</function>
...
函数声明,举个例子:int add(int, int)
- 在 JSP 中声明头信息
<%@ taglib uri="http://www.zgh.com" prefix="xxx" %>
- JSP 中调用函数
${xxx:函数名()}
二:JSP可以使用标签,自定义标签(类似核心标签库和格式化标签库)
每一个标签都是一个单独的类
- 创建一个类描述一个标签,实现一个 Tag 接口并重写里面的方法
- 细致的看一下这些方法
- 两组对应的 get/set 方法,自己补全方法内容并添加相应的私有属性
- 还有一个单独的 release 方法,回收对象
- 最重要的是 doStartTag 与 doEndTag 方法
- 在 doStartTag 与 doEndTag 方法内添加自己的逻辑(头标签加载完成时执行 doStartTag 方法,尾标签加载完成时执行 doEndTag 方法)
- 两个方法都有自己的一组返回值(是 Tag 接口的常量)
- doStartTag 方法返回值有
Tag.EVAL_BODY_INCLUDE
、Tag.SKIP_BODY
分别是展示与不展示(即跳过、忽略)标签内内容 - doEndTag 方法返回值有
Tag.EVAL_PAGE
、Tag.SKIP_PAGE
分别是展示与不展示标签后内容
- 配置一个"说明书"(tld 配置文件)
- 当前工程下 web\WEB-INF 文件夹下创建一个新的 xxx.tld 文件
- xxx.tld 文件中先描述两个重要的标签
uri
short-name
; - 配置文件中每个
tag
标签对应一个标签方法,如果标签内包含属性,则描述attribute
标签
<short-name>prefix</short-name>
<uri>uri</uri>
<tag>
<name>标签名</name>
<tag-class>类全名</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>属性名</name>
<required>true</required> //属性是否必须有
<rtexprvalue>true</rtexprvalue> //属性值是否支持 EL
</attribute>
</tag>
- 创建 JSP,声明头信息
- JSP 中使用标签