精华内容
下载资源
问答
  • Javaweb学习--显示商品浏览记录

    千次阅读 2017-12-29 09:23:02
    功能:如淘宝侧边栏:您最近浏览过的商品,显示商品的标题图片等信息. 1.项目结构(ViewListDBHelperDemo项目名) 把页面要用到的文件放在WebContent文件夹下,包括images(商品图片), sql(数据库建表), ...

    功能:如淘宝侧边栏:您最近浏览过的商品,显示商品的标题图片等信息.

    1.项目结构(ViewListDBHelperDemo项目名)


    把页面要用到的文件放在WebContent文件夹下,包括images(商品图片), sql(数据库建表), details.jsp(详情页), index.jsp(首页).

    其中sql文件夹下的items.sql是里面写的是建表语句,可以复制到终端进行运行建表.


    2.工具类com.util.DBHelper / DBHelper.java

    /*********************开始***********************/

    package com.util;
    import java.sql.Connection;
    import java.sql.DriverManager;
    public class DBHelper {

    private static final String driver="com.mysql.jdbc.Driver";//数据库驱动
    //连接数据库的URL地址
    private static final String  url="jdbc:mysql://localhost:3306/shopping?useUnicode=true&characterEncoding=UTF-8";
    private static final String username="root";//数据库的用户名
    private static final String password="123456";//数据库的密码
    private static Connection conn=null;
     
    //静态代码块负责加载驱动
    static {
    try {
       Class.forName(driver);
    }
    catch(Exception ex){
    ex.printStackTrace();
    }
    }
     
    //单例模式返回数据连接对象
    public static Connection getConnection()  throws Exception{
        if(conn == null) {
        conn = DriverManager.getConnection(url,username,password);
        return conn;
        }
        return conn;
    }
     
    public static void main(String[] args) {
    try {
    Connection conn =DBHelper.getConnection();
    if(conn!=null) {
    System.out.println("数据库连接正常");
    System.out.println(conn);
    }else {
    System.out.println("数据库连接异常");
    }
    }catch(Exception e) {
    e.printStackTrace();
    }
    }
    }

    /*********************结束***********************/

    注意:连接数据库要时刻注意跑出异常,用try catch进行处理.


    sql 文件夹\ items.sql:创建表(数据库名称为shopping 要自己建)

    建数据库: 

    $ mysql -u root - p

    >password 1********

    mysql> show databases

    mysql>create database shopping

    mysql>use shopping

    mysql>把下面的代码复制进去就可以完成建表

    /*********************开始***********************/


    /*
    Navicat MySQL Data Transfer
    Source Server         : MySQL50
    Source Server Version : 50067
    Source Host           : localhost:3306
    Source Database       : shopping
    Target Server Type    : MYSQL
    Target Server Version : 50067
    File Encoding         : 65001
    */


    SET FOREIGN_KEY_CHECKS=0;
    DROP TABLE IF EXISTS `items`;
    CREATE TABLE `items` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(50) default NULL,
      `city` varchar(50) default NULL,
      `price` int(11) default NULL,
      `number` int(11) default NULL,
      `picture` varchar(500) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;


    INSERT INTO `items` VALUES ('1', '沃特篮球鞋', '佛山', '180', '500', '001.jpg');
    INSERT INTO `items` VALUES ('2', '安踏运动鞋', '福州', '120', '800', '002.jpg');
    INSERT INTO `items` VALUES ('3', '耐克运动鞋', '广州', '500', '1000', '003.jpg');
    INSERT INTO `items` VALUES ('4', '阿迪达斯T血衫', '上海', '388', '600', '004.jpg');
    INSERT INTO `items` VALUES ('5', '李宁文化衫', '广州', '180', '900', '005.jpg');
    INSERT INTO `items` VALUES ('6', '小米3', '北京', '1999', '3000', '006.jpg');
    INSERT INTO `items` VALUES ('7', '小米2S', '北京', '1299', '1000', '007.jpg');
    INSERT INTO `items` VALUES ('8', 'thinkpad笔记本', '北京', '6999', '500', '008.jpg');
    INSERT INTO `items` VALUES ('9', 'dell笔记本', '北京', '3999', '500', '009.jpg');
    INSERT INTO `items` VALUES ('10', 'ipad5', '北京', '5999', '500', '010.jpg');

    /*********************结束***********************/


    3.业务逻辑类com.dao.DAO / ItemsDAO.java

    注意引入的包为mysql.jdbc下的.

    /*********************开始***********************/

    package com.dao;
    import java.util.ArrayList;
    import com.entity.items;
    import com.mysql.jdbc.Connection;
    import com.mysql.jdbc.PreparedStatement;
    import com.mysql.jdbc.ResultSet;
    import com.util.DBHelper;


    //商品的业务逻辑类
    public class ItemsDAO {
        //获得所有商品的信息
    public ArrayList<items> getAllItems(){
    //连接对象
    Connection conn = null;
    //语句对象( PreparedStatement 用于sql执行参数化查询)
       PreparedStatement stmt = null;
       //数据集(结果集)
       ResultSet rs = null;
       //商品集合
       ArrayList<items> list = new ArrayList<items>();
       //对数据库的操作会抛出异常,要用try catch finally
       try {
        //获得连接对象
       conn = (Connection) DBHelper.getConnection();
       String sql = "select * from items;"; //执行的sql语句
       stmt = (PreparedStatement) conn.prepareStatement(sql);
       rs = (ResultSet) stmt.executeQuery();//获得数据集
       while(rs.next()) {    //遍历数据集
       items item =new items();
       item.setId(rs.getInt("id"));
       item.setName(rs.getString("name"));
       item.setCity(rs.getString("city"));
       item.setNumber(rs.getInt("number"));
       item.setPrice(rs.getInt("price"));
       item.setPicture(rs.getString("picture"));
       list.add(item); //每次遍历完把商品加到list集合中
       }
       return list;
       }
       catch(Exception e){
       e.printStackTrace();
       return null;
       }finally { //finally里面释放资源
       //关闭数据集对象
       if(rs !=null) {
       try {
       rs.close();
       rs=null;
       }catch(Exception ex) {
       ex.printStackTrace();
       }   
       }
       //释放语句对象
       if(stmt !=null) {
       try {
       stmt.close();
       stmt=null;
       }catch(Exception ex) {
       ex.printStackTrace();
       }
      
       }
       }
    }
    //根据商品编号获取商品资料getItemsById
    public items getItemsById(int id) {
    //连接对象
    Connection conn = null;
    //语句对象( PreparedStatement 用于sql执行参数化查询)
       PreparedStatement stmt = null;
       //数据集
       ResultSet rs = null;
       //商品集合
       ArrayList<items> list = new ArrayList<items>();
       //对数据库的操作会抛出异常,要用try catch finally
       try {
        //获得连接对象
       conn = (Connection) DBHelper.getConnection();
       String sql = "select * from items where id=?;"; //根据编号查询--sql语句
       stmt = (PreparedStatement) conn.prepareStatement(sql);
       stmt.setInt(1, id);
       rs = (ResultSet) stmt.executeQuery();//获得数据集
       if(rs.next()) {    //遍历数据集,如果有下一条资料生成商品资料
       items item =new items();
       item.setId(rs.getInt("id"));
       item.setName(rs.getString("name"));
       item.setCity(rs.getString("city"));
       item.setNumber(rs.getInt("number"));
       item.setPrice(rs.getInt("price"));
       item.setPicture(rs.getString("picture"));
      return item; //返回商品资料
       }
       else {
       return null;
       }
       }
       catch(Exception e){
       e.printStackTrace();
       return null;
       }finally { //finally里面释放资源
       //关闭数据集对象
       if(rs !=null) {
       try {
       rs.close();
       rs=null;
       }catch(Exception ex) {
       ex.printStackTrace();
       }   
       }
       //释放语句对象
       if(stmt !=null) {
       try {
       stmt.close();
       stmt=null;
       }catch(Exception ex) {
       ex.printStackTrace();
       }
      
       }
    }
    }

    public ArrayList<items> getViewList(String list){
    ArrayList<items> itemlist = new ArrayList<items>();
    int iCount = 5;//每次返回前五条记录
    if(list!=null && list.length()>0) {
    String[]  arr = list.split("#");
    if(arr.length>=5) {
    for(int i=arr.length-1;i>=arr.length-iCount-1;i--) {
    itemlist.add(getItemsById(i));
    }
    }
    return itemlist;
    }else {
    return null;
    }
    }
    }

    /*********************结束***********************/


    4.实体类com.entity/items.java /  items.java

    商品类items(以后类最好用大写字母开头比较有辨识度),包括商品的各种private属性及getter\setter方法.

    /*********************开始***********************/

    package com.entity;
    //商品类
    public class items {
    private int id;//商品编号
    private String name;//商品名称
    private String city;//产地
    private int price;//商品价格
    private int number;//库存
    private String picture;//商品图片
    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 String getCity() {
    return city;
    }
    public void setCity(String city) {
    this.city = city;
    }
    public int getPrice() {
    return price;
    }
    public void setPrice(int price) {
    this.price = price;
    }
    public int getNumber() {
    return number;
    }
    public void setNumber(int number) {
    this.number = number;
    }
    public String getPicture() {
    return picture;
    }
    public void setPicture(String picture) {
    this.picture = picture;
    }


    }

    /*********************结束***********************/


    5.显示页面

    /*********************开始***********************/

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
    <%@ page import="com.entity.items"%>
    <%@ page import="com.dao.ItemsDAO"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
    <style type="text/css">
       div{
          float:left;
          margin: 10px;
       }
       div dd{
          margin:0px;
          font-size:10pt;
       }
       div dd.dd_name
       {
          color:blue;
       }
       div dd.dd_city
       {
          color:#000;
       }
    </style>
      </head>
      
      <body>
        <h1>商品展示</h1>
        <hr>
      
        <center>
        <table width="750" height="60" cellpadding="0" cellspacing="0" border="0">
          <tr>
            <td>
              
              <!-- 商品循环开始 -->
               <% 
                   ItemsDAO itemsDao = new ItemsDAO(); 
                   ArrayList<items> list = itemsDao.getAllItems();
                   if(list!=null&&list.size()>0)
                   {
                   for(int i=0;i<list.size();i++)
                   {
                      items item = list.get(i);
               %>   
              <div>
                 <dl>
                   <dt>
                     <a href="details.jsp?id=<%=item.getId()%>"><img src="images/<%=item.getPicture()%>" width="120" height="90" border="1"/></a>
                   </dt>
                   <dd class="dd_name"><%=item.getName() %></dd> 
                   <dd class="dd_city">产地:<%=item.getCity() %>&nbsp;&nbsp;价格:¥ <%=item.getPrice() %></dd> 
                 </dl>
              </div>
              <!-- 商品循环结束 -->
            
              <%
                       }
                  } 
              %>
            </td>
          </tr>
        </table>
        </center>
      </body>
    </html>

    /*********************结束***********************/

    6.详情页面

    在循环遍历时生成页面结构,开头要引入实体类和逻辑类

    /*********************开始**********************/

    <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
    <%@ page import="com.entity.items"%>
    <%@ page import="com.dao.ItemsDAO"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>


    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'details.jsp' starting page</title>
        
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
        <style type="text/css">
       div{
          float:left;
          margin-left: 30px;
          margin-right:30px;
          margin-top: 5px;
          margin-bottom: 5px;
       }
       div dd{
          margin:0px;
          font-size:10pt;
       }
       div dd.dd_name
       {
          color:blue;
       }
       div dd.dd_city
       {
          color:#000;
       }
    </style>
      </head>
      
      <body>
        <h1>商品详情</h1>
        <hr>
        <center>
          <table width="750" height="60" cellpadding="0" cellspacing="0" border="0">
            <tr>
              <!-- 商品详情 -->
              <% 
    //创建业务逻辑对象
                 ItemsDAO itemDao = new ItemsDAO();
                // items item = itemDao.getItemsById(Integer.parseInt(request.getParameter("id")));
                items item = itemDao.getItemsById(Integer.parseInt(request.getParameter("id")));
                if(item!=null) 
                 {
              %>
              <td width="70%" valign="top">
                 <table>
                   <tr>
                     <td rowspan="4"><img src="images/<%=item.getPicture()%>" width="200" height="160"/></td>
                   </tr>
                   <tr>
                     <td><B><%=item.getName() %></B></td> 
                   </tr>
                   <tr>
                     <td>产地:<%=item.getCity()%></td>
                   </tr>
                   <tr>
                     <td>价格:<%=item.getPrice() %>¥</td>
                   </tr> 
                 </table>
              </td>
              <% 
                }
              %>
              <% 
                  String list ="";
                  //从客户端获得Cookies集合
                  Cookie[] cookies = request.getCookies();
                  //遍历这个Cookies集合
                  if(cookies!=null&&cookies.length>0)
                  {
                  for(Cookie c:cookies)
                  {
                      if(c.getName().equals("ListViewCookie"))
                      {
                         list = c.getValue();
                      }
                  }
              }
                  
                  list+=request.getParameter("id")+"#";   
                 
                  //如果浏览记录超过1000条,清零.
                  String[] arr = list.split("#");
                  if(arr!=null&&arr.length>0)
                  {
                      if(arr.length>=1000)
                      {
                          list="";
                      }
                  }
                  Cookie cookie = new Cookie("ListViewCookie",list);
                  response.addCookie(cookie);
              
              %>
              <!-- 浏览过的商品 -->
              <td width="30%" bgcolor="#EEE" align="center">
                 <br>
                 <b>您浏览过的商品</b><br>
                 <!-- 循环开始 -->
                 <% 
                    ArrayList<items> itemlist = itemDao.getViewList(list);
                    if(itemlist!=null&&itemlist.size()>0 )
                    {
                       System.out.println("itemlist.size="+itemlist.size());
                       for(items i:itemlist)
                       {
                             
                 %>
                 <div>
                 <dl>
                   <dt>
                     <a href="details.jsp?id=<%=i.getId()%>"><img src="images/<%=i.getPicture() %>" width="120" height="90" border="1"/></a>
                   </dt>
                   <dd class="dd_name"><%=i.getName() %></dd> 
                   <dd class="dd_city">产地:<%=i.getCity() %>&nbsp;&nbsp;价格:<%=i.getPrice() %> ¥ </dd> 
                 </dl>
                 </div>
                 <% 
                       }
                    }
                 %>
                 <!-- 循环结束 -->
              </td>
            </tr>
          </table>
        </center>
      </body>
    </html>

    /*********************结束***********************/

    7.数据库

    查看表结构:mysql>desc items(表的名字)

     PreparedStatement (语句对象) 

    参考:PreparedStatement   http://blog.csdn.net/kingskyleader/article/details/4800397

    在数据库的操作过程中,PreparedStatement 对象是一个很不起眼但是记为重要的接口对象,它继承 于Statement,并与之在两方面有所不同:

    1)PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。

    2)由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

     

    作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

     

     

    二.PreparedStatement在java中常用数据库操作 
    1 引用特定的包  
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 

    2 一般实例化一个PreparedStatement和结果集 
    PreparedStatement prepstmt = null; 
    ResultSet rs = null; 

    3 得到SQL语句 
    conn 为Connection类型 
    prepstmt = conn.prepareStatement(String StrSQl); 

    4 执行SQL,得到结果集 
    rs 为ResultSet类型。 
    rs = prepstmt.executeQuery();


    ResultSet (数据库)结果集 参考:

    ResultSet接口介绍(推荐这篇)   ResultSet

    对数据库的查询操作,一般需要返回查询结果,在程序中,JDBC为我们提供了ResultSet接口来专门处理查询结果集

    Statement通过以下方法执行一个查询操作:

    ResultSet executeQuery(String sql) throws SQLException 

    单词Query就是查询的意思。函数的返回类型是ResultSet,实际上查询的数据并不在ResultSet里面,依然是在数据库里,ResultSet中的next()方法类似于一个指针,指向查询的结果,然后不断遍历。所以这就要求连接不能断开。

    ResultSet接口常用方法:

    • boolean next()     遍历时,判断是否有下一个结果
    • int getInt(String columnLabel)
    • int getInt(int columnIndex)
    • Date getDate(String columnLabel)
    • Date getDate(int columnIndex)
    • String getString(String columnLabel)
    • String getString(int columnIndex)

     

    二、ResultSet接口实现查询操作:

    步骤如下:(和上一篇博文中的增删改的步骤类似哦)

    • 1、加载数据库驱动程序:Class.forName(驱动程序类)
    • 2、通过用户名密码和连接地址获取数据库连接对象:DriverManager.getConnection(连接地址,用户名,密码)
    • 3、构造查询SQL语句
    • 4、创建Statement实例:Statement stmt = conn.createStatement()
    • 5、执行查询SQL语句,并返回结果:ResultSet rs = stmt.executeQuery(sql)
    • 6、处理结果
    • 7、关闭连接:rs.close()、stmt.close()、conn.close()



    展开全文
  • 案例:商品浏览记录的实现

    千次阅读 2017-04-11 17:24:31
    利用sql语句建立sql items.sql /* Navicat MySQL Data Transfer Source Server : MySQL50 Source Server Version : 50067 Source Host : localhost:3306 Source Database : shopping Target Server Type :...

    注:采用Model1和(JSP+JavaBean)实现

    一、实现DBHelper类

    1.添加数据库jar包到lib目录,在tomcat目录下的lib目录也要添加:mysql-contentor-java-5.0.5-bin.jar

    注意:这是很容易出现的问题,若不在tomcat的lib目录添加jar包,会报ider java.lang.ClassNotFoundException: com.mysql.jdbc.Driver的错。

    2.在/src目录下建立util包并建立DBHelper.java

    package utils;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    
    /**
     * Created by Administrator on 2017/4/9.
     */
    public class DBHelper {
        private static final String driver = "com.mysql.jdbc.Driver"; //数据库驱动
        private static final String url="jdbc:mysql://localhost:3306/supermarket?useUnicode=true&characterEncoding=UTF-8";//连接数据库的URL地址并设置编码方式为“utf-8”
        private static final String username="root";//数据库的用户名
        private static final String password="root";//数据库的密码
    
        private static Connection conn=null;//静态代码块负责加载驱动
        static
        {
            {
                Class.forName(driver);
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
    
        //单例模式返回数据库连接对象
        public static Connection getConnection() throws Exception
        {
            if(conn==null)
            {
                conn = DriverManager.getConnection(url,username,password);
                return conn;//如果数据库连接对象为空,则重新建立
            }
            return conn;//若不为空,直接返回数据库连接对象
        }
        //主函数测试代码
        public static void main(String[] args) {
            try
            {
                Connection conn = DBHelper.getConnection();
                if(conn!=null)
                {
                    System.out.println("数据库连接正常!");
                }
                else
                {
                    System.out.println("数据库连接异常!");
                }
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }
    

    二、创建实体类(PO)

    前置:安装mysql数据库和mysql数据库管理工具navicat 1.利用sql语句建立sql表

    items.sql

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : MySQL50
    Source Server Version : 50067
    Source Host           : localhost:3306
    Source Database       : shopping
    
    Target Server Type    : MYSQL
    Target Server Version : 50067
    File Encoding         : 65001
    
    Date: 2014-08-27 12:12:31
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for items
    -- ----------------------------
    DROP TABLE IF EXISTS `items`;
    CREATE TABLE `items` (
      `id` int(11) NOT NULL auto_increment,
      `name` varchar(50) default NULL,
      `city` varchar(50) default NULL,
      `price` int(11) default NULL,
      `number` int(11) default NULL,
      `picture` varchar(500) default NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of items
    -- ----------------------------
    INSERT INTO `items` VALUES ('1', '沃特篮球鞋', '佛山', '180', '500', '001.jpg');
    INSERT INTO `items` VALUES ('2', '安踏运动鞋', '福州', '120', '800', '002.jpg');
    INSERT INTO `items` VALUES ('3', '耐克运动鞋', '广州', '500', '1000', '003.jpg');
    INSERT INTO `items` VALUES ('4', '阿迪达斯T血衫', '上海', '388', '600', '004.jpg');
    INSERT INTO `items` VALUES ('5', '李宁文化衫', '广州', '180', '900', '005.jpg');
    INSERT INTO `items` VALUES ('6', '小米3', '北京', '1999', '3000', '006.jpg');
    INSERT INTO `items` VALUES ('7', '小米2S', '北京', '1299', '1000', '007.jpg');
    INSERT INTO `items` VALUES ('8', 'thinkpad笔记本', '北京', '6999', '500', '008.jpg');
    INSERT INTO `items` VALUES ('9', 'dell笔记本', '北京', '3999', '500', '009.jpg');
    INSERT INTO `items` VALUES ('10', 'ipad5', '北京', '5999', '500', '010.jpg');
    

    2.建立实体类/entity.items.java并设置私有属性和封装getter和setter。

    items.java

    package entity;
    
    /**
     * Created by Administrator on 2017/4/9.
     */
    public class items {
        private int id; // 商品编号
        private String name; // 商品名称
        private String city; // 产地
        private int price; // 价格
        private int number; // 库存
        private String picture; // 商品图片
    
        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 String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    
        public String getPicture() {
            return picture;
        }
    
        public void setPicture(String picture) {
            this.picture = picture;
        }
    }
    

    三、创建业务逻辑类(DAO)

    1.建立dao包、创建itemsDAO类

    itemsDAO.java

    package dao;
    
    import entity.items;
    import utils.DBHelper;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.ArrayList;
    
    /**
     * Created by Administrator on 2017/4/9.
     */
    public class itemsDAO {
    
    }
    
    
    

    2.在itemDAO.java中添加查询所有商品的方法

     public ArrayList<items> getAllItems(){//创建查询所有的方法
            Connection conn = null;//连接对象
            PreparedStatement stmt = null;//语句对象
            ResultSet rs = null;//结果集对象
            ArrayList<items> list = new ArrayList<items>();//存储集合
            try {
                conn= DBHelper.getConnection();//获取连接对象
                String sql = "select * from items;";//建立sql语句
                stmt=conn.prepareStatement(sql);//创语句对象并放sql语句
                rs = stmt.executeQuery();//执行语句对象
                while (rs.next()){//处理结果集
                   items item = new items();
                   item.setId(rs.getInt("id"));
                   item.setName(rs.getString("name"));
                   item.setCity(rs.getString("city"));
                   item.setPrice(rs.getInt("price"));
                   item.setNumber(rs.getInt("number"));
                   item.setPicture(rs.getString("picture"));
                   list.add(item);//将遍历出的结果放入到集合中
                }
                return list;//返回集合
            }
            catch (Exception ex){
                ex.printStackTrace();
                return null;//若出现异常,就返回空集合
            }
            finally {
                // 释放数据集对象
                if (rs != null) {
                    try {
                        rs.close();//释放结果集
                        rs = null;
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                // 释放语句对象
                if (stmt != null) {
                    try {
                        stmt.close();//释放语句对象
                        stmt = null;
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    

    3.在itemsDAO中添加查询单个商品的方法

     public items getItemById(int id){
            Connection conn = null;
            PreparedStatement stmt = null;
            ResultSet rs = null;
            try {
                conn= DBHelper.getConnection();
                String sql = "select * from items where id=?;";
    
                stmt=conn.prepareStatement(sql);
                stmt.setInt(1,id);
                rs = stmt.executeQuery();
                if (rs.next()){
                    items item = new items();
                    item.setId(rs.getInt("id"));
                    item.setName(rs.getString("name"));
                    item.setCity(rs.getString("city"));
                    item.setPrice(rs.getInt("price"));
                    item.setNumber(rs.getInt("number"));
                    item.setPicture(rs.getString("picture"));
                    return item;
                }
                return null;
            }
            catch (Exception ex){
                ex.printStackTrace();
                return null;
            }
            finally {
                // 释放数据集对象
                if (rs != null) {
                    try {
                        rs.close();
                        rs = null;
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
                // 释放语句对象
                if (stmt != null) {
                    try {
                        stmt.close();
                        stmt = null;
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }

    4.创建返回浏览记录的方法

    //根据收集到的item的点击顺序的字符串,创建返回浏览记录的方法
    public ArrayList<items> getViewList(String list) {
            //创建返回除去的集合
            ArrayList<items> ViewList = new ArrayList<items>();
            //定义最多5条记录
            int iCount = 5;
            //遍历接收到的list字符串,里面包含的是item的id号,间隔为","
            if (list != null && list.length() > 0) {
                //获得item的id号字符串数组
                String[] itemlist = list.split(",");
                //当item浏览数大于5个时候
                if (itemlist.length >= 5) {
                    //从最后一个开始循环
                    for (int i = itemlist.length - 1; i >= itemlist.length - iCount; i--) {
                        items item = getItemById(Integer.parseInt(itemlist[i]));
                        //循环最后5个并添加到要返回除去的集合当中去
                        ViewList.add(item);
                    }
                    //当item浏览数小于5个时
                } else {
                    for (int i = itemlist.length - 1; i >= 0; i--) {
                        items item = getItemById(Integer.parseInt(itemlist[i]));
                        ViewList.add(item);
                    }
                }
                //将小于5个浏览记录的商品集合返回出去
                return ViewList;
            } else {
                //如果接收到的字符串list为空,则返回空
                return null;
            }
    
        }

    四、创建页面层

    与之相对应的

    1.展示全部商品的页面代码为

    <%
      //建立业务逻辑对象
      itemsDAO itemsDao = new itemsDAO();
      //建立实体对象
      items item = new items();
      //建立接收实体对象的集合并接收数据库中的所有实体
      ArrayList<items> list = itemsDao.getAllItems();
         //若集合不为空
         if (list != null && list.size() > 0) {
            //遍历集合中的实体
            for (int i = 0; i < list.size(); i++) {
                 item = list.get(i);
    %>
     //循环展示实体开始
     <a href="details.jsp?id=<%=item.getId()%>" class="thumbnail">
       图片:<img src="img/<%=item.getPicture()%>" alt="<%=item.getName()%>" class="img-rounded" width="120"
                         height="90"></a>
     <p>
      名称:<%=item.getName()%><br>
      产地:<%=item.getCity()%><br>
      价格:<%=item.getPrice()%><br>
      </p>
      //循环展示实体结束
      <%
           }
      }
     %>

    2.展示单个商品的页面代码

     <% 
    //创建业务逻辑对象
    itemsDAO itemsDao = new itemsDAO();
    //创建要展示的实体对象,利用index页面超链接传过来的id号进行处理
    items item = itemsDao.getItemById(Integer.parseInt(request.getParameter("id")));
        if (item != null) {
                %>
    //实体展示开始
    <a href="details.jsp?id=<%=item.getId()%>" class="thumbnail">
    <img src="img/<%=item.getPicture()%>" alt="<%=item.getName()%>" class="img-rounded" width="120" height="90">
                </a>
                <p>
                    名称:<%=item.getName()%><br>
                    产地:<%=item.getCity()%><br>
                    价格:<%=item.getPrice()%><br>
                </p>
     //实体展示结束
                <%
    
                    }
                %>

    3.利用cookie展示浏览记录功能

    3.1 利用cookie记录商品浏览信息

    <%
        //创建一个字符串接收cookie中的缓存id记录
        String list = "";
        //获取已存在的cookie中的id记录
        Cookie[] cookies = request.getCookies();
        for (Cookie c : cookies) {
            if (c.getName().equals("ListViewCookie")) {
                list = c.getValue();
            }
        }
        //若商品id记录超过1000条,则清零
        String[] arr = list.split(",");
        if (arr != null && arr.length > 0) {
            if (arr.length >= 1000) {
                list = "";
            }
        }
        //将新点击的商品的id存放到list中
        list = list + request.getParameter("id") + ",";
        //将list放入到cookie中并用response添加cookie
        Cookie cookie = new Cookie("ListViewCookie", list);
        response.addCookie(cookie);
    %>

    3.2根据cookie中保存的id号,利用业务逻辑对象,展示实体对象。

    <%
    //创建业务逻辑对象
    itemsDAO itemsDao = new itemsDAO();
    //创建cookie接收集合
    ArrayList<items> Viewarr = new ArrayList<items>();
    //根据cookie中保存的id号,利用业务逻辑对象的getViewList()方法调出实体对象
    Viewarr = itemsDao.getViewList(list);
    //循环展示实体对象开始
    for (items i : Viewarr) {
     %>
         图片:<img src="img/<%=i.getPicture()%>" alt="<%=i.getName()%>" class="img-rounded" width="120" height="90">
     <p>
         名称:<%=i.getName()%><br>
         产地:<%=i.getCity()%><br>
         价格:<%=i.getPrice()%><br>
     </p>
    
     <%
     //循环展示实体对象结束
         }
     %>

    ——至此JSP部分学习完毕。

    展开全文
  • Session案例,显示商品浏览记录

    千次阅读 多人点赞 2012-01-11 22:56:48
    因为session为每一个浏览器用户创建了一个session,这样对服务器的要求无形之中高了很多,而cookie是对每个浏览器发送数据,所以服务器负担小,所以大部分浏览器还是选择使用cookie来实现浏览记录的显示。...

    相对于Cookie而言,Session并不经常在服务器中使用,因为session为每一个浏览器用户创建了一个session,这样对服务器的要求无形之中高了很多,而cookie是对每个浏览器发送数据,所以服务器负担小,所以大部分浏览器还是选择使用cookie来实现浏览记录的显示。

    当用户的浏览器禁用Cookie的时候,可以使用超链接里面带着指定的id去访问servlet,具体代码为response.encodeURL("/");里面放具体的servlet访问地址,这样的话,就能带着指定的id去访问从而解决了禁用cookie问题,
    如果用户没有禁用cookie,则第一次他会将超链接和cookie同时发送回去,但是,当第二次访问的时候,服务器发现他返回了cookie,则就不在重新写超链接了

    本案例是使用session来实现模仿当用户在首页点击了商品名字的时候,通过session记录了各个他点击的商品的名字,然后当选择结账的时候,自动将他选择购买的商品显示出来,下面上代码

    第一段代码是用来充当首页的servlet,里面假设了如果用户禁用cookie的情况

    package com.bird.shopping;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.Serializable;
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    /**
     * @category 模拟网站首页的servlet用来显示所有的商品
     * @author Bird
     *
     */
    public class ListBookServlet extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		PrintWriter out = response.getWriter();
    		
    		request.getSession();//注意,一定要得到session,否则无法进行自动的id添加
    		
    		out.write("本网站有如下商品</br>");
    		Map<String,Book> map = DB.getAll();
    		for(Map.Entry<String, Book> entry : map.entrySet()){
    			Book book = entry.getValue();
    			String url = response.encodeURL("/Web/servlet/BuyServlet?id="+book.getId()+"");
    			out.write(book.getName()+"<a href='"+url+"' target='_blank'>购买</a></br>");
    		}
    		
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    	}
    
    }
    
    class DB{
    	//必须使用链表Map进行有序存储
    	private static Map<String,Book> map = new LinkedHashMap<String,Book>();
    	static{
    		map.put("1", new Book("1","javaweb开发详解","老张","一本好书!!!"));
    		map.put("2", new Book("2","jdbc开发详解","老张","一本好书!!!"));
    		map.put("3", new Book("3","sping开发详解","老黎","一本好书!!!"));
    		map.put("4", new Book("4","struts开发详解","老宇","一本好书!!!"));
    		map.put("5", new Book("5","heibrate开发详解","老毕","一本好书!!!"));
    	}
    	
    	public static Map<String,Book> getAll(){
    		return map;
    	}
    }
    
    class Book implements Serializable{
    	
    	private static final long serialVersionUID = 1L;
    	private String id;
    	private String name;
    	private String author;
    	private String description;
    	
    	public Book(){}
    	
    	public Book(String id, String name, String author, String description) {
    		this.id = id;
    		this.name = name;
    		this.author = author;
    		this.description = description;
    	}
    	
    	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 getDescription() {
    		return description;
    	}
    	public void setDescription(String description) {
    		this.description = description;
    	}
    	
    }	
    

    第二段代码,是根据带过来的id将对应的商品名称放入到session中,以备下面的结账,当然,最终的跳转一定要使用浏览器的本地重定向,而不是服务器的请求重定向,否则会反复访问这个servlet干同样的事情,导致多次的购买

    package com.bird.shopping;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * @category 购买
     * @author Bird
     *
     */
    public class BuyServlet extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		String id = request.getParameter("id");
    		Book book = DB.getAll().get(id);
    		
    		HttpSession session = request.getSession();
    		
    		//从session获得用户保存的数据(购物车)
    		@SuppressWarnings("unchecked")
    		List<Book> list = (List<Book>) session.getAttribute("list");
    		if(list==null){
    			list = new ArrayList<Book>();
    			session.setAttribute("list", list);
    		}
    		
    		list.add(book);
    		String url = response.encodeRedirectURL(request.getContextPath()+"/servlet/ListCarServlet");
    		//request.getRequestDispatcher("/servlet/ListCarServlet").forward(request, response);
    		response.sendRedirect(url);
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    	}
    
    }
    

    第三段代码,用来显示已经购买的商品名称

    package com.bird.shopping;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * @category 显示用户购买的商品
     * @author Bird
     *
     */
    public class ListCarServlet extends HttpServlet {
    
    	private static final long serialVersionUID = 1L;
    
    	public void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html;charset=UTF-8");
    		PrintWriter out = response.getWriter();
    		
    		HttpSession session = request.getSession();
    		if(session == null){
    			out.write("您没有购买任何商品");
    			return;
    		}
    		
    		out.write("您购买了如下商品:</br>");
    		@SuppressWarnings("unchecked")
    		List<Book> list = (List<Book>) session.getAttribute("list");
    		for(Book book: list){
    			out.write(book.getName());
    			out.write("</br>");
    		}
    	}
    
    	public void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    	}
    
    }
    



    展开全文
  • 项目功能介绍 要求:能够显示当前的商品信息,当用户点击对应商品之后,页面跳转到该商品的详细信息,并在左下角显示最近5次浏览过的商品清单。 那么它的功能就很明显了,首先是商品信息的主页面,然后是详细信息...

                                                                    学习下一节:2.数据库,实体类,数据库连接类的实现

    1.项目功能介绍

       要求:能够显示当前的商品信息,当用户点击对应商品之后,页面跳转到该商品的详细信息,并在左下角显示最近5次浏览过的商品清单。

       那么它的功能就很明显了,首先是商品信息的主页面,然后是详细信息页面,在详细信息页面中有一个近五次的商品清单。

       其中,前面两点很容易实现,主要是我们用于浏览商品的记录需要用我们的cookie保存。

    2.框架介绍

        使用Model1(jsp+javabean)开发,采用MVC的设计模式。

        a.需要一个实体类(javabean),对应我们数据库中的表

        b.需要一个工具类用于连接数据库:DBHelper

        c.需要一个用于处理业务逻辑的Dao,用于对数据库进行操作

        d.然后就是其他的功能(用户交互),我们可以在jsp中实现

    3.效果一览

      从网上找了好看的网页模板,我们就根据这个来实现我们的功能。

      这个是主页面:用来存放商品的信息,我们只要求完成红色框框内的功能,其他的不做处理。

      主页面实现展示我们数据库中所有的商品信息。


    这个是第二个页面,用于显示当前商品的详情和浏览历史。

    在1处,我们显示当前的商品详情,2处显示近五条的商品记录。


      好了,接下来就要开始动手做了。

                                                                    学习下一节:数据库,实体类,数据库连接类的实现

    展开全文
  • 在主页中显示商品,点击商品可以查看商品的具体信息,带用户浏览完之后,回到主页,就会看到自己曾经浏览过什么商品商品主页Servlet CookieDemo3.java: package cn.edu.cookie; import java.io.IOException; ...
  • 使用Cookie实现商品浏览记录功能

    千次阅读 2014-12-18 21:36:44
    像很多购物网站、淘宝,京东等购物网站,细心的朋友都会发现页面的一侧都会有那种浏览过的商品历史记录信息,之前也只是听说这个是使用cookie机制实现的,但是具体怎么实现的还不是很清楚,通过这两天的学习,终于也...
  • 学习上一节:2.数据库,实体类,数据库连接工具类的实现 学习下一节:4.显示商品的详细信息的实现1.介绍 在前面我们实现了数据库的设计,接下来我们就先实现我们的主页...
  • 利用Cookie记录商品浏览信息

    千次阅读 2017-07-31 22:37:42
    利用Cookie记录商品浏览信息 Web客户端和Web服务端是基于Http协议进行通信的,Http协议具有无状态的特点,服务端只能被动的受理客户端的Http请求,并且不知道该Http是来自于那个客户端。 在实际开发环境中,为了能让...
  • Cookie小案例------记住浏览过的商品记录 我们知道,这个功能在电商项目中很常见。这里处理请求和页面显示都是由servlet实现,主要是为了... 4,当浏览过的商品本身就在浏览记录中,显示列表将其从中间移到最上面
  • //商品实体类,对应数据库中的goods public class Good { private int id; private String name; private double price; private String image; private String infor; public int getId() { return id;...
  • 1 商品列表页---跳转到---&gt;商品详细信息页时将cookie写到浏览器------------------------------------------------------------------// 获得客户端携带的cookie 获得名字是pids的cookie String pids = pid ...
  • //第一步先创建一个商品列表,不是使用数据库来实现的  pageEncoding="UTF-8"%> Insert title here 某网站出售的商品表 九阴真经查看 辟邪剑谱查看 ...清空商品浏览记录 Cookie[] coo
  • 收藏: http://www.chinaz.com/manage/2017/0816/796691.shtml(详细的介绍) https://blog.csdn.net/qq_38797181/article/details/72725198 评论: https://blog.csdn.net/ztchun/article/details/71106117(详细...
  • // 如果有浏览商品的Cookie则拿到其中的商品浏览过的商品是很多件的,商品是以,分割的 if (cookies[i].getName().equals("bookHistory")) { // 分割字符串,拿到留有浏览过的商品的id // 不管,有...
  • 用户足迹 统计出浏览量前十的商品 select goods_id,count(goods_id) as number from nideshop_footprint GROUP BY goods_id ORDER BY number desc LIMIT 0,10
  • 用户浏览历史记录

    2018-07-30 22:10:00
    用户在访问每个商品详情页面时,都要记录浏览历史记录 历史记录只需保存多个商品的sku_id即可,而且需要保持添加sku_id的顺序,所以采用redis中的列表来保存,redis的数据存储设计 'history_用户id': [sku_id列表]...
  • JSP浏览商品信息项目学习笔记

    千次阅读 2016-01-06 14:37:11
    这个项目是我在慕课网上看到的,《JAVA遇见HTML--JSP基础篇...项目很简单,就是显示商品信息,然后点击商品详情的时候在右边显示浏览过的商品信息,类似淘宝。 原项目是用的MyEclipse+mysql ,我改成了Eclipse + oracle
  • 1.创建数据库,任何一个系统首先要做的事情就是建表,明确自己的需求建相应,该中我只说一下 pimg字段,其他的大家都应该懂的吧(paddr表示的是商品产地) ,pimg字段用于存放上传图片的文件名,比如 美 女....
  • 该功能是基于数据库中persona_product,和persona_order实现的,这两个分别记录了用户的id以及该用户浏览过的商品,用户的id以及该用户购买过的商品,主要思路如下: package bubugao....
  • 使用C语言链表实现商品管理系统

    万次阅读 多人点赞 2018-06-06 15:11:24
    #include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;windows.h&...#define bool char#define true 1#define false 0#define NUM 100typedef struct ... // 商品编号 char gn...
  • 商城产品浏览记录,看了又看一种实现思路 很直白的思路。
  • 如何使用redis缓存来实现用户最近... 1,最近浏览记录肯定是需要失效时间的  确定使用缓存,缓存可以设置失效时间(最大设置为一个月,但是这已经足够了),如果使用mysql等数据库,还需要定时任务清除,很明显是不切合...
  • //打开数据库,建立了一个叫records的,里面只有一列name来存储历史记录: db.execSQL( "create table records(id integer primary key autoincrement,name varchar(200))" ); } @Override public void...
  • 文章目录前言1、用户表2、产品表3、商品品牌表4、商品分类表5、订单表6、订单商品信息表7、购物车表8、收获地址表9、省市区地址联动表10、广告信息表11、优惠券表12、优惠券领取记录表13、搜索记录表14、意见反馈表...
  • 商品价格变化监控记录方法

    千次阅读 2019-05-25 21:24:00
    喜欢购物的人们对价格的改动是非常在意的,这个介绍一种监控商品价格变化改动的方法,并且把改变的数据保存到Exel中。下方为这次监控的商品。 首先打开软件网页自动操作通用工具PageOperator,在任务菜单中...
  • 显示用户曾经浏览过的商品 // bookHistory Cookie cookie = null; Cookie cookies[] = request.getCookies(); for(int i=0;cookies!=null && i;i++){ if(cookies[i].getName().equals("bookHistory")){ ...
  • 笔者在做ecshop二次开发时曾开发过商品内容页左侧浏览过此商品的人还购买了的功能(发现京东、凡客均有此功能),在此和大家分享一下: 一、数据库设计 建一张,ecs_goods_visite 笔者在做ecshop二次...
  • 1.对最近浏览商品的实现需要用到cookie,一下代码可以获取cookie:   /** * 获取cookie的值 * @param request * @param name cookie的名称 * @return */ public static String getCo
  • ecshop中的浏览历史代码分析

    千次阅读 2014-08-19 22:51:58
    在你每次浏览一件商品的同时,会在左侧中记录您的浏览记录,在ecshop中是通过cookie来记录的, 在goods.php里可以查到如下代码:
  • 数据库设计很简单 新增1个浏览日志: -------------------- 浏览日志表名: VisitLog 字段: 用户ID ...- 数据库很简单,难度主要在根据数据库内的记录计算出“浏览商品的顾客还浏览”的列表

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,329
精华内容 6,931
关键字:

商品浏览记录表