ServletCart2

下面继续学习购物车的servlet层的一些设计

准备工作是:在刚才创建的购物车的web工程点击new、servlet就可以创建一个servlet了。创建好之后,那就开始吧

1、先给出ItemsDAO.java的代码吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package dao;
import java.sql.*;
import java.util.ArrayList;
import cn.itcast.DB.DBHelper;
import entity.Items;
//商品的业务逻辑类
public class ItemsDao {
//获得所有的商品信息
public ArrayList<Items> getAllItems() {
Connection conn=null;//不可以释放
PreparedStatement stmt=null;//其次释放
ResultSet rs=null;//最先释放
ArrayList<Items> list = new ArrayList<Items>();//商品集合
try{
conn=DBHelper.getConnection();
String sql="select * from Items;";
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.setPrice(rs.getInt("price"));
item.setNumber(rs.getInt("number"));
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();
}
}
}
}
//根据商品编号获得商品资料
public Items getItermsById(int id){
Connection conn=null;//不可以释放
PreparedStatement stmt=null;//其次释放
ResultSet rs=null;//最先释放
try{
conn=DBHelper.getConnection();
String sql="select * from Items where id=?;";
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.setPrice(rs.getInt("price"));
item.setNumber(rs.getInt("number"));
item.setPicture(rs.getString("picture"));
return item;
}else
{
return null;
}
}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();
}
}
}
}
//获取最近浏览的钱五条信息
public ArrayList<Items> getViewList(String list){
ArrayList<Items> itemlist =new ArrayList<Items>();
int iCount=5;//每次返回前五条
if(list!=null&&list.length()>0){
String[] arr=list.split(",");//分隔成字符数组
//如果商品记录大于等于五条,就倒叙输出
if(arr.length>=5){
for(int i=arr.length-1;i>=arr.length-iCount;i--)
{
itemlist.add(getItermsById(Integer.parseInt(arr[i])));
}
}else{
for(int i=arr.length-1;i>=0;i--)
{
itemlist.add(getItermsById(Integer.parseInt(arr[i])));
}
}
return itemlist;
}else{
return null;
}
}
}

2、还没有完。还得把cn.itcast.DB包下面的DBHelper.java写一下。否则上面的代码会报错哦!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package cn.itcast.DB;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBHelper {
//我用的是mysql,这个是看用的啥了。
private static final String driver = "com.mysql.jdbc.Driver";
//定义一个静态类型的变量url,看是要连接哪个数据库并指定了字符编码
private static final String url="jdbc:mysql://localhost:3306/checkmysql?useUnicode=true&characterEncoding=UTF-8";
//连接数据库所使用的用户,一般情况下是root
private static final String username="root";
//下面就是个人使用数据库的密码了。每个人的可能不同
private static final String password="xxxxx";
//定义一个连接数据库的变量
private 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();
}
}
}

3、对上面准备的时候创建的servletCart.java进行编写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package Servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.ItemsDAO;
import entity.Cart;
import entity.Items;
public class CartServlet extends HttpServlet {
private String action;//显示购物车动作
//商品业务逻辑类的对象
private ItemsDAO idao =new ItemsDAO();
/**
* Constructor of the object.
*/
public CartServlet() {
super();
}
/**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
if(request.getParameter("action")!=null){//判断动作类型
this.action=request.getParameter("action");
if(action.equals("add")){//如果是添加商品进购物车
// addToCart(request,response);
if(addToCart(request,response)){
//服务器跳转
request.getRequestDispatcher("/success.jsp").forward(request, response);
}else{
request.getRequestDispatcher("/faliure.jsp").forward(request, response);
}
addToCart(request,response);
}
if(action.equals("show")){//如果是显示购物车
//服务器跳转
request.getRequestDispatcher("/cart.jsp").forward(request, response);
//showCart(request,response);
}
}
}
//添加商品进购物车
private boolean addToCart(HttpServletRequest request, HttpServletResponse response){
String id=request.getParameter("id");//获得商品的id
String number =request.getParameter("num");//获得商品的数量
//获得商品的资料。id是整型的,需要进行转换成整型
Items item=idao.getItemsById(Integer.parseInt(id));
//判断是不是第一次给狗驱车添加商品,需要给session中创建新的购物车对象
if(request.getSession().getAttribute("cart")==null){
Cart cart =new Cart();
//典型的session保存
request.getSession().setAttribute("cart", cart);
}
//获得session保存的购物车对象,这里也用到了强制类型转换
Cart cart =(Cart)request.getSession().getAttribute("cart");
//调用添加商品进购物车的方法
if(cart.addGoodsInCart(item, Integer.parseInt(number))){
return true;//添加成功
}else{
return false;//添加失败
}
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}
}

4、编写的details.jsp代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%@ page import="entity.Items"%>
<%@ page import="dao.ItemsDAO"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'details.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link href="css/main.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="js/lhgcore.js"></script>
<script type="text/javascript" src="js/lhgdialog.js"></script>
<script type="text/javascript">
function selflog_show(id)
{
var num = document.getElementById("number").value;
J.dialog.get({id: 'haoyue_creat',title: '购物成功',width: 600,height:400, link: '<%=path%>/servlet/CartServlet?id='+id+'&num='+num+'&action=add', cover:true});
}
function add()
{
var num = parseInt(document.getElementById("number").value);
if(num<100)
{
document.getElementById("number").value = ++num;
}
}
function sub()
{
var num = parseInt(document.getElementById("number").value);
if(num>1)
{
document.getElementById("number").value = --num;
}
}
</script>
<style type="text/css">
hr{
border-color:FF7F00;
}
div{
float:left;
margin-left: 30px;
margin-right:30px;
margin-top: 5px;
margin-bottom: 5px;
}
div dd{
margin:0px;
font-size:10pt;
}
div dd.dd_name
{
color:blue;
}
div dd.dd_city
{
color:#000;
}
div #cart
{
margin:0px auto;
text-align:right;
}
span{
padding:0 2px;border:1px #c0c0c0 solid;cursor:pointer;
}
a{
text-decoration: none;
}
</style>
</head>
<body>
<h1>商品详情</h1>
<a href="index.jsp">首页</a> >> <a href="index.jsp">商品列表</a>
<hr>
<center>
<table width="750" height="60" cellpadding="0" cellspacing="0" border="0">
<tr>
<!-- 商品详情 -->
<%
ItemsDAO itemDao = new ItemsDAO();
Items item = itemDao.getItemsById(Integer.parseInt(request.getParameter("id")));
if(item!=null)
{
%>
<td width="70%" valign="top">
<table>
<tr>
<td rowspan="5"><img src="image/<%=item.getPicture()%>" width="200" height="160"/></td>
</tr>
<tr>
<td><B><%=item.getName()%></B></td>
</tr>
<tr>
<td>产地:<%=item.getCity()%></td>
</tr>
<tr>
<td>价格:<%=item.getPrice()%>¥</td>
</tr>
<tr>
<td>购买数量:<span id="sub" onclick="sub();">-</span><input type="text" id="number" name="number" value="1" size="2"/><span id="add" onclick="add();">+</span></td>
</tr>
</table>
<div id="cart">
<img src="images/buy_now.png"><a href="javascript:selflog_show(<%=item.getId()%>)"><img src="images/in_cart.png"></a><a href="servlet/CartServlet?action=show"><img src="images/view_cart.jpg"/></a>
</div>
</td>
<%
}
%>
<%
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);
%>
<!-- 浏览过的商品 -->
<td width="30%" bgcolor="#EEE" align="center">
<br>
<b><font color="#FF7F00">您浏览过的商品</font></b><br>
<!-- 循环开始 -->
<%
ArrayList<Items> itemlist = itemDao.getViewList(list);
if(itemlist!=null&&itemlist.size()>0 )
{
System.out.println("itemlist.size="+itemlist.size());
for(Items i:itemlist)
{
%>
<div>
<dl>
<dt>
<a href="details.jsp?id=<%=i.getId()%>"><img src="image/<%=i.getPicture() %>" width="120" height="90" border="1"/></a>
</dt>
<dd class="dd_name"><%=i.getName() %></dd>
<dd class="dd_city">产地:<%=i.getCity() %>&nbsp;&nbsp;价格:<%=i.getPrice() %> ¥ </dd>
</dl>
</div>
<%
}
}
%>
<!-- 循环结束 -->
</td>
</tr>
</table>
</center>
</body>
</html>

5、跳转成功的success.jsp。只给出了关键的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
<center>
<img src="images/add_cart_success.jpg"/>
<hr>
<%
String id = request.getParameter("id");
String num = request.getParameter("num");
%>
您成功购买了<%=num%>件商品编号为<%=id%>的商品&nbsp;&nbsp;&nbsp;&nbsp;
<br>
<br>
<br>
</center>

6、failure.jsp的关键的代码如下

1
2
3
4
5
6
7
8
9
<center>
<img src="images/add_cart_failure.jpg"/>
<hr>
<br>
<br>![add_cart_failure](C:\Users\Administrator\Desktop\images\add_cart_failure.jpg)
<br>
</center>

7、index.jsp的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ page import="entity.Items"%>
<%@ page import="dao.ItemsDAO"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style type="text/css">
hr{
border-color:FF7F00;
}
div{
float:left;
margin: 10px;
}
div dd{
margin:0px;
font-size:10pt;
}
div dd.dd_name
{
color:blue;
}
div dd.dd_city
{
color:#000;
}
</style>
</head>
<body>
<h1>商品展示</h1>
<hr>
<center>
<table width="750" height="60" cellpadding="0" cellspacing="0" border="0">
<tr>
<td>
<!-- 商品循环开始 -->
<%
ItemsDAO itemsDao = new ItemsDAO();
ArrayList<Items> list = itemsDao.getAllItems();
if(list!=null&&list.size()>0)
{
for(int i=0;i<list.size();i++)
{
Items item = list.get(i);
%>
<div>
<dl>
<dt>
<a href="details.jsp?id=<%=item.getId()%>"><img src="image/<%=item.getPicture()%>" width="120" height="90" border="1"/></a>
</dt>
<dd class="dd_name"><%=item.getName() %></dd>
<dd class="dd_city">产地:<%=item.getCity() %>&nbsp;&nbsp;价格:¥ <%=item.getPrice() %></dd>
</dl>
</div>
<!-- 商品循环结束 -->
<%
}
}
%>
</td>
</tr>
</table>
</center>
</body>
</html>

在上面使用到的图片大概就是下面这些。

001

002

003

006

add_cart_success

buy_now

go_shopping

in_cart

view_cart