A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

WEB16-Cookie&Session篇记录用户的上次访问时间
用户登录完成后,显示您是第X位,您上次的访问时间是:yyyy-MM-dd.
  • 如果第一次访问的话,只显示您是第X位.
  • 如果不是第一次访问的话,显示您是第X位访问的用户,您上次的访问时间是:yyyy-MM-dd.
会话技术
会话:用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话.
常见的会话技术:
  • Cookie :将数据保存到客户端浏览器.
  • Session :将数据保存到服务器端.
为什么使用会话技术?
  • 私有的数据,购物信息数据保存在会话技术中.
用户数据私有化的过程
Cookie技术的使用
  • 向浏览器保存数据:
    • HttpServletResponse有一个方法:void addCookie(Cookie 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自身有不足没有办法与ASP,PHP技术竞争.想在动态网页中输出表单.在Servlet中获得PrintWriter out = response.getWriter();
  • out.println(“<form action=’’ method=’’>”);
  • out.println(“</form>”);
  • SUN又推出了动态的网页开发技术就是JSP.
JSP的执行流程:
  • JSP会被翻译成Servlet,编译成class进行执行的.
JSP的嵌入Java代码:JSP的脚本元素
  • <%! %>        :翻译成类中的成员部分.定义变量,定义方法,定义类.Servlet是线程不安全的,尽量少在类中定义成员属性!!
  • <% %>        :翻译成类的service方法内部的内容.定义变量,定义类,直接写代码块.
  • <%= %>        :翻译成service方法内部的out.print();

步骤分析
  • 步骤一:准备登陆的案例
  • 步骤二:在统计人数的Servlet中,判断是否是第一次访问.
  • 步骤三:根据是否是第一次来显示不同的信息,同时将当前的时间保存到Cookie中.
代码实现public class CountServlet extends HttpServlet {        private static final long serialVersionUID = 1L;        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {                response.setContentType("text/html;charset=UTF-8");                Integer count = (Integer) this.getServletContext().getAttribute("count");//                response.getWriter().println("<h1>现在网站被访问的次数为:"+count+"</h1>");                                /**                 * 获得浏览器中带过来的所有的Cookie信息,从数组中查找有没有指定名称的Cookie                 * 判断用户是否是第一次访问:(从数组中没有找到指定名称的Cookie)                 * * 如果是第一次:显示欢迎,记录当前访问的时间存入到Cookie中.                 * * 如果不是第一次:显示欢迎,上一次访问时间,同时记录当前访问的时间存入到Cookie中。                 */                // 获得浏览器带过来的所有的Cookie:                Cookie[] cookies = request.getCookies();                // 从数组中查找指定名称的Cookie:                Cookie cookie = CookieUtils.findCookie(cookies, "lastVisit");                // 判断是否是第一次:                if(cookie == null){                        // 第一次访问                        response.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.addCookie(c);        }        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {                doGet(request, response);        }}Cookie的常用API
Cookie的常用API:
  • getName();
  • getValue();
  • setDomain(String domain); 设置Cookie的有效域名.
  • setPath(String path); 设置Cookie的有效路径.
  • setMaxAge(int maxAge); 设置Cookie的有效时间.
Cookie的分类有关:
  • 会话级别的Cookie:默认的Cookie,关闭浏览器Cookie就会销毁.
  • 持久级别的Cookie:可以设置Cookie的有效时间,那么关闭浏览器Cookie还会存在,手动销毁持久性Cookie,setMaxAge(0)-----前提是有效路径必须一致
记录用户的商品浏览记录
在购物网站上浏览商品的信息,商家为了留住用户,记住之前浏览的一些商品.
步骤分析.
  • 步骤一:在登录完成后,显示商品列表页面
  • 步骤二:为商品列表页面做一些准备.
  • 步骤三:点击某个商品,将商品ID传递一个Servlet.
  • 步骤四:在Servlet中,判断是否是第一次浏览商品.
  • 步骤五:如果是第一次:将商品的ID存入到Cookie中即可.
  • 步骤六:如果不是第一次,判断该商品是否已经浏览了.
  • 步骤七:如果浏览过,删除之前元素,将该元素添加到最前面.
  • 步骤八:如果没有浏览过商品,判断最大长度,如果没有超过限制,直接加到最前面;如果已经超过限制,删除最后一个,将其插入到最前面.
静态原型:(要根据需求自己学会分析)
  • 记录商品浏览记录
  • 记录的最大长度3
  • 商品按照时间的倒序排列
代码实现public class ProductServlet extends HttpServlet {        private static final long serialVersionUID = 1L;        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {                /**                 * * 接收商品id.                 * * 接收从客户端带过来的所有Cookie.                 * * 从Cookie的数组中查找指定名称的Cookie.                 * * 判断是否是第一次浏览商品:                 *     * 第一次浏览商品                 *        * 直接将商品的ID存入到Cookie.                 *        * 将Cookie回写到浏览器.                 *     * 不是第一次浏览商品 1-2                 *        * 判断当前的商品是否已经在浏览记录.                 *            * 已经存在: 2-1 移除当前元素,将当前元素添加到最开始.                 *            * 没在浏览记录中:                  *                * 判断是否已经超过了最大长度:如果超过 2-1-3:删除最后一个 将当前元素添加到最前面.                 *                * 没有超过:直接将该元素添加到最前位置.                 *        * 将转换的id的值存入到Cookie,回写浏览器.                 */                // 接收id:                String id = request.getParameter("id");                // 获得所有的Cookie的信息:                Cookie[] cookies = 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-1                        String value = cookie.getValue();                        String[] ids = value.split("-");                        // 将数组变为集合:                        LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));                        if(list.contains(id)){                                // 之前浏览过该商品                                list.remove(id); // 1-2-3                                list.addFirst(id);                        }else{                                // 没有浏览过该商品.                                if(list.size() >=3 ){                                        // 超过3个                                        list.removeLast();                                        list.addFirst(id);                                }else{                                        // 没到3个.                                        list.addFirst(id);                                }                        }                        // 将list中的元素取出,使用-连接上保存到Cookie,写回浏览器.                        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);                }                                request.getRequestDispatcher("/demo2/product_info.htm").forward(request, response);        }        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {                doGet(request, response);        }}清空浏览记录删除持久性的Cookie:public class ClearServlet extends HttpServlet {        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.sendRedirect("/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 stub                doGet(request, response);        }}Cookie存储中文的问题
Cookie可以存中文,但是不能直接存中文.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马