什么是jstl
jstl是Apache对EL表达式的扩展,jstl是标签语言,使用起来很方便,但是它不是内置标签,需要导入jar包
- 导入 jstl 。jar 包
jstl 标签库
- core :核心标签库,也叫c标签
- fmt:格式话标签
- sql :数据库标签库,过时了
- xml: xml标签库,过时了
使用jsp指令 导入标签库
- 导入jar 包jstl.jar
- 在需要实用的jsp页面导入标签库
- 格式:<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core”%>
- prefix 表示前缀
- uri 不一定是真实存在的地址,但是可以让jsp找到jstl标签库的描述文件
jstl 核心标签库 (core)
- out
- value:可以是字符串,也可以是EL表达式
- default:当要输出的内容是null时,会输出default的值
- escapeXml:默认值的true,表示转义
- 实例:
- set
- var:变量名
- value:变量值,可以值EL表达式
- scope:域,默认是pageContext,可以指定;request,session,application
- 实例:
- remove 标签
- var 变量名
- scope: 如果不指定scope,那么默认删除所有域中的这个属性
- 实例:
url 标签
- value 指定一个路径,会自动在路径前添加项目路径
- 子标签c:param>用来给路径添加 参数
- c:url value=”/a.jsp”>c:url>
- ccope 指定要保存的域
- var 变量名,将这个变量名保存到指定的域中
- 练习url标签的 三个属性:
- 练习url标签的子标签添加参数
- ==jsp页面获取项目路径的方法==
- 使用EL表达式 ${pageContext.request.ContextPath }/a.jsp
- url标签方式
- 如果需要大量的使用,建议使用url标签
if 标签
- if标签的test必须是一个boolean类型的值,如果test内容是true,那么执行if标签的内容,如果是false那么不执行
- 练习if标签:
- choose 标签
- choose 标签对应Java中的 if/else if/else结构,when标签的test 为true时,会执行这个when标签的内容,当所有的when都不成立的时候,那么就会执行otherwise 的内容
- foreach 循环
- 计数方式的循环
- var 循环变量
- begin 开始的变量值
- end 结束的变量值
- step 设置步子长度,每次增加的幅度
- -
- 遍历数组和集合
- items 表示需要的循环额对象
- var 表示每次循环的值的变量
- 计数方式的循环
- 如果指定了 forEach循环的属性varstatus 如果指定了循环状态变量,那么就可以使用循环状态的几个属性
- count 表示当前 循环的次数
- index 表示当前 循环的索引
- first 表示判断是不是第一次循环
- last 表示判断是不是最后一次循环
- current 表示当前循环的值
- redirect 标签,重定向
- url 要转到的资源地址,不需要添加项目名,这个标签内部做了优化,重定向可以不添加项目名
- 例子:
fmt标签库
- 使用步骤
- 导入jstl jar 包
- 在需要使用的jsp页面使用taglib指令导入标签库
- 格式化日期
- value 传递一个Date 类型的变量
- pattern 给定一个格式化的模板
- 格式化数字
- value 给顶一个数字
- pattern 给定一个数字格式化的模板
- 0.000 这种模板会四舍五入,同时如果有多余的0,会补上
- #.## 这种模板会四舍五入,同时有多余的0,不会补
自定义jstl标签方式之实现SimpleTag接口(java ee文档)
我们在jsp页面使用的标签,就等于调用了对象的某个方法一样,,自定义标签就是自定义类
- 步骤
- 标签处理类
- 编写标签处理类的tld描述文件
- 定义标签处理类需要实现的接口介绍SimpleTag
- doTag()使用标签要执行的方法
- Tag getParent()获取 父标签
- 返回值是父接口的类型
- setJspBody(JspFragment jspBody)设置标签体
- setJspContext(JspContext pc) 获取jsp上下文对象
- 标签的生命周期:
- 当容器(Tomcat)第一次执行到某个标签时,会创建标签处理类的实例;
- 然后调用setJspContext(JspContext)方法,把当前JSP页面的pageContext对象传递给这个方法;
- 如果当前标签有父标签,那么使用父标签的标签处理类对象调用setParent(JspTag)方法;
- 如果标签有标签体,那么把标签体转换成JspFragment对象,然后调用setJspBody()方法;
- 每次执行标签时,都调用doTag()方法,它是标签处理方
- 定义的标签处理类
- 定义tld描述文件
- 引入自定义标签库,使用标签
自定义jstl标签之,继承SimpleTagSupport
- SimpleTagSupport是SimpleTag的一个实现类
- 内部封装了一些方法获取jspContext(可以自定义强转换为pageContext)
- 我们只需要重写doTag方法
- 和直接 实现SimpleTag接口相比,简单了很多
- 定义标签处理类
- 标签tld描述文件和引入标签同上
自定义jstl标签体
- 可以选择的值
- ==empty== 标签体是空
- jsp 标签体可以是Java脚本,EL表达式,jstl等,但是jsp2.0之后,不在使用
- ==scriptless== 标签体不能是Java脚本,可以是EL表达式,字符串,jstl等
- tagdependent:标签体内容不做运算,由标签处理类自行处理,无论标签体内容是EL、JSP、JSTL,都不会做运算。这个选项几乎没有人会使用!
- 定义标签处理类
- 定义tld文件
- 引入,和使用
执行了自定义标签体的内容后,不在执行jsp后续压面的内容
- 在定义标签护理类的时候,在doTag方法内,需要添加 throw new SkipPageException ,抛出异常终止后续的页面显示
- 定义tld文件
- 导入和使用
自定义标签属性
- 在 标签处理类中,给定javaBean属性,至少要提供set方法
- 配置tld文件
- 引入标签,使用标签