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=1;//购买量

    

    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() == 1) { Object[] currentRow = sqlResult.get(0); BookBean book = new BookBean(Integer.parseInt(currentRow[0] + ""), currentRow[1] + "", Integer.parseInt(currentRow[2] + ""), currentRow[3] + "", Integer.parseInt(currentRow[4] + "")); 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 = 0; i < sqlResult.size(); i++) { currentRow = sqlResult.get(i); BookBean book = new BookBean(Integer.parseInt(currentRow[0] + ""), currentRow[1] + "", Integer.parseInt(currentRow[2] + ""), currentRow[3] + "", Integer.parseInt(currentRow[4] + "")); 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()==0){ return false; }else{ //通过参数来进行传递

                Object[] temp=result.get(0); user.setUser_id(Integer.parseInt(temp[0]+"")); user.setUser_name(temp[1]+""); user.setUser_pwd(temp[2]+""); user.setUser_email(temp[3]+""); user.setUser_tel(temp[4]+""); user.setUser_grade(Integer.parseInt(temp[5]+"")); 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=0;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+1); 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=0;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<=1){ cart.remove(id); }else{ cart.get(id).setShoping_num(temp-1); } } //清空书

        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=0; for(int id :cart.keySet()){ result+=cart.get(id).getBook_price()*cart.get(id).getShoping_num(); } return result; } }
ShopingCart

四、顺着页面流和处理逻辑,来看一下整个工程吧

javaEE开发案例——购物车   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 = 0; 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=0;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=0;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="6"><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("定时器正常工作");

                    

                }

                

            }, 3*60);

    }



}
ServletContextEvent

 

 

1)ServletContextEvent

在本例中的功能是每隔一段时间打印一段日志,在实际项目中,可以用于应用启动的时候获取数据库的参数,以及定时

 

 

 

 

你可能感兴趣的:(javaee)