您的位置:首页 > 编程语言 > Java开发

Java学习【web基础-JSP3-JSP中的9大内置对象1】

2017-07-21 14:08 603 查看
我们已经知道,一个变量必须先定义,才能后使用! 如果没有定义一个变量,而直接使用,会编译报错!(javac阶段时报错!)

什么是jsp内置对象: 所谓jsp内置对象就是不用自己提前定义,直接拿来使用的对象,就是内置对象。

内置对象一共9个,可以在web服务器解析jsp后得到的java源文件中看到:

比如,有一个jsp页面代码如下:



访问该jsp页面后,势必会生成一个java源文件,如下:



为了生成第9个内置对象,我们需要修改index.jsp:





注意,这9大内置对象,只能在jsp页面中直接使用,不可以在main方法中直接使用!

在jsp文件的第一行所写的代码,会出现在java源文件的哪里?? 也会出现在9大内置对象定义之后!!! 所以整个jsp页面,都能访问任何直至对象!

Jsp9大内置对象分别是: (必须背过!)

pageContext

request

session

application

repsone

out

exception

page

config

request内置对象。(重点)

我们之前学习过http协议,我们知道一个浏览器向服务器发起请求的时候,一共会发哪些信息呢?
a.  请求行
b.  请求头
c.  请求体
a)  如果请求方式是post,且有参数,那么参数就在请求体里面
i.  地址栏上看不见参数!
b)  如果请求方式是get,且有参数,那么参数就是url后面,用?隔开
i.  Eg. http://localhost:8080/kk/index.jsp?a=123&b=456


客户端发送给服务器的所有数据,所有信息,都会被封装在request内置对象中!

也就是说,请求行+请求头+请求体–>request!



学习request就是学习HttpServletRequet类的方法





request的方法:

与中国程序员最有缘的知识点: 中文乱码!

世界上第一台计算机诞生于1946年,在美国。 计算机中只能存放2进制数据。

所以计算机中存放任何字符,就不是存放字符的“轮廓外观” 到内存或硬盘中的。

比如要存放一个字符a,则存放的是a对应的数字97的2进制。

如果计算机要显示97对应的字符,会经过显卡的计算,根据数字的不同,在屏幕上打印出不同的像素点,也就是字符的“轮廓”。

当年,美国人发明出计算机的目的是为了计算导弹轨迹,也不会想着让计算机普及给别的国家使用。 所以老美做了第一张编码表,这个编码表不顾及其它国家的文字,只映射了拉丁字母和常用符号: ASCII



一共128对! 0~127的数字,每一个数字对应一个字符。

在ascii码表中,每一个字符占1个字节

世界上第一台个人电脑诞生于1981年,此时意味着计算机普及了,进入家庭。

此时其它国家也需要使用计算了,ascii编码表就无法满足其它国家对字符的需求!

所以各个国家,都分别制作了针对于自己的国家的编码表!;

比如,中国制定了gb2312编码表, 该编码表的前0~127个数字,对应的字符与ascii完全一致! 从128开始以后,对应的字符就是中国人自己编制的! 该码表特点是,存放了简体中文!

后来为了的繁体字也编码在内,就出现了gbk! 该编码表中包含了繁体字!

后来为了团结少数名族,就出现了gb18030, 该码表中囊括了各大少数民族的字符!

Gb编码表中,数字和字母各占1个字节,所有汉字统统占2个字节

日本人也自己只做了针对自己国家的编码表,该编码表的前0~127个数字,对应的字符与ascii完全一致! sjis .

后来各个国家都有了自己的编码表,所有国家的编码表的前0~127个数字,对应的字符都与ascii完全一致!但是后面的数字呢? 各个国家的编码表就各不相同了!

所以,很容易知道,造成乱码的根本原因就是:编码与解码的码表不一致!

因为各个国家的编码表是天下打乱的!! 没有统一的标准。 老美又出来了,制作了一个码表: unicode码表, 万国码,该码表中囊括了世界上所有国家的文字。 Unicode码表中每个字符占2个字节! 哪怕是a字符,也占2个字节 .

但是unicode因为每个字符占2个字节,所有数字范围就是0~65535, 也就是说对应关系一共多少65536种。 这个数字其实不够!

后来为了完全包含世界上所有国家的所有文字,美国又制作了一张码表: utf-8!

utf-8中每个字符占1-3个字节。

00000000

110xxxxx xxxxxxxx

1110xxxx xxxxxxxx xxxxxxxx

所以,至今为止,最好的码表是utf-8, 但是实际情况并不是所有程序员都在使用这个码表,我们要为了码表的统一做出努力,从今以后,任何环境下都要是utf-8!!!

编码和解码复习:

编码: 字符—–>对应的数字

解码: 数字——>对应的字符



我们现在研究一下为什么,jsp提交的中文,在request获取以后,是乱码??



解决中文乱码问题方法1:



解决中文乱码问题方法2:



讨论,目前中文乱码解决方式有2种,到底用哪个?

使用第二种! 因为方便!!

从今以后,但凡制作表单,method必须给成post!!

至此,讲解完毕了以下两个方法:

request.setCharacterEncoding()

request.getCharacterEncoding()

request的方法:



response内置对象: 响应内置对象。

我们知道,客户端传送给服务器的所有数据,都被封装进request内置对象中了,

反过来,服务器发送给客户端的所有数据,都会被先封装进response中,再从resposne中取出来,制作一个http响应!

response的方法:

getWriter();

用于获取一个字符输出流,该流的起点是服务器,终点是客户端!



getOutputStream();

上面getWriter获取的是字符流,这里获取的是字节流。
字节流可以操作任何文件(文本文件、图片、视频、音频,任何文件)
字符流只能操作文本文件(只要记事本方式打开的,看不到乱码就是文本文件)

1.Out内置对象是一个字符输出流, getOutputStream()获取的是一个字节流,这两个流都能向客户端浏览器发送数据,方向是一致的! 所以它们2的关系是互斥的!




2.如果非要使用response.getOutputStream()获取的字节流,必须让out失效




使用response.getOutputStream()目的就是为了给客户端发送2进制数据! 而不是发送html字符串。


sendRedirect(), 重定向。

要搞清楚什么是重定向,必须先搞清楚什么是转发(<jsp:forward page=”” />)
要彻底搞清楚什么是转发,就必须知道request内置对象的生命周期。




补充request的方法:

request.setAttribute(String key, Object value) 在request范围中设置一个属性!
request.getAttribute(String key)从request范围中获取一个属性!

思考,
在一个请求范围中设置的属性,在同一个请求范围中能获取吗?  能!
在一个请求范围中设置的属性,在另外一个新请求范围中能获取吗? 不能!


转发:

1.服务器端跳转
2.客户端无法感知(地址栏不变!)
3.转发前后一共历经了2个页面,作为客户端一共发起1次请求,所以转发前后的2个页面中的所有request都代表同一次请求




总之,转发前后的2个页面中的所有request内置对象,都代表同一次请求!!

转发代码示例:



重定向:



重定向的特点:

1.客户端跳转。 在客户端浏览器请求一个jsp页面中,jsp响应了302+location响应头,浏览器就会自动再发起第2次请求,去找location指明的资源,注意,第一次请求和第二次请求都是浏览器发出的请求,所以叫客户端跳转
2.重定向时,客户端地址栏会发生变化!
3.重定向前后一共发起2次请求, 重定向前后的两个jsp页面中的request各不相同!!所以重定向不能延长请求范围!


重定向代码示例:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: