概述:
1. HttpServeltResponse接口:负责将运行结果写入到响应包
2. HttpServletRequest接口: 负责读取请求协议包信息
3.ServletContext接口:可以为当前网站中所有的Servlet提欧【共享数据】
4.Cookie: 在一次会话过程中,存储浏览器在服务端产生的私人数据
5.HttpSession接口:在一次会话过程中,存储浏览器在服务端产生的私人数据
HttpServeltResponse接口的使用:设置response响应头的参数,在响应体中写入内容
1)一个来自于Servlet规范中接口;由Tomcat负责提供这个接口实现类
2)负责在Servlet运行完毕后,将相关的数据写入到【响应头】和【响应体】
3)开发人员习惯于将HttpServletResponse接口修饰对象,称为【响应对象】
response.setCharacterEncoding() 与 response.setContentType()
1)相同点: 都可以设置响应头中【字符集】
2)不同点:response.setContentType()还可以设置【内容类型】
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String str="Hello HttpServletResponse";//OneServlet运行后的结果,写到响应体里 /** * 1.浏览器根据【响应头】中设置的【字符集】对接受内容进行解码 * 2.在默认情况下【响应头】中字符集【ISO-8859-1】 * 3.显示【中文】要把响应头中字符集设置为【GBK】 */ resp.setContentType("text/html;charset=utf-8"); String msg = "明天休息"; resp.getWriter().write(msg); /** * 从resp中得到一个【输出流】 * 【输出流】将字符串写入到【响应体】中 */ PrintWriter out = resp.getWriter(); out.write(str); /** * out.write()只能将字符串或者unicode码写入响应体中 * out.print()则会按原本的特征写入 * */ int num=50; out.write(num); out.println(num); /** * 富文本:既有文字内容又有html标签 * 1.浏览器根据【响应头】的【内容类型】处理接受结果 * 2.默认情况下【响应头】的【内容类型】是"text" * 3.如果要成功显示html标签,需要通知浏览器,重新设置响应头的内容类型集 * resp.setContentType("text/html"); */ resp.setContentType("text/html"); msg = "apple<br/>orange<br/>egg"; resp.getWriter().write(msg); }//tomcat 会在 OneServlet调用完毕后将响应包推送到浏览器上 }
HttpServeltRequest接口的使用
1.来自于Servlet规范中一个接口,接口实现类由Tomcat负责提供的
2.由HttpServletRequest接口修饰对象,可以帮助开发人员读取【请求协议包】信息相当于[Scanner]
3.一般习惯于将HttpServletRequest接口修饰对象称为【请求对象】
使用
1.读取【请求行】信息
String url = request.getRequstURL();
String method = request.getMethod();
2. 读取【请求头】或则【请求体】中所有的【请求参数名】
request.getParameterNames();
3. 读取请求头或则请求体中【参数内容】
http://localhost:555/myWeb/two.do?uname=mike
String value = request.getParameter("请求参数名")
http://localhost:555/myWeb/two.do?uname=mike&uname=allen&uname=smith
String array []=request.getParameterValues("请求参数名")
中文请求参数乱码问题:
1.[原因]: 跟浏览器采用【请求方式】有关
如果浏览器以【GET方式】发送请求,【请求参数】在【请求头】存放
在请求协议包到达服务端之后,【请求头】内容是由Tomcat负责解析Tomcat9.0在解析数据时,默认采用的字符集[utf-8].
所以如果浏览器以【GET】方式发送中文参数,此时在服务端不会出现中文乱码问题
如果浏览器以【POST方式】发送请求,【请求参数】在【请求体】存放
在请求协议包到达服务端之后,【请求体】内容是由对应【请求对象request】
负责解码的。request对象默认使用【ISO-8859-1】字符集
所以如果浏览器以【POST】方式发送中文参数,此时在服务端必须会出现中文乱码问题
2.【解决方案】:在request对象解析数据之前,重新设置request对象字符集【utf-8】即可.
request.setCharacterEncoding("utf-8");
String value =request.getParameter("参数");
使用例子
public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.读取【请求行】中【请求的资源文件地址】 String url = req.getRequestURI().toString(); //2.读取【请求行】中的【请求方式】 String method = req.getMethod(); System.out.println("浏览器访问的资源文件地址"+url); System.out.println("浏览器访问时采用的请求方式"+method); //3.读取请求协议包中所有请求参数名称 Enumeration paras = req.getParameterNames(); while(paras.hasMoreElements()){ System.out.println(paras.nextElement()); } //4.读取【单个请求参数内容】 String userAge = req.getParameter("age"); System.out.println(userAge); //5.读取【一个参数关联多个内容】****复选框作为参数时往往带有多个值 String[] homes = req.getParameterValues("home"); for(String home:homes){ System.out.println(home); } } }
请求对象与响应对象生命周期:
1.都是由Tomcat负责创建的
2.每当Tomcat收到一个【请求协议包】时,就会为这个请求协议包创建一对【请求对象和响应对象】
3.一次请求对应 一对【请求对象和响应对象】
4.在Tomcat调用被请求的Servlet中服务方法(doGet/doPost)时,负责将本次【请求对象和响应对象】作为参数传入到服务方法
5.在服务方法工作完毕后,Tomcat 销毁本次请求相关的request和response
6.Tomcat 负责将【响应包】推送到浏览器上
ServletContext接口
1.Servlet规范中一个接口,接口实现类由Tomcat负责提供
2.负责为当前工程中所有Servlet提供【共享数据】
3.开发人员习惯于将ServletContext接口修饰对象称为【全局作用域对象】
【生命周期】:网站被创建->网站被销毁
1.【全局作用域对象】在Tomcat启动时,由Tomcat为当前网站来创建的
2.一个网站中只能有一个全局作用域对象
3.从网站启动开始一直到网站关闭时,由Tomcat负责销毁当前网站的全局作用域对象
【使用】:
1.如何得到当前工程中【全局作用域对象】
ServletContext application= request.getServletContext():
向Tomcat索要当前工程的全局作用域对象
【共享数据来源方式一】:
在网站启动之前。开发人员可以将网站中绝大多数Servlet需要使用的数据添加到web.xml
<context-param>
<param-name>共享数据名称</param-name>
<param-value>共享数据内容</param-value>
</context-param>
在网站启动时:Tomcat首先为当前网站创建一个【全局作用域对象】,Tomcat然后将web.xml配置共享数据添加到【全局作用域对象】
在网站运行时,当前某一个Servlet需要使用【共享数据】时,可以从全局作用域对象索要数据
共享数据内容= application.getInitParameter("共享数据名称")
*****此时共享数据只能读取使用,不能修改
【共享数据来源方式二】:
在Tomcat运行期间,可以将某一个Servlet提供的数据保存到全局作用域对象中,供当前网站中其他的Servlet来使用
AServlet: 提供共享数据
application.setAttribute("共享数据名",共享数据数据); object
BServlet:
共享数据数据 = application.getAttribute("共享数据")
*****由Servlet存入共享数据可以被修改。
Cookie:
在参与一个会话过程中Servlet之间,进行【数据共享】,Cookie存储在浏览器上,保存本次会话的【共享数据】
【工作原理】:
1.在浏览器访问【OneServelt】时。
【OneServelt】负责将当前浏览器产生的私人数据保存到Cookie。
然后【OneServelt】负责将Cookie推送到当前浏览器上.
2. 在浏览器再次来访问当前网站【TwoServlet】时,需要无条件的将服务端之前推送过来的【Cookie】在推送回去。
这样TwoSerelt得到【OneSerelt】提供的共享数据
【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保存到客户端计算机的【硬盘上】,同时制定cookie在硬盘上存活时间。
在存活时间范围之内,关闭浏览器甚至关闭计算机,都不会导致cookie被销毁。
cookie.setMaxAge(以秒为单位时间)
[cookie缺点]:
1.一个cookie对象只能存放一个键值对,如果存储的数据较多,需要管理多个Cookie
2.cookie只能存放String类型数据,无法存放【高级类型Java数据,比如List,Map】
应用:
OneServlet用来新建Cookie,存到响应头中返回给浏览器
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.读取当前用户基本信息 String name = req.getParameter("username"); String jiaozi = req.getParameter("jiaozi"); //2.将当前用户私人数据保存到Cookie里 Cookie c1 = new Cookie("key1",name); Cookie c2 = new Cookie("key2",jiaozi); //3.c1需要在硬盘上存活60秒 c1.setMaxAge(60); //4.将Cookie写入到【响应包】的【响应头】中 resp.addCookie(c1); resp.addCookie(c2); } }
TwoServlet用来接收浏览器推送回来的Cookie,读取其中的用户信息
public class TwoServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.读取当前来访浏览器推送回来的Cookie Cookie array[] = req.getCookies(); //2.根据得到的Cookie,招待当前用户 for(Cookie cookie:array){ String keyName = cookie.getName();//读取cookie中关键字名称 String value = cookie.getValue();//读取cookie中的共享数据 if("key1".equals(keyName)){ System.out.println("您好"+value); }else if("key2".equals(keyName)){ System.out.println("这是您喜欢的"+value); } } } }
网页初始页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <center> <h1>新用户点餐页面</h1> <form action="/myWeb/one.do"> 客人名称:<input type="text" name="username"><br/> 饺子类型:<input type="radio" name="jiaozi" value="三鲜饺子">三鲜饺子 <input type="radio" name="jiaozi" value="西葫芦饺子">西葫芦饺子 <input type="radio" name="jiaozi" value="虾仁饺子">虾仁饺子 <input type="submit" name="jiaozi" value="点餐"/> </form> <h1>VIP通道</h1> <a href="/myWeb/two.do">贵客里面请</a> </center> </body> </html>