บทความนี้เป็นงานวิจัยเกี่ยวกับโมดูลคำสั่งซื้อในร้านหนังสือ Javaweb
1. สร้างคลาสที่เกี่ยวข้อง
โดเมน:
คำสั่ง
คำสั่งซื้อ
dao: orderdao
บริการ: OrderService
web.servlete: orderServlet
/** * คลาสรายการคำสั่งซื้อ */คลาสสาธารณะ orderitem {สตริงส่วนตัว iid; การนับจำนวน int ส่วนตัว; // ปริมาณรวมสองเท่าของผลรวมสองรายการ; // คำสั่งซื้อรวมผลรวมย่อย; // สั่งซื้อหนังสือส่วนตัว; // หนังสือที่จะซื้อ} /** * คลาสสั่งซื้อ */คำสั่งซื้อระดับสาธารณะ {สตริงส่วนตัว oid; เวลาสั่งซื้อวันที่ส่วนตัว; // เวลาการสั่งซื้อรวมสองเท่าส่วนตัว; // สถานะ int รวมทั้งหมด; // มีสี่ประเภทของสถานะการสั่งซื้อ: 1 ไม่ชำระ 2 ไม่ชำระ แต่ไม่ได้จัดส่ง 3 ไม่ได้จัดส่ง แต่ไม่ได้รับการยืนยันใบเสร็จรับเงิน 4 การทำธุรกรรมที่ได้รับการยืนยันว่าเป็นเจ้าของส่วนตัว; // ที่อยู่สตริงส่วนตัว Public Class OrderDao {Private QueryRunner QR = ใหม่ txQueryRunner (); / *** เพิ่มคำสั่งซื้อ* @param คำสั่ง*/ โมฆะสาธารณะ addorder (คำสั่งซื้อ) {ลอง {string sql = "แทรกลงในค่าคำสั่งซื้อ (?,?,?,?,?,?)"; / * * การประทับเวลาสำหรับการประมวลผลการแปลงวันที่ UTIL เป็น SQL */ timestamp timestamp = timestamp ใหม่ (order.getOrderTime (). getTime ()); Object [] params = {order.getoid (), timestamp, order.getTotal (), order.getState (), order.getOwner (). getUid (), order.getAddress ()}; qr.update (sql, params); } catch (sqlexception e) {โยน runtimeException ใหม่ (e); }} /*** แทรกรายการคำสั่งซื้อ* @Param orderItemList* /โมฆะสาธารณะ addOrderItemList (รายการ <SordItem> orderItemList) { /*** batch (สตริง SQL, Object [] [] ของคลาส QueryRunner Params)* * แต่ละอาร์เรย์หนึ่งมิติจะถูกดำเนินการหนึ่งครั้งด้วย SQL และอาร์เรย์หนึ่งมิติหลายตัวจะถูกดำเนินการหลายครั้ง*/ ลอง {String SQL = "แทรกลงในค่าคำสั่งซื้อ (?,?,?,?,?)"; /** แปลง OrderItemList เป็นอาร์เรย์สองมิติ* แปลงวัตถุ OrderItem เป็นอาร์เรย์หนึ่งมิติ*/ วัตถุ [] [] params = วัตถุใหม่ [orderItemList.Size ()] []; // วนซ้ำผ่านรายการสั่งซื้อและใช้แต่ละวัตถุ OrderItem เพื่อกำหนดค่าให้กับอาร์เรย์หนึ่งมิติแต่ละตัวใน params สำหรับ (int i = 0; i <orderItemList.size (); i ++) {orderItem item = orderItemList.get.get (i); params [i] = วัตถุใหม่ [] {item.getiid (), item.getCount (), item.getSubtotal (), item.getOrder (). getoid (), item.getBook (). getBid ()}; } qr.batch (sql, params); // ดำเนินการประมวลผลแบตช์} catch (sqlexception e) {โยน runtimeException ใหม่ (e); }} / ** * query order โดย uid * @param uid * @return * / รายการสาธารณะ <order> findByUid (สตริง uid) { / * * 1. การค้นหารายการทั้งหมด <ord> ของผู้ใช้ปัจจุบันผ่าน uid * 2. วนผ่านแต่ละคำสั่งซื้อ รายการ <order> orderlist = qr.Query (SQL, ใหม่ Beanlisthandler <order> (order.class), uid); / * * 2. วนซ้ำผ่านคำสั่งซื้อแต่ละรายการและโหลดรายการคำสั่งซื้อทั้งหมดของตัวเองสำหรับมัน */สำหรับ (คำสั่งซื้อ: orderlist) {loadOrderItems (คำสั่งซื้อ); // เพิ่มรายการคำสั่งซื้อทั้งหมดสำหรับวัตถุสั่งซื้อ}/ * 3 รายการคำสั่งซื้อคืน */return orderList; } catch (sqlexception e) {โยน runtimeException ใหม่ (e); }} / ** * โหลดรายการคำสั่งซื้อทั้งหมดสำหรับคำสั่งซื้อที่ระบุ * @param order * @throws sqlexception * / โมฆะส่วนตัว loadorderitems (คำสั่งซื้อ) พ่น sqlexception { / * * คำถามสองตาราง: orderem, หนังสือ * / string sql = "เลือก * จาก orderem i, book b / * * เนื่องจากชุดผลลัพธ์ของแถวไม่ได้เป็น javabean อีกต่อไปคุณไม่สามารถใช้ Beanlisthandler ได้อีกต่อไป แต่ Maplisthandler */ list <map <String, Object >> maplist = qr.Query (SQL, maplisthandler ใหม่ (), order.getoid (); / * * maplist เป็นหลายแผนที่แต่ละแผนที่สอดคล้องกับชุดผลลัพธ์ * หนึ่งบรรทัด: * {iid = c7ad5492f27d492189105fb50e55cbb6, นับ = 2, subtotal = 60.0, oid = 1ae8a70354c947f8b81b803 ไฮเบอร์เนตราคา = 30.0, ผู้แต่ง = จาง Weiqin, image = book_img/8991366-1_l.jpg, cid = 2} * ... * * เราต้องใช้แผนที่เพื่อสร้างวัตถุสองรายการและการใช้งาน ผลลัพธ์คือ orderItem) และบันทึก orderItem*/ list <orderItem> orderItemList = toOrderItemList (maplist); order.setOrderItemList (orderItemList); } / ** * แปลงแต่ละแผนที่ใน maplist เป็นสองวัตถุและสร้างความสัมพันธ์ * @param maplist * @return * / รายการส่วนตัว <SorderItem> TORORDITEMLIST (รายการ <แผนที่ <String, Object >> maplist) {รายการ <orderItem> orderItemList = ใหม่ สำหรับ (แผนที่ <สตริงวัตถุ> แผนที่: maplist) {orderItem item = toOrderItem (แผนที่); orderItemList.add (รายการ); } return orderItemList; } / ** * แปลงแผนที่เป็น OrderItem Object * @param Map * @return * / Private OrderItem toOrderItem (แผนที่ <String, Object> MAP) {orderItem orderItem = Commonutils.tobean (แผนที่, orderItem.class); หนังสือหนังสือ = Commonutils.tobean (แผนที่, book.class); orderItem.SetBook (หนังสือ); return orderitem; } / ** * โหลดลำดับ * @param oid * @return * / โหลดคำสั่งสาธารณะ (สตริง oid) {ลอง { / * * 1 รับคำสั่งซื้อทั้งหมดของผู้ใช้ปัจจุบัน * / string sql = "เลือก * จากคำสั่งซื้อที่ oid =?"; order order = qr.Query (SQL, ใหม่ beanHandler <order> (order.class), OID); /** 2. โหลดรายการทั้งหมดสำหรับการสั่งซื้อ*/ loadOrderItems (คำสั่งซื้อ); /** 3. รายการคำสั่งซื้อคืน*/ return order; } catch (sqlexception e) {โยน runtimeException ใหม่ (e); }} / ** * สถานะการสั่งซื้อแบบสอบถามผ่าน oid * @param oid * @return * / public int getStateByoid (สตริง oid) {ลอง {string sql = "เลือกสถานะจากคำสั่งซื้อที่ oid =?"; return (จำนวนเต็ม) QR.Query (SQL, ScalarHandler ใหม่ (), OID); } catch (sqlexception e) {โยน runtimeException ใหม่ (e); }} / ** * แก้ไขสถานะการสั่งซื้อ * @param oid * @param state * @return * / โมฆะสาธารณะ updateTate (สตริง oid, สถานะ int) {ลอง {string sql = "อัปเดตคำสั่งซื้อ state =? โดยที่ oid =?"; qr.update (SQL, state, OID); } catch (sqlexception e) {โยน runtimeException ใหม่ (e); - คำสั่งระดับสาธารณะ {private orderdao orderdao = new orderdao (); / *** วิธีการชำระเงิน* @param oid*/ โมฆะสาธารณะ zhifu (สตริง oid) {/** 1 รับสถานะของคำสั่งซื้อ** หากสถานะคือ 1 จากนั้นเรียกใช้รหัสต่อไปนี้** หากสถานะไม่ใช่ 1 ดังนั้นวิธีนี้จะไม่ทำอะไรเลย if (state == 1) {// แก้ไขสถานะการสั่งซื้อเป็น 2 orderdao.updatestate (OID, 2); }} / *** เพิ่มคำสั่ง* ที่ต้องการธุรกรรม* @param order* / โมฆะสาธารณะเพิ่ม (คำสั่งซื้อ) {ลอง {// เริ่มธุรกรรม jdbcutils.beginTransaction (); orderdao.addorder (คำสั่งซื้อ); // แทรก orderdao.addorderItemList (order.getOrderItemList ()); // แทรกรายการทั้งหมดในคำสั่ง // ส่งธุรกรรม jdbcutils.CommitTransaction (); } catch (exception e) {// การทำธุรกรรมย้อนกลับลอง {jdbcutils.rollbacktransaction (); } catch (sqlexception e1) {} โยน runtimeException ใหม่ (e); }} / ** * คำสั่งซื้อของฉัน * @param uid * @return * / รายการสาธารณะ <order> myorders (สตริง uid) {return orderdao.findbyuid (uid); } / ** * โหลดลำดับ * @param oid * @return * / โหลดคำสั่งสาธารณะ (สตริง oid) {return orderdao.load (oid); } /** * ยืนยันใบเสร็จรับเงิน * @param oid * @throws orderException * /โมฆะสาธารณะยืนยัน (สตริง oid) พ่น orderException { / * * 1. ตรวจสอบสถานะการสั่งซื้อ หากไม่ใช่ 3 ให้โยนข้อยกเว้น */int state = orderdao.getStateByoid (OID); // รับสถานะการสั่งซื้อถ้า (สถานะ! = 3) โยน orderException ใหม่ ("การยืนยันคำสั่งซื้อล้มเหลวคุณไม่ใช่สิ่งที่ดี!"); /** 2. แก้ไขสถานะการสั่งซื้อเป็น 4 ระบุว่าการทำธุรกรรมนั้นสำเร็จ*/ orderdao.updatestate (OID, 4); - คำสั่งซื้อระดับสาธารณะขยายฐาน baseservlet {คำสั่งเอกชนคำสั่งซื้อบริการ = คำสั่งใหม่ (); / ** * จ่ายเงินให้ธนาคาร * * @param Request * @param Response * @return * @throws Servletexception * @throws ioexception */ สตริงสาธารณะ zhifu (httpservletrequest Request, httpservletResponse) โยน servleTexception, iOException inputStream input = this.getClass (). getClassLoader () .getResourceasstream ("MerchantInfo.properties"); props.load (อินพุต); /** เตรียม 13 พารามิเตอร์*/ สตริง p0_cmd = "ซื้อ"; สตริง p1_merid = props.getProperty ("p1_merid"); String p2_order = request.getParameter ("OID"); สตริง p3_amt = "0.01"; สตริง p4_cur = "cny"; สตริง p5_pid = ""; สตริง p6_pcat = ""; สตริง p7_pdesc = ""; สตริง p8_url = props.getProperty ("p8_url"); สตริง p9_saf = ""; สตริง pa_mp = ""; String PD_FRPID = request.getParameter ("PD_FRPID"); String pr_needResponse = "1"; / * * คำนวณ hmac */ string keyValue = props.getProperty ("keyValue"); String HMAC = PaymentUtil.BuildHmac (P0_CMD, P1_Merid, P2_ORDER, P3_AMT, P4_CUR, P5_PID, P6_PCAT, P7_PDESC, P8_URL, P9_SAF, PA_MP, PD_FRPID /** เชื่อมต่อ URL ของ yibao และ 13+1 พารามิเตอร์*/ stringbuilder url = stringbuilder ใหม่ (props.getProperty ("url")); url.append ("p0_cmd =") ผนวก (p0_cmd); url.append ("& p1_merid =") ผนวก (p1_merid); url.append ("& p2_order =") ผนวก (p2_order); url.append ("& p3_amt =") ผนวก (p3_amt); url.append ("& p4_cur =") ผนวก (p4_cur); url.append ("& p5_pid =") ผนวก (p5_pid); url.append ("& p6_pcat =") ผนวก (p6_pcat); url.append ("& p7_pdesc =") ผนวก (p7_pdesc); url.append ("& p8_url =") ผนวก (p8_url); url.append ("& p9_saf =") ผนวก (p9_saf); url.append ("& pa_mp =") ผนวก (pa_mp); url.append ("& pd_frpid =") ผนวก (pd_frpid); url.append ("& pr_needResponse ="). ผนวก (pr_needResponse); url.append ("& hmac =") ผนวก (HMAC); System.out.println (URL); /** เปลี่ยนเส้นทางไปยัง yibao*/ response.sendredirect (url.toString ()); คืนค่า null; } /*** วิธีนี้เป็นวิธีการโทรกลับ Yibao เราต้องตรวจสอบว่า Yibao กำลังเรียกวิธีนี้หรือไม่! * * @param Request * @param Response * @return * @throws servletexception * @throws ioexception */ สตริงสาธารณะกลับ (คำขอ httpservletrequest, httpservletResponse การตอบสนอง) โยน servletexception, ioexception {/ * 1 String R0_CMD = request.getParameter ("R0_CMD"); String R1_Code = request.getParameter ("R1_Code"); String R2_trxid = request.getParameter ("r2_trxid"); String R3_AMT = request.getParameter ("R3_AMT"); String r4_cur = request.getParameter ("R4_Cur"); String R5_PID = request.getParameter ("R5_PID"); String r6_order = request.getParameter ("R6_Order"); String R7_UID = request.getParameter ("R7_UID"); String R8_MP = request.getParameter ("R8_MP"); String r9_btype = request.getParameter ("R9_BTYPE"); สตริง hmac = request.getParameter ("HMAC"); / * * 2. ตรวจสอบว่าผู้เข้าชมคือ Yibao! */ คุณสมบัติอุปกรณ์ประกอบฉาก = คุณสมบัติใหม่ (); inputStream input = this.getClass (). getClassLoader () .getResourceasstream ("MerchantInfo.properties"); props.load (อินพุต); สตริง keyValue = props.getProperty ("keyValue"); บูลีนบูล = Paymentutil.VerifyCallback (HMAC, P1_Merid, R0_CMD, R1_Code, R2_TRXID, R3_AMT, R4_CUR, R5_PID, R6_ORDER, R7_UID, R8_MP, R9_BTYPE if (! bool) {// ถ้าการตรวจสอบล้มเหลว request.setAttribute ("msg", "คุณไม่ใช่สิ่งที่ดี!"); return "f: /jsps/msg.jsp"; }/** 3. รับลำดับสถานะกำหนดว่าคุณต้องการแก้ไขสถานะการสั่งซื้อและเพิ่มคะแนนและการดำเนินธุรกิจอื่น ๆ*/orderservice.zhifu (r6_order); // เป็นไปได้ที่จะใช้งานฐานข้อมูลหรืออาจไม่ทำงาน! /** 4. กำหนดวิธีการโทรกลับปัจจุบัน* หากเป็นจุดต่อจุดคุณต้องตอบกลับสตริงที่เริ่มต้นด้วยความสำเร็จ*/ ถ้า (r9_btype.equals ("2")) {response.getWriter () พิมพ์ ("ประสบความสำเร็จ"); } / * * 5. บันทึกข้อมูลความสำเร็จและส่งต่อไปยัง msg.jsp * / request.setAttribute ("msg", "การชำระเงินสำเร็จ! รอให้ผู้ขายจัดส่ง! คุณรอ ~"); return "f: /jsps/msg.jsp"; } /** * ยืนยันใบเสร็จรับเงิน * * @param Request * @param Response * @return * @throws servletexception * @throws ioexception * /สตริงสาธารณะยืนยัน (httpservletrequest คำขอ httpservletResponse) การโทรหา servletexception msg.jsp 3. * บันทึกข้อมูลที่ประสบความสำเร็จและส่งต่อไปยัง msg.jsp */ string oid = request.getParameter ("OID"); ลอง {orderservice.confirm (OID); request.setAttribute ("msg", "ขอแสดงความยินดีการทำธุรกรรมประสบความสำเร็จ!"); } catch (orderException e) {request.setAttribute ("msg", e.getMessage ()); } return "f: /jsps/msg.jsp"; } /** * คำสั่งโหลด * * @param Request * @param Response * @return * @throws servletexception * @throws ioexception * /การโหลดสตริงสาธารณะ (httpservletrequest คำขอ httpservletResponse) การใช้ servletexception, ioexception { / * 1 ถึง /jsps/order/desc.jsp */request.setAttribute ("order", orderervice.load (request.getParameter ("OID")))); return "f: /jsps/order/desc.jsp"; } /** * คำสั่งซื้อของฉัน * * @param Request * @param Response * @return * @throws servletexception * @throws ioexception * /สตริงสาธารณะ myorders (httpservletrequest คำขอ httpservletresponse OrderService#Myorders (UID) เพื่อรับคำสั่งซื้อทั้งหมดของรายชื่อผู้ใช้ <Sordice> 3. * บันทึกรายการคำสั่งซื้อไปยังฟิลด์คำขอและส่งต่อไปยัง /jsps/order/list.jsp */ผู้ใช้ผู้ใช้ = (ผู้ใช้) request.getSession (). getAttribute ("session_user"); รายการ <order> orderlist = orderervice.myorders (user.getuid ()); request.setAttribute ("orderlist", orderlist); return "f: /jsps/order/list.jsp"; } /** * เพิ่มคำสั่งให้ใช้รถในเซสชันเพื่อสร้างวัตถุคำสั่งซื้อ * * @param Request * @param Response * @return * @throws servletexception * @throws ioexception * /สตริงสาธารณะเพิ่ม (httpsertrequest request. โทรหาวิธีการบริการเพื่อทำคำสั่งซื้อให้เสร็จสมบูรณ์ 4. * บันทึกคำสั่งซื้อไปยังฟิลด์คำขอและส่งต่อไปยัง /jsps/order/desc.jsp */// รับรถเข็นจาก Session Cart Cart = (CART) Request.getSession (). GetAttribute ("CART"); // แปลงรถเข็นเป็นวัตถุสั่งซื้อ/ * * สร้างวัตถุสั่งซื้อและตั้งค่าแอตทริบิวต์ * * รถเข็น -> คำสั่งซื้อ */ คำสั่งซื้อ = new order (); order.setoid (Commonutils.uuid ()); // ตั้งค่าลำดับหมายเลข SetEnderTime (วันที่ใหม่ ()); // set order.setState (1); // ตั้งค่าสถานะการสั่งซื้อเป็น 1 ระบุว่าการชำระเงินไม่ใช่ผู้ใช้ที่ชำระเงิน = (ผู้ใช้) คำขอ. getSession (). getAttribute ("session_user"); order.setOwner (ผู้ใช้); // ตั้งค่า Order Onerger order.settotal (cart.getTotal ()); // ตั้งค่ารวมคำสั่งซื้อและรับผลรวมจาก CART/ * * สร้างคอลเลกชันรายการคำสั่งซื้อ * * cartItemList -> orderItemList */ รายการ // วนผ่าน cartItems ทั้งหมดในรถเข็นใช้วัตถุ cartItem แต่ละรายการเพื่อสร้างวัตถุ OrderItem และเพิ่มลงในคอลเลกชันสำหรับ (cartItem cartItem: cart.getCartItems ()) {orderItem oi = new OrderItem (); // สร้างรายการคำสั่งซื้อ oi.setCount (cartItem.getCount ()); // ตั้งค่าจำนวนรายการ oi.setBook (cartItem.getBook ()); // ตั้งค่าหนังสือ oi.setsubtotal (cartItem.getSubtotal (); // ตั้งค่า subtotal ของรายการ // เพิ่มรายการคำสั่งซื้อทั้งหมดในการสั่งซื้อ order.setOrderItemList (orderItemList); // ล้างตะกร้ารถเข็นช็อปปิ้ง (); - - - - - request.setAttribute ("คำสั่งซื้อ", คำสั่งซื้อ); ส่งคืน "/jsps/order/desc.jsp"; -2. สร้างคำสั่งซื้อ
3. คำสั่งซื้อของฉัน (ตรวจสอบโดยผู้ใช้)
4. โหลดคำสั่งซื้อ (ตรวจสอบโดย ID)
5. ยืนยันใบเสร็จรับเงิน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น