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



<%
}
}
%>


推荐阅读
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
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社区 版权所有