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的常用APICookie的常用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可以存中文,但是不能直接存中文.
|