采用Model1(jsp+Javabean)实现
Mac 安装方式
下载MySQL驱动 JDBC
IDEA选择: Java Enterprise -> Web application
配置项目:
开启终端:登录数据库
mysql -u root -p
创建一个新的数据库 -> shopping :
create database shopping;
查看是否创建成功:
show databases;
IDEA: View -> Tool Windows -> Database
Database:shopping
再填写用户名+密码,Test Connection
复制粘贴:
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');
运行,生成表
定义静态变量:数据库驱动
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();
}
}
定义商品属性 :
private int id ; //商品编号
private String name; //商品名称
private String city; //产地
private int price; //价格
private int number; //库存
private String picture; //商品图片
通过SQL语句:select * from Items; 从表items查询结果。
public ArrayList
{
Connection cOnn= null;
PreparedStatement stmt = null;
ResultSet rs = null; //(ResultSet)是数据中查询结果返回的一种对象
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
public Items getItemsById()
和获取全部信息的代码差不多,这里仅修改try{}里的代码:
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;
}
}
① 传入list字符串,通过分隔符”#”识别出不同的商品id,存放到字符串数组arr中
注意: Tomcat高版本中,COOKIE对象的构造函数的两个字符串参数:COOKIE名字和COOKIE值都不能包含空白字符以及下列字符:[]() <> = , &#8221; / ? @ :
因此,分隔符采用”#”
② 根据分割后的id,查询商品信息,添加到itemlist中,返回
public ArrayList
System.out.println("list:"+list);
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;
}
}
调用ItemsDAO的getAllItems() 获得所有商品的Item实例
遍历打印商品信息:
商品展示
<%
ItemsDAO itemsDao = new ItemsDAO();
ArrayList
if(list!=null&&list.size()>0)
{
for(int i=0;i
Items item = list.get(i);
%>
<%
}
}
%>
为图片设置超链接,目的:进入到商品详情页面
实现功能:显示商品详情(点取超链接时传入的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)
{
%>
<%=item.getName() %>
产地:<%=item.getCity()%>
价格:<%=item.getPrice() %>¥
<%
}
%>
<%
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);
%>
您浏览过的商品
<%
ArrayList
if(itemlist!=null&&itemlist.size()>0 )
{
System.out.println("itemlist.size="+itemlist.size());
for(Items i:itemlist)
{
%>
<%
}
}
%>