day14-cookie&商品浏览记录

来源:互联网 发布:文字转语音软件 编辑:程序博客网 时间:2024/05/16 17:39

day14-cookie

今日重点:Cookie 存储 获取移除  

 

一.【会话技术】

什么是会话:用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话.

常见的会话技术:

* Cookie :将数据保存到客户端浏览器.

* Session :将数据保存到服务器端.

购物信息保存在cookie和session中的原理:




二.【Cookie技术的使用】

1.向浏览器保存数据:

Response对象的addCookie(Cookie cookie):

2.获得浏览器带过来的Cookie:

Request对象的getCookies()返回一个Cookie[]数组:

3.创建一个Cookie对象(也是一个键值对):

Cookie(String name,String value);

Cookie的常用API:

1.getName();

2.getValue();

3.setDomain(String domain); -- 设置Cookie的有效域名. //www.baidu.com music.baidu.com

4.setPath(String path);-- 设置Cookie的有效路径.(在什么情况下访问服务器才会带cookie)

5.setMaxAge(int maxAge);-- 设置Cookie的有效时间.

 

Cookie的分类有关:

* 会话级别的Cookie : 关闭浏览器Cookie就会销毁. (默认的Cookie)

* 持久级别的Cookie : 可以设置Cookie的有效时间.

* 手动销毁持久性Cookie (前提是有效路径必须一致. )

              销毁步骤:创建一个和原来cookie名字一样的cookie。

                            设置cookie与原来cookie一致的有效路径。

                            设置cookie的有效时间为0。setMaxAge(0)

                            回写cookie到浏览器。

 

 

Cookie其它用处:登录界面的记住用户名 .

 

 

三.【JSP的简单概述】

Java Server Pages(Java服务器端页面). JSP就是动态网页开发技术

       JSP= Java代码 + HTML的元素 + JSP内置东西.   

      

JSP的执行过程:

* JSP会被翻译成Servlet,编译成class进行执行的. JSP的本质是Servlet

 

JSP的嵌入Java代码:( JSP的脚本元素)

* <%!   %>       : 编译成类中的成员部分. 定义变量,定义方法,定义类.Servlet是线程不安全的,尽量少在类中定义成员属性!!(不安全是因为servlet是单例的,很多人共享,信息容易串.)

* <%    %>  :编译成类的service方法内部的内容.可以定义变量,定义类,直接写代码块.

* <%=   %>  :编译到service方法内部的out.print();注意无分号

<%! int i = 3;%>

<% int a = 5;%>

<%= a %>

</body>

示例:使用JSP显示十行十列的表格:

<tableborder="1"width="600">

         <%

                   for(int i =1;i<=10;i++){

         %>

         <tr>

                   <%

                   for(intj=1;j<=10;j++){

                   %>

                   <td>11</td>

                   <% } %>

         </tr>

         <% } %>

</table>


更改JSP的编码模板: 改成UTF-8




 

记录用户的上次登陆访问时间.

准备工作:

1.工具类和C3P0的xml配置文件和连接数据库所用的三个包.

2.domain层 . service层 . dao层 . servlet层并配置好web.xml文件.

3.引入页面的文件夹.

4.最后检查一遍servlet中页面跳转的路径是否正确.和网页所提交的路径是否正确.


1.      获得cookie :只有获得全部cookie然后循环取出想要的cookie.getValue()

2.      存储cookie :通过new一个cookie然后response.addCookie( cookie名) 存储

 

public class CountServlet extends HttpServlet {

       private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throwsServletException, IOException {

                   response.setContentType("text/html;charset=UTF-8");

                   Integercount = (Integer)this.getServletContext().getAttribute("count");

//              response.getWriter().println("<h1>现在网站被访问的次数为:"+count+"</h1>");

                  

                   /**

                    * 获得浏览器中带过来的所有的Cookie信息,从数组中查找有没有指定名称的Cookie

                    * 判断用户是否是第一次访问:(从数组中没有找到指定名称的Cookie)

                    * * 如果是第一次:显示欢迎,记录当前访问的时间存入到Cookie.

                    * * 如果不是第一次:显示欢迎,上一次访问时间,同时记录当前访问的时间存入到Cookie中。

                    */

                   // 获得浏览器带过来的所有的Cookie:

                   Cookie[]cookies =request.getCookies();

                   // 从数组中查找指定名称的Cookie:

                   Cookiecookie = CookieUtils.findCookie(cookies,"lastVisit");

                   // 判断是否是第一次:

                   if(cookie ==null){

                            // 第一次访问

                            response.getWriter().println("<h1>您是第"+count+"位访客!</h1>");

                   }else{

                            // 不是第一次

                            Long l = Long.parseLong(cookie.getValue());

                            Dated =new Date(l);

                            response.getWriter().println("<h1>您是第"+count+"位访客!上次访问时间是:"+d.toLocaleString()+"</h1>");

                   }

                   // 创建一个Cookie对象:

                   Cookiec = new Cookie("lastVisit",""+System.currentTimeMillis());

                   // 设置Cookie的有效路径 ,后面讲到.

                   c.setPath("/day11");

                   // 设置Cookie的有效时间 (默认以秒作为单位)

                   c.setMaxAge(60 *60);

                   // 保存到浏览器端:

                   response.addCookie(c);

                  

                   response.getWriter().println("<h3><ahref='/day11/demo2/product_list.jsp'>商品列表</a></h3>");

         }

 

* Cookie的工具类

(要注意遍历cookies数组中的的判断条件的equals方法书写,一定要是非空常量在equals前,避免把变量放在equals前.因为数组有几率为空,这个时候就会报错,而且极不容易检查出)

public class CookieUtils {

         public static CookiefindCookie(Cookie[] cookies,Stringname){

                   if(cookies ==null){

                            returnnull;

                   }else{

                            for(Cookiecookie:cookies){

                                     if(name.equals(cookie.getName())){

                                               returncookie;

                                     }

                            }

                            returnnull;

                   }

 

 

记录用户的商品浏览记录(cookie拼接):


准备工作:

1.在登录成功后所跳转到的页面中(如CountServlet)添加一个”商品列表”的链接.

2.在工程中准备好商品列表的页面.

3.商品页面中:给所列商品设置id以便于拼接cookie, 并且将每个商品链接的工程名写成动态获取的方式,完整链接的路径都是记录用户浏览商品的servlet(ProductServlet),且要传入该商品的id.

<ahref="${ pageContext.request.contextPath }/ProductServlet?id=1">//并给servlet传入Id

                   <imgsrc="products/1/cs10001.jpg"width="170"height="170"style="display:inline-block;">

                                     </a>

 

面试题:String和StringBuffer的区别: StringBuffer的拼接字符串效率比较高哦,String拼接的时候是不停的创建新的对象,所以非常浪费资源.

 

Eclipse快捷查找一个类:ctrl+shift+R

 

public class ProductServlet extends HttpServlet {

         private static final long serialVersionUID = 1L;     

protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException,IOException {

                   /**

                    * * 接收商品id.

                    * * 接收从客户端带过来的所有Cookie.

                    * * Cookie的数组中查找指定名称的Cookie.

                    * * 判断是否是第一次浏览商品:

                    *     * 第一次浏览商品

                    *       * 直接将商品的ID存入到Cookie.

                    *       * Cookie回写到浏览器.

                    *     * 不是第一次浏览商品 1-2

                    *       * 判断当前的商品是否已经在浏览记录.

                    *           * 已经存在: 2-1移除当前元素,将当前元素添加到最开始.

                    *           * 没在浏览记录中:

                    *                *判断是否已经超过了最大长度:如果超过 2-1-3:删除最后一个将当前元素添加到最前面.

                    *                *没有超过:直接将该元素添加到最前位置.

                    *       * 将转换的id的值存入到Cookie,回写浏览器.

                    */

                   // 接收id:

                   Stringid = request.getParameter("id");

                   // 获得所有的Cookie的信息:

                   Cookie[]cookies =request.getCookies();

                   // 判断是否是第一次:

                   Cookiecookie = CookieUtils.findCookie(cookies,"history");

                   if(cookie ==null){   // 第一次浏览商品

                            Cookiec =new Cookie("history",id);

                            c.setPath("/day11");

                            c.setMaxAge(60*60*24*7);

                            response.addCookie(c);

                   }else{

                            // 不是第一次浏览

                            // 判断选择的商品是否已经在浏览记录中 2-1

                            Stringvalue =cookie.getValue();

                            String[]ids =value.split("-");

                            // 将数组变为集合:

                            LinkedList<String>list =newLinkedList<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,写回浏览器.

                            StringBuffersb =new StringBuffer();

                            for(Strings:list){

                                     sb.append(s).append("-");

                            }

                            StringsValue =sb.toString().substring(0,sb.length()-1);//去掉最后一个-

                            System.out.println(sValue);

                            // 存入到Cookie

                            Cookiec =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);  //跳转到商品详情的页面

         }

 

最后要在商品列表页面下方示出商品浏览记录:

<divstyle="width:1210px;margin:0 auto;padding: 0 9px;border:1px solid #ddd;border-top:2px solid #999;height:246px;">

                   <h4style="width:50%;float:left;font:14px/30px " 微软雅黑 ";">浏览记录</h4>

                   <divstyle="width:50%;float:right;text-align:right;"><ahref="">more</a></div>

                   <divstyle="clear:both;"></div>

                   <divstyle="overflow:hidden;">

                   <ahref="${pageContext.request.contextPath }/ClearServlet">清除浏览记录</a>

                                    <ulstyle="list-style:none;">

                                    <%

                                               Cookie[]cookies = request.getCookies();

                                         Cookie cookie =CookieUtils.findCookie(cookies,"history");

                                        if(cookie ==null){

                                    %>

                                              <h4>您还没有浏览商品!!</h4>       

                                    <%      

                                         }else{

                                                  Stringvalue = cookie.getValue();// 1-2-3\

                                                  String[] ids = value.split("-");

                                                 for(String id:ids){

                                      %>              

                                         <li style="width:150px;height:216;float:left;margin:0 8px 0 0;padding:0 18px 15px;text-align:center;"><imgsrc="products/1/cs1000<%=id %>.jpg"width="130px"height="130px"/></li>          

                                      <%                 

                                                  }

                                         }

                                      %>

                                     </ul>

                            </div>

                   </div>

 

清除浏览记录的ClearServlet.

public class ClearServlet extends HttpServlet {

         private static final long serialVersionUID = 1L;

         protected voiddoGet(HttpServletRequest request,HttpServletResponseresponse) throwsServletException, IOException {

                   Cookiecookie =new Cookie("history",null); //只要名一样就会将原来的cookie覆盖掉

                   cookie.setPath("/day11");

                   cookie.setMaxAge(0);

                   response.addCookie(cookie);

                   response.sendRedirect("/day11/demo2/product_list.jsp");

         }


整个流程的宏观理解是:

要明确此时Servlet的功能是后台获取浏览器带来的cookie并将新的cookie保存回浏览器,整个过程是在页面跳转的一瞬间内完成的逻辑, 所以要有入有出,所以最后要实现跳转页面的效果.别写着写着都不知道该代码是处于整个需求中的哪个步骤了.fuck!!!

清空浏览记录(删除持久性cookie):

public class ClearServlet extends HttpServlet {

         private static final long serialVersionUID = 1L;

         protected voiddoGet(HttpServletRequest request, HttpServletResponseresponse)throwsServletException, IOException {

                   Cookiecookie =new Cookie("history",null);

                   cookie.setPath("/day11");

                   cookie.setMaxAge(0);

                   response.addCookie(cookie);

                   response.sendRedirect("/day11/demo2/product_list.jsp");

         }








原创粉丝点击