郭璞 2016-01-26 647浏览量
Cookie作为一个客户端技术被广泛的应用着。我今天也来谈一谈我对Cookie的理解。
具体的思路如下:
package cookie;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class MyCookieDemo
*/
@WebServlet("/MyCookieDemo")
public class MyCookieDemo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyCookieDemo() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("<br>这是网站首页!<br/><br/>");
writer.write("您上次的访问时间是:");
//得到上次访问的时间
Cookie [] cookies = request.getCookies();
for(int i=0; cookies!=null&&i<cookies.length;i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals("lastAccessTime")){
Long time = Long.parseLong(cookie.getValue());
Date date = new Date(time);
writer.write(date.toLocaleString());
}
}
//给用户以cookie的形式发送更新过的时间
Cookie cookie = new Cookie("lastAccessTime",System.currentTimeMillis()+"");
response.addCookie(cookie);
}
/**
* @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);
}
}
需要注意的是以下问题:
response.setContentType("text/html;charset=UTF-8");
说是商品记录,这里只是一个简单的示意,所以并没有连接数据库进行相关的操作,而是利用一个DB类进行了模拟。下面是我的思路:
商品首页:
商品的详细的信息界面:
下面是代码详情:
首先是WebTitle.java(实际是一个Servlet文件):
package lastskim;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class WebTitle
*/
@WebServlet("/WebTitle")
public class WebTitle extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public WebTitle() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
//1.显示所有的商品信息
PrintWriter out = response.getWriter();
out.write("本网站有如下商品,任君挑选:"+"<br><br>");
Set<Map.Entry<String , Item>> set = DB.getItems().entrySet();
for(Map.Entry<String, Item> me: set){
Item item = me.getValue();
out.write("<a href='/ServletStudy/ItemInfo?id="+item.getId()
+"' target='_blank'>"+item.getName()+"</a>");
out.write("<br>");
}
//2.显示已经浏览过的商品的信息
out.write("<br>您曾经浏览过的商品的信息如下:<br><br>");
Cookie [] cookies = request.getCookies();
for(int i=0 ;cookies!=null && i<cookies.length;i++){
Cookie cookie = cookies[i];
if(cookie.getName().equals("itemHistory")){
String itemHistory = cookie.getValue();
//使用正则表达式,确保以下划线进行分割!
String[] ids = itemHistory.split("\\_");
for(String id : ids){
Item item = (Item) DB.getItems().get(id);
out.write(item.getName()+"<br>");
}
}
}
}
/**
* @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);
}
}
//模拟数据库进行加载商品信息
class DB {
private static Map<String ,Item> map = new LinkedHashMap<String ,Item>();
//由于需要在初始化的时候进行加载数据,所以在同步的静态的代码块中进行声明即可
static{
map.put("1", new Item("1","C语言入门","小郭","19$"));
map.put("2", new Item("2","C++语言入门","赵老师","21$"));
map.put("3", new Item("3","Java语言入门","Jemas","32$"));
map.put("4", new Item("4","JUnit","Juit","12$"));
map.put("5", new Item("5","PHP","老毛","32$"));
map.put("6", new Item("6","JavaScript","阿布","27$"));
}
public static Map getItems(){
return map;
}
}
//模拟的商品Item信息
class Item {
private String id;
private String name;
private String author;
private String price;
public Item() {
super();
// TODO Auto-generated constructor stub
}
public Item(String id, String name, String author, String price) {
super();
this.id = id;
this.name = name;
this.author = author;
this.price = price;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
注意:
然后是商品详情界面:
package lastskim;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ItemInfo
*/
@WebServlet("/ItemInfo")
public class ItemInfo extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ItemInfo() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");
//1.根据用户带过来的id号,现实上皮的详细的信息
String id = request.getParameter("id");
Item item = (Item) DB.getItems().get(id);
PrintWriter out = response.getWriter();
out.write("<br>您所浏览的商品的详细的信息如下:<br>");
out.write(item.getId()+"<br>");
out.write(item.getName()+"<br>");
out.write(item.getAuthor()+"<br>");
out.write(item.getPrice()+"<br>");
//2.将更新的cookie信息写回到原来的Cookie中
String itemHistory = makeItemHistory(request, id);
Cookie cookie = new Cookie("itemHistory",itemHistory);
response.addCookie(cookie);
}
private String makeItemHistory(HttpServletRequest request, String id) {
// TODO Auto-generated method stub
String itemHistory =null;
Cookie cookies[] = request.getCookies();
for(int i=0 ;cookies!=null && i<cookies.length;i++){
if(cookies[i].getName().equals("itemHistory")){
itemHistory = cookies[i].getValue();
}
}
//一般来说在浏览记录中添加数据呼吁道如下几种情况
//itemHistory= null 1 itemHistory = 1
//超过了一页显示的最大个数 :itemHistory= 2_3_4 1 itemHistory = 1_2_3
//itemHistory= 2_3_4 1 itemHistory = 1_2_3
//itemHistory= 2_1_4 1 itemHistory = 1_2_4
//itemHistory= null 1 itemHistory = 1
if(itemHistory== null){
return id;
}
//这个代码块的作用是分解出一个个的信息,并用于字符串内容的验证
List l = (List) Arrays.asList(itemHistory.split("\\_"));
LinkedList<String> list = new LinkedList();
list.addAll(l);
if(list.contains(id)){
list.remove(id);
list.addFirst(id);
}else{
//超过了一页显示的最大个数 :itemHistory= 2_3_4 1 itemHistory = 1_2_3
if(list.size()>=3){
list.removeLast();
list.addFirst(id);
}else{
//未超过一页显示的最大个数 :itemHistory= 2_3 1 itemHistory = 1_2_3
list.addFirst(id);
}
}
StringBuilder sb = new StringBuilder();
for(String listId : list){
sb.append(listId+"_");
}
return sb.deleteCharAt(sb.length()-1).toString();
}
/**
* @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);
}
}
总结:
下面是代码的测试结果:
第一次访问网站:
第一次点击超链接可以看到商品的详细的信息
第二次点击超链接返回后,刷新首页即可看到商品浏览的历史
第三次点击超链接后就达到了商品历史记录的上限
第四次访问后,返回首页,刷新一下,便会将第一次的浏览历史记录去除,添加上最新的浏览记录
在包含有三个历史记录中访问了其中一个,便会更新历史记录的顺序:
总结:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
集结各类场景实战经验,助你开发运维畅行无忧