模拟亚马逊、淘宝等浏览记录功能(访问数据库)
Q题目
现在要求,模拟一个类似的功能,实体为一个网上书店,要求显示最近的三条浏览记录,使用数据库存储数据和查询数据,如下图
例如:
1)现有如下网上书店:
本站书籍目录:JAVAC++C语言LinuxAndroid
最近三次浏览记录:
3)浏览第一个商品后,若为Java,显示界面
本站书籍目录:JAVAC++C语言LinuxAndroid
最近三次浏览记录:JAVA
4)浏览第二个商品,若为C++
5)浏览第三个商品,若为Java,此时涉及一个排序问题了,最前的必须是最近浏览的。
6)浏览第四个商品,为C语言
具体分析见:http://blog.csdn.net/baidu_37107022/article/details/72783206
实现代码
目录
注意:数据库驱动jar包,以及配置文件info.properties
数据库数据如下:
book类
package com.tcb.domain;public class Book {private int id;private String name;private int price;private String author;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public Book(String name, int price, String author) {super();this.name = name;this.price = price;this.author = author;}@Overridepublic String toString() {return "Book [id=" + id + ", name=" + name + ", price=" + price + ", author=" + author + "]";}public Book() {super();// TODO Auto-generated constructor stub}}
bookDao类:查询数据库内容
package com.tcb.dao;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;import com.tcb.domain.Book;
import com.tcb.utils.DBUtils;public class BookDao {//查询指定书籍的详情public Book queryBook(int id){Connection connection=DBUtils.getConnection();try {String sql="select * from book where id=?";PreparedStatement ps=connection.prepareStatement(sql);ps.setInt(1, id);ResultSet resultSet=ps.executeQuery();while(resultSet.next()){int id2= resultSet.getInt("id");String name=resultSet.getString("name");int price=resultSet.getInt("price");String author=resultSet.getString("author");Book book=new Book(name, price, author);book.setId(id2);return book;}} catch (SQLException e) {e.printStackTrace();}return null;}//查询出所有书籍信息用于展示public ArrayList<Book> queryAllBook(){Connection connection=DBUtils.getConnection();ArrayList<Book> list=new ArrayList<>();try {String sql="select * from book";PreparedStatement ps=connection.prepareStatement(sql);ResultSet resultSet=ps.executeQuery();while(resultSet.next()){int id=resultSet.getInt("id");String name=resultSet.getString("name");int price=resultSet.getInt("price");String author=resultSet.getString("author");Book book=new Book(name, price, author);book.setId(id);list.add(book);}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return list;}
}
工具类:获得数据库连接Connection
package com.tcb.utils;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;public class DBUtils {public static String driverName="";public static String url="";public static String username="";public static String password="";static{ResourceBundle resourceBundle=ResourceBundle.getBundle("info");driverName=resourceBundle.getString("driverName");url=resourceBundle.getString("url");username=resourceBundle.getString("username");password=resourceBundle.getString("password");}public static Connection getConnection(){try {//1.注册驱动Class.forName(driverName);//2.获取连接Connection connection = DriverManager.getConnection(url,username,password);return connection;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}public static void closeAll(ResultSet resultSet,Statement statement ,Connection connection){if (resultSet!=null) {try {resultSet.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (statement!=null) {try {statement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (connection!=null) {try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
配置文件info.properties
url的最后一个参数:book为数据库名称(自己定)
数据库的用户名username和密码password(根据自己设置的填写)
driverName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://localhost\:3306/book
username=root
password=123
展示所有书籍BookContent
package com.tcb.web.servlet;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.tcb.dao.BookDao;
import com.tcb.domain.Book;
import com.tcb.utils.DBUtils;public class ShowBookContent extends HttpServlet {private static final long serialVersionUID = 1L;public ShowBookContent() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();// 展示所有书籍writer.write("本站书籍目录:<br>");BookDao bookDao=new BookDao();ArrayList<Book> list=bookDao.queryAllBook();for (Book book : list) {writer.write("<a href='" + request.getContextPath() + "/ShowBookDetails?id=" + book.getId()+ "'>"+ book.getName() + "</a><br>");}// 显示最近三次的访问记录writer.write("最近三次浏览记录:<br>");Cookie[] cookies = request.getCookies();if (cookies != null) {for (Cookie cookie : cookies) {String name = cookie.getName();if ("ids".equals(name)) {String value = cookie.getValue();String[] values = value.split("-");for (int i = 0; i < values.length; i++) {String id = values[i];Book book1 = bookDao.queryBook(Integer.parseInt(id));writer.write("<a href='ShowBookDetails?id="+book1.getId() + "'>" + book1.getName()+ "</a><br>");}}}}}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
展示书籍具体信息
package com.tcb.web.servlet;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.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.tcb.dao.BookDao;
import com.tcb.domain.Book;
import com.tcb.utils.DBUtils;public class ShowBookDetails extends HttpServlet {private static final long serialVersionUID = 1L;public ShowBookDetails() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();// 显示被查看书籍的具体信息BookDao bookDao=new BookDao();String id = request.getParameter("id");Book book = bookDao.queryBook(Integer.parseInt(id));writer.write("您查看了" + book.getName() + "这本书。<br><br>");writer.write("书籍具体信息如下:<br>");writer.write(book.getName() + "<br>");writer.write(book.getAuthor() + "<br>");writer.write(book.getPrice() + "<br>");// 存储该次访问记录,方便在主页面中显示最近的访问记录// 存取数据格式为:3-2-1 先要进行数据拆分,根据情况做修改数据操作,再将数据合并放回到cookie中Cookie[] cookies = request.getCookies();if (cookies != null) {//创建一个Stringbuffer来存取所有Cookie的名字,用于判断Cookies数组中是否有ids这个Cookie,没有就需要创建StringBuffer cookieNames=new StringBuffer();//遍历Cookies数组for (Cookie cookie : cookies) {//得到Cookie名字String name = cookie.getName();//将Cookie名字存起来cookieNames.append(name+"-"); //加“-”目的是:防止分隔开每个Cookie的名字,防止相连的名字组合匹配到ids//若有ids这个Cookie,就需要做处理if ("ids".equals(name)) {// 取出Cookie中存的值String value = cookie.getValue();// ids这个Cookie取出的值为空那就没必要做拆分了if (value != null && !"".equals(value)) {String[] values = value.split("-");// 数组转化成Collection集合List<String> list = Arrays.asList(values);// 把list集合直接转化成LinkedList,为了方便后续处理LinkedList<String> linked = new LinkedList<String>(list);// 判断Cookie值中包含id否if (linked.contains(id)) {linked.remove(id);} else {if (linked.size() > 2) {linked.removeLast();}}linked.addFirst(id);// 将存进linkedList中的数据取出来组合成1-2或1-2-3等形式,放到Cookie中String result = "";for (int i = 0; i < linked.size(); i++) {result += linked.get(i);if (i < linked.size()-1) {result += "-";}}Cookie cookie2 = new Cookie("ids", result);cookie2.setMaxAge(10 * 60);response.addCookie(cookie2);}}}if(!cookieNames.toString().contains("ids")){Cookie cookie = new Cookie("ids", id);cookie.setMaxAge(10 * 60);response.addCookie(cookie);}} else {Cookie cookie = new Cookie("ids", id);cookie.setMaxAge(10 * 60);response.addCookie(cookie);}}protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
不使用,而使用集合实现数据存储实现该功能:http://blog.csdn.net/baidu_37107022/article/details/72783206
模拟亚马逊、淘宝等浏览记录功能(访问数据库)相关推荐
- 带你一步步破解亚马逊 淘宝 京东的反爬虫机制!
事情是这样的 亚马逊是全球最大的购物平台 很多商品信息.用户评价等等都是最丰富的. 今天,手把手带大家,越过亚马逊的反爬虫机制 爬取你想要的商品.评论等等有用信息 反爬虫机制 但是,我们想用爬虫来爬取 ...
- 模拟亚马逊、淘宝等浏览记录(历史记录)功能(访问集合存储的数据)
我们经常在淘宝,京东,亚马逊等电商平台浏览商品是,经常会看到最近浏览记录这一栏,如下图: Q题目 现在要求,模拟一个类似的功能,实体为一个网上书店,要求显示最近的三条浏览记录.如下图 例如: 1)现有 ...
- 亚马逊又为卖家解锁新功能,最高提升10%转化的它不可忽略!
上周,亚马逊又为卖家解锁了一个新功能:A +内容草稿复制,它可以自动将新获批的A+页面复制到其他国家/地区的帐户中. 意思就是,以前每个国家/地区的A+内容都要重复创建并审批,现在只需编辑和本地化要复 ...
- 亚马逊云机器人平台RoboMaker新功能WorldForge使用测试
恭喜你,读者朋友!你读到了全网首发(大概吧,我也没搜过反正)的AWS RoboMaker新功能WorldForge的使用测试,超多配图,细节丰富,价值高达6.5美元,读到就是赚到!文末有惊喜! 亚马逊 ...
- 亚马逊ec2 ng 文件服务器,在亚马逊EC2云服务器上装完后访问不了
==== 必填信息.没有填写将不予回复 ==== - iRedMail 版本号: - 使用哪个数据库存储用户帐号(OpenLDAP,MySQL,PostgreSQL): - 使用的 Linux/BSD ...
- 亚马逊S3Client实现上传下载功能
首先引入依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3&l ...
- 亚马逊——不一样的电商公司
其一: 电商公司就是电子商务公司.电子商务通俗的说就是利用电子工具进行各种商务活动,如网上购物.在线电子支付等.可以说电子商务是传统商业活动的电子化和网络化.离我们最近的就是网购了,通常我们会在淘宝. ...
- 禁止查看写好的宏_【收藏】亚马逊Listing不知道怎么写??看完此篇,即刻破单!...
[收藏]亚马逊Listing不知道怎么写??看完此篇,即刻破单! 众所周知,在亚马逊平台上大部分交易来自于排位靠前的listing决定的,可见listing的重要性.这里有不少新卖家在选完品之后,不知 ...
- 第五十二期:甲骨文遭遇“中年危机”:继阿里后,再被亚马逊永久抛弃
42岁的甲骨文迎来"中年危机".10月15日,亚马逊AWS技术布道者Jeff Barr在AWS官网宣布亚马逊消费者业务永久弃用甲骨文(Oracle)数据库. 作者:温暖来源:镁客网 ...
最新文章
- 预测汽车级Linux专业技术的需求
- Spring对事务管理的支持的发展历程--转
- 算法导论——优先队列(大到小)
- Spring整合ActiveMQ完成消息队列MQ编程
- ARM 之五 发展史及各时期内核(ARM1 ~ ARM11 / Cortex)介绍
- mediawiki禁止注册
- Python 字符串的内置函数
- GraphQL在Wildfly群上
- 多线程队列的算法优化
- api demo 京东商品详情_jd-demo
- [转载] 民兵葛二蛋——第31集
- 没解决:如何离线更新eclipse支持的Compiler compliance level
- 计算机毕业论文答辩申请书,论文答辩申请书范文6篇
- ContextCapture与Pix4D生成正射影像并进行拼接修图(附航测练习数据下载)
- midas显示代理服务器错误,midas运行后出错大神帮忙看看哪错了
- Java求指定精度的开根号运算
- 技术分享 | MySQL:caching_sha2_password 快速问答
- 为什么自来水按立方米收费?
- tecplot 通过数据点、坐标点绘制云图、三维云图
- 矩阵指数 matlab,空间计量-矩阵指数空间模型
热门文章
- 大连理工大学 计算机复试分数线,2020大连理工大学考研复试分数线已公布
- EOS账户系统(3)账户的权限
- 智能合约重构社会契约(12)天秤币
- 区块链BaaS云服务(17)纸贵科技Z-BaaS“合约中心”
- Bitcoin0.21版 公链开发(1) Bitcoind 、Bitcoin-qt编译
- C++ Primer 5th笔记(chap 13 拷贝控制)析构函数
- gdb+pwndbg使用初探
- python—多线程之数据混乱问题
- TEEC_RegisterSharedMemory和TEEC_AllocateSharedMemory的区别
- travis-ci中的checkpatch工具使用