热门标签 | 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() %> ¥



<%
}
}
%>


推荐阅读
  • selenium通过JS语法操作页面元素
    做过web测试的小伙伴们都知道,web元素现在很多是JS写的,那么既然是JS写的,可以通过JS语言去操作页面,来帮助我们操作一些selenium不能覆盖的功能。问题来了我们能否通过 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
  • 本文探讨了一个Web工程项目的需求,即允许用户随时添加定时任务,并通过Quartz框架实现这些任务的自动化调度。文章将介绍如何设计任务表以存储任务信息和执行周期,以及如何通过一个定期扫描机制自动识别并加载新任务到调度系统中。 ... [详细]
  • java datarow_DataSet  DataTable DataRow 深入浅出
    本篇文章适合有一定的基础的人去查看,最好学习过一定net编程基础在来查看此文章。1.概念DataSet是ADO.NET的中心概念。可以把DataSet当成内存中的数据 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • Hadoop集群搭建:实现SSH无密码登录
    本文介绍了如何在CentOS 7 64位操作系统环境下配置Hadoop集群中的SSH无密码登录,包括环境准备、用户创建、密钥生成及配置等步骤。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • 分布式计算助力链力实现毫秒级安全响应,确保100%数据准确性
    随着分布式计算技术的发展,其在数据存储、文件传输、在线视频、社交平台及去中心化金融等多个领域的应用日益广泛。国际知名企业如Firefox、Google、Opera、Netflix、OpenBazaar等均已采用该技术,推动了技术创新和服务升级。 ... [详细]
  • 本文总结了在多人协作开发环境中使用 Git 时常见的问题及其解决方案,包括错误合并分支的处理、使用 SourceTree 查找问题提交、Git 自动生成的提交信息解释、删除远程仓库文件夹而不删除本地文件的方法、合并冲突时的注意事项以及如何将多个提交合并为一个。 ... [详细]
  • 本文探讨了Java编程语言中常用的两个比较操作符==和equals方法的区别及其应用场景。通过具体示例分析,帮助开发者更好地理解和使用这两个概念,特别是在处理基本数据类型和引用数据类型的比较时。 ... [详细]
  • 开发笔记:每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解
    开发笔记:每篇半小时1天入门MongoDB——3.MongoDB可视化及shell详解 ... [详细]
  • 本文详细介绍了如何使用Rufus工具制作一个兼容UEFI启动模式的Windows Server 2008 R2安装U盘,包括必要的软件和步骤。 ... [详细]
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社区 版权所有