Servlet开发时需要使用的5种工具对象
一、概述:
- HttpServletResponse接口:负责将运行结果写入到响应包
- HttpServletRequest接口:负责读取请求包中相关信息
- ServletContext接口:可以为当前网站中所有的Servlet提供【共享数据】
- Cookie:在一次会话过程中,存储浏览器在服务端产生的私人数据
- HttpSession接口:在一次会话过程中,存储浏览器在服务端产生的私人数据
二、HttpServletResponse接口:
- 【介绍】:
1)一个来自于Servlet规范中接口;由Tomcat负责提供这个接口实现类
2)负责在servlet运行完毕后,将相关数据写入到【响应头】和【响应体】
3)开发人员习惯将HttpServletResponse接口修饰对象,称为【响应对象】 - request.setCharacterEncoding()与response.setContentType()
1)相同点:都可以设置响应头中【字符集】
2)不同点:response.setContentType()还可以设置【内容类型】
三、HttpServletRequest接口:
-
【介绍】:
1)来自于Servlet规范中的一个接口,接口实现类由Tomcat负责提供的
2)由HttpServletRequest接口修饰对象,可以帮助开发人员读取【请求协议包】信息相当于【Scanner】
3)一般习惯于将HttpServletRequest接口修饰对象称为【请求对象】 -
【作用】:
1)读取【请求行】信息
String url = request.getRequestURL();
String method = request.getMethod();
2)读取【请求头】或者【请求体】中所有的【请求参数名】
request.getParameterNames();
3)读取请求头或者请求体中的【参数内容】
http://localhost:555/myWeb/two.do?name=mike
String value = request.getParameter(“请求参数名”)http://localhost:555/myWeb/two.do?uname=mike&uname=allen&uname=smith String array[] = request.getParameterValues("请求参数名")
四、请求对象与响应对象生命周期:
- 都是由Tomcat负责创建的
- 每当Tomcat收到一个【请求协议包】时,就会为这个请求协议包创建一对【请求对象和响应对象】
- 一次请求对应一对【请求对象和响应对象】
- 在Tomcat调用被请求的Servlet中的服务方法(doGet和doPost)时,负责将本次【请求对象和响应对象】作为参数传入到服务方法
- 在服务方法工作完毕后,Tomcat销毁本次请求相关的request和response
- Tomcat负责将【响应包】推送到浏览器上
五、中文请求方式乱码问题
-
【原因】:跟浏览器采用【请求方式】
如果浏览器以【Get方式】发送请求,【请求参数】在【请求头】存放
在请求协议包到达服务端之后,【请求头】内容由Tomcat负责解析
Tomcat9.0 在解析数据时,默认采用的字符集是【utf-8】
所以如果浏览器以【Get】方式发送中文参数,此时在服务端不会出现中文乱码问题如果浏览器以【Post方式】发送请求,【请求参数】在【请求体】存放
在请求协议包到达服务端之后,【请求体内容】是由对应【请求对象request】负责解码的。request对象默认使用的是【ISO-8859-1】字符集
所以如果浏览器以【Post】方式发送中文参数,此时在服务端一定会出现中文乱码问题 -
【解决方案】:在request对象解析数据之前,重新设置request对象字符集【utf-8】即可
request.setCharaterEncoding(“utf-8”);
request.getParameter(“参数”);
六、ServletContext接口
- 【介绍】:
1)Servlet规范中的一个接口,接口实现类由Tomcat负责提供
2)负责为当前工程中所有Servlet提供【共享数据】
3)开发人员习惯于将ServletContext接口修饰对象称为【全局作用域对象】 - 【生命周期】:
1)【全局作用域对象】在Tomcat启动时,由Tomcat为当前网站来创建的
2)一个网站中只能有一个全局作用域对象
3)从网站启动开始一直到网站关闭时,由Tomcat负责销毁当前网站的全局作用域对象 - 【使用】:
1)如何得到当前工程中的【全局作用域对象】
ServletContext application = request.getServletContext():
向Tomcat索要当前工程的全局作用域对象 - 【共享数据来源方式一】:
在网站启动之前,开发人员可以将网站中绝大多数Servlet需要使用的数据添加到web.xml中
共享数据名称
共享数据内容
在网站启动时:Tomcat首先为当前网站创建一个【全局作用域对象】
Tomcat然后将web.xml配置共享数据添加到【全局作用域对象】
在网站运行时,当前某一个Servlet需要使用【共享数据】时
可以从全局作用域对象索要数据
共享数据内容 = application.getInitParameter(“共享数据名称”)
此时共享数据只能读取使用,但是不能修改 - 【共享数据来源方式二】:
在Tomcat运行期间,可以将某一个Servlet提供的数据保存到全局作用域对象中,仅当前网站中其他的Servlet来使用
AServlet:提供共享数据
application.setAttribute(“共享数据名”,共享数据); object
BServlet:
共享数据=application.getAttribute(“共享数据”);
由Servlet存入共享数据可以被修改
七、会话
- 【定义】:一个浏览器与一个服务端的一次完整的交流
- 【特点】:
1)在一次会话过程中,经历多次请求与响应
2)在一次会话过程中,同一个浏览器往往访问多个Servlet - 【需求】:在一次会话过程中,在浏览器要访问的Servlet之间进行数据共享
- 【解决方案】:Cookie和HttpSession
八、Cookie:
- 【介绍】:
1)Cookie是Servlet规范提供一个工具类
2)在参与一个会话过程中Servlet之间,进行【数据共享】
3)Cookie存储在浏览器上,保存本次会话的【共享数据】 - 【工作原理】:
1)在浏览器访问【OneServlet】时。
【OneServlet】负责将当前浏览器产生的私人数据保存到Cookie。
然后【OneServlet】负责将Cookie推送到当前浏览器上
2)在浏览器再次来访问当前网站【TwoServlet】时,需要无条件将服务端之前推送过来的Cookie推送回去,这样TwoServlet就得到【OneServlet】提供的共享数据 - 【Cookie使用】:
1)如何创建一个Cookie对象,来保存共享数据
Cookie c1 = new Cookie(“key”,“共享数据”);
一个Cookie对象只能存储一个键值对
Cookie对象只能存储String类型共享数据
2)如何将Cookie写入到响应包的【响应头】
response.addCookie(c1);
3)如何从请求协议包的【请求头】读取浏览器返还的Cookie
Cookie array[] = request.getCookies(); - 【cookie对象的生命周期】:
1)【默认情况】:cookie保存在浏览器内存中
所以在浏览器关闭时,cookie会被windows进行销毁
2)【人工干预】:要求将Cookie保存在客户端计算机的【硬盘上】
同时制定Cooike在硬盘上的存活时间
在存活时间范围之内,关闭浏览器甚至关闭计算机,都不会导致Cookie被销毁
cookie.setMaxAge(以秒为单位时间) - 【cookie缺点】:
1)一个cookie对象只能存放一个键值对,如果存储的数据较多,需要管理多个cookie
2)cookie只能存放String类型数据,无法存放【高级类型Java数据,比如List,Map】
九、HttpSession接口
-
【介绍】:
1)来自Servlet规范中的接口,接口实现类来自于Tomcat
2)为参与同一个会话的Servlet之间提供共享数据
3)习惯于将HttpSession接口修饰的对象称为【会话作用域对象】也可以叫做【session对象】 -
【HttpSession与Cookie区别】:
【相同点】:为参与同一个会话的servlet之间提供共享数据
【不同点】:
存储位置:cookie存储在客户端浏览器内存中或者硬盘上
HttpSession存储在服务端计算机的内存中
存储内容:cookie只能存储String类型数据
HttpSession可以存储任意类型的数据
存储数量:一个Cookie只能存储一个键值对
一个HttpSession对象可以存储任意数的键值对 -
【使用】:
1)在浏览器来访时,Tomcat不会主动为当前浏览器创建对应的HttpSession对象
2)只有浏览器所访问的Servlet向Tomcat提出要求时,Tomcat才会为当前浏览器创建一个HttpSession对象
3)如何在Servlet中为当前浏览器,申请一个HttpSession对象
a) HttpSession session = request.getSession();
b) HttpSession session = request.getSession(true);
c) HttpSession session = request.getSession(false); -
getSession()与request.getSession(true)与getSession(false)
1)getSession():如果当前浏览器在服务端已经拥有了一个SESSION对象,
此时Tomcat需要将这个session对象进行返回
如果当前浏览器在服务端尚未拥有SESSION对象
此时Tomcat需要创建一个全新的session对象返回
2)getSession(true):与getSession()完全一致
3)getSession(flase):如果当前浏览器在服务端已经拥有了一个SESSION对象,
此时Tomcat需要将这个session对象进行返回
如果当前浏览器在服务端尚未拥有SESSION对象
此时返回一个NULL
如果来访的用户身份已经确认合法了,此时可以使用getSession()或getSession(true)
如果来访的用户身份尚未确认,此时只可以使用getSession(false) -
Tomcat是如何将浏览器与SESSION对象关联
在Tomcat创建一个SESSION对象时,为SESSION对象生成一个唯一编号
然后将这个编号保存到cookie中,推送到当前浏览器内存中
等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回的cookie来判断浏览器在服务端是否有session对象 -
如何使用HttpSession对象
在本次会话中,AServlet需要为本次会话中其他Servlet提供共享数据
session.setAttribute(“key”,共享数据)
在本次会话过程中,BServlet需要得到当前浏览器session的数据
session.getAttribute(“key”)