ในบทความล่าสุดเราได้เสร็จสิ้นการแสดงข้อมูล DataGrid ของข้อมูล JSON แต่ไม่เกี่ยวข้องกับพื้นหลัง เราเพียงแค่แสดงข้อมูล JSON ที่เราสร้างขึ้นเอง ในส่วนนี้เรารวม JSON และ Struts2 เพื่อเชื่อมต่อปฏิสัมพันธ์ระหว่าง EasyUI และ Struts2
1. การก่อสร้างสภาพแวดล้อม JSON
สภาพแวดล้อม JSON นั้นง่ายมากเพียงนำเข้าแพ็คเกจ JSON JAR ดังนี้:
(หมายเหตุ: Jar Package Jar's Jar's Jar ดาวน์โหลดที่อยู่: http://xiazai.vevb.com/201605/yuanma/json-lib-2.4(vevb.com).rar)
2. ปรับปรุงการกระทำ
มีคุณสมบัติในการควบคุม DataGrid ที่เป็น URL ซึ่งสามารถระบุที่อยู่ URL ของข้อมูลที่ร้องขอ ในส่วนก่อนหน้านี้เราตั้งค่าที่อยู่นี้โดยตรงเป็นไฟล์ JSON ที่เฉพาะเจาะจง ที่นี่เราตั้งค่า URL นี้เป็นการกระทำเช่น URL: 'category_queryjoinaccount.action' ซึ่งหมายความว่าวิธีการ queryjoinaccount ของหมวดหมู่จะถูกร้องขอ (รหัสของ query.jsp จะได้รับในตอนท้ายของบทความ) ดังนั้นเราต้องทำวิธีการ QueryJoinaccount ในหมวดหมู่
ก่อนที่จะรวม struts2 และ JSON ลองมาดูว่ามีการส่งคำขออะไรสำหรับข้อมูล JSON ที่แสดงก่อน:
เนื่องจากประเภทเป็นคุณสมบัติของคลาสหมวดหมู่เราจึงได้ใช้อินเตอร์เฟส ModelDriven <หมวดหมู่> ใน baseaction ดังนั้นประเภทนี้จะถูกห่อหุ้มไว้ในโมเดล เราไม่จำเป็นต้องกังวลเกี่ยวกับมันเราสามารถรับมันผ่านโมเดล อย่างไรก็ตามเราจำเป็นต้องได้รับพารามิเตอร์หน้าและแถวที่ส่งโดย EasyUI โดยอัตโนมัติดังนั้นเราสามารถเพิ่มหน้าตัวแปรสมาชิกสองตัวและแถวไปยัง Basemodel และใช้วิธีการรับและตั้งค่า ในที่สุดเราต้องพิจารณาสิ่งหนึ่ง หลังจากได้รับพารามิเตอร์เหล่านี้ทั้งหมดเราจะทำการสอบถามข้อมูลในฐานข้อมูลตามพารามิเตอร์เหล่านี้ แล้วเราจะใส่ข้อมูลที่เราพบที่ไหน? นอกจากนี้ยังต้องบรรจุในรูปแบบ JSON และส่งไปยังแผนกต้อนรับก่อนที่ DataGrid จะสามารถแสดงได้ เราไม่พิจารณาวิธีการจัดทำข้อมูลแบบสอบถามในรูปแบบ JSON ก่อนอื่นเราพิจารณาวางข้อมูลนี้ไว้ในที่เดียว เป็นเรื่องธรรมดาที่จะคิดใช้ MAP เนื่องจากข้อมูลในรูปแบบ JSON อยู่ในรูปแบบของค่าคีย์ เมื่อนึกถึงสิ่งนี้เรายังคงปรับปรุงการเกิดปฏิกิริยาต่อไป:
@Controller ("baseaction") @scope ("prototype") ระดับสาธารณะ Baseaction <t> ขยายการดำเนินการดำเนินการดำเนินการตามคำขอ, SessionAware, ApplicationAware, ModelDriven <t> {// หน้าและแถวเกี่ยวข้องกับการเพจ Pagemap เก็บข้อมูลการสืบค้นแล้วบรรจุในรูปแบบ JSON // หน้าและแถวเพื่อใช้วิธีการรับและตั้งค่า PAGEMAP จำเป็นต้องใช้วิธี GET เท่านั้นเนื่องจาก PAGEMAP ไม่ได้รับพารามิเตอร์ส่วนหน้า แต่เป็นหน้าจำนวนเต็มที่ได้รับการป้องกัน แถวจำนวนเต็มที่ได้รับการป้องกัน แผนที่ที่ได้รับการป้องกัน <String, Object> Pagemap = null; // ให้การกระทำที่แตกต่างนำไปใช้ด้วยตัวเอง // ละเว้นการรับและตั้งวิธี .../********************************************* @Resource บัญชีที่ได้รับการป้องกันการบริการบัญชี; // แผนที่วัตถุโดเมนป้องกัน <String, Object> คำขอ; แผนที่ป้องกัน <String, Object> เซสชัน; แผนที่ป้องกัน <String, Object> แอปพลิเคชัน; @Override โมฆะสาธารณะ setapplication (แผนที่ <สตริงวัตถุ> แอปพลิเคชัน) {this.application = แอปพลิเคชัน; } @Override void setSession (แผนที่ <String, Object> เซสชัน) {this.session = เซสชัน; } @Override โมฆะสาธารณะ setRequest (แผนที่ <สตริง, วัตถุ> คำขอ) {this.request = คำขอ; } // แบบจำลองการป้องกัน T Modeldriven; @Override สาธารณะ t getModel () {parameterizedType type = (parameterizedType) this.getClass (). getGenericsUperClass (); Class clazz = (คลาส) type.getActualTypeArguments () [0]; ลอง {model = (t) clazz.newinstance (); } catch (exception e) {โยน runtimeException ใหม่ (e); } ส่งคืนโมเดล; - ตกลงหลังจากปรับปรุง basecategory เราสามารถเขียนวิธีการ queryjoinaccount ในหมวดหมู่ เราลบวิธีการดั้งเดิมทั้งหมดในหมวดหมู่เนื่องจากวิธีการใช้สำหรับการทดสอบเมื่อสร้างสภาพแวดล้อมมาก่อนและไม่จำเป็นต้องใช้อีกต่อไป ตอนนี้เราได้เริ่มรหัสโครงการแล้ว:
@Controller ("หมวดหมู่") @Scope ("ต้นแบบ") หมวดหมู่คลาสสาธารณะขยาย baseaction <category> {String String QueryJoInAccount () {// ใช้เพื่อจัดเก็บข้อมูลของ Page Pagemap = HASHMAP ใหม่ <String, Object> (); // สอบถามข้อมูลที่เกี่ยวข้องตามคำหลักและพารามิเตอร์เพจ เราได้เขียนวิธีนี้ในการให้บริการ ในเวลานั้นเราเสร็จสิ้นรายการ Query Cascading <sategory> categoryList = categoryService.QueryJoinAccount (model.getType (), หน้า, แถว); pagemap.put ("แถว", categorylist); // เก็บไว้ในรูปแบบ JSON จากไฟล์ JSON ในส่วนก่อนหน้าจะเห็นได้ว่าคีย์คือทั้งหมดและคีย์คือแถว ที่นี่เราเก็บแถวก่อน // สอบถามจำนวนระเบียนทั้งหมดตามคำหลัก Long Total = CategoryService.getCount (model.getType ()); // วิธีนี้ยังไม่ได้เขียนไปที่เลเยอร์บริการเพื่อปรับปรุงในภายหลัง // system.out.println (รวม); pagemap.put ("รวม" รวม); // จัดเก็บในรูปแบบ JSON จากนั้นจัดเก็บผลตอบแทนทั้งหมด "JSONMAP"; - ด้วยวิธีนี้เราได้เขียนการกระทำ ตอนนี้การกระทำจะได้รับพารามิเตอร์ที่ส่งจากแผนกต้อนรับจากนั้นสอบถามจำนวนระเบียนทั้งหมดของประเภทที่ระบุและผลิตภัณฑ์ทั้งหมดของประเภทที่ระบุตามพารามิเตอร์ มันถูกเก็บไว้ตามคีย์ที่ระบุไว้ใน JSON (เช่นทั้งหมดและแถว) และวางไว้ใน HashMap หลังจากนั้นตราบใดที่ข้อมูลใน HashMap นี้ถูกบรรจุไว้ในรูปแบบ JSON และส่งไปยังแผนกต้อนรับส่วนหน้าสามารถแสดงได้โดย DataGrid ก่อนอื่นเราใส่ hashmap นี้ก่อนปรับปรุงรหัสเลเยอร์บริการจากนั้นจัดทำแพ็คเกจข้อมูลในแฮชแมปนี้
3. ปรับปรุงหมวดหมู่
จากหมวดหมู่ข้างต้นเราจะเห็นว่าต้องมีการเพิ่มวิธีการ getCount ในหมวดหมู่บริการและจะต้องนำไปใช้ในคลาสการใช้งานเฉพาะดังนี้:
// categoryService อินเตอร์เฟสสาธารณะหมวดหมู่ส่วนต่อประสาน Explaive Baseservice <หมวดหมู่> {// ข้อมูลหมวดหมู่การสืบค้น, การเรียงลำดับผู้ดูแลระบบรายชื่อสาธารณะ <หมวดหมู่> QueryJoinAccount (ประเภทสตริง, หน้า int, ขนาด int); // แบบสอบถามโดยใช้ชื่อของหมวดหมู่ // สอบถามจำนวนทั้งหมดของระเบียนตามคำหลัก getCount ยาวสาธารณะ (ประเภทสตริง); } // CategoryServiceImpl ใช้คลาส @SuppressWarnings ("ไม่ได้ตรวจสอบ") @Service ("หมวดหมู่บริการ") คลาสสาธารณะหมวดหมู่ ServiceImpl ขยาย BaseserviceImpl <หมวดหมู่> ใช้หมวดหมู่ {@override รายการสาธารณะ C. ประเภทชอบ: พิมพ์ "; Return getSession (). createquery (hql) .setstring ("type", "%" + type + "%") .setfirstresult ((page-1) * ขนาด) // แสดงจาก one.setMaxResults (ขนาด) // แสดงหลายรายการ (); } @Override สาธารณะ Long GetCount (ประเภทสตริง) {String HQL = "SELECT COUNT (C) จากหมวดหมู่ C โดยที่ C.Type ชอบ: ประเภท"; return (long) getSession (). createquery (hql) .setstring ("type", "%" + type + "%") .uniqueresult (); // ส่งคืนบันทึก: จำนวนระเบียนทั้งหมด}} จนถึงตอนนี้เส้นทางสู่การรับข้อมูลในฐานข้อมูลนี้ได้เปิดขึ้นแล้ว สองขั้นตอนแรกเสร็จสิ้นเพื่อดึงข้อมูลจากฐานข้อมูลส่วนหน้า->-> จากนั้นเราเริ่มจัดทำแพ็คเกจข้อมูลที่เก็บไว้ใน HashMap แล้วส่งไปที่แผนกต้อนรับ
4. กำหนดค่า struts.xml
บรรจุภัณฑ์ข้อมูลที่ระบุสามารถทำได้ผ่านการกำหนดค่าใน struts.xml ก่อนอื่นให้ดูที่การกำหนดค่าใน struts.xml:
<struts> <constant name = "struts.devmode" value = "true"/> <package name = "shop" ขยาย = "json-default"> <!-jason-default สืบทอด struts-default-> <sults-sults> กำหนดค่าในฤดูใบไม้ผลิเพราะมันจะถูกส่งไปยังการจัดการฤดูใบไม้ผลิ-> <action name = "category_*" method = "{1}"> <!-คุณต้องเพิ่มแพ็คเกจ JSON ก่อนจากนั้นสืบทอด json-default ด้านบน-> <result name = "JSONMAP" Type = "JSON"> <! ตัวกรองตัวเลือกที่ไม่จำเป็นและสนับสนุนรูปแบบนิพจน์ปกติ JSON: {ทั้งหมด: 3, แถว: [{บัญชี: {id: 2, เข้าสู่ระบบ: "ผู้ใช้", ชื่อ: "บริการลูกค้า", pass: "ผู้ใช้"}, ร้อน: true, id: 3, …}]}-> <param name = ข้อผิดพลาดใน CSDN ฉันจะติดตามภาพและวางไว้ด้านล่าง-> </param> </result> </action> <action name = "Matcount_*" method = "{1}"> <ชื่อผลลัพธ์ = "index">/index.jsp </result> </action> <! name = "send">/web-inf/{1}/{2} .jsp </result> </action> </package> </struts>จากการกำหนดค่าข้างต้นเราจะเห็นว่าก่อนอื่นแพ็คเกจจะต้องสืบทอด JSON-Default เนื่องจาก JSON-DEFAULT สืบทอด struts-default เนื่องจากมี struts2-json-plugin-2.3.24.1.jar ในแพ็คเกจ JSON Jar คุณสามารถเปิดและดูว่ามี struts-plugin.xml อยู่ข้างใน คุณสามารถเปิดและดูว่า JSON-Default สืบทอด struts-default:
ถัดไปฉันกำหนดค่า <result> ชื่อคือสตริงที่ส่งคืนโดยการกระทำและต้องจับคู่ประเภทกับ JSON จากนั้นมีพารามิเตอร์ในผลลัพธ์ ก่อนอื่นพารามิเตอร์ที่ต้องจับคู่กับชื่อเป็นรูท พารามิเตอร์นี้จะต้องจับคู่กับวัตถุ HASHMAP ที่ต้องแปลงในตอนนี้นั่นคือ pagemap ที่เรากำหนดไว้ ด้วยการกำหนดค่าของพารามิเตอร์นี้ struts จะบรรจุข้อมูลใน pagemap ในรูปแบบ JSON จากนั้นกำหนดค่าบัญชีดำ บัญชีดำหมายถึงการบอก struts ฟิลด์ใดที่ไม่จำเป็นต้องบรรจุเมื่อบรรจุภัณฑ์เช่นข้อมูลเกี่ยวกับรหัสผ่านของผู้ดูแลระบบ จากรูปแบบ Jason ในความคิดเห็นด้านบนคุณจะเห็นว่าแถว [0] .Account.Pass แสดงถึงฟิลด์รหัสผ่าน แต่ต้องมีข้อมูลมากกว่าหนึ่งข้อมูลดังนั้นเราต้องใช้นิพจน์ทั่วไปเพื่อแสดงเพื่อให้รหัสผ่านทั้งหมดจะไม่ถูกบรรจุลงใน JSON
5. แก้ไขเนื้อหา query.jsp
ณ จุดนี้เราได้บรรจุข้อมูลไว้ในรูปแบบ JSON ต่อไปเราจะปรับปรุงเนื้อหาของ Query.jsp front-end เพื่อให้ DataGrid Display อย่างถูกต้อง:
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> $ (function () {$ ('#dg'). dataGrid ({// ที่อยู่ URL ถูกเปลี่ยนเป็น URL CategoryAction: 'Category_QueryJoinAccount.Action', loadmsg: 'การโหลด ...... ', QueryParams: {type: ''}, // type พารามิเตอร์ Striped: True, Nowrap: True, Singleselect: True, Pagination: True, Rowstyler: ฟังก์ชั่น (ดัชนี, แถว) {console.info ("ดัชนี" + ดัชนี + "," + แถว) ถ้า (ดัชนี % 2 == 0) {ฟิลด์: 'ช่องทำเครื่องหมาย', ช่องทำเครื่องหมาย: true}, {ฟิลด์: 'id', ชื่อเรื่อง: 'หมายเลข', ความกว้าง: 200} // ฟิลด์ฟิลด์ที่นี่ควรจะเหมือนกับในฐานข้อมูลนั่นคือพวกเขาควรจะเหมือนกันในรูปแบบของ JSON "<span>" + ค่า + "</span>"; }}, {ฟิลด์: 'ร้อน', ชื่อเรื่อง: 'ร้อน', ความกว้าง: 100, // ฟิลด์ฟอร์มร้อน: ฟังก์ชั่น (ค่า, แถว, ดัชนี) {ถ้า (ค่า) {// ถ้ามันร้อนค่าเป็นจริงและค่าเป็นตัวแปรบูลีนกลับ " // tick} else {return "<input type = 'ช่องทำเครื่องหมาย' disable = 'true'"; // ไม่ตรวจสอบ}}}, {ฟิลด์: 'account.login', ชื่อเรื่อง: 'ผู้ดูแลระบบ', ความกว้าง: 200, //account.loginadministrator ชื่อล็อกอินชื่อ: ฟังก์ชั่น (ค่า, แถว, ดัชนี) {ถ้า (row.account! // หากชื่อเข้าสู่ระบบไม่ว่างให้แสดงชื่อล็อกอิน} else {return "ไม่มีผู้ดูแลระบบในหมวดหมู่นี้"; - - </script> </head> <body> <table id = "dg"> </table> </body> </html> 6. การทดสอบแสดงผลลัพธ์
สุดท้ายลองทดสอบผลลัพธ์การแสดงผลของ DataGrid ดังนี้:
ณ จุดนี้เราได้รวม struts2 และ JSON สำเร็จแล้วและตอนนี้เราสามารถส่งข้อมูลในรูปแบบ JSON ไปยังเบื้องหน้า
(หมายเหตุ: ในที่สุดฉันจะให้การดาวน์โหลดซอร์สโค้ดของโครงการทั้งหมด! ทุกคนยินดีที่จะรวบรวมหรือแบ่งปัน)
ที่อยู่ดั้งเดิม: http://blog.csdn.net/eson_15/article/details/51332758
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น