1.什么是JSP
1.JSP全名为Java Server Pages
2.中文名叫java服务器页面
3.它是在传统的网页HTML文件(*.htm,*.html)中插入Java程序段和JSP标记
4.后缀名为(*.jsp)。
5.其根本是一个简化的Servlet设计
2.为什么要有JSP
1.直接使用Html文件是没有办法输出Java当中的信息
2.使用servlet来去输出一个网页非常的麻烦
3.于是就出现了jsp,又能写html,又能写Java代码
3.JSP脚本元素和变量
在JSP当中写Java代码:
<%java代码%>: 内部的java代码翻译到service方法的内部
<%=java变量或表达式>: 会被翻译成service方法内部out.print()
<%!java代码%>: 会被翻译成servlet的成员的内容
4.JSP指令
1.什么是指令:
JSP指令用于设置整个JSP页面的相关信息
以及用于JSP页面与其它容器之间的通信
2.include指令:
作用:
表示在JSP编译时插入一个包含文件或者代码的文件(就是引用另外一个jsp到当前的jsp中)
include指令所包含的文件名不能是一个变量url,只能是静态的文件名
3.page指令:
page指令共有11个属性:
contentType:
contentType属性指定JSP页面的MIME和编码格式
pageEncoding:
pageEncoding属性用来指定JSP文件的编码格式
import:
在JSP中引入Java的包和类,多个包之间以逗号隔开
session:
指定当前页面是否能获得当前用户的session对象
缺省是true
如果指定为false,那么在该页面中无法使用session,使用的话会提示500错误
errorPage:
如果当前页面发生异常
网页会重定向到errorPage所指定的页面进行处理
isErrorPage:
允许指定的JSP页面为错误处理页面
language属性:
指定页面中使用的脚本语言种类
目前只支持java
extends:
用于指定该JSP生成的servlet继承自哪个父类
必须指定包名加类名
buffer:
用来设置输出流缓冲区
缓冲区的作用就是为了提高IO性能
也就是说减少write的次数
autoFlush:
用来指定当输出流缓冲区满了的时候,是否自动刷新缓冲区
isThreadSafe:
缺省值为true
指定该JSP文件是否支持多线程访问
info:
用来设置该jsp文件的介绍信息
isELIgnored:
用来标示是否支持EL表达式
5.动态包含指令和静态包含指令
1.静态包含:
将两个jsp页面接着到一起, 然后再翻译成servlet
2.动态包含:
各自翻译自己的页面,然后再引入
3.结构图如下:(上面的的是静态,后面的是动态)
6.请求转发
请求转发:
<jsp:forward page="要转发的资源"></jsp:forward>
7.隐式对象
jsp被翻译成servlet之后,service方法中有9个对象定义并初始化完毕
1.request:
得到用户请求信息对象
2.response:
服务器向客户端的响应对象
3.config:
服务器配置,可以取得初始化参数
4.application:
所有用户的共享信息,就是servletContext
5.page:
指当前页面转换后的Servlet类的实例
6.session:
用来保存用户会话的信息
7.out:
out的类型:JspWriter
out作用就是想客户端输出内容 out.write()
out缓冲区默认8kb
可以设置成0 代表关闭out缓冲区内容直接写到respons缓冲区
out写的内容写到out缓冲区当中
最后再把out缓冲区当中的内容合并到response缓冲区当中
8.pageContext:
1.jsp页面的上下文对象
2.是一个域对象
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)
3.可以向指定的其他域中存取数据
setAttribute(String name,Object obj,int scope)
setAttribute(“name”,"lk",PageContext.REQUEST_SCOPE);
getAttribute(String name,int scope)
getAttribute("lk",PageContext.REQUEST_SCOPE)
removeAttrbute(String name,int scope)
findAttribute(String name)
自动到所有的域当中找数据
从小到大的范围搜索数据
依次从pageContext域,request域,session域,application域中获取属性
在某个域中获取后将不在向后寻找
4.可以获得其他8大隐式对象:
pageContext.getRequest()
pageContext.getSession()
5.第三点和第四点的代码实现见下面的结构图
8.区别out.write()和response.write():
1.out.write()会把数据存到out缓存区,然后再拼接到respond缓冲区
2.respond.write()会把数据存到respond缓冲区,也就只有这个缓冲区的数据才能响应到浏览器页面,
3.具体的结构图如下图所示: