jsp进阶
内容回顾
jsp 创建
jsp 的工作原理:翻译 --> 编译 --> 运行
翻译:第一次访问 jsp 页面时,服务器进行 jsp 页面的翻译,将 jsp 翻译为一个 java
类,该类被称为是一个 servlet 类;
jsp 组成:
① 脚本:<% java 代码>
② java 表达式:<%= java 代码>
③ 声明: <%! 变量>
④ jsp 指令:三大指令:page/include/taglib
⑤ el 表达式(${}):是 java 表达式的替代品,可以更简单进行数据的获取
⑥ jsp 动作:
jsp:useBean -- 创建实体类对象
jsp:setProperty -- 指定实体属性的设置
jsp:getProperty -- 获取指定实体类的属性
jsp:forward -- 进行页面的转发
jsp:param -- 页面转发时携带参数的设置
jsp:include -- 动态页面包含,所有涉及到的 jsp 页面,都会翻译成对应的
java 类;
JSP 的九大内置对象
内置对象简介
内置对象也称为隐式对象,不需要人为的创建,在 jsp 页面已经初始化好并且封装好了的,
可以直接使用;九大内置对象分别为:
① application -- 服务器对象
② session -- 会话对象
③ page -- 当前页面,类似与 java 程序中的 this 对象
④ request -- 请求对象
⑤ response -- 响应对象
⑥ out -- 页面输出对象
⑦ config -- 配置对象
⑧ pageContext -- 页面全局对象
⑨ exception -- 异常处理对象
在 jsp 页面中,使用 <% 快捷键补全 %>,就可以看到 8 个内置对象,exception 对象
没有,exception 是关于页面异常处理的内置对象,需要将 page 指令中 isErrorPage
= "true" 才会显示异常处理对象;
或者使用 pageContext 对象进行获取,pageContext.getException();
内置对象的创建
内置对象不用编程人员创建,系统会自动创建好,那系统什么时候?在哪?进行内置对象的创
建?
通过查看 jsp 页面翻译后的 java 类文件可以查询到,在 翻译后的类文件中会有一个
jspService 方法,在该方法的内部进行了内置对象的创建;
九大内置对象详解
application
是一个作用域对象,可以将信息保存在服务器中,直到服务器关闭;否则在任意时候我们都可 以从服务器中获取 application域对象中储存的数据;该对象生命周期为服务启动到服务 器关闭;其作用域为整个 web 应用;
request
请求作用域对象,可以将信息保存在一次请求中,主要用于 http 协议传送到服务器的请求数 据。该对象代表了客户端的请求信息,其作用域为一次请求;
response
该对象代表客户端响应信息,主要是将需要的数据发送给客户端,一般返回的是经过容易处理 的或者是有数据渲染的 jsp 页面
config
用于服务器的配置信息描述,可以通过 pageContext 提供的 getServletConfig 方法 进行获取;当一个 servlet 被初始化时,容器会把某些信息通过该对象传递给 servlet; 一般在 web.xml 中进行基本配置;
page
当前页面对象,就跟 this 对象一个意思;
session 对象
域对象,会话对象,服务器启动时会自动为每一个用户创建一个会话对象,用来保存当前用户 的信息;只要浏览器不关闭,在设定的时间内这个用户的信息会保存在session对象中;其作 用域为一次会话
out 对象
请求作用域对象,可以将信息保存在一次请求中,主要用于 http 协议传送到服务器的请求数据。该对象代表了客户端的请求信息,其作用域为一次请求; 该对象代表客户端响应信息,主要是将需要的数据发送给客户端,一般返回的是经过容易处理 的或者是有数据渲染的 jsp 页面;
exception 对象
该对象用于展示页面异常信息,只有在 page 指令设置 isErrorPage = true 后才会创建该对象;该对象几乎继承了所有的异常类,可以描述几乎所有的异常状态;
pageContext 对象
该对象的作用是获取任何范围的参数,因为通过该对象可以获取其他任意的内置对象,该提对 象提供了 getXX() 的方法进行其他内置对象的获取;该对象还可以获取项目的根路径; 获取项目根路径的方法:pageContext.getServletContext.contextPath
四大作用域对象
application:只要服务器不关闭,值永远保存;
session:面对浏览器,只要不主动退出,会话存在,值就存在;
request:面向求情,一次请求;
pageContext:面向页面,某一个页面的作用域;
作用域的范围大小:
application > session > request > pageContext
所有的域对象都有用户参数设置和获取的方法:
setAttribute(key,value);
getAttribute(key)
四大作用域范围总结
该对象用于展示页面异常信息,只有在 page 指令设置 isErrorPage = true 后才会创
建该对象;该对象几乎继承了所有的异常类,可以描述几乎所有的异常状态;
该对象的作用是获取任何范围的参数,因为通过该对象可以获取其他任意的内置对象,该提对
象提供了 getXX() 的方法进行其他内置对象的获取;该对象还可以获取项目的根路径;
获取项目根路径的方法:pageContext.getServletContext.contextPath
EL 进阶
当使用多个域对象设置参数时,使用 el 表达式进行数据获取时,默认是按照最小范围的作用
域开始进行参数的匹配,如果最小的范围中没有该参数,接着往上一个作用域中进行查找,一
直到 application 作用域;
如果所有的作用域中都没有 el 表达式中获取的参数,结果显示为空;
任意一个作用域或者多个作用域中有 el 表示中获取的参数,显示结果为较小的作用域设置的
值;
如果要获取指定作用域中设置的值,是使用 el 表达式进行数据时,可以在获取的参数前面加
上指定的域对象;如果不加会从最小的作用域开始查找;
el 获取数据时无域对象指定
el 获取指定域对象中的数据
JSTL 标准标签库
简介
JSTL 全称为 JavaServer Pages Standard Tag Labrary --- jsp 标准标签库;
主要提供了供 JavaWeb 开发人员使用的一个标准的标签库,该标签库功能比 html 提供的
标签更强大;可以使用 jstl 提供的标签取代传统的 java 代码;提高的程序的可读性、体
验感、维护性;
JSTL 通常和 el 表达式配合使用,使用 el 表达式来获取数据,用 JSTL 提供的标签来操
作数据;
JSTL 除了有标准的标签库以外,还提供了 JSTL 函数,也可以使用函数进行数据的操作;
JSTL 的使用
① 下载 jar 包,建议使用 1.2 版本,1.1 版本为过时的版本;
② 在 jsp 页面中使用 taglib 指令进行 jstl 的引入;
引入的格式:<% taglib uri="jstl资源路径" prefix="c" %>
JSTL 核心标签
通用标签
① 设置参数标签 set
<c:set var="参数名称" value="值" scope="域对象"></c:set>
② 输出标签 out -- 相当于 <jsp:getProperty> 或者是 <%= %>
<c:out value="参数名称"></c:out>
③ 删除标签 remove -- 删除指定参数
<c:remove var="参数名称"></c:remove>
分支标签
分支标签类似于 java 中的分支结构;
① 单分支标签 if
<c:if test="条件表达式">标签内容</c:if>
当条件表达式成立,标签内容被执行,条件表达式不成立,标签内容不执行
② 多分支标签 choose - when - otherwise
<choose>
<when test="条件表达式">内部代码</when>
<when test="条件表达式">内部代码</when>
········
<otherwise>内部代码</otherwise>
</choose>
从上往下依次运算 when 标签的条件表达式,如果某个表达式成立,执行对应 when
标签中的内容,一旦某一 when 标签的条件表达式成立,后面所有的 when 标签条件表达式
都不再继续运算;
换句话说,一个 when 标签表达式成立,执行内部的代码,分支结构结束;
只有所有的 when 标签条件表达式都不成立,才会执行 otherwise 标签内部的代
码
单分支结构
多分支结构
循环标签
可以对容器进行遍历;
<c:foreach items="需要遍历的容器" var="变量" varStatus="count">
</c:foreach>
items 属性用来指明遍历的容器,容器通常是集合或者数组,使用 el 表达式进行获取;
var 属性用来声明变量,每一次针对容器的遍历结果会储存到 var 声明的变量中
varStatus 属性用来描述当前遍历出来的对象状态,该状态有个属性:
count -- 用来实现对象的计数,序号从 1 开始
index -- 用来表示遍历对象的索引,序号从 0 开始
first -- 获取第一个遍历对象
last -- 获取最后一个遍历对象
导入标签
导入标签类似于 include 指令或者动作标签,用来实现其他页面的引入操作;
<c:import url="资源路径"></c:import>
资源路径:一般使用相对路径,也就是项目中存在的其他页面;
JSTL 函数
JSTL 函数大部分是针对字符串的操作;
使用函数之前需要进行函数的引用,就跟使用核心标签库一样,需要通过 page 指定进行指定
uri 访问,和别名的命名;
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"
%>
在引入后就可以使用 jstl 提供的函数;所有的函数如下图: