บทความนี้ได้แบ่งปันวิธีการปรับแต่งกรอบ MVC Struts2 MVC กับคุณ เนื้อหาเฉพาะมีดังนี้
Custom MVC: (ก่อนอื่นเข้าใจแนวคิดของ Model1 และ Model2)
Model1 และ Model2:
Model1: มันเป็นเทคโนโลยีการพัฒนา JSSP บริสุทธิ์ที่รวมรหัสตรรกะทางธุรกิจและดูรหัสการแสดงผล
Model2: Model2 ขึ้นอยู่กับ Model1 โดยแยกรหัสตรรกะทางธุรกิจและสร้าง servlet เพียงอย่างเดียว Model2 ยังได้รับการพัฒนาตาม MVC
ลักษณะของ MVC สรุปได้ดังนี้:
(1) การเก็บข้อมูลและการแยกการแสดงผล
(2) คอนโทรลเลอร์รวมโมเดลและมุมมองที่แตกต่างกันเข้าด้วยกัน
(3) แอปพลิเคชันแบ่งออกเป็นสามส่วนคู่กันอย่างหลวมและทำงานร่วมกันซึ่งจะช่วยปรับปรุงความสามารถในการปรับขนาดและการบำรุงรักษา
(4) แต่ละเลเยอร์มีหน้าที่รับผิดชอบฟังก์ชั่นที่แตกต่างกันและปฏิบัติหน้าที่ของตัวเอง ส่วนประกอบของแต่ละเลเยอร์มีลักษณะเหมือนกันซึ่งอำนวยความสะดวกในการสร้างรหัสโปรแกรมผ่านวิศวกรรมและเครื่องมือ
MVC คิดและข้อดี (แข็งแกร่งมาก)
MVC เป็นรูปแบบสถาปัตยกรรมวัตถุประสงค์คือการแยกโมเดล (ตรรกะทางธุรกิจ) และมุมมอง (เลเยอร์การนำเสนอ) เพื่อให้แบบจำลองและมุมมองสามารถแก้ไขได้อย่างอิสระโดยไม่ส่งผลกระทบต่อกันและกัน ซอฟต์แวร์ส่วนใหญ่ใช้รูปแบบนี้เมื่อออกแบบสถาปัตยกรรม มีหลายวิธีในการใช้โหมด MVC เมื่อระบบเรียกดูผ่านเบราว์เซอร์ต้องการพัฒนารุ่นมือถือคุณจะต้องพัฒนามุมมองใหม่และตรรกะทางธุรกิจของชิ้นส่วนโมเดลสามารถนำกลับมาใช้ใหม่ได้ ซอฟต์แวร์จำนวนมากจำเป็นต้องเปิดตัวรุ่น B/S และ C/S ในเวลาเดียวกันโดยใช้โหมด MVC ส่วนโมเดลสามารถนำกลับมาใช้ใหม่ได้และต้องมีการพัฒนามุมมองที่แตกต่างกันเท่านั้น แนวคิด MVC แบ่งแอปพลิเคชันออกเป็นสามส่วนพื้นฐาน: M (รุ่น, รุ่น) V (ดู, View) C (คอนโทรลเลอร์, คอนโทรลเลอร์) ในกรณีที่ M แสดงถึงส่วนที่ประมวลผลตรรกะทางธุรกิจ V แสดงถึงส่วนที่แสดงข้อมูลและรับอินพุตของผู้ใช้ C นั้นคล้ายกับตัวกลางเพื่อให้แน่ใจว่า M และ V ไม่ได้โต้ตอบโดยตรง
ขั้นตอนพื้นฐานมีดังนี้:
1. สร้าง XML Document Framework.xml
2. กำหนดอินเทอร์เฟซการกระทำ
3. กำหนดคลาส ActionMapping และถือว่าเป็นโหนดการกระทำ
4. กำหนดคลาส ActionMappingManage เพื่อจัดการคลาส ActionMapping (โหนดการกระทำ)
5. กำหนดคลาส ActionManager โดยใช้กลไกการสะท้อนกลับเพื่อรับคลาสเฉพาะตามชื่อคลาสของประเภทสตริง (การเขียนของ tags web.xml)
6. เขียน servlets สำหรับการควบคุมเวลาทำงาน
7. กำหนดคลาสการเข้าสู่ระบบสำหรับการทดสอบ
1. สร้าง XML Document Framework.xml
<!-? xml version = "1.0" encoding = "utf-8"?-> <!-ไฟล์ข้อ จำกัด นิยาม-> (หมายเหตุ) <!-องค์ประกอบบ่งชี้องค์ประกอบ-> <!-attlist ระบุแอตทริบิวต์-> <! การส่งต่อ-> <!-การดำเนินการองค์ประกอบ (การกระทำ)-> <!-การกระทำองค์ประกอบ (ผลลัพธ์*)-> (* หมายถึงหลาย) <!-ชื่อการกระทำของ Attlist CDATA #Required Class CDATA #Required-> <! name = "success"> success.jsp </result> <result name = "login"> index.jsp </result> </action> </actions> </framework>
หมายเหตุ: ข้อกำหนดการเขียนของช่องว่างและ <>
ลำดับชั้นของโหนด
2. กำหนดอินเทอร์เฟซการกระทำ
หมายเหตุ: พารามิเตอร์ excute ถูกเขียนร้องขอและตอบกลับ
3. กำหนดคลาส ActionMapping ให้ถือเป็นโหนดการกระทำ (เขียนฉลากของโหนดการกระทำ)
ห่อหุ้มข้อมูลไปยังฟิลด์และคอลเลกชันผลลัพธ์
หมายเหตุ: เพิ่มข้อมูลลงในการเขียน (คอลเลกชันแผนที่)
4. กำหนดคลาส ActionMappingManage เพื่อจัดการคลาส ActionMapping (โหนดการกระทำ)
/** มีโหนดการกระทำมากกว่าหนึ่งโหนด* ใช้ในการจัดการคลาส ActionMapping*/คลาสสาธารณะ ActionMappingManager {// การรวบรวมคลาส ActionMapping MAP ส่วนตัว <String, ActionMapping> Maps = ใหม่ HashMap <String, ActionMapping> (); Public ActionMapping getActionMapping (ชื่อสตริง) {return maps.get (ชื่อ); } // แยกวิเคราะห์ไฟล์การกำหนดค่าทั้งหมดภายใต้โครงการ SRC // แยกวิเคราะห์หลังจากการสร้างอินสแตนซ์สาธารณะ ActionMappingManager (String [] ไฟล์) {สำหรับ (ชื่อไฟล์สตริง: ไฟล์) {init (ชื่อไฟล์); }} // วิธีการเริ่มต้นเริ่มต้น // แยกวิเคราะห์เอกสาร XML public public void init (เส้นทางสตริง) {ลอง {inputStream คือ = this.getClass (). getResourceasstream ("/"+พา ธ ); // แยกวิเคราะห์เอกสาร XML doc = new SaxReader (). อ่าน (IS); // รับรูทองค์ประกอบรูทรูท = doc.getRootElement (); // รับการกระทำของโหนดองค์ประกอบการกระทำ = (องค์ประกอบ) root.elementIterator ("การกระทำ") next (); // ใช้ FOR LOOP เพื่อสำรวจโหนดการกระทำทั้งหมดภายใต้โหนดการกระทำสำหรับ (iterator <Element> action = actions.elementIterator ("การกระทำ"); action.hasnext ();) {// รับ <การกระทำ> Node Element ActionNext = action.next (); // รับแอตทริบิวต์ชื่อและแอตทริบิวต์คลาสในโหนดการกระทำตามลำดับสตริงชื่อ = actionNext.attributeValue ("ชื่อ"); String className = ActionNext.attributeValue ("คลาส"); // บันทึกแอตทริบิวต์สองตัวข้างต้นไปยังคลาส ActionMapping ActionMapping Map = new ActionMapping (); mapapp.setClassName (className); mapapp.setName (ชื่อ); // เนื่องจากมีโหนดผลลัพธ์หลายโหนดภายใต้โหนดแอ็คชั่นข้ามโหนดผลลัพธ์ทั้งหมดภายใต้การดำเนินการสำหรับ (ตัววนซ้ำ <องค์ประกอบ> ผลลัพธ์ = actionNext.ElementIterator ("ผลลัพธ์"); result.hasNext ();) {// รับผลการแข่งขัน // แยกค่าแอตทริบิวต์ชื่อของโหนดผลลัพธ์และค่าในผลลัพธ์โหนดผลลัพธ์สตริงผลลัพธ์ = resultnext.attributeValue ("ชื่อ"); String resultValue = resultNext.getText (); // บันทึกไว้ในชุดคอลัมน์สองคอลัมน์ใน ActionMapping เพื่ออำนวยความสะดวกในการเรียกคลาส ActionMapping (มีข้อมูลในคลาส ActionMapping!) map.addresult (ชื่อผลลัพธ์, ผลลัพธ์); System.out.println (map.getName ()); } // รับคอลเลกชันของการกระทำทั้งหมด maps.put (map.getName (), แผนที่); }} catch (Exception e) {// todo: จัดการข้อยกเว้น}}}สรุป:
แยกวิเคราะห์ไฟล์การกำหนดค่า Framework.xml ผ่าน DOM4J สิ่งนี้จะได้รับโหนดรูทและโหนดการกระทำจากนั้นสำรวจโหนดการกระทำภายใต้โหนดการกระทำผ่านการวนรอบเพื่อรับค่าแอตทริบิวต์ของชื่อและคลาส เนื่องจากมีโหนดผลลัพธ์หลายโหนดภายใต้โหนดแอ็คชั่นเดียวและโหนดผลลัพธ์ทั้งหมดภายใต้การกระทำพวกเขาจะถูกเก็บไว้ในชุดคอลัมน์สองคอลัมน์ใน ActionMapping และในที่สุดก็รับชุดของโหนดการกระทำทั้งหมด
หมายเหตุ: การเขียนวิธีการเริ่มต้นและการเขียนของ ActionMappingManager ด้วยกลุ่มพารามิเตอร์
5. กำหนดคลาส ActionManager โดยใช้กลไกการสะท้อนกลับเพื่อรับคลาสเฉพาะตามชื่อคลาสของประเภทสตริง
Public Class ActionManager {การกระทำแบบคงที่สาธารณะ getActionClass (String className) {class clazz = null; การดำเนินการ = null; // รับคลาสโหลดเดอร์ของเธรดปัจจุบันลอง {// ถ้ามีคลาสในเธรดจะได้รับประเภทของคลาสโดยตรงตามชื่อคลาส clazz = thread.currentthread (). getContextClassLoader (). loadClass (คลาสคลาส); } catch (classnotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } if (clazz == null) {ลอง {// ถ้าไม่มีในเธรดจากนั้นใช้วิธี class.forName เพื่อรับ clazz = class.forName (className); } catch (classnotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); }} if (action == null) {ลอง {// แปลงประเภทที่ได้รับเป็นการกระทำและเรียกตัวสร้างพารามิเตอร์ที่ไม่มีพารามิเตอร์ซึ่งเทียบเท่ากับใหม่ในระดับหนึ่ง แต่ความต้องการใหม่ในการระบุประเภทการกระทำ = (แอ็คชั่น) clazz.newinstance (); } catch (InstantiationException e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ E.PrintStackTrace (); } catch (unglemalAccessException e) {// todo catch block catch auto-generated e.printstacktrace (); }} return action; -การกำหนดค่าโหนดสำหรับ web.xml:
6. เขียน servlets เพื่อควบคุมรันไทม์ (servlets เริ่มต้นคลาสทั้งหมด)
คลาสสาธารณะ MyServlet ขยาย httpservlet { / ***คุณซน* / โมฆะสาธารณะ doget (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) โยน servletexception, ioexception {dopost (คำขอ, การตอบสนอง); } <br> / ***ทำงานหนักต่อไป* / actionMappingManager man = null; โมฆะสาธารณะ dopost (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {// รับ actionmapping object actionmapping actionmapping = man.getActionMapping (getPath (คำขอ)); // รับกลไกการสะท้อนกลับของแอ็คชั่นแอ็คชั่นการกระทำ = actionManager.getActionManager (actionMapping.getClassName ()); ลอง {string message = action.execute (คำขอ, การตอบกลับ); สตริงผลลัพธ์ = actionMapping.getResults (ข้อความ); Response.sendredirect (ผลลัพธ์); } catch (exception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); }} /** รับชื่อพา ธ ของคำขอ* /สตริงสาธารณะ getPath (คำขอ httpservletRequest) {// โครงการ + ที่อยู่คำขอสตริง requesturi = request.getRequesturi (); // ชื่อโครงการสตริง contextPath = request.getContextPath (); // การร้องขอเฉพาะเส้นทางสตริง = requesturi.substring (contextPath.length ()); string filename = path.substring (1, path.astilastindexof (".")); คืนชื่อไฟล์; } / * * rewrite init โปรแกรมรันและโหลดคลาสทั้งหมด * * /@Override โมฆะสาธารณะ init (servletConfig config) พ่น servletexception {// วัตถุ config เป็นวัตถุของ javax.servlet.servletConfig ฟังก์ชั่นคือการได้รับข้อมูลการกำหนดค่าการกำหนดค่าเริ่มต้น //config.getInitParameter เป็นเนื้อหาพารามิเตอร์การเริ่มต้นของชื่อสตริงชื่อที่ระบุ = config.getInitParameter ("config"); สตริง [] ชื่อไฟล์ = null; if (filename == null) {// ถ้ามันว่างเปล่า filenames = สตริงใหม่ [] {"framework.xml"}; } else {// หากมีข้อมูลพารามิเตอร์การกำหนดค่าอื่น ๆ จะถูกเก็บไว้ในอาร์เรย์โดยแยกชื่อไฟล์ = filename.split (","); } // ใช้วิธีการเริ่มต้นสำหรับการเริ่มต้น man = new ActionMappingManager (ชื่อไฟล์); -หมายเหตุ: ระดับและความคิดเห็นของรหัส
7. กำหนดคลาสการเข้าสู่ระบบสำหรับการทดสอบ
การเข้าสู่ระบบคลาสสาธารณะใช้การดำเนินการ {@Override สตริงสาธารณะดำเนินการ (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) โยนข้อยกเว้น {ชื่อสตริง = request.getParameter ("ชื่อ"); สตริง pwd = request.getParameter ("PWD"); if (name.equals ("1") && pwd.equals ("1")) {return success; } else {return login; -รหัส JSP:
ตระหนักถึงผลกระทบ:
ไม่ว่าถนนจะยาวแค่ไหนคุณสามารถเดินทีละขั้นตอนและไม่ว่าถนนจะสั้นแค่ไหนคุณก็ไม่สามารถเข้าถึงได้โดยไม่ต้องก้าว
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น