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");
}
- day14-cookie&商品浏览记录
- cookie商品浏览记录
- 用Cookie实现商品浏览记录
- 利用cookie显示商品的浏览记录
- 利用Cookie实现用户浏览商品记录
- Java Cookie记录商品浏览历史
- 使用Cookie实现保存商品浏览记录
- cookie实现商品浏览记录的原理
- 利用Cookie记录商品浏览信息
- 记录用户的商品浏览记录(Linkedlist,删除cookie)
- 用Cookie实现商品浏览记录(No.39)
- jquery+cookie+json保存浏览商品的记录
- cookie技术案例-用户浏览商品的记录
- Cookie小案例-----记住浏览过的商品记录
- Cookie记录浏览过的商品,商城类网站
- 使用Cookie实现商品的浏览记录功能
- 【JSP开发】利用cookie实现商品浏览记录
- java 使用Cookie实现,浏览过商品记录
- 创业者成功的必备思维:粉丝思维
- JDK的下载与安装
- Hive之 Hql语法解析
- OC_转场动画的工具类(无交互)
- 获取被调用的DLL动态库路径
- day14-cookie&商品浏览记录
- hibernate配置文件,一般命名为hibernate.cfg.xml
- 【OpenGL】OpenGL引擎开发视频教程
- 【Linux-运维-故障恢复】误删crontab的恢复
- Emoji处理方式大起底
- java中导入导出Excel表格(jxl的API应用)
- 机器视觉之HALCON入门之路1-Windows 10下的HALCON13.0安装
- 线程同步
- 【JavaWeb笔记】JavaScript(二) 常用对象