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内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用。
语法:
1.页面跳转标签
写法格式:
相当于: 请求转发:request.getRequestDispatcher("/two.jsp").forward(request, response);
案例:
2.包含标签
写法格式:(动态包含)
相当于: 静态包含
案例:
面试题:动态包含和静态包含有什么区别?
1、写法不同:
静态包含是指令包含
动态包含是JSP动作标签包含
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内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用。
语法:
1.页面跳转标签
写法格式:
相当于: 请求转发:request.getRequestDispatcher("/two.jsp").forward(request, response);
案例:
2.包含标签
写法格式:(动态包含)
相当于: 静态包含
案例:
面试题:动态包含和静态包含有什么区别?
1、写法不同:
静态包含是指令包含
动态包含是JSP动作标签包含
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.数据的修改