บทความนี้ใช้ฟังก์ชั่นการส่งต่อคำขอของ Struts เป็นหลัก ฟังก์ชั่นอื่น ๆ จะทำขึ้นอย่างช้าๆ
เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้เนื้อหาของ Javassist และฉันเห็นบทความ
นี่คือเฟรมเวิร์ก Struts2 ที่เรียบง่ายและในเวลาเดียวกันคุณเพิ่มความเข้าใจของคุณเอง
บทความนี้ใช้ฟังก์ชั่นการส่งต่อคำขอของ Struts เป็นหลัก ฟังก์ชั่นอื่น ๆ จะทำขึ้นอย่างช้าๆ
ก่อนอื่นทั้งหมดในกรอบ Struts2 การใช้งานและการกระโดดของคำขอส่วนใหญ่จะถูกกำหนดค่าโดย struts.xml <แอ็คชั่น> ป้ายกำกับหมายถึงคำจำกัดความของคำขอซึ่งมีชื่อ "ชื่อ" ของคำขอ; <ผลลัพธ์ "ฉลากกำหนดประเภท" ชื่อ "ของผลลัพธ์รวมถึง 'ความสำเร็จ', 'ไม่มี', 'เข้าสู่ระบบ', 'อินพุต', 'ข้อผิดพลาด'; ②ประเภท" ประเภท "รวมถึง 'dispatcher (เริ่มต้น)' ' '', 'โซ่', 'เปลี่ยนเส้นทาง', 'การเปลี่ยนเส้นทาง', 'สตรีม'; หลังจากกำหนดค่า struts.xml แบบฟอร์มในอินเตอร์เฟสสามารถค้นหาแท็กการกระทำที่สอดคล้องกันผ่านค่าแอตทริบิวต์ชื่อที่กำหนดโดยคุณสมบัติการกระทำเพื่อค้นหาคลาสที่สอดคล้องกันและวิธีการดำเนินการ จากนั้นจับคู่สตริงสตริงที่ส่งคืนโดยวิธีการดำเนินการเพื่อให้ตรงกับชื่อในแท็กผลลัพธ์และดำเนินการดำเนินการตามคำขอถัดไปตามประเภทที่กำหนด
หลังจากทำความเข้าใจว่า struts2 เชื่อมต่ออินเทอร์เฟซที่ร้องขอฟังก์ชั่นโปรแกรมเดียวกันเราสามารถใช้ฟังก์ชันส่วนนี้ผ่านรหัสของเราเองได้อย่างไร
แล้วเราจะเริ่มได้อย่างไร?
เราจะถูกแบ่งออกเป็นสองส่วนด้วยฟังก์ชั่นง่าย ๆ ①ส่วนการโต้ตอบ②resultส่วนหนึ่ง
ส่วนการกระทำ
①เราจำเป็นต้องค้นหาคลาสที่เกี่ยวข้องและวิธีการดำเนินการตามคำขอของอินเตอร์เฟส
ส่วนผลลัพธ์
①เราต้องส่งคืนประเภทสตริงของ 'ความสำเร็จ', 'ไม่มี', 'เข้าสู่ระบบ', 'อินพุต' และ 'ข้อผิดพลาด'
②ที่อยู่คำขอประเภทต่าง ๆ จำเป็นต้องระบุสำหรับการส่งคืนประเภทต่างๆ
③ประเภทที่ต้องกำหนดรวมถึง 'dispatcher (default)', 'chain', 'redirect', 'refirectaction', 'สตรีม'
ในบทความนี้ประเภทผลตอบแทนของผลลัพธ์จะรับรู้เพียงสองประเภทของ 'ความสำเร็จ' และ 'เข้าสู่ระบบ' และในขณะนี้พวกเขาไม่ได้พิจารณาประเภทของคำขอ ฟังก์ชั่นที่สมบูรณ์แบบจะถูกเติมเต็มในภายหลัง
จากนั้นมาดูกันว่าจะบรรลุฟังก์ชั่นด้านบนผ่านรหัสได้อย่างไร
ประการแรกคำอธิบายประกอบแบบกำหนดเองทั้งสองของ ActionAnnotation และ Resultannotation ขอวิธีการและวิธีการที่สอดคล้องกันของสตริงที่ส่งคืนโดยคำอธิบายประกอบแบบกำหนดเองทั้งสองของการกระทำ
/ ** * แอ็คชั่นหมายเหตุ: ActionName เทียบเท่ากับ URL -Pattern * @author linling * */ @retention (RetentionPolicy.runtime) @TargetType.method blic @interface actionnotation {String actionName () ค่าเริ่มต้น "" () ค่าเริ่มต้น {};} /*** กลับไปที่วัตถุคำอธิบายประกอบ: ชื่อเทียบเท่ากับชื่อของผลลัพธ์ในการกำหนดค่า struts รวมถึง 'ความสำเร็จ', 'ไม่มี', 'ข้อผิดพลาด', 'อินพุต ล็อกอิน '; () ค่าเริ่มต้น "index.jsp";}
จากนั้นเรากำหนดคลาส ActionContext เพื่อบันทึกเนื้อหาที่จำเป็นสำหรับคำขอ
/*** ใช้ Struts Simulation ข้ามไปยังเนื้อหาที่จำเป็นในการดำเนินการวิธีการที่สอดคล้อง เฉพาะ* /url สตริงส่วนตัว; ตัวอย่างเช่นคีย์: 'ความสำเร็จ'; การกระทำของวัตถุส่วนตัว; / *** ประเภทพารามิเตอร์ประเภท* / คลาสส่วนตัว <?> [] paramstype; * / สตริงส่วนตัว [] ActionParamsName;
AnalysePackage เป็นวิธีที่จำเป็นสำหรับการประกอบ ActionContext
/** * สำรวจไฟล์คลาสภายใต้แพ็คเกจ SCAN_Package ซึ่งใช้วิธีการดำเนินการใด ๆ เพื่อวิเคราะห์มันประกอบลงในวัตถุ ActionContext และวางไว้ใน URLMAP * @Param Real_Path Scan_Package * @thro ws classnotfoundexception * @throws @Throws unglemlaCcessException * @throws notfoundexception */ public readysePackage (String real_path, String scan_package foundException, การสร้างการโต้ตอบแบบ reginalAccessException, notfoundException {ไฟล์ไฟล์ = ไฟล์ใหม่ (real_path); ถ้า (ไฟล์. ] f iles = file.listfiles (); classstype = class.forname (ชื่อไฟล์); วิธี [] เมธอด = classstype.getMethods (); . GETANNOTATION (ACTIONANTATION.CLASS); ข้อผิดพลาดในการยกเลิกวิธี! " + วิธีการ +", actionName: " + url +", result.length: " + results.lengts.lengt h);} actioncontext.seturl (url); actiontextext.setMethod (method.getName ()) แผนที่ <res) แผนที่ = ใหม่ hashmap <res) (); คือ null ");} map.put (result.name (), ค่า);} actionContext.setResults (แผนที่); Act ionContext.setClasStype (classtype); actionContext. setAction (classtype.newinstance ()); Method.getParameterTypes ());
GetParams เป็นอาร์เรย์พารามิเตอร์คำขอตามเนื้อหาคำขอในคำขอ HTTPSERVLETREQUEST
/** * ขึ้นอยู่กับประเภทพารามิเตอร์ parastype และชื่อพารามิเตอร์ actinparamsname เพื่อวิเคราะห์คำขอคำขอเพื่อสร้างวัตถุพารามิเตอร์ [] * @param Request * @paramstype * @param actionparamsname * @retourn * @throws InfantiationException * @throws พ่น unglegalargumentException * @ @ @ @ @ @ @ @ @ @ @ throws involutionantargetException * @throws nosuchmedhodexception * @throws SecurityException */ วัตถุคงที่สาธารณะ [] คำขอเควส, คลาส <?> [] Paramstype, String [] ActionParamSname) Invocat iontargexception, nosuchmethodexception, SecurityException {Object [Object] = วัตถุใหม่ [paramstype.length]; รูปแบบ parampe [i])) {วัตถุ [i] = paramsutils.getparam (คำขอ, paramstype [i], actionparamsname [i]); classstype.getDetDeclardFields (); ) {{String key = iterator.next (); ความยาว! ค่าสตริง = map.get (คีย์) [0]; } ส่งคืนวัตถุ;}
โอเคต่อไป เราสามารถใช้วิธีการดำเนินการ
การเข้าสู่ระบบคลาสสาธารณะ {@ActionNotation (actionName = "login.action", results = {@Resultanitation (name = resultType.success, value = "i ndex.jsp"),@resultannotation . (actionName = "loginForUse.Action", results = {@ResAnnotation (name = resultType.Success, value = "indexp") otary (name = resultType.login, value = "login.jsp")})) (หมายเลข int, loginpojo loginpojo) {ถ้า ("hello" .equals (loginpojo.getUserName ()) && "World" .equojo.getpa sword ())) {ส่งคืนผลลัพธ์
ต่อไปสิ่งที่เราต้องทำคืออนุญาตให้โปรแกรมสำรวจวิธีการทั้งหมดในไดเรกทอรีการทำงานเมื่อเริ่มต้นและใช้วิธีการดำเนินการเพื่อค้นหาและรวบรวมลงใน ActionContext ด้วยวิธีนี้เมื่อคำขอมาถึงเราสามารถค้นหา ActionContext ที่เกี่ยวข้องตามที่อยู่คำขอและเรียกวิธีการโดยกลไกการสะท้อนกลับ
เราตั้งค่า Servlets สองตัว หนึ่งใช้เพื่อดำเนินการโปรแกรมการเริ่มต้น หนึ่งใช้ในการกรองคำขอการดำเนินการทั้งหมด
<servlet> <servlet> strutsinitservlet </servlet-name> <servlet-lass> com.bayern.struts.servletsinitservlet </servlet-class> .Bayern.struts.one </param-value> </init-param> <load-on-startup> 10 </load-startup>> <servlet-name> dispatcherservlet </servlet-name> <servlet-class> com.bayern.struts.one.servlet.dispatcherservlet </servlet-mapping </servlet-mapping> <servlet-name> dispatcherservlet </servlet-name> <url-pattern>* Servlet-mapping>
DispatchERServlet ใช้การกรองของคำขอการดำเนินการที่ใช้และช่วยให้สามารถดำเนินการวิธีการดำเนินการที่สอดคล้องกันและสร้างการกระโดดครั้งต่อไป
Ublic Void Dopost (Httpservletrequest Request, HttpservletResponse Response) พ่นบริการ); (การร้องขอ, ActionContext.getParamstype (), ActionContext.getActionParamsName ()); . -getAction (), Params); MAP <res)
ตอนนี้เราได้ใช้ฟังก์ชันการส่งต่อ Framework Framework ที่ง่ายที่สุด ฟังก์ชั่นนั้นหยาบมากและหลายกรณียังไม่ได้พิจารณา
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้