目录
6、搭建项目文件层:entity、util、dao、service、servlet、test。
14、启动服务使用浏览器访问网址:http://localhost:8080/shoppingCart/list.do
**本示例主要着重基于session的业务层开发。
1、创建数据表computer
2、创建初始数据
3、新建web项目:shoppingCart
别忘了勾选web.xml
4、配置Servlet环境
点击添加额外jar包
找到Servlet-api,添加即可,点击Aply
5、导入数据库连接驱动
拖拽:
6、搭建项目文件层:entity、util、dao、service、servlet、test。
7、创建实体类
Computer.class
package com.qf.entity;
public class Computer {
private int id;
private String model;
private String pic;
private String prodDesc;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getPic() {
return pic;
}
public void setPic(String pic) {
this.pic = pic;
}
public String getProdDesc() {
return prodDesc;
}
public void setProdDesc(String prodDesc) {
this.prodDesc = prodDesc;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Computer other = (Computer) obj;
if (id != other.id)
return false;
return true;
}
@Override
public String toString() {
return "Computer [id=" + id + ", model=" + model + ", pic=" + pic + ", prodDesc=" + prodDesc + ", price="
+ price + "]";
}
}
8、创建数据库连接类
DBUtil.class
package com.qf.util;
import java.sql.Connection;
import java.sql.DriverManager;
//数据库链接的工具类型
public class DBUtil {
//5.0版本获取数据库链接
public static Connection getConnection(){
Connection con=null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取数据库的链接
String url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8";
String name="root";
String pwd="123456";
con=DriverManager.getConnection(url,name,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
//8.0版本获取数据库链接
public static Connection getConnection2(){
Connection con=null;
try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取数据库的链接
String url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&serverTimezone=UTC";
String name="root";
String pwd="123456";
con=DriverManager.getConnection(url,name,pwd);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
}
9、编写dao层操作数据库代码
package com.qf.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.qf.entity.Computer;
import com.qf.util.DBUtil;
public class ComputerDao {
//查询所有商品列表
public List<Computer> findAll(){
//定义一个集合对象
List<Computer> coms=new ArrayList<Computer>();
//获取数据库链接对象
Connection con=DBUtil.getConnection();
//定义sql语句
String sql="select * from computer";
try {
//获取PreparedStatment对象 负责操作数据库sql语句
PreparedStatement prep=con.prepareStatement(sql);
//执行sql语句 获取查询数据后的结果集对象
ResultSet rs=prep.executeQuery();
//迭代结果集对象 将查询输出的数据封装到Emp对象当中
while(rs.next()){
Computer c=new Computer();
c.setId(rs.getInt("id"));
c.setModel(rs.getString("model"));
c.setPic(rs.getString("pic"));
c.setPrice(rs.getDouble("price"));
c.setProdDesc(rs.getString("prodDesc"));
coms.add(c);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return coms;
}
//根据id查询某个商品信息
public Computer findById(int id){
Computer c=null;
//获取数据库链接
Connection con=DBUtil.getConnection();
//定义sql
String sql="select * from computer where id=?";
try {
//获取PreparedStatement对象
PreparedStatement prep=con.prepareStatement(sql);
//注入占位符参数
prep.setInt(1, id);
//执行sql获取结果集对象
ResultSet rs=prep.executeQuery();
while(rs.next()){
c=new Computer();
c.setId(rs.getInt("id"));
c.setModel(rs.getString("model"));
c.setPic(rs.getString("pic"));
c.setPrice(rs.getDouble("price"));
c.setProdDesc(rs.getString("prodDesc"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return c;
}
}
10、测试dao层操作数据库是否可用
package com.qf.test;
import java.util.List;
import com.qf.dao.ComputerDao;
import com.qf.entity.Computer;
public class ComputerTest {
public static void main(String[] args) {
ComputerDao dao=new ComputerDao();
//System.out.println(dao.findById(1));
List<Computer>cs=dao.findAll();
System.out.println(cs);
for(Computer c:cs){
System.out.println(c);
}
}
}
11、编写Servlet层
package com.qf.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.qf.dao.ComputerDao;
import com.qf.entity.Computer;
public class ActionServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ComputerDao dao=new ComputerDao();
String uri=request.getRequestURI();
String path=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
if(path.equals("/list")){
List<Computer>cs=dao.findAll();
request.setAttribute("cs", cs);
request.getRequestDispatcher("computer_list.jsp").forward(request, response);
}
}
}
12、导入前端文件
13、 编辑部署文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>cart</servlet-name>
<servlet-class>com.qf.servlet.ActionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>cart</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
14、启动服务使用浏览器访问网址:http://localhost:8080/shoppingCart/list.do
网页效果如下:
15、编写业务层
在service包中创建两个类
Cart.class
package com.qf.service;
import java.util.ArrayList;
import java.util.List;
//购物车类
public class Cart {
//商品条目类型
private List<CartItem> items=new ArrayList<>();
//添加购物车ﳵ
public boolean add(CartItem item){
//先判断一下这个商品有没有购买过 如果买过返回false 没有买过 返回true 并将商品加如到购物车当中
for(int i=0;i<items.size();i++){
CartItem curr=items.get(i);
if(curr.getC().getId()==item.getC().getId()){
//已经购买过该商品了
return false;
}
}
items.add(item);
return true;
}
}
CartItem.class
package com.qf.service;
import com.qf.entity.Computer;
//商品条目类 记录着对应商品的名称及 购买数量
public class CartItem {
private Computer c;//记录购买的商品信息
private int qty;// 记录着购买的商品的数量
public Computer getC() {
return c;
}
public void setC(Computer c) {
this.c = c;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
}
16、修改Servlet层
package com.qf.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.qf.dao.ComputerDao;
import com.qf.entity.Computer;
import com.qf.service.Cart;
import com.qf.service.CartItem;
public class ActionServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ComputerDao dao=new ComputerDao();
String uri=request.getRequestURI();
String path=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
if(path.equals("/list")){
List<Computer>cs=dao.findAll();
request.setAttribute("cs", cs);
request.getRequestDispatcher("computer_list.jsp").forward(request, response);
}else if(path.equals("/buy")){
int id=Integer.parseInt(request.getParameter("id"));
//根据客户传递过来的商品id 在数据库中查寻出用户购买的商品信息并封装成一个对象返回
Computer c=dao.findById(id);
//创建一个商品条目类型
CartItem item=new CartItem();
//将用户购买的商品放入到商品条目类中
item.setC(c);
//设置该购买的产品数量
item.setQty(1);
//获取Session对象
HttpSession session=request.getSession();
//到session中获取购物车对象 ,如果是第一次够买session中没有购物车对象
//会为其创建一个购物车对象
Cart cart=(Cart)session.getAttribute("cart");
if(cart==null){
//如果是第一次购买 需要先创建好一个cart对象 然后绑定到session对象上
cart=new Cart();
session.setAttribute("cart",cart);
}
boolean flag=cart.add(item);
if(!flag){
//该商品已经购买过了 提示用户已经买过这个商品
request.setAttribute("buy_error"+id, "已经购买过该商品了");
request.getRequestDispatcher("list.do").forward(request, response);
}else{
//没有买过,返回到商品列表
request.setAttribute("buy_error"+id, "添加购物车成功");
request.getRequestDispatcher("list.do").forward(request, response);
}
}
}
}
17、修改computer_list.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,com.qf.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8" />
<link href="css/main/style.css"
type="text/css" rel="stylesheet" />
</head>
<body topMargin="10">
<div id="append_parent"></div>
<table cellSpacing=6 cellPadding=2 width="100%" border="0">
<tbody>
<tr>
<td>
<table class="guide" cellSpacing="0" cellPadding="0" width="100%"
border="0">
<tbody>
<tr>
<td>
<a href='#'>主页</a> /
<a href='#'>笔记本订购(WEB007)</a> / 商品列表
</td>
</tr>
</tbody>
</table>
<br />
<table class="tableborder" cellSpacing="0" cellPadding="0"
width="100%" border="0">
<tbody>
<tr class="header">
<td class="altbg1" width="15%">
<b>型号</B>
</td>
<td class="altbg1" width="20%">
<b>产品图片</b>
</td>
<td class="altbg1" width="30%">
<b>产品说明</b>
</td>
<td class="altbg1" width="10%">
<b>产品报价</b>
</td>
<td class="altbg1">
</td>
</tr>
</tbody>
<tbody>
<%
List<Computer>cs=(List<Computer>)request.getAttribute("cs");
for(Computer c:cs){
%>
<tr>
<td class="altbg2">
<%=c.getModel() %>
</td>
<td class="altbg2">
<img src="img/<%=c.getPic() %>" width="150"
height="90" />
</td>
<td class="altbg2">
<%=c.getProdDesc() %>
</td>
<td class="altbg2">
¥<%=c.getPrice() %>
</td>
<td class="altbg2">
<a href="buy.do?id=<%=c.getId()%>">购买</a>
<span style="color:red;">
<%
String msg=(String)request.getAttribute("buy_error"+c.getId());
%>
<%=(msg==null?"":msg) %>
</span>
</td>
</tr>
<%} %>
</tbody>
</table>
<br />
<center>
<input class="button" type="button" value="查看购物车"
name="settingsubmit" onclick="location = 'cart.html';">
</center>
</td>
</tr>
</tbody>
</table>
</body>
</html>
测试购物车的添加功能
http://127.0.0.1:8080/shoppingCart/list.do
18、 编辑购物车页面和功能
Cart.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,com.qf.entity.*,com.qf.service.*"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8" />
<link href="css/main/style.css"
type="text/css" rel="stylesheet" />
</head>
<body topMargin="10">
<div id="append_parent"></div>
<table cellSpacing="6" cellPadding="2" width="100%" border="0">
<tbody>
<tr>
<td>
<table class="guide" cellSpacing="0" cellPadding="0" width="100%"
border="0">
<tbody>
<tr>
<td>
<a href='#'>主页</a> /
<a href='computer_list.html'>笔记本订购(WEB007)</a> / 购物车信息
</td>
</tr>
</tbody>
</table>
<br />
<table class="tableborder" cellSpacing="0" cellPadding="0"
width="100%" border="0">
<tbody>
<tr class="header">
<td class="altbg2" colspan="6">
购物车信息
</td>
</tr>
<tbody>
<tr>
<td class="altbg1" width="20%">
<b>型号</b>
</td>
<td class="altbg1" width="20%">
<b>价格</b>
</td>
<td class="altbg1" width="10%">
<b>数量</b>
</td>
<td class="altbg1" width="30">
</td>
<td class="altbg1" width="10%">
</td>
<td class="altbg1">
</td>
</tr>
</tbody>
<tbody>
<%
Cart cart=(Cart)session.getAttribute("cart");
if(cart!=null&&cart.list().size()>0){
List<CartItem> items=cart.list();
for(CartItem it:items){
%>
<tr>
<td class="altbg2">
<%=it.getC().getModel() %>
</td>
<td class="altbg2">
<%=it.getC().getPrice() %>
</td>
<td class="altbg2">
<%=it.getQty() %>
</td>
<td class="altbg2">
<input type="text" size="3" value=""
id="num_<%=it.getC().getId() %>" />
</td>
<td class="altbg2">
<a href="javascript:;" onclick="location='update.do?id=<%=it.getC().getId()%>&qty='+document.getElementById('num_<%=it.getC().getId() %>').value;">更改数量</a>
</td>
<td class="altbg2">
<a href="del.do?id=<%=it.getC().getId() %>">删除</a>
</td>
</tr>
<%
}
}
%>
<tr>
<td class="altbg1" colspan="6">
<b>总价格:¥<% if(cart==null){
out.println(0);
}else{
out.println(cart.total());
} %></b>
</td>
</tr>
</tbody>
<tr>
<td class="altbg2" colspan="6">
<b>还没有选购商品</b>
</td>
</tr>
</table>
<br />
<center>
<input class="button" type="button" value="返回商品列表"
name="settingsubmit" onclick="location = 'list.do';">
<input class="button" type="button" value="清空购物车"
name="settingsubmit"
onclick="location = 'clear.do';">
</center>
</td>
</tr>
</tbody>
</table>
</body>
</html>
computer_list.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.util.*,com.qf.entity.*"
pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8" />
<link href="css/main/style.css"
type="text/css" rel="stylesheet" />
</head>
<body topMargin="10">
<div id="append_parent"></div>
<table cellSpacing=6 cellPadding=2 width="100%" border="0">
<tbody>
<tr>
<td>
<table class="guide" cellSpacing="0" cellPadding="0" width="100%"
border="0">
<tbody>
<tr>
<td>
<a href='#'>主页</a> /
<a href='#'>笔记本订购(WEB007)</a> / 商品列表
</td>
</tr>
</tbody>
</table>
<br />
<table class="tableborder" cellSpacing="0" cellPadding="0"
width="100%" border="0">
<tbody>
<tr class="header">
<td class="altbg1" width="15%">
<b>型号</B>
</td>
<td class="altbg1" width="20%">
<b>产品图片</b>
</td>
<td class="altbg1" width="30%">
<b>产品说明</b>
</td>
<td class="altbg1" width="10%">
<b>产品报价</b>
</td>
<td class="altbg1">
</td>
</tr>
</tbody>
<tbody>
<%
List<Computer>cs=(List<Computer>)request.getAttribute("cs");
for(Computer c:cs){
%>
<tr>
<td class="altbg2">
<%=c.getModel() %>
</td>
<td class="altbg2">
<img src="img/<%=c.getPic() %>" width="150"
height="90" />
</td>
<td class="altbg2">
<%=c.getProdDesc() %>
</td>
<td class="altbg2">
¥<%=c.getPrice() %>
</td>
<td class="altbg2">
<a href="buy.do?id=<%=c.getId()%>">购买</a>
<span style="color:red;">
<%
String msg=(String)request.getAttribute("buy_error"+c.getId());
%>
<%=(msg==null?"":msg) %>
</span>
</td>
</tr>
<%} %>
</tbody>
</table>
<br />
<center>
<input class="button" type="button" value="查看购物车"
name="settingsubmit" onclick="location = 'cart.jsp';">
</center>
</td>
</tr>
</tbody>
</table>
</body>
</html>
19、业务层
Cart .class
package com.qf.service;
import java.util.ArrayList;
import java.util.List;
//购物车类
public class Cart {
//商品条目类型
private List<CartItem> items=new ArrayList<>();
//添加购物车ﳵ
public boolean add(CartItem item){
//先判断一下这个商品有没有购买过 如果买过返回false 没有买过 返回true 并将商品加如到购物车当中
for(int i=0;i<items.size();i++){
CartItem curr=items.get(i);
if(curr.getC().getId()==item.getC().getId()){
//已经购买过该商品了
return false;
}
}
items.add(item);
return true;
}
//获取购物车中所有商品条目
public List<CartItem>list(){
return items;
}
//修改购物车中商品数量方法
public void update(int id,int qty){
for(int i=0;i<items.size();i++){
CartItem curr=items.get(i);
if(curr.getC().getId()==id){
curr.setQty(qty);
return;
}
}
}
//删除商品条目
public void delete(int id){
for(int i=0;i<items.size();i++){
CartItem curr=items.get(i);
if(curr.getC().getId()==id){
items.remove(curr);
return;
}
}
}
//清空购物车中的所有商品
public void clear(){
items.clear();
}
//统计总价格
public double total(){
double total=0;
for(int i=0;i<items.size();i++){
CartItem curr=items.get(i);
total+=curr.getC().getPrice()*curr.getQty();
}
return total;
}
}
CartItem .class
package com.qf.service;
import com.qf.entity.Computer;
//商品条目类 记录着对应商品的名称及 购买数量
public class CartItem {
private Computer c;//记录购买的商品信息
private int qty;// 记录着购买的商品的数量
public Computer getC() {
return c;
}
public void setC(Computer c) {
this.c = c;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
}
20、Servlet层
ActionServlet .class
package com.qf.servlet;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.qf.dao.ComputerDao;
import com.qf.entity.Computer;
import com.qf.service.Cart;
import com.qf.service.CartItem;
public class ActionServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ComputerDao dao=new ComputerDao();
String uri=request.getRequestURI();
String path=uri.substring(uri.lastIndexOf("/"),uri.lastIndexOf("."));
if(path.equals("/list")){
List<Computer>cs=dao.findAll();
request.setAttribute("cs", cs);
request.getRequestDispatcher("computer_list.jsp").forward(request, response);
}else if(path.equals("/buy")){
int id=Integer.parseInt(request.getParameter("id"));
//根据客户传递过来的商品id 在数据库中查寻出用户购买的商品信息并封装成一个对象返回
Computer c=dao.findById(id);
//创建一个商品条目类型
CartItem item=new CartItem();
//将用户购买的商品放入到商品条目类中
item.setC(c);
//设置该购买的产品数量
item.setQty(1);
//获取Session对象
HttpSession session=request.getSession();
//到session中获取购物车对象 ,如果是第一次够买session中没有购物车对象
//会为其创建一个购物车对象
Cart cart=(Cart)session.getAttribute("cart");
if(cart==null){
//如果是第一次购买 需要先创建好一个cart对象 然后绑定到session对象上
cart=new Cart();
session.setAttribute("cart",cart);
}
boolean flag=cart.add(item);
if(!flag){
//该商品已经购买过了 提示用户已经买过这个商品
request.setAttribute("buy_error"+id, "已经购买过该商品了");
request.getRequestDispatcher("list.do").forward(request, response);
}else{
//没有买过,返回到商品列表
request.setAttribute("buy_error"+id, "添加购物车成功");
request.getRequestDispatcher("list.do").forward(request, response);
}
}else if(path.equals("/update")){
int id=Integer.parseInt(request.getParameter("id"));
int qty=Integer.parseInt(request.getParameter("qty"));
HttpSession session=request.getSession();
//到session中获取购物车对象 ,如果是第一次够买session中没有购物车对象
//会为其创建一个购物车对象
Cart cart=(Cart)session.getAttribute("cart");
cart.update(id, qty);
response.sendRedirect("cart.jsp");
}else if(path.equals("/del")){
int id=Integer.parseInt(request.getParameter("id"));
HttpSession session=request.getSession();
//到session中获取购物车对象 ,如果是第一次够买session中没有购物车对象
//会为其创建一个购物车对象
Cart cart=(Cart)session.getAttribute("cart");
cart.delete(id);
response.sendRedirect("cart.jsp");
}else if(path.equals("/clear")){
HttpSession session=request.getSession();
//到session中获取购物车对象 ,如果是第一次够买session中没有购物车对象
//会为其创建一个购物车对象
Cart cart=(Cart)session.getAttribute("cart");
cart.clear();
response.sendRedirect("cart.jsp");
}
}
}
项目资源代码:
链接:https://pan.baidu.com/s/1UlzDdMST9zKp6t_zNB49gw
提取码:sjd1