资讯专栏INFORMATION COLUMN

JSP 商品浏览[Web application]

JasinYip / 3118人阅读

摘要:是数据中查询结果返回的一种对象商品集合连接数据库语句把一个商品加入集合返回集合释放数据集对象释放语句对象执行语句要记得捕获异常,且要用释放资源。

JSP 商品信息[Web]

采用Model1(jsp+Javabean)实现

实现DBHelper类(连接数据库)

创建实体类

创建业务逻辑类(DAO)

创建页面层

一、环境准备 1.1 MySQL 安装
Mac 安装方式

官网下载安装包dmg即可

安装

偏好设置启动mysql

配置bash_profile

添加“export PATH=$PATH:/usr/local/mysql/bin”

下载MySQL驱动 JDBC

1.2 创建项目

IDEA选择: Java Enterprise -> Web application
配置项目:

WEB_INF 内创建 classes 和 lib 文件夹

File -> Project Structure -> paths -> Use module compile output path 选择classes文件夹

File -> Project Structure -> Dependecies -> “+”号 -> JAR… -> 选择创建的lib文件夹

1.3 数据库创建

开启终端:登录数据库

mysql -u root -p

创建一个新的数据库 -> shopping :

create database shopping;

查看是否创建成功:

show databases;
1.4 连接数据库测试

IDEA: View -> Tool Windows -> Database

: 选择 Data Source -> MySQL

Database:shopping
再填写用户名+密码,Test Connection

1.5 创建数据库内容 1. 打开 Navicat,进入shopping数据库 2. Query 选择 New Query

复制粘贴:

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");

运行,生成表

1.5.3 刷新数据库,查看结果 1.6 存放数据库的图片到Web项目

项目中web目录下新建一个文件夹images

找10张图片放入,命名格式”001.jpg”,”002.jgp”…

二、DBHelper类 连接数据库

定义静态变量:数据库驱动

public static final String driver = "com.mysql.jdbc.Driver"; //数据库驱动
//连接数据库的URL地址
public static final String url = "jdbc:mysql://localhost:3306/shopping?useUnicode=true&charactorEncoding=UTF-8";
public static final String username = "root";
public static final String password = "amoy1205";
public 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("数据库连接正常");
        }
        else {
            System.out.println("数据库连接异常");
        }

    }
    catch (Exception ex){
        ex.printStackTrace();
    }
}
三、item 类(存放商品实体)

定义商品属性 :

private int id ; //商品编号
private String name; //商品名称
private String city; //产地
private int price;  //价格
private int number;  //库存
private String picture; //商品图片
四、ItemDAO 类 (业务逻辑类) 4.1 获取全部商品信息的方法

通过SQL语句:select * from Items; 从表items查询结果。

public ArrayList getAllItems()
{
    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null; //(ResultSet)是数据中查询结果返回的一种对象
    ArrayList list = new ArrayList();//商品集合
    try{
        conn = DBHelper.getConnection(); //连接数据库
        String sql = "select * from Items;"; //SQL语句
        stmt = conn.prepareStatement(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.setNumber(rs.getInt("number"));
            item.setPrice(rs.getInt("price"));
            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();
            }
        }
    }
}

执行SQL语句要记得捕获异常,且要用finally释放资源。

PreparedStatement : 执行SQL查询语句的API之一
「JDBC 中preparedStatement和Statement区别」参考资料:https://blog.csdn.net/xuebing1995/article/details/72235380
4.2 根据商品编号获取商品信息

public Items getItemsById()
和获取全部信息的代码差不多,这里仅修改try{}里的代码:

修改sql查询语句

stmt.setInt(1,id)将指定的参数设置为给定的java int值, sql将查询id匹配的条目

查询结果不用循环

返回item而不是list

try{
    conn = DBHelper.getConnection();
    String sql = "select * from Items WHERE id=?;"; //SQL语句
    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.setNumber(rs.getInt("number"));
        item.setPrice(rs.getInt("price"));
        item.setPicture(rs.getString("picture"));
        return item;
    }
    else {
        return null;
    }
}
4.3 通过cookie实现 商品浏览记录DAO

① 传入list字符串,通过分隔符”#”识别出不同的商品id,存放到字符串数组arr中

注意: Tomcat高版本中,Cookie对象的构造函数的两个字符串参数:Cookie名字和Cookie值都不能包含空白字符以及下列字符:[]() < > = , " / ? @ :      
因此,分隔符采用”#”

② 根据分割后的id,查询商品信息,添加到itemlist中,返回

public ArrayList getViewList(String list){
    System.out.println("list:"+list);
    ArrayList itemlist = new ArrayList();
    int iCount = 5;
    if (list!=null && list.length()>=0)
    {
        String[] arr = list.split("#");
        System.out.println("arr.length="+arr.length);
        if(arr.length>=5)
        {
            for(int i=arr.length-1;i>=arr.length-iCount;i--)
            {
                itemlist.add(getItemsById(Integer.parseInt(arr[i])));
            }
        }
        else
        {
            for(int i=arr.length-1;i>=0;i--)
            {
                itemlist.add(getItemsById(Integer.parseInt(arr[i])));
            }
        }
        return itemlist;
    }
    else
    {
        return null;
    }
}
五、页面层 5.1 index.jsp 5.1.1 中添加css样式
  
    商品展示
      
  
5.1.2 获取全部商品信息
调用ItemsDAO的getAllItems() 获得所有商品的Item实例

遍历打印商品信息:

    

商品展示


<% ItemsDAO itemsDao = new ItemsDAO(); ArrayList list = itemsDao.getAllItems(); if(list!=null&&list.size()>0) { for(int i=0;i
<%=item.getName() %>
产地:<%=item.getCity() %>  价格:¥ <%=item.getPrice() %>
<% } } %>
为图片设置超链接,目的:进入到商品详情页面
5.2 details.jsp

实现功能:显示商品详情(点取超链接时传入的id值再调用ItemsDAO的getItemsById()获取商品信息)+最近浏览商品记录(cookie实现)

css样式和index.jsp相同,复制即可

中需要处理的:
① 从request中获取cookie: request.getCookies()
② 获取本项目Cookie对应的字符串

  if(c.getName().equals("ListViewCookie"))
  {
     list = c.getValue();
  }

③ 追加本次浏览的记录:

list+=request.getParameter("id")+"#";

④ 创建新的cookie对象,并将其放到response:

  Cookie cookie = new Cookie("ListViewCookie",list);
  response.addCookie(cookie);

⑤ 再通过ItemsDAO的getViewList()获取cookie的字符串,根据返回的列表打印最近浏览的记录

标签中添加完整代码:

  
      <% 
         ItemsDAO itemDao = new ItemsDAO();
         Items item = itemDao.getItemsById(Integer.parseInt(request.getParameter("id")));
         if(item!=null)
         {
      %>
      
      <% 
        }
      %>
      <% 
          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);
      
      %>
      
<%=item.getName() %>
产地:<%=item.getCity()%>
价格:<%=item.getPrice() %>¥

您浏览过的商品
<% ArrayList itemlist = itemDao.getViewList(list); if(itemlist!=null&&itemlist.size()>0 ) { System.out.println("itemlist.size="+itemlist.size()); for(Items i:itemlist) { %>
<%=i.getName() %>
产地:<%=i.getCity() %>  价格:<%=i.getPrice() %> ¥
<% } } %>

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76636.html

相关文章

  • SpringSecurity01(使用传统的xml方式开发,且不连接数据库)

    摘要:创建一个工程在里面添加依赖,依赖不要随便改我改了出错了好几次都找不到原因可以轻松的将对象转换成对象和文档同样也可以将转换成对象和配置 1.创建一个web工程2.在pom里面添加依赖,依赖不要随便改,我改了出错了好几次都找不到原因 UTF-8 1.7 1.7 2.5.0 1.2 3.0-alpha-1 ...

    Gilbertat 评论0 收藏0
  • JSP 学习记录

    摘要:对象具有请求域,即完成客户端的请求之前,该对象一直有效。提交的数据量最多不超过。安全性较低但效率比方式高。适合提交数据量大,安全性高的用户信息。除非本次会话的所有页面都关闭后再重新访问某个或者,将会创建新的会话。 JSP 简介 全名为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java当中使用HTML标签。JSP是一种动态网页技术标准,也是Java...

    BearyChat 评论0 收藏0
  • Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】

    摘要:于是乎服务器向用户浏览器发送了一个名为的,它的值是的值。标记着该用户已经登陆了跳转到其他页面,告诉用户成功登陆了。注册多个用户,不断发帖子,扰乱正常发帖秩序。在处理表单的中刷新。监听用户提交事件。 什么是Session Session 是另一种记录浏览器状态的机制。不同的是Cookie保存在浏览器中,Session保存在服务器中。用户使用浏览器访问服务器的时候,服务器把用户的信息以某种...

    Java_oldboy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<