javaEE开发案例——购物车
一、页面
流程:登录页面(login.jsp)——>购物大厅页面(hall.jsp)——>购物车页面(showMyCart.jsp)——>订单页面(myorder.jsp)——>订单确认页面(orderOK.jsp)
二、页面+控制
加上控制逻辑之后:
登录页面(login.jsp)—>登录控制页面(GoHallUIServlet)—>购物大厅页面(hall.jsp)—>购物控制页面(ShoppingClServlet)—>购物车页面(showMyCart.jsp)—>订单控制页面(GoMyOrderServlet)—>订单页面(myorder.jsp)—>(订单提交处理SubmitOrderServlet)—>订单确认页面(orderOK.jsp)
三、页面+控制+DAO
后台数据库,对应四张表:分别是
用户表uses:(user_id,user_name,user_pwd,user_email,user_tel,user_grade)
书籍表books:(book_id,book_name,book_price,book_publisher,book_num<库存>)
订单分为订单表和订单细节表:
orders(order_id,user_id,order_total<定价总价>,order_time(下订单时间))
orderdetails(order_id,book_id,book_num)
对应上述实体表,有对应的Bean,以及各自的service类
package com.bobo.domain; import java.io.Serializable; public class BookBean implements Serializable{
private int book_id;
private String book_name;
private int book_price;
private String book_publisher;
private int book_num;//库存量
private int shoping_num=;//购买量 public int getShoping_num() {
return shoping_num;
}
public void setShoping_num(int shoping_num) {
this.shoping_num = shoping_num;
}
@Override
public String toString() {
return "Book [book_id=" + book_id + ", book_name=" + book_name
+ ", book_price=" + book_price + ", book_publisher="
+ book_publisher + ", book_num=" + book_num + "]";
}
public BookBean(){ } public BookBean(int book_id, String book_name, int book_price,
String book_publisher, int book_num) {
super();
this.book_id = book_id;
this.book_name = book_name;
this.book_price = book_price;
this.book_publisher = book_publisher;
this.book_num = book_num;
} public int getBook_id() {
return book_id;
}
public void setBook_id(int book_id) {
this.book_id = book_id;
}
public String getBook_name() {
return book_name;
}
public void setBook_name(String book_name) {
this.book_name = book_name;
}
public int getBook_price() {
return book_price;
}
public void setBook_price(int book_price) {
this.book_price = book_price;
}
public String getBook_publisher() {
return book_publisher;
}
public void setBook_publisher(String book_publisher) {
this.book_publisher = book_publisher;
}
public int getBook_num() {
return book_num;
}
public void setBook_num(int book_num) {
this.book_num = book_num;
} }
BookBean
package com.bobo.domain; import java.io.Serializable; public class UserBean implements Serializable{
private int user_id;
private String user_name;
private String user_pwd; public UserBean(){ }
public UserBean(String user_name, String user_pwd) {
super();
this.user_name = user_name;
this.user_pwd = user_pwd;
}
private String user_tel;
private String user_email;
private int user_grade;
@Override
public String toString() {
return "User [user_id=" + user_id + ", user_name=" + user_name
+ ", user_pwd=" + user_pwd + ", user_tel=" + user_tel
+ ", user_email=" + user_email + ", user_grade=" + user_grade
+ "]";
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public String getUser_pwd() {
return user_pwd;
}
public void setUser_pwd(String user_pwd) {
this.user_pwd = user_pwd;
}
public String getUser_tel() {
return user_tel;
}
public void setUser_tel(String user_tel) {
this.user_tel = user_tel;
}
public String getUser_email() {
return user_email;
}
public void setUser_email(String user_email) {
this.user_email = user_email;
}
public int getUser_grade() {
return user_grade;
}
public void setUser_grade(int user_grade) {
this.user_grade = user_grade;
} }
UserBean
package com.bobo.service; import com.bobo.domain.BookBean;
import com.bobo.utils.SqlHelper; import java.util.ArrayList; public class BookService {
/**
* 根据id返回对应的书籍
* @param id 书籍id
* @return
*/
public BookBean getBookById(int id) {
String sqltext = "select * from books where book_id=?";
String[] params = { id + "" };
try {
ArrayList<Object[]> sqlResult = SqlHelper.ExecuteReader(sqltext,
params);
if (sqlResult.size() == ) {
Object[] currentRow = sqlResult.get();
BookBean book = new BookBean(Integer.parseInt(currentRow[]
+ ""), currentRow[] + "",
Integer.parseInt(currentRow[] + ""), currentRow[]
+ "", Integer.parseInt(currentRow[] + ""));
return book; }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
return null; } public ArrayList<BookBean> getAllBooks() {
ArrayList<BookBean> books = new ArrayList<BookBean>();
String sqlText = "select * from books";
try {
ArrayList<Object[]> sqlResult = SqlHelper.ExecuteReader(sqlText,
null);
Object[] currentRow = null;
for (int i = ; i < sqlResult.size(); i++) {
currentRow = sqlResult.get(i); BookBean book = new BookBean(Integer.parseInt(currentRow[]
+ ""), currentRow[] + "",
Integer.parseInt(currentRow[] + ""), currentRow[]
+ "", Integer.parseInt(currentRow[] + ""));
books.add(book); }
return books;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} } }
BookService
package com.bobo.service; import java.util.ArrayList; import com.bobo.domain.UserBean;
import com.bobo.utils.SqlHelper; //处理和user表相关的业务逻辑
public class UserService {
/**
* 检查该用户是否存在,如果存在,返回true,否则返回false
* @param user 传入的用户对象,同时也通过参数传递,返回用户的其他相关信息
* @return
*/
public boolean checkUser(UserBean user){
String sqlText="select * from users where user_name=? and user_pwd=?";
String[] params={user.getUser_name(),user.getUser_pwd()};
ArrayList<Object[]> result;
try {
result = SqlHelper.ExecuteReader(sqlText, params);
if(result==null || result.size()==){
return false; }else{
//通过参数来进行传递
Object[] temp=result.get();
user.setUser_id(Integer.parseInt(temp[]+""));
user.setUser_name(temp[]+"");
user.setUser_pwd(temp[]+"");
user.setUser_email(temp[]+"");
user.setUser_tel(temp[]+"");
user.setUser_grade(Integer.parseInt(temp[]+""));
return true; }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} }
}
UserService
package com.bobo.service;
import com.bobo.utils.DateHelper;
import com.bobo.utils.SqlHelper;
import com.bobo.domain.BookBean;
import com.bobo.domain.UserBean; public class OrderService {
private DateHelper dateHelper=new DateHelper(); /*
* 处理提价订单的业务逻辑
*/
public void submitOrder(ShopingCart myCart,UserBean user){
String dateTime=dateHelper.getCurrentTime();
String sqlText="insert into orders (user_id,order_total,order_time) values(?,?,?)";
String[] params={user.getUser_id()+"",myCart.getTotalPrice()+"",dateTime};
try {
int key=SqlHelper.ExecuteInsertReturnKey(sqlText, params);
System.out.println("插入记录的key值是"+key);
for(int i=;i<myCart.getCartBooks().size();i++){
BookBean book=myCart.getCartBooks().get(i);
sqlText="insert into orderDetails (order_id,book_id,shopping_num,order_price) values (?,?,?,?)";
int price=book.getBook_price()*book.getShoping_num();
String[] pars={key+"",book.getBook_id()+"",book.getShoping_num()+"", price+""};
//这种每一次插入都需要连接打开和关闭,显然是不太好的
SqlHelper.ExecuteNonQuery(sqlText, pars);
}
} catch (Exception e) { e.printStackTrace();
}
} }
orderService
除了上述实体表对应的bean和Service之外,还有一个内存中的实体对象:购物车;数据库中并没有购物车这张表,而是利用内存中的一个hashmap来实现
package com.bobo.service;
import com.bobo.domain.*; import java.util.ArrayList;
import java.util.HashMap; //代表我的购物车
//在本案例中,购物车对应内存中的hashmap,而非一张实际表 public class ShopingCart {
HashMap<Integer,BookBean> cart=new HashMap<Integer,BookBean>(); public void addBook(Integer id){ if(cart.containsKey(id)){
BookBean book=cart.get(id);
int num=book.getShoping_num();
book.setShoping_num(num+);
cart.put(id, book);
}else{
BookBean book=new BookService().getBookById(id);
cart.put(id, book);
} }
/*//添加书
public void addBook(Integer id,BookBean book){
if(cart.containsKey(id)){
int num=book.getShoping_num();
book.setShoping_num(num+1);
cart.put(id, book);
}else{
cart.put(id, book); }
}*/
@Override
public String toString() {
String result="";
for(int i=;i<cart.size();i++){
result+="book"+i+":"+cart.get(i).toString()+";";
}
return result;
}
//删除书
public void delBook(Integer id ){
int temp=cart.get(id).getShoping_num();
if(temp<=){
cart.remove(id);
}else{
cart.get(id).setShoping_num(temp-);
} }
//清空书
public void clearCart(){
cart.clear();
}
//更新某本书的数量
public void updateBook(int book_id,int book_num){
BookBean book=cart.get(book_id);
book.setShoping_num(book_num); }
//得到购物车中的所有书
public ArrayList<BookBean> getCartBooks(){
ArrayList<BookBean> result=new ArrayList<BookBean>();
for(Integer id:cart.keySet()){
result.add(cart.get(id));
}
return result;
} //获取购物车中物品的总价
public int getTotalPrice(){
int result=;
for(int id :cart.keySet()){
result+=cart.get(id).getBook_price()*cart.get(id).getShoping_num(); }
return result;
} }
ShopingCart
四、顺着页面流和处理逻辑,来看一下整个工程吧
r
整个工程的结构如上图所示,其中所有的jsp文件都放置在WEB-INF目录下,放置暴露给用户,仅在根目录下放置一个index.jsp作为入口,其核心是依旧jsp:forward语句,
1)具体如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE >
<html lang="zh-hans">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="lib/bootstrap/css/animate.min.css">
<link rel="stylesheet" href="css/login.css">
<title>用户登录页面</title>
</head> <body>
<jsp:forward page="/WEB-INF/login.jsp"></jsp:forward>
</body>
</html>
index.jsp
2)上述forward语句,将工程转到登录页面login.jsp内容如下
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE >
<html lang="zh-hans">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="mylib/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="css/login.css">
<title>用户登录页面</title>
</head> <body> <div class="login_div">
<h1 class="text-center">用户登录</h1>
<form class="form-horizontal" role="form" method="post" action="/Myshoping/GoHallUI">
<div class="form-group">
<label for="firstname" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="username"
placeholder="请输入用户名">
</div>
</div>
<div class="form-group">
<label for="lastname" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="password"
placeholder="请输入密码">
</div>
</div>
<div class="form-group">
<div class="row">
<div class="col-sm-offset-1 col-sm-5">
<button type="submit" class="btn btn-default" id="btn_button">登录</button>
</div>
<div class="col-sm-offset-1 col-sm-5">
<button type="submit" class="btn btn-default" id="btn_button">登录</button>
</div>
</div>
</div>
</form>
</div> </body>
</html>
login.jsp
login.jsp呈现登录表单,要求用户输入用户名和密码
3)用户如果合法,下一步将跳转到购物大厅页面(hall.jsp),其中,对用户身份的验证将由GoHallUIServlet来完成
package com.bobo.controller; import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.bobo.domain.BookBean;
import com.bobo.domain.UserBean;
import com.bobo.service.BookService;
import com.bobo.service.ShopingCart;
import com.bobo.service.UserService; public class GoHallUI extends HttpServlet { /**
* 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 {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
//判断用户是否已经登录(用户可能登录后,从其他页面进入购物大厅)
if(request.getSession().getAttribute("loginUser")!=null){
//说明用户已经登录过了,此时就不用为用户新建购物车了
System.out.println("说明用户已经登录过了,此时就不用为用户新建购物车了");
BookService bookService=new BookService();
ArrayList<BookBean> bookList=bookService.getAllBooks();
request.setAttribute("books",bookList );
request.getRequestDispatcher("/WEB-INF/hall.jsp").forward(request, response);
return;
}
//获得从登陆页面传递的用户名和密码
String user_name=request.getParameter("username");
String user_pwd=request.getParameter("password");
UserBean login_user=new UserBean(user_name,user_pwd);
//第一次成功登陆后,将用户放置到session中
request.getSession().setAttribute("loginUser", login_user);
UserService userService=new UserService();
if(userService.checkUser(login_user)){
//如果用户合法,那么跳转到购物大厅
//用户登录成功后,为其创建购物车
System.out.println("用户首次合法登录");
ShopingCart cart=new ShopingCart();
request.getSession().setAttribute("cart", cart);
//同时为购物大厅准备好书籍数据(之所以这么设计,是为了保证如果用户不经过登录直接跳转到购物大厅,是看不到任何数据的)
BookService bookService=new BookService();
ArrayList<BookBean> bookList=bookService.getAllBooks();
request.setAttribute("books",bookList );
request.getRequestDispatcher("/WEB-INF/hall.jsp").forward(request, response);
}else{
//如果不合法,返回登陆页面
System.out.println("用户非法登录");
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(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 {
doGet(request,response);
} }
GoHallUIServlet
GoHallUIServlet主要完成以下工作:
a.如果是由登录页面跳转来的,验证用户的身份合法性(如果合法,那么将用户信息放置到session中,同时为用户创建一个购物车,将其也放置到session中)
b.如果是有其他页面想要跳转至购物大厅,那么检验session中是否有此用户信息
c.准备购物大厅要呈现的书籍数据
4)购物大厅页面,向用户呈现书籍信息,并提供购买入口
<%@ page language="java"
import="java.util.*,java.util.ArrayList,com.bobo.domain.BookBean "
pageEncoding="utf-8"%> <!DOCTYPE >
<html lang="zh-hans">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="mylib/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="css/hall.css">
<title>购物大厅</title>
</head> <body>
<div class="container">
<h1 class="text-center">欢迎进入购物大厅</h1>
<table>
<%
ArrayList<BookBean> books = (ArrayList<BookBean>) request
.getAttribute("books");
%>
<tr>
<td>书名</td>
<td>价格</td>
<td>出版社</td>
<td>点击购买</td>
</tr>
<%
for (int i = ; i < books.size(); i++) { %>
<tr>
<td><%=books.get(i).getBook_name()%></td>
<td><%=books.get(i).getBook_price()%></td>
<td><%=books.get(i).getBook_publisher()%></td>
<td><a href="/Myshoping/ShoppingClServlet?type=add&id=<%=books.get(i).getBook_id()%>">购买</a></td>
</tr>
<%
}
%>
</table>
<div>
<button type="button" id="showCart">查看购物车</button>
<a href="/Myshoping/index.jsp">返回重新登录</a>
</div>
</div> </body>
</html>
hall.jsp
5)用户的购买行为记录在购物车中(这不是一个数据库中的对象,用一个内存中hashmap来表示);用户在hall.jsp页面的购买请求,经过ShopingClServlet处理之后,在跳转至购物车页面(用户操作购物车的行为可能有多种,因此使用额外的参数type来记录究竟是哪一种行为)
package com.bobo.controller; 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 com.bobo.service.BookService;
import com.bobo.service.ShopingCart; //该控制器用于响应用户购买商品的请求
public class ShoppingClServlet extends HttpServlet { /**
* 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");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
ShopingCart cart = (ShopingCart) request.getSession().getAttribute(
"cart");
String type = request.getParameter("type");
if (type.equals("add")) {
// 从购物大厅页面接受用户的购买请求,准备数据,跳转到购物车页面
int book_id = Integer.parseInt(request.getParameter("id"));
cart.addBook(book_id); } else if (type.equals("delete")) {
// 从购物车页面接受用户的删除请求,准备数据,再跳转到购物车页面,但是怎么判断是从哪个页面跳转来的呢
int del_id = Integer.parseInt(request.getParameter("del_id"));
System.out.println(del_id);
cart.delBook(del_id);
}else if(type.equals("update")){
//如果是数量的更新操作,注意每一行都有一个id和对应的数量,因此获得的是一个数组
String[] book_ids=request.getParameterValues("id");
String[] book_nums=request.getParameterValues("book_num"); //去购物车业务类中进行更新
for(int i=;i<book_ids.length;i++){
cart.updateBook(Integer.parseInt(book_ids[i]), Integer.parseInt(book_nums[i]));
} }
request.setAttribute("totalPrice", cart.getTotalPrice());
request.setAttribute("cartBooks", cart.getCartBooks());
System.out.println(cart.getCartBooks());
request.getRequestDispatcher("/WEB-INF/showMyCart.jsp").forward(
request, response); } }
shopingClServlet
该页面的处理用户对于购物车的各种行为,包括购买,删除和数量更新,处理之后,跳转好购物车页面showMyCart.jsp
6)在showMyCart.jsp中,用户可以对购物车中的书籍进行删除和数量更新,这些请求,也将由shopingClServlet来处理
<%@ page language="java" import="java.util.*,com.bobo.domain.BookBean"
pageEncoding="utf-8"%> <!DOCTYPE >
<html lang="zh-hans">
<head>
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="mylib/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="css/showMyCart.css">
<title>我的购物车</title>
</head> <body>
<div class="container">
<h1 class="text-center">我的购物车</h1>
<form action="ShoppingClServlet?type=update" method="post">
<table>
<tr>
<td>book_id</td>
<td>书名</td>
<td>价格</td>
<td>出版社</td>
<td>数量</td>
<td>删除</td>
</tr>
<%
ArrayList<BookBean> list = (ArrayList<BookBean>) request
.getAttribute("cartBooks");
for(int i=;i<list.size();i++){
BookBean book=list.get(i);
%>
<tr>
<!-- 使用隐藏的表单来传递内容 -->
<td><%=book.getBook_id() %><input type="hidden" value=<%=book.getBook_id() %> name="id"></td>
<td><%=book.getBook_name() %></td>
<td><%=book.getBook_price()%></td>
<td><%=book.getBook_publisher()%></td>
<td><input type="text" name="book_num" value=<%=book.getShoping_num() %>></input></td>
<td><a href="/Myshoping/ShoppingClServlet?type=delete&del_id=<%=book.getBook_id()%>">删除</a></td>
</tr>
<%} %>
<tr>
<td colspan=""><input type="submit" value="update"/></td>
</tr>
</table>
</form>
<div>
<p>商品总价是: ${totalPrice} 元</p>
</div>
<p>
<a href="/Myshoping/GoMyOrder">提交订单</a>
<a href="/Myshoping/GoHallUI">返回购物大厅</a>
</p>
</form>
</div> </body>
</html>
showMyCart.jsp
7)最终,如果用户确定购买,点击购物车页面“确认订单”页面后,将由GoMyOrderServlet将订单信息记录到数据库中,然后跳转至订单成功页面
package com.bobo.controller; import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.bobo.domain.BookBean;
import com.bobo.domain.UserBean;
import com.bobo.service.ShopingCart;
//处理用户查看订单的请求
public class GoMyOrder extends HttpServlet { /**
* 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 {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html");
PrintWriter out = response.getWriter();
//为订单查看页面准备用户信息,和订单信息
ShopingCart cart=(ShopingCart) request.getSession().getAttribute("cart");
ArrayList<BookBean> books=cart.getCartBooks();
request.setAttribute("books", books);
int total_price=cart.getTotalPrice();
request.setAttribute("total_price", total_price);
UserBean user=(UserBean)request.getSession().getAttribute("loginUser");
request.setAttribute("loginUser", user);
request.getRequestDispatcher("/WEB-INF/myOrder.jsp").forward(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 { doGet(request,response);
} }
GoMyOrderServlet
订单的插入操作涉及两张表,订单表和订单详情表,其中要注意,在向订单表中插入一条新订单,数据库自动生成一条订单id后,在向订单详情表中插入详情后,这里的订单id一定要是上面生成的id,因此要注意数据库操作的事务性。
8)最终的订单ok页面(邮件的发送暂时没有做)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head> <title>订单已提交</title> <meta charset="utf-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
--> </head> <body>
<h2>订单已经提交,邮件已发送至您的注册邮箱,请至邮箱确认!</h2>
</body>
</html>
OrderOK.jsp
其他:此外,该项目中,自己实现了两个listener
1)ServletContextEvent
在本例中的功能是每隔一段时间打印一段日志,在实际项目中,可以用于应用启动的时候获取数据库的参数,以及定时备份等
package com.bobo.listener; import javax.servlet.ServletContextEvent;
import java.util.Timer;
import java.util.TimerTask; import javax.servlet.ServletContextListener;
/*
* 这个类用于监听整个web应用的启动和销毁,可以用于执行某些定时程序,获得数据库的连接等,有点类似于on-start:1的servlet
* */ public class ContextListener implements ServletContextListener {
private Timer timer;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
timer.cancel(); } @Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub timer=new Timer();
timer.schedule(new TimerTask(){ @Override
public void run() {
System.out.println("定时器正常工作"); } }, *);
} }
ServletContextEvent
1)ServletContextEvent
在本例中的功能是每隔一段时间打印一段日志,在实际项目中,可以用于应用启动的时候获取数据库的参数,以及定时
javaEE开发案例——购物车的更多相关文章
- 百度UEditor开发案例(JSP)
本案例的开发环境:MyEclipse+tomcat+jdk 本案例的开发内容: 用百度编辑器发布新闻(UEditor的初始化开发部署) 编辑已发过的新闻(UEditor的应用——编辑旧文章) ...
- 《实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)》
<实战突击:PHP项目开发案例整合(第2版)(含DVD光盘1张)> 基本信息 作者: 徐康明 辛洪郁 出版社:电子工业出版社 ISBN:9787121221378 上架时间:2014 ...
- Linux服务器oraclejdk与openjdk共存并配置JavaEE开发环境
由于本人学业的需要,需要在linux中搭建JavaEE开发环境,与windows的同学协同开发. JDK 由于fedora默认使用openjdk,移除多多少少会出现点问题,由于很多开源软件默认使用到它 ...
- JavaEE开发环境搭建(2)---(MySQL的安装)
上次写了JavaEE开发环境搭建之jdk的安装...然后自己看的时候感觉有时候加载图片不是很流畅,所以这次就少添加点图片了~~ JavaEE开发环境搭建之MySQL的安装 1:mysql 的下载 在百 ...
- JavaEE开发环境搭建(1)---(jdk的安装)
----------我是前言---------- 有时候从网上找资料真的是一件很开(dan)心(teng)的事情, 因为很多你想要了解的东西总是很巧妙的被略去了... 或者... 根本没有... 真是 ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享
http://www.cnblogs.com/huyong/p/3454012.html 使用Jquery+EasyUI 进行框架项目开发案例讲解之五 模块(菜单)管理源码分享 在上四篇文章 ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之四 组织机构管理源码分享
http://www.cnblogs.com/huyong/p/3404647.html 在上三篇文章 <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之三---角色管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之三 角色管理源码分享 在上两篇文章 <使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享> ...
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之二 用户管理源码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>我们分享 ...
随机推荐
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- CSS3动画(动画已丢,看原文)
原文:http://ued.1905.com:8880/sample/css3/base/test.html CSS3动画 简要展示了CSS3常用动画效果,以及所使用代码. bounce 复制 展开代 ...
- Angualar:指令大全
指令: 内置渲染指令 内置事件指令 内置节点指令 自定义指令 restrict template replace属性 templateUrl属性 trnsclude priorty terminal属 ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...
- [ZZ] D3D中的模板缓存(3)
http://www.cppblog.com/lovedday/archive/2008/03/25/45334.html http://www.cppblog.com/lovedday/ D3D中的 ...
- 那么都数据库表,那么多不同记录。是怎样都存储在一个key-value数据库的?
那么都数据库表,那么多不同记录.是怎样都存储在一个key-value数据库的? :设置不同的键值而已!不同的表,选出统一的key规范 jedis.sadd("tom:friend:list& ...
- PHP函数补完:stream_context_create()模拟POST/GET
PHP函数补完:stream_context_create()模拟POST/GET PHP流的创建 在 2011年01月08日 那天写的 已经有 9408 次阅读了 感谢 参考或原文 服务 ...
- 页面静态化1 --- 概念(Apache内置压力测试工具使用方法)
三个概念 ①静态网址: http://127.0.0.1/regis.html ②动态网址:在请求页面时可以动态的传一些值进去. http://127.0.0.1/regis.php?id=45&am ...
- 理解OAuth 2.0[摘]
原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到 ...
- 将ntfs分区转换为ext4分区
转自 http://blog.csdn.net/nianhongmin/article/details/27818195 将ntfs分区转换为ext4分区 分类: Linux 2014-05-31 1 ...