J2EE EL + JSTL 基础知识总结

  • Tomcat 9
  • EL Expression Language,表达式语言
  • JSTL JSP Standard Tag Library,JSP 标准标签库

JSP 代码并不好写,因为包含前端代码与 Java 代码(两种语言风格不统一),为了解决这个问题,EL、JSTL 诞生了(将两种语言风格统一)

JSP 本质上是给浏览器做响应的,所以保留前端代码风格,并将 Java 代码风格改为标签格式

EL

Expression Language

  1. 代替原来 Java 程序取值的过程,比如request.getParameter("key");request.getAttribute("key");常用
  2. 处理一些简单的计算(算数 逻辑 比较)
  3. 调用方法(通常是有返回值),不常用

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

  1. 上述取值方式对于(基本数据类型、包装类、String)可以直接取值,而其余对象还需要进一步的操作,以 domain 对象举例:
    • 下述代码第一行必须要提供该属性对应的非私有getXXX方法,不然会报错(找不到属性)
    • 下述两种写法实质上底层都是通过反射调用非私有方法
${requestScope.user.uname} 
${requestScope.user.getUname()}

//(User) request.getAttribute("user").getUname();
  1. 如果 xxx 是数组,若数组越界则浏览器不予展示(不报错)
  2. 如果 xxx 是 List 集合,若集合越界是会报错的
  3. 如果 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();

做简单运算

运算JavaEL
算数运算+ - * / % 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
  1. 下载两个 jar 包
  2. 导包(将上述两个jar包导入项目)
    • 直接将两个 jar 包存放到 Tomcat 根路径下 lib 文件夹中
    • 或者在工程内 web\WEB-INF 文件夹下再创建一个文件夹,存放两个 jar 包
  3. 工程关联,比如:重启 idea 编辑器 > File > Project Structure > Modules > Dependencies > 鼠标左键双击Tomcat x.x.x > +
  4. 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可以使用标签,自定义函数(类似函数标签库)

  1. 描述一个类
  2. 类中描述的方法必须是静态的,并且方法通常有返回值
  3. 配置一个"说明书"(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)

  1. 在 JSP 中声明头信息 <%@ taglib uri="http://www.zgh.com" prefix="xxx" %>
  2. JSP 中调用函数 ${xxx:函数名()}

二:JSP可以使用标签,自定义标签(类似核心标签库和格式化标签库)

每一个标签都是一个单独的类

  1. 创建一个类描述一个标签,实现一个 Tag 接口并重写里面的方法
  2. 细致的看一下这些方法
    • 两组对应的 get/set 方法,自己补全方法内容并添加相应的私有属性
    • 还有一个单独的 release 方法,回收对象
    • 最重要的是 doStartTag 与 doEndTag 方法
  3. 在 doStartTag 与 doEndTag 方法内添加自己的逻辑(头标签加载完成时执行 doStartTag 方法,尾标签加载完成时执行 doEndTag 方法)
    • 两个方法都有自己的一组返回值(是 Tag 接口的常量)
    • doStartTag 方法返回值有 Tag.EVAL_BODY_INCLUDETag.SKIP_BODY 分别是展示与不展示(即跳过、忽略)标签内内容
    • doEndTag 方法返回值有 Tag.EVAL_PAGETag.SKIP_PAGE 分别是展示与不展示标签后内容
  4. 配置一个"说明书"(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>
  1. 创建 JSP,声明头信息
  2. JSP 中使用标签
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值