JSP技术(下)
一、JSP九大内置对象
(一)内置对象简介
内置对象: 也称之为隐式对象, 在jsp页面中, 已经初始化好的并且已经封装好的, 不需要程序员手动再去创建,可以直接拿过来使用;
如何获取内置对象呢? 快捷键:<% 快捷键补全 %>.
以上有八个内置对象, 还缺少一个内置对象;exception异常对象
异常内置对象如何获取?isErrorPage="true"打开错误页面
关于这九大内置对象 , 都有自己的引用名称;
前边是引用名称, 后边是数据类型;
(二)内置对象创建
既然是内置对象, 已经内置创建好的, 不需要程序员手动创建;
由此可见: 内置对象的实现和管理就是web容器(tomcat)
(三)内置对象详解
名称 |
类型 |
描述 |
out |
javax.servlet.jsp.JspWriter |
用于页面输出 JSP输出字符流 |
request |
javax.servlet.http.HttpServletRequest |
得到用户请求信息。 域对象,针对某次请求 |
response |
javax.servlet.http.HttpServletResponse |
服务器向客户端的回应信息 |
config |
javax.servlet.ServletConfig |
服务器配置,可以取得初始化参数 JSP配置信息的封装对象(一般不用) |
session |
javax.servlet.http.HttpSession |
用来保存用户的信息(会话技术) 域对象,针对某次会话N次请求 |
application |
javax.servlet.ServletContext |
所有用户的共享信息 域对象,针对整个项目的所有请求, 在这它是最大的作用域 |
page |
java.lang.Object |
指当前页面转换后的Servlet类的实例 当前JSP对应的Servlet对象。 (一般不用) |
pageContext |
javax.servlet.jsp.PageContext |
JSP的页面容器 域对象,是JSP独有的。 普通Servlet是没有这个域对象 最小的域对象, 作用范围:是当前JSP页面 |
exception |
java.lang.Throwable |
表示JSP页面所发生的异常,在错误页中才起作用 设置了isErrorPage=”true”才会出现。 封装了上一个页面的错误信息。 |
1. pageContext对象
指的是jsp页面容器, 是jsp独有的 普通servlet是没有的, 并且还是一个作用域对象
作用域范围: 当前页面中有效
作用:
1. Jsp是最小的作用域, 当前页面中有效
2. 可以操作其它的内置对象
案例:
动态获取项目名:
2. out对象
用于页面输出内容, 返回类型JSPWrite, 写出数据数据先进入缓冲区, 然后在输出
Servlet的out对象与out对象有什么区别?
1. Servlet的out对象输出信息时, 不带缓冲区, 返回值的类型: PrintWrite
2. Jsp的out对象带缓冲区, 数据数据先进入缓冲区, 然后在输出, 返回值类型: JSPWrite
案例:
原理图:
问题:
想要输出的结果按照顺序输出: hello 你好
解决: 刷新缓冲区
二、JSP四大作用域对象
(一)作用域对象简介
Servlet的作用域对象:
Request : 请求
Session : 面向浏览器(服务端缓存)
servletContext : 面向web工程
获取结果:
JSP四大作用域对象:(从小到大)
pageContext: 指定页面容器
Request: 面向请求
Session: 面向浏览器, 会话
Application: 面向服务器
(二)JSP作用域对象范围验证
1. 先从当前页面中获取值
总结: 所有作用域的值都可以正常获取吧
2. 从当前一个页面请求转发到另一个页面
结果:
总结: 当从一个页面请求转发到另外一个页面时, pageContext域中的值消失, 因为pageContext作用域对象只能在当前页面中有效;
3. 从当前一个页面(one.jsp)重定向到另一个页面(two.jsp)
结果:
总结: 当前一个页面重定向到另一个页面, request作用域对象消失, 因为request对象只能在一次请求一次响应中有效, 响应结束, request的值消失;
4. 关闭浏览器再次打开另外一个页面(two.jsp)
总结: session域对象中的值消失, 因为session是属于会话对象, 作用域是当前浏览器, 一旦浏览器关闭再次打开, 对象消失;
5. 关闭服务器, 再次打开另外一个页面(two.jsp)
总结: application域中的数据在没有关闭服务器之前一直存在, 因为application是作用服务器的,而当你的服务器关闭重新启动, application中的数据会消失;
三、EL进阶
使用EL表达式取值必须确保值是存储在作用域对象中,而当多个作用域存储出现同名情况时,会默认从作用域最小的开始取值。
此时, 会发现是从最小的作用域中获取值;
问题: 取出指定的作用域中的指定值;
因为EL表达式为每一个作用域提供了一个默认的变量:
Application ==> applicationScope
Session ==> sessionScope
Request ==> requestScope
pageContext ==> pageScope
总结:
1. 可以直接从某个作用域中取值, 如果不写作用域+Scope.属性名, 默认从最小的作用域中取值
2. 一旦出现同名的情况, 使用作用域+Scope.属性名是唯一 一种从域对象中获取数据的方式;
四、JSP动作标签
JSP动作标签的作用是用来简化Java脚本的,是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用。
语法:
<jsp:标签名 属性名=”属性值”></jsp:标签名>
1. 页面跳转标签
写法格式:
<jsp:foward page=”跳转页面地址”></jsp:foward>
相当于: 请求转发:request.getRequestDispatcher("/two.jsp").forward(request, response);
案例:
2. 包含标签
写法格式:(动态包含)
<jsp:include page="包含页面的地址"></jsp:include>
相当于: 静态包含<%@include file=”页面名称” %>
案例:
面试题:动态包含和静态包含有什么区别?
1、写法不同:
静态包含是指令包含<%@include file=”***”%>
动态包含是JSP动作标签包含<jsp:include page="***"></jsp:include>
2、编译方式不同:
静态包含:编译过程中将被包含的页面先整合到包含页面再编译。所以只有一个文件
动态包含:编译过程中包含的页面与被包含的页面都编译,运行后内容再通过servlet整合
3、参数传递:
静态包含不能向被包含页面传递参数
动态包含可以使用jsp:param标签向被包含页面传递参数
4、运行效率:
静态包含快,当成了一个页面;动态包含是多个页面,运行慢。
五、JSTL标准标签库
(一)JSTL简介
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
JSTL的使用步骤:
1、导包:
2、标签的引用:
使用taglib指令来引入标签库
3、使用
JSTL组成:
1)核心标签库
2)函数标签库
3)格式化标签库(格式化日期的时候使用)
注意:
Jstl不能单独使用, 需要结合el表达式一起使用
(二)JSTL之核心标签
1、通用标签:
3、分支标签
单分支:
多分支
4、循环标签forEach
(三)JSTL之函数标签
引入函数标签库:
应用场景:
案例:
六、完善项目功能
(一)改造查询功能
回顾:之前的查询
问题:
1. 需要从servlet中获取域中的集合数据, 然后使用for循环遍历
2. 代码的可读性较差, 不易维护
使用jstl和el表达式结合使用去优化查询功能:(优化)
(二)修改学员信息功能
分析:若要修改学员信息,首先在index.jsp页面的操作链接中添加“修改”链接。当单击修改链接时,先将要修改的学员信息通过表单进行回显,再对显示后的数据进行修改操作。
修改页面中数据:
1. 数据的回显
2. 数据的修改
第十四讲JSP技术(下)
一、JSP九大内置对象
(一)内置对象简介
内置对象: 也称之为隐式对象, 在jsp页面中, 已经初始化好的并且已经封装好的, 不需要程序员手动再去创建,可以直接拿过来使用;
如何获取内置对象呢? 快捷键:<% 快捷键补全 %>.
以上有八个内置对象, 还缺少一个内置对象;exception异常对象
异常内置对象如何获取?isErrorPage="true"打开错误页面
关于这九大内置对象 , 都有自己的引用名称;
前边是引用名称, 后边是数据类型;
(二)内置对象创建
既然是内置对象, 已经内置创建好的, 不需要程序员手动创建;
由此可见: 内置对象的实现和管理就是web容器(tomcat)
(三)内置对象详解
名称 |
类型 |
描述 |
out |
javax.servlet.jsp.JspWriter |
用于页面输出 JSP输出字符流 |
request |
javax.servlet.http.HttpServletRequest |
得到用户请求信息。 域对象,针对某次请求 |
response |
javax.servlet.http.HttpServletResponse |
服务器向客户端的回应信息 |
config |
javax.servlet.ServletConfig |
服务器配置,可以取得初始化参数 JSP配置信息的封装对象(一般不用) |
session |
javax.servlet.http.HttpSession |
用来保存用户的信息(会话技术) 域对象,针对某次会话N次请求 |
application |
javax.servlet.ServletContext |
所有用户的共享信息 域对象,针对整个项目的所有请求, 在这它是最大的作用域 |
page |
java.lang.Object |
指当前页面转换后的Servlet类的实例 当前JSP对应的Servlet对象。 (一般不用) |
pageContext |
javax.servlet.jsp.PageContext |
JSP的页面容器 域对象,是JSP独有的。 普通Servlet是没有这个域对象 最小的域对象, 作用范围:是当前JSP页面 |
exception |
java.lang.Throwable |
表示JSP页面所发生的异常,在错误页中才起作用 设置了isErrorPage=”true”才会出现。 封装了上一个页面的错误信息。 |
1. pageContext对象
指的是jsp页面容器, 是jsp独有的 普通servlet是没有的, 并且还是一个作用域对象
作用域范围: 当前页面中有效
作用:
1. Jsp是最小的作用域, 当前页面中有效
2. 可以操作其它的内置对象
案例:
动态获取项目名:
2. out对象
用于页面输出内容, 返回类型JSPWrite, 写出数据数据先进入缓冲区, 然后在输出
Servlet的out对象与out对象有什么区别?
1. Servlet的out对象输出信息时, 不带缓冲区, 返回值的类型: PrintWrite
2. Jsp的out对象带缓冲区, 数据数据先进入缓冲区, 然后在输出, 返回值类型: JSPWrite
案例:
原理图:
问题:
想要输出的结果按照顺序输出: hello 你好
解决: 刷新缓冲区
二、JSP四大作用域对象
(一)作用域对象简介
Servlet的作用域对象:
Request : 请求
Session : 面向浏览器(服务端缓存)
servletContext : 面向web工程
获取结果:
JSP四大作用域对象:(从小到大)
pageContext: 指定页面容器
Request: 面向请求
Session: 面向浏览器, 会话
Application: 面向服务器
(二)JSP作用域对象范围验证
1. 先从当前页面中获取值
总结: 所有作用域的值都可以正常获取吧
2. 从当前一个页面请求转发到另一个页面
结果:
总结: 当从一个页面请求转发到另外一个页面时, pageContext域中的值消失, 因为pageContext作用域对象只能在当前页面中有效;
3. 从当前一个页面(one.jsp)重定向到另一个页面(two.jsp)
结果:
总结: 当前一个页面重定向到另一个页面, request作用域对象消失, 因为request对象只能在一次请求一次响应中有效, 响应结束, request的值消失;
4. 关闭浏览器再次打开另外一个页面(two.jsp)
总结: session域对象中的值消失, 因为session是属于会话对象, 作用域是当前浏览器, 一旦浏览器关闭再次打开, 对象消失;
5. 关闭服务器, 再次打开另外一个页面(two.jsp)
总结: application域中的数据在没有关闭服务器之前一直存在, 因为application是作用服务器的,而当你的服务器关闭重新启动, application中的数据会消失;
三、EL进阶
使用EL表达式取值必须确保值是存储在作用域对象中,而当多个作用域存储出现同名情况时,会默认从作用域最小的开始取值。
此时, 会发现是从最小的作用域中获取值;
问题: 取出指定的作用域中的指定值;
因为EL表达式为每一个作用域提供了一个默认的变量:
Application ==> applicationScope
Session ==> sessionScope
Request ==> requestScope
pageContext ==> pageScope
总结:
1. 可以直接从某个作用域中取值, 如果不写作用域+Scope.属性名, 默认从最小的作用域中取值
2. 一旦出现同名的情况, 使用作用域+Scope.属性名是唯一 一种从域对象中获取数据的方式;
四、JSP动作标签
JSP动作标签的作用是用来简化Java脚本的,是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用。
语法:
<jsp:标签名 属性名=”属性值”></jsp:标签名>
1. 页面跳转标签
写法格式:
<jsp:foward page=”跳转页面地址”></jsp:foward>
相当于: 请求转发:request.getRequestDispatcher("/two.jsp").forward(request, response);
案例:
2. 包含标签
写法格式:(动态包含)
<jsp:include page="包含页面的地址"></jsp:include>
相当于: 静态包含<%@include file=”页面名称” %>
案例:
面试题:动态包含和静态包含有什么区别?
1、写法不同:
静态包含是指令包含<%@include file=”***”%>
动态包含是JSP动作标签包含<jsp:include page="***"></jsp:include>
2、编译方式不同:
静态包含:编译过程中将被包含的页面先整合到包含页面再编译。所以只有一个文件
动态包含:编译过程中包含的页面与被包含的页面都编译,运行后内容再通过servlet整合
3、参数传递:
静态包含不能向被包含页面传递参数
动态包含可以使用jsp:param标签向被包含页面传递参数
4、运行效率:
静态包含快,当成了一个页面;动态包含是多个页面,运行慢。
五、JSTL标准标签库
(一)JSTL简介
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
JSTL的使用步骤:
1、导包:
2、标签的引用:
使用taglib指令来引入标签库
3、使用
JSTL组成:
1)核心标签库
2)函数标签库
3)格式化标签库(格式化日期的时候使用)
注意:
Jstl不能单独使用, 需要结合el表达式一起使用
(二)JSTL之核心标签
1、通用标签:
3、分支标签
单分支:
多分支
4、循环标签forEach
(三)JSTL之函数标签
引入函数标签库:
应用场景:
案例:
六、完善项目功能
(一)改造查询功能
回顾:之前的查询
问题:
1. 需要从servlet中获取域中的集合数据, 然后使用for循环遍历
2. 代码的可读性较差, 不易维护
使用jstl和el表达式结合使用去优化查询功能:(优化)
(二)修改学员信息功能
分析:若要修改学员信息,首先在index.jsp页面的操作链接中添加“修改”链接。当单击修改链接时,先将要修改的学员信息通过表单进行回显,再对显示后的数据进行修改操作。
修改页面中数据:
1. 数据的回显
2. 数据的修改