1. การเพิ่มปัญหา
ใน struts2 หากมีการใช้งานอินเทอร์เฟซ ModelDriven <Model> พารามิเตอร์ที่ผ่านสามารถถูกฉีดเข้าไปในโมเดลและสามารถใช้โมเดลในการกระทำได้ แต่ฉันควรทำอย่างไรถ้ามีสองรุ่นที่ต้องใช้ในการกระทำเดียวกัน? ตัวอย่างเช่นในส่วนก่อนหน้านี้เราเสร็จสิ้นฟังก์ชั่นการชำระเงินออนไลน์ แต่การชำระเงินยังไม่สิ้นสุด เราจำเป็นต้องได้รับข้อมูลตอบรับจากบุคคลที่สาม ตัวอย่างเช่นหลังจากการชำระเงินที่สำเร็จเราต้องส่งอีเมลและข้อความไปยังผู้ชำระเงิน ดังนั้นเราจึงต้องได้รับพารามิเตอร์ที่ส่งผ่านจากบุคคลที่สามในการจ่ายเงิน เนื่องจากพารามิเตอร์ที่ส่งผ่านจากบุคคลที่สามนั้นแตกต่างจากที่ผ่านโดยเราเราจึงต้องเขียนโมเดล (backdata) เพื่อรับพารามิเตอร์เหล่านั้น ดังนั้นปัญหาคือการจ่ายเงินของเราได้ถูกเขียนดังนี้: การจ่ายเงินระดับสาธารณะขยาย baseaction <enddata> นั่นคืออินเตอร์เฟส ModelDriven <endData> ได้ถูกนำไปใช้ใน baseaction ดังนั้นเราจะได้รับรูปแบบอื่นในการกระทำและต้องจัดการกับพวกเขาแตกต่างกันอย่างไร
มีวิธีแก้ปัญหา (ที่จริงแล้วมันไม่สามารถเรียกได้ว่าเป็นวิธีแก้ปัญหา ... เพราะมันไม่ได้รับการแก้ไขเลย ... ) ซึ่งก็คือการเขียนแบบจำลองแล้วปล่อยให้ Senddata และ backdata สืบทอดมัน แต่ปัญหาคือโมเดลทั้งสองนี้ไม่มีอะไรทำเลยทำไมคุณต้องสืบทอดรุ่นเดียวกัน ดังนั้นการแก้ปัญหานี้จริง ๆ แล้วหนีปัญหาข้างต้น
ปัญหานี้ได้รับการแก้ไขอย่างดีใน SpringMVC (SpringMVC ไม่ได้เริ่มเรียนรู้จริง ๆ ถ้าคุณพูดอะไรผิดพลาดโปรดแก้ไข!) เพราะแต่ละวิธีใน SpringMVC สอดคล้องกับโมเดลแทนที่จะเป็นแต่ละการกระทำที่สอดคล้องกับโมเดลซึ่งสะดวก ฉันสามารถเขียนสองวิธีในการกระทำเดียวกันและวิธีการต่าง ๆ จัดการกับโมเดลที่แตกต่างกัน
2. การแก้ปัญหา
Struts2 ยังให้วิธีแก้ปัญหานี้:
Struts2 จัดเก็บแผนที่จำนวนมากใน ActionContext เช่นคำขอเซสชันแอปพลิเคชัน ฯลฯ ที่กล่าวถึงก่อนหน้านี้ นอกจากนี้ยังมีพารามิเตอร์พารามิเตอร์ซึ่งเก็บพารามิเตอร์การร้องขอทั้งหมดของคำขอ ตราบใดที่การกระทำของเราใช้อินเทอร์เฟซพารามิเตอร์ที่เราสามารถรับพารามิเตอร์นี้ได้ นี่เป็นเช่นเดียวกับ ModelDriven หากเราใช้อินเทอร์เฟซ ModelDriven <Model> เราจะได้รับโมเดลในการกระทำนั่นคือกำหนดโมเดลและใช้วิธีการตั้งค่า
โอเคตอนนี้ปัญหาง่ายต่อการแก้ พารามิเตอร์การชำระเงินและพารามิเตอร์ที่ส่งคืนจะแตกต่างกัน กล่าวคือพารามิเตอร์ที่ป้อน payacition สองครั้งนั้นแตกต่างกันนั่นคือข้อมูลที่ติดตั้งใน ParameterMap สองครั้งนั้นแตกต่างกัน ตราบใดที่เราเลือกพารามิเตอร์ในการดำเนินการ (พารามิเตอร์สามารถแยกแยะได้จากคำขอคำขอที่แตกต่างกันสองครั้ง) เป็นการตัดสินเราจะรู้ว่ารุ่นใดที่ควรใช้เพื่อรับพารามิเตอร์ (senddata หรือ backdata) มาเขียนรหัสใหม่ในการจ่าย:
@Controller ("การจ่ายเงิน")@Scope ("Prototype") การจ่ายเงินระดับสาธารณะขยาย baseaction <jobch> ดำเนินการพารามิเตอร์ Asparameteraware {// โปรดทราบว่า SendData ไม่สามารถเขียนได้ใน baseaction ที่สืบทอดมาข้างต้น คุณต้องเขียนวัตถุ ในภายหลังเราจะพิจารณาว่าจะใช้ // กำหนดแผนที่เพื่อรับแผนที่ส่วนตัว <String, String []> พารามิเตอร์; @Override โมฆะสาธารณะ setParameters (แผนที่ <สตริง, สตริง []> พารามิเตอร์) {this.parameters = พารามิเตอร์; } / *ในบทความ struts-default.xml, servletconfig interceptor จะถูกดำเนินการก่อนที่ Modeldriven ดังนั้นเมื่อเราฉีดโมเดลพารามิเตอร์คำขอมีอยู่แล้วดังนั้นเราจึงสามารถใช้พารามิเตอร์ในวิธีการจ่ายเงินของ GetModel ( / / / @ ไม่ส่งคืน // ด้วยวิธีนี้เราสามารถใช้พารามิเตอร์นี้เพื่อตรวจสอบว่ามีการชำระเงินหรือส่งคืนถ้า (พารามิเตอร์. get ("pd_frpid")! = null) {model = new senddata (); } else {model = new backdata (); } ส่งคืนโมเดล; } // วิธีการส่งข้อมูลไปยัง Yibao สาธารณะสตริง Gobank () {// รุ่นที่ส่งที่สอดคล้องกัน: SendData senddata senddata = (senddata) โมเดล; // ตรรกะของการส่งข้อมูลได้ถูกนำไปใช้ในส่วนก่อนหน้า ... } // วิธีการรับข้อมูลที่ส่งคืนสาธารณะโมฆะ Backbank () {// รุ่นที่ได้รับ: backdata backdata backdata = (backdata); // ตรรกะของการจัดการข้อมูลที่ส่งคืน ... มันจะถูกนำไปใช้ในภายหลัง // จุดความรู้ของ struts2 แรกจัดการการร้องขอหลายรุ่น}}}}3. การไหลของการประมวลผล struts2
มาวิเคราะห์กระบวนการดำเนินการของ struts2 ซึ่งจะเอื้อต่อการทำความเข้าใจหลักการข้างต้นมากขึ้น การไหลของการประมวลผล Struts:
1) หลังจากได้รับการร้องขอให้สร้างพร็อกซีของแอ็คชั่นก่อนจากนั้นสร้างการกระทำเมื่อสร้างพร็อกซี
2) ดำเนินการ 18 interceptors จากนั้นเรียกใช้วิธีการกระทำหลังจากที่ interceptor ดำเนินการสำเร็จ;
3) หลังจากดำเนินการตามวิธีการดำเนินการจะเรียกว่า 18 interceptors ดังนั้นตามกระบวนการนี้เรารู้: ก่อนอื่นสร้างการกระทำ> จากนั้นเรียกใช้งาน Interceptor (ก่อนที่จะดำเนินการ servletConfig ก่อนจากนั้นเรียกใช้ ModelDriven เนื่องจาก servletConfig interceptor ติดตั้งไว้ด้านหน้าของ ModelDriven) ดังนั้นในรหัสข้างต้นเราสามารถใช้ข้อมูลใน ParameterMap ในวิธี GetModel () เพื่อทำการตัดสิน
ใช้แผนภาพเวลาง่าย ๆ ต่อไปนี้เพื่อแสดงถึงการประมวลผลการไหลของการประมวลผลข้างต้น:
สิ่งนี้แสดงให้เห็นถึงการประมวลผลการไหลของสัญชาตญาณ Struts2 ดังนั้นจึงเป็นเรื่องง่ายที่จะเข้าใจการประมวลผลคำขอหลายรุ่นข้างต้น ณ จุดนี้ส่วนหนึ่งของวิธีการของ struts2 เพื่อจัดการคำขอหลายรุ่นได้รับการวิเคราะห์ ต่อไปนี้เป็นตรรกะเล็ก ๆ ในโครงการนี้
4. ปรับปรุงวิธีการรับข้อมูล
ตรรกะที่อยู่เบื้องหลังนี้คือการใช้ตรรกะนั่นคือการประมวลผลข้อมูลที่ส่งคืน ตรรกะที่นี่ส่วนใหญ่รวมถึง: การอัปเดตสถานะการสั่งซื้อ (ชำระเงิน, จัดส่ง ฯลฯ ), การส่งอีเมล, การส่งข้อความ ฯลฯ ก่อนอื่นเราจะทำการอัปเดตสถานะการสั่งซื้อส่งอีเมลและส่งข้อความไปยังเรื่องและเราจะเขียนในภายหลัง
ก่อนอื่นปรับปรุงวิธี backbank ():
โมฆะสาธารณะ backbank () {backdata backdata = (backdata) โมเดล; System.out.println (รุ่น); บูลีน isok = payservice.checkbackdata (backdata); if (isok) {// 1 อัปเดตสถานะการสั่งซื้อพารามิเตอร์จะถูกส่งตามสถานการณ์ในฐานข้อมูลที่ใช้ทดสอบ ForderService.UpDatestatusById (Integer.ValueOf (201605006), 2); // 2. ส่งอีเมลตามที่อยู่อีเมลผู้ใช้ // 3 ส่ง System.out.println ("---- ประสบความสำเร็จ !! -----"); } else {system.out.println ("---- false !!! -----"); -จากนั้นเราก็ทำวิธี checkbackdata (backdata) ใน Payservice (ตรรกะนั้นเหมือนกันกับในส่วนที่ 21):
@Service ("Payservice") คลาสสาธารณะ PayserviceImpl ใช้ payservice {// ละเว้นรหัสที่ไม่เกี่ยวข้อง/***************************************************************** backdata) {// สตริงผนวกเพื่อเตรียมการตรวจสอบการเข้ารหัส StringBuffer infoBuffer = new StringBuffer (); infoBuffer.Append (backdata.getp1_merid ()); infoBuffer.Append (backdata.getr0_cmd ()); infoBuffer.Append (backdata.getR1_Code ()); infoBuffer.Append (backdata.getR2_trxid ()); infoBuffer.Append (backdata.getr3_amt ()); infoBuffer.Append (backdata.getR4_Cur ()); infoBuffer.Append (backdata.getR5_PID ()); infoBuffer.Append (backdata.getr6_order ()); infoBuffer.Append (backdata.getr7_uid ()); infoBuffer.Append (backdata.getR8_MP ()); infoBuffer.Append (backdata.getR9_BType ()); ส่งคืน infoBuffer.toString (); } // เข้ารหัสข้อมูลที่ส่งคืนและเปรียบเทียบกับ ciphertext ที่ส่งไป ถ้าตกลงก็หมายความว่าข้อมูลไม่ได้ถูกดัดแปลงด้วย Public Boolean CheckBackData (backdata backdata) {string joinparam = this.joinbackdataparam (backdata); // รับสตริง ciphertext ของคุณเอง md5 = digestutil.hmacsign (Joinparam.toString (), คีย์); // การเปรียบเทียบ ciphertext กับ ciphertext ที่ส่งผ่าน md5.equals return (backdata.gethmac ()); -ในที่สุดเราก็ทำเมธอด updatestatusById ใน Forderservice:
// ForderService อินเทอร์เฟซสาธารณะ FORDERSERVICE ขยาย Baseservice <Forder> {// ละเว้นรหัสอื่นที่ไม่เกี่ยวข้อง ... // อัปเดตสถานะการสั่งซื้อตามหมายเลขคำสั่งซื้อโมฆะสาธารณะ updatestatusById (int id, int sid); ใช้ ForderService {// ละเว้นรหัสอื่นที่ไม่เกี่ยวข้อง @Override โมฆะสาธารณะ updatestatusById (int id, int sid) {String hql = "อัปเดต forder f set f.status.id =: sid โดยที่ f.id =: id"; getSession (). createquery (HQL) .SetInteger ("SID", SID) .SetInteger ("ID", ID) .ExecuteUpdate (); -สิ่งนี้จะช่วยให้สถานะการสั่งซื้อได้รับการอัปเดตหลังจากลูกค้าจ่าย
ลิงค์ดั้งเดิม: http://blog.csdn.net/eson_15/article/details/51465067
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น