概述:
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>
网页初始化设置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one.do</url-pattern> </servlet-mapping> <servlet> <servlet-name>TwoServlet</servlet-name> <servlet-class>com.bjpowernode.controller.TwoServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TwoServlet</servlet-name> <url-pattern>/two.do</url-pattern> </servlet-mapping> </web-app>
HttpSession接口
1. 为参与同一个会话的servlet之间提供共享数据
2. 习惯于将HttpSession接口修饰的对象称为【会话作用域对象】也可以叫做【session对象】
【HttpSession与Cookie区别】:
【相同点】:为参与同一个会话的servlet之间提供共享数据
【不同点】:
[存储位置]: cookie存储在客户端浏览器内存中或则硬盘上,HttpSession存储在服务端计算机的内存中
[存储内容]: cookie只能存储String类型数据,HttpSession可以存储任意类型数据
[存储数量]: 一个Cookie只可以存储一个键值对,一个HttpSession对象可以任意个数的键值对
【使用】 :
1.在浏览器来访时,Tomcat不会主动为当前浏览器创建对应的HttpSession对象
2.只有浏览器所访问的Servelt向Tomcat提出要求时,Tomcat才会为当前浏览器创建一个HttpSession对象
3.如何在Servelt中为当前浏览器,申请一个HttpSession对象
1) HttpSession session = request.getSession();
2) HttpSession session = request.getSession(true);
3) HttpSession session = request.getSession(false);
4.getSession() 与 request.getSession(true) 与 getSession(false)
1) getSession(): 如果当前浏览器在服务端中已经拥有了一个SESSION对象,此时Tomcat需要将这个session对象进行返回
如果当前浏览器在服务端中尚未拥有SESSION对象,此时Tomcat需要创建一个全新的session对象返回
2)getSession(true): 与getSession()完全一致。
3)getSession(false):如果当前浏览器在服务端中已经拥有了一个SESSION对象,此时Tomcat需要将这个session对象进行返回
如果当前浏览器在服务端中尚未拥有SESSION对象,此时返回一个null
******** 如果来访的用户身份已经确认合法了,此时可以使用getSesion()或则getSession(true)
如果来访的用户身份尚未确认,此时只可以使用getSession(false)
5.Tomcat是如何将浏览器与SESSION对象关联:利用cookie
在Tomcat创建了一个SESSION对象时,为SESSION对象生成一个唯一编号
然后将这个编号保存到cookie中,推送到当前的浏览器内存中
等到浏览器再次发送请求时,Tomcat就可以通过读取浏览器返回的cookie
来判断浏览器在服务端中是否有session对象
6.如何使用HttpSession对象
在本次会话过程中 AServlet需要为本次会话中其他Servelt提供共享数据
session.setAttribute("key",共享数据)
在本次会话过程中,BServlet需要得到当前浏览器session的数据
session.getAttribute("key")
应用:
OneServlet模拟一个简单购物车,每次打开浏览器进入该页面,tomcat就会为其建立一个session来保存购物车的物品和数量
public class OneServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.读取浏览器推送过来的【商品名称】 String goodsName = req.getParameter("name"); //2.向tomcat索要当前浏览器在服务端的session对象 HttpSession session = req.getSession(); //3.将用户所选商品保存到当前用户session中 Integer goodsNum = (Integer)session.getAttribute(goodsName); if(goodsNum==null){//之前没买过 session.setAttribute(goodsName,1); }else { session.setAttribute(goodsName,goodsNum+1); } } }
网站初始配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>OneServlet</servlet-name> <servlet-class>com.bjpowernode.controller.OneServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>OneServlet</servlet-name> <url-pattern>/one.do</url-pattern> </servlet-mapping> </web-app>
网站初始页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <center> <h1>商品展示页面</h1> <table border="2"> <tr> <td>面包</td> <td>15.00</td> <td><a href="/myWeb/one.do?name=面包">放入购物车</a></td> </tr> <tr> <td>啤酒</td> <td>10.00</td> <td><a href="/myWeb/one.do?name=啤酒">放入购物车</a></td> </tr> <tr> <td>烤肠</td> <td>30.00</td> <td><a href="/myWeb/one.do?name=烤肠">放入购物车</a></td> </tr> </table> </center> </body> </html>