1、第 11 章 WEB11-Cookie 获得浏览器带过来的 Cookie:HttpServletRequest 有一个方法:* Cookie getCookies(); 创建一个 Cookie 对象:* Cookie(String name,String value);【JSP 的简单概述】 什么是 JSP :Java Server Pages(Java 服务器端页面).JSP = Java 代码 + HTML 的元素 + JSP内置东西 SUN 公司为什么推出 JSP 动态网页开发技术:* SUN 公司推出的 Servlet 技术进行动态网页开发.发现 Servlet 自身有不足没有办法与
2、ASP,PHP 技术竞争.想在动态网页中输出表单.在 Servlet 中获得 PrintWriter out = response.getWriter();* out.println(“”);* out.println(“”);* SUN 又推出了动态的网页开发技术就是 JSP. JSP 的执行过程:* JSP 会被翻译成 Servlet,编译成 class 进行执行的. JSP 的嵌入 Java 代码:JSP 的脚本元素* :翻译成类中的成员部分. 定义变量,定义方法,定义类.Servlet 是线程不安全的,尽量少在类中定义成员属性!* :翻译成类的 service 方法内部的内容. 定义变
3、量,定义类,直接写代码块.* :翻译成 service 方法内部的 out.print();1.1.2.2 步骤分析:【步骤一】:准备登陆的案例.【步骤二】:在统计人数的 Servlet 中.判断是否是第一次访问.【步骤三】:根据是否是第一次显示不同的信息,同时将当前的时候保存到 Cookie 中.1.1.3 代码实现public class CountServlet extends HttpServlet private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest reques
4、t, HttpServletResponse response) throws ServletException, IOException response.setContentType(“text/html;charset=UTF-8“);Integer count = (Integer) this.getServletContext().getAttribute(“count“);/ response.getWriter().println(“现在网站被访问的次数为:“+count+“);/* 获得浏览器中带过来的所有的 Cookie 信息,从数组中查找有没有指定名称的 Cookie* 判
5、断用户是否是第一次访问:(从数组中没有找到指定名称的 Cookie)* * 如果是第一次:显示欢迎,记录当前访问的时间存入到 Cookie 中.* * 如果不是第一次:显示欢迎,上一次访问时间,同时记录当前访问的时间存入到 Cookie 中。*/ 获得浏览器带过来的所有的 Cookie:Cookie cookies = request.getCookies();/ 从数组中查找指定名称的 Cookie:Cookie cookie = CookieUtils.findCookie(cookies, “lastVisit“);/ 判断是否是第一次:if(cookie = null)/ 第一次访问r
6、esponse.getWriter().println(“您是第“+count+“位访客!“);else/ 不是第一次Long l = Long.parseLong(cookie.getValue();Date d = new Date(l);response.getWriter().println(“您是第“+count+“位访客! 上次访问时间是:“+d.toLocaleString();/ 创建一个 Cookie 对象:Cookie c = new Cookie(“lastVisit“,“+System.currentTimeMillis();/ 保存到浏览器端:response.add
7、Cookie(c);protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response);1.1.4 总结:1.1.4.1 Cookie 的常用 API: Cookie 的常用的 API:* getName();* getValue();* setDomain(String domain); - 设置 Cookie 的有效域名. / * setPath(String path);
8、- 设置 Cookie 的有效路径.* setMaxAge(int maxAge); - 设置 Cookie 的有效时间. Cookie 的分类有关:* 会话级别的 Cookie:默认的 Cookie.关闭浏览器 Cookie 就会销毁.* 持久级别的 Cookie:可以设置 Cookie 的有效时间.那么关闭浏览器 Cookie 还会存在. 手动销毁持久性Cookie. setMaxAge(0)-前提是有效路径必须一致.1.2案例二:记录用户的商品浏览记录:1.2.1 需求:在购物网站上浏览商品的信息,商家为了留住用户,记住之前浏览的一些商品.1.2.2 分析:1.2.2.1 技术分析:1.
9、2.2.2 步骤分析:【步骤一】:在登录完成后,显示商品列表页面.【步骤二】:为商品列表页面做一些准备工作.【步骤三】:点击某个商品,将商品 ID 传递一个 Servlet.【步骤四】:在 Servlet 中:判断是否是第一次浏览商品【步骤五】:如果是第一次:将商品的 ID 存入到 Cookie 中即可.【步骤六】:如果不是第一次:判断该商品是否已经浏览了.【步骤七】:如果浏览器过.删除之前元素,将该元素添加到最前面.【步骤八】:如果没有浏览过该商品.判断最大长度,没有超过限制,直接加到最前,如果已经超过限制,删除最后一个,将其插入到最前.1.2.3 代码实现:public class Pro
10、ductServlet extends HttpServlet private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException /* * 接收商品 id.* * 接收从客户端带过来的所有 Cookie.* * 从 Cookie 的数组中查找指定名称的 Cookie.* * 判断是否是第一次浏览商品:* * 第一次浏览商品* * 直接将
11、商品的 ID 存入到 Cookie.* * 将 Cookie 回写到浏览器.* * 不是第一次浏览商品 1-2* * 判断当前的商品是否已经在浏览记录.* * 已经存在: 2-1 移除当前元素,将当前元素添加到最开始.* * 没在浏览记录中: * * 判断是否已经超过了最大长度 :如果超过 2-1-3:删除最后一个 将当前元素添加到最前面.* * 没有超过:直接将该元素添加到最前位置.* * 将转换的 id 的值存入到 Cookie,回写浏览器.*/ 接收 id:String id = request.getParameter(“id“);/ 获得所有的 Cookie 的信息:Cookie c
12、ookies = request.getCookies();/ 判断是否是第一次:Cookie cookie = CookieUtils.findCookie(cookies, “history“);if(cookie = null)/ 第一次浏览商品Cookie c = new Cookie(“history“,id);c.setPath(“/day11“);c.setMaxAge(60*60*24*7);response.addCookie(c);else/ 不是第一次浏览/ 判断选择的商品是否已经在浏览记录中 2-1String value = cookie.getValue();Str
13、ing ids = value.split(“-“);/ 将数组变为集合:LinkedList list = new LinkedList(Arrays.asList(ids);if(list.contains(id)/ 之前浏览过该商品list.remove(id); / 1-2-3list.addFirst(id);else/ 没有浏览过该商品.if(list.size() =3 )/ 超过 3 个list.removeLast();list.addFirst(id);else/ 没到 3 个.list.addFirst(id);/ 将 list 中的元素取出,使用- 连接上保存到 Coo
14、kie,写回浏览器.StringBuffer sb = new StringBuffer();for(String s:list)sb.append(s).append(“-“);String sValue = sb.toString().substring(0,sb.length()-1);System.out.println(sValue);/ 存入到 Cookie 中Cookie c = new Cookie(“history“,sValue);c.setPath(“/day11“);c.setMaxAge(60*60*24*7);response.addCookie(c);reques
15、t.getRequestDispatcher(“/demo2/product_info.htm“).forward(request, response);protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException doGet(request, response);1.2.4 总结:1.2.4.1 清空浏览记录:删除持久性的 Cookie:public class ClearServlet extends HttpServl
16、et private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException Cookie cookie = new Cookie(“history“,null);cookie.setPath(“/day11“);cookie.setMaxAge(0);response.addCookie(cookie);response.sendRedir
17、ect(“/day11/demo2/product_list.jsp“);/* see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException / TODO Auto-generated method stubdoGet(request, response);1.3
18、案例三:将商品添加到购物车:1.3.1 需求:查看某个商品详情的时候,添加到购物车.需要将商品添加到购物车.1.3.2 分析:1.3.2.1 技术分析:【Session 的概述】Cookie 本身是有大小和个数的限制.Session 没有限制.Cookie 的数据保存在客户端,Session 数据保存在服务器端. Session 的执行原理:基于 Cookie 的. 使用 Session:* 获得 Session:* request.getSession();1.3.2.2 步骤分析:【步骤一】:点击加入购物车提交到 Servlet【步骤二】:在 Servlet 将购物的商品存入到 Sessi
19、on 中.【步骤三】:可以创建一个 Map 集合用于保存购物信息 Map 的 key 可以是商品的名称,Map 的value 是数量.【步骤四】:在购物车页面中显示 Map 中的数据就可以.1.3.3 代码实现:public class CartServlet extends HttpServlet private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExceptio
20、n, IOException / 接收商品名称:String name = new String(request.getParameter(“name“).getBytes(“ISO-8859-1“),“UTF-8“);/ 创建 Map 集合用于保存购物信息.Map Map 的 key 是商品的名称 value 是购买的数量.Map map = (Map) request.getSession().getAttribute(“cart“);if(map = null)map = new LinkedHashMap();/ 判断购物车中是否已经买了该商品.if(map.containsKey(n
21、ame)/ map 中已经有该商品 :/ * 如果购物车中已经有该商品 : 获得到 Map 中该商品的数量+1。 存回到 Map 集合中.Integer count = map.get(name);count+;map.put(name, count);else/ map 中没有该商品./ * 如果购物车中没有改商品: 将商品添加到 Map 集合中 数量 1.map.put(name, 1);/ * 将 Map 集合保存到 session 中.request.getSession().setAttribute(“cart“, map);response.setContentType(“text
22、/html;charset=UTF-8“);response.getWriter().println(“继续购物 | 去结算“);1.3.4 总结:1.3.4.1 Session 是域对象 :session 何时创建和销毁?作用范围:* 创建 :服务器端第一次调用 getSession()创建 session.* 销毁 :三种情况销毁 session:* 1.session 过期. 默认过期时间为 30 分钟.* 2.非正常关闭服务器 .如果正常关闭 session 序列化到硬盘.* 3.手动调用 session.invalidate();* 作用范围: 多次请求.( 一次会话)1.4案例四:
23、进行一次性验证码的校验1.4.1 需求:在登录的页面中,需要有一个验证码的校验.1.4.2 分析:1.4.2.1 技术分析:使用 session 保存生产的验证码.1.4.2.2 步骤分析:【步骤一】:生成验证码,将生成验证码的随机的 4 个字母或数字保存到 session 中.【步骤二】:在页面中输入验证码值,点提交.【步骤三】:在 Servlet 中从表单中获得验证码从 session 中获得一个验证码.【步骤四】:比对两个验证码值是否一致.【步骤五】:将 session 中保存的验证码清空.1.4.3 代码实现:protected void doGet(HttpServletReques
24、t request, HttpServletResponse response) throws ServletException, IOException / 校验验证码程序:String code1 = request.getParameter(“code“);String code2 = (String) request.getSession().getAttribute(“code“);request.getSession().removeAttribute(“code“);if(!code1.equalsIgnoreCase(code2)request.setAttribute(“msg“, “验证码输入错误!“);request.getRequestDispatcher(“/demo2/login.jsp“).forward(request, response);return ;.1.4.4 总结:1.4.4.1 使用 JS 控制图片切换 :function changeImg()document.getElementById(“img1“).src=“/day11/CheckImgServlet?time=“+new Date().getTime();