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

模拟亚马逊、淘宝等浏览记录功能(访问数据库)相关推荐

  1. 带你一步步破解亚马逊 淘宝 京东的反爬虫机制!

    事情是这样的 亚马逊是全球最大的购物平台 很多商品信息.用户评价等等都是最丰富的. 今天,手把手带大家,越过亚马逊的反爬虫机制 爬取你想要的商品.评论等等有用信息 反爬虫机制 但是,我们想用爬虫来爬取 ...

  2. 模拟亚马逊、淘宝等浏览记录(历史记录)功能(访问集合存储的数据)

    我们经常在淘宝,京东,亚马逊等电商平台浏览商品是,经常会看到最近浏览记录这一栏,如下图: Q题目 现在要求,模拟一个类似的功能,实体为一个网上书店,要求显示最近的三条浏览记录.如下图 例如: 1)现有 ...

  3. 亚马逊又为卖家解锁新功能,最高提升10%转化的它不可忽略!

    上周,亚马逊又为卖家解锁了一个新功能:A +内容草稿复制,它可以自动将新获批的A+页面复制到其他国家/地区的帐户中. 意思就是,以前每个国家/地区的A+内容都要重复创建并审批,现在只需编辑和本地化要复 ...

  4. 亚马逊云机器人平台RoboMaker新功能WorldForge使用测试

    恭喜你,读者朋友!你读到了全网首发(大概吧,我也没搜过反正)的AWS RoboMaker新功能WorldForge的使用测试,超多配图,细节丰富,价值高达6.5美元,读到就是赚到!文末有惊喜! 亚马逊 ...

  5. 亚马逊ec2 ng 文件服务器,在亚马逊EC2云服务器上装完后访问不了

    ==== 必填信息.没有填写将不予回复 ==== - iRedMail 版本号: - 使用哪个数据库存储用户帐号(OpenLDAP,MySQL,PostgreSQL): - 使用的 Linux/BSD ...

  6. 亚马逊S3Client实现上传下载功能

    首先引入依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3&l ...

  7. 亚马逊——不一样的电商公司

    其一: 电商公司就是电子商务公司.电子商务通俗的说就是利用电子工具进行各种商务活动,如网上购物.在线电子支付等.可以说电子商务是传统商业活动的电子化和网络化.离我们最近的就是网购了,通常我们会在淘宝. ...

  8. 禁止查看写好的宏_【收藏】亚马逊Listing不知道怎么写??看完此篇,即刻破单!...

    [收藏]亚马逊Listing不知道怎么写??看完此篇,即刻破单! 众所周知,在亚马逊平台上大部分交易来自于排位靠前的listing决定的,可见listing的重要性.这里有不少新卖家在选完品之后,不知 ...

  9. 第五十二期:甲骨文遭遇“中年危机”:继阿里后,再被亚马逊永久抛弃

    42岁的甲骨文迎来"中年危机".10月15日,亚马逊AWS技术布道者Jeff Barr在AWS官网宣布亚马逊消费者业务永久弃用甲骨文(Oracle)数据库. 作者:温暖来源:镁客网 ...

最新文章

  1. 预测汽车级Linux专业技术的需求
  2. Spring对事务管理的支持的发展历程--转
  3. 算法导论——优先队列(大到小)
  4. Spring整合ActiveMQ完成消息队列MQ编程
  5. ARM 之五 发展史及各时期内核(ARM1 ~ ARM11 / Cortex)介绍
  6. mediawiki禁止注册
  7. Python 字符串的内置函数
  8. GraphQL在Wildfly群上
  9. 多线程队列的算法优化
  10. api demo 京东商品详情_jd-demo
  11. [转载] 民兵葛二蛋——第31集
  12. 没解决:如何离线更新eclipse支持的Compiler compliance level
  13. 计算机毕业论文答辩申请书,论文答辩申请书范文6篇
  14. ContextCapture与Pix4D生成正射影像并进行拼接修图(附航测练习数据下载)
  15. midas显示代理服务器错误,midas运行后出错大神帮忙看看哪错了
  16. Java求指定精度的开根号运算
  17. 技术分享 | MySQL:caching_sha2_password 快速问答
  18. 为什么自来水按立方米收费?
  19. tecplot 通过数据点、坐标点绘制云图、三维云图
  20. 矩阵指数 matlab,空间计量-矩阵指数空间模型

热门文章

  1. 大连理工大学 计算机复试分数线,2020大连理工大学考研复试分数线已公布
  2. EOS账户系统(3)账户的权限
  3. 智能合约重构社会契约(12)天秤币
  4. 区块链BaaS云服务(17)纸贵科技Z-BaaS“合约中心”
  5. Bitcoin0.21版 公链开发(1) Bitcoind 、Bitcoin-qt编译
  6. C++ Primer 5th笔记(chap 13 拷贝控制)析构函数
  7. gdb+pwndbg使用初探
  8. python—多线程之数据混乱问题
  9. TEEC_RegisterSharedMemory和TEEC_AllocateSharedMemory的区别
  10. travis-ci中的checkpatch工具使用