热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JSP商品浏览[Webapplication]

JSP商品信息[Web]采用Model1(jsp+Javabean)实现实现DBHelper类(连接数据库)创建实体类创建业务逻辑类(DAO)创建页面层一、环境准备1.1MySQL
JSP 商品信息[Web]

采用Model1(jsp+Javabean)实现

  • 实现DBHelper类(连接数据库)
  • 创建实体类
  • 创建业务逻辑类(DAO)
  • 创建页面层

一、环境准备

1.1 MySQL 安装

Mac 安装方式

  1. 官网下载安装包dmg即可
  2. 安装
  3. 偏好设置启动mysql
  4. 配置bash_profile
  5. 添加“export PATH=$PATH:/usr/local/mysql/bin”

下载MySQL驱动 JDBC

1.2 创建项目

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

  1. WEB_INF 内创建 classes 和 lib 文件夹
  2. File -> Project Structure -> paths -> Use module compile output path 选择classes文件夹
  3. 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项目

  1. 项目中web目录下新建一个文件夹images
  2. 找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{}里的代码:

  1. 修改sql查询语句
  2. stmt.setInt(1,id)将指定的参数设置为给定的java int值, sql将查询id匹配的条目
  3. 查询结果不用循环
  4. 返回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值都不能包含空白字符以及下列字符:[]() <> = , &#8221; / ? @ :

因此,分隔符采用”#”

② 根据分割后的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 {
Items item = list.get(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() %> ¥



<%
}
}
%>


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
author-avatar
夜遊神_丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有