คำนำ
ฉันพบปัญหาดังกล่าวในงานของฉันเมื่อวันก่อนเมื่อวาน ฉันห่อหุ้ม pojo ในพารามิเตอร์อินเตอร์เฟส นี่เป็นเรื่องธรรมดามาก เมื่อมีพารามิเตอร์มากมายการคิดแบบเฉื่อยคือการห่อหุ้ม pojo จากนั้นมีคำอธิบายประกอบจำนวนมากที่จะเพิ่มก่อนพารามิเตอร์เช่น: @requestparam, @requestbody, @PathVariable ฯลฯ ความเข้าใจของฉันเป็นเช่นนี้ ก่อนอื่นฉันจะระบุว่าฉันไม่เคยอ่านซอร์สโค้ด แต่ฉันแค่เข้าใจมันขึ้นอยู่กับประสบการณ์ @RequestParam พยายามใช้สำหรับคำขอรับ พารามิเตอร์อยู่บน URL ในส่วนหัวของ HTTP สถานที่เฉพาะคืออะไร? มีอยู่ในรูปแบบของคีย์ = ค่า @RequestBody ใช้กับพารามิเตอร์การร้องขอโพสต์ในตัว HTTP @PathVariable นั้นเป็นวิธีการเขียนของการพักผ่อน ใส่พารามิเตอร์บน URL โดยไม่มีเครื่องหมายคำถามเพื่อแยกแยะว่าเป็นพารามิเตอร์หรือ URL บางทีฉันอาจไม่แม่นยำมากที่จะพูดแบบนี้ แต่ฉันมักจะใช้มันด้วยวิธีนี้ ในขณะเดียวกันก็มีวิธีทั่วไปในการเขียนพารามิเตอร์ซึ่งจะไม่เพิ่มคำอธิบายประกอบก่อนพารามิเตอร์ ตัวอย่างเช่นหากพารามิเตอร์เป็นประเภทพื้นฐานอย่าเพิ่ม @RequestParam และหากพารามิเตอร์เป็นถั่วอย่าเพิ่ม RequestBody พวกเขายังสามารถแยกวิเคราะห์ได้โดย SpringMVC หลังจากหัวหน้าทีมของฉันเห็นอินเทอร์เฟซเขาขอให้ฉันลบ @requestbody เพราะหลังจากเพิ่มสิ่งนี้ลงในแบ็กเอนด์คำขอ AJAX ที่ส่วนหน้าต้องแสดงประเภทเนื้อหาคำสั่ง: "แอปพลิเคชัน/JSON" ที่จะแยกวิเคราะห์โดย SpringMVC ซึ่งดูเหมือนว่าจะทำสิ่งที่ไม่จำเป็น แม้ว่าฉันจะลบออกตามความต้องการของเขา แต่ฉันคิดว่าฉันต้องคิดออกว่าเกิดอะไรขึ้นความแตกต่างระหว่างการเพิ่มหรือไม่เพิ่มสิ่งที่ส่งผลกระทบต่อประสิทธิภาพหรือสถานการณ์ที่ดีที่สุดสำหรับแต่ละสถานการณ์ นอกจาก Baidu แล้วฉันยังต้องถามอาจารย์ด้วย
กระบวนการวิเคราะห์พารามิเตอร์อินเตอร์เฟสสปริง MVC
ก่อนอื่นฉันค่อยๆศึกษาซอร์สโค้ดผ่านการดีบัก โดยไม่ต้องเพิ่มคำอธิบายประกอบใด ๆ :
ในระหว่างกระบวนการพัฒนาการบริโภคและการผลิตโดยทั่วไปจะไม่เพิ่ม ควรเพิ่มตามนั้นเนื่องจากสามารถลดช่วงการค้นหาของอินเทอร์เฟซ นี่คือตัวอย่างง่ายๆฉันแค่ต้องการให้เขาตรวจสอบกระบวนการของ SpringMVC ที่ได้รับคำขอ
ครั้งแรกหลังจาก Tomcat เริ่มต้นเส้นทางการร้องขอในคลาสคอนโทรลเลอร์ทั้งหมดคือ @requestmapping และถั่วคอนโทรลเลอร์จะถูกโหลดลงในคอนเทนเนอร์สปริง หลังจากคำขอของหน้ามาถึงจะพบ servlet dispatcherservlet หลังจากคำขอมาถึง Servlet ทุกคนรู้ว่ามีวิธีการเริ่มต้นสองวิธีของ servlet หนึ่งคือการโหลดทันทีและอื่น ๆ คือการโหลดล่าช้า อย่างไรก็ตามไม่ว่าจะเกิดอะไรขึ้นวิธีการเริ่มต้นเท่านั้นที่เรียกว่าครั้งเดียวเท่านั้นและจากนั้นวิธีการบริการจะถูกเรียกโดยตรงทุกครั้ง เมื่อปิด Tomcat วิธีการทำลายของ servlet จะสิ้นสุดลง ดังนั้นการห่อหุ้ม SpringMVC ของ servlet จะต้องสืบทอดวิธีการบริการและ dispatcherservlet ยังเป็นวิธี Dodispatch ในวิธีนี้เส้นทางการร้องขอจะได้รับโดยใช้วัตถุ httpservletrequest ซึ่งเป็น /notjson จากนั้นเปรียบเทียบกับ URL ทั้งหมดในคอนเทนเนอร์เพื่อให้ได้อินเทอร์เฟซในคอนโทรลเลอร์ในที่สุด หลังจากค้นหาอินเทอร์เฟซคุณจะรู้พารามิเตอร์ของอินเทอร์เฟซโดยธรรมชาติ ที่นี่ฉันแสดง เพื่อความสะดวกและความเรียบง่ายมีเพียงสองพารามิเตอร์ในการแสดงผลซึ่งเป็นสองในคำขอ AJAX ด้านล่าง
SpringMVC จะได้รับคุณสมบัติใน POJO ผ่านการสะท้อน ในกระบวนการนี้ SpringMVC จะประกาศอาร์เรย์ก่อน ขนาดของอาร์เรย์นี้คือจำนวนพารามิเตอร์ ฉันมีเพียงหนึ่งที่นี่ อันที่จริงฉันเชื่อว่าหลายคนจะประสบปัญหาเช่นเดียวกับฉัน เมื่อพารามิเตอร์ของถั่วและประเภทพื้นฐานมีอยู่ในเวลาเดียวกัน SpringMVC จะแยกวิเคราะห์สิ่งนี้ได้อย่างไร ฉันได้พบกับเรื่องนี้หลายครั้ง โดยไม่ต้องดูซอร์สโค้ดประเภทพื้นฐานจะถูกห่อหุ้มไว้ในถั่วและส่วนหน้าจะเขียนแอตทริบิวต์ในวัตถุ แน่นอนฉันเชื่อว่านี่เป็นสิ่งที่ทุกคนไม่สามารถยอมรับได้ เราทุกคนหวังว่าจะวิเคราะห์ว่ามันวิเคราะห์อย่างไรเพื่อให้เราสามารถเล่นซอในเวลานั้น ต่อไปนี้เป็นกระบวนการสะท้อน หลังจากสะท้อน Pojo ของฉันฉันได้รับคุณสมบัติและวิธีการภายใน หลังจากแยกวิเคราะห์พารามิเตอร์ให้กำหนดค่าให้กับพารามิเตอร์ นี่อาจเป็นสถานที่ที่สำคัญที่สุด ได้รับมอบหมายอย่างไร?
จากวิธีการดีบักวิธีนี้ฉันได้เรียนรู้ว่าชื่อคือจอแสดงผลซึ่งเป็นตัวพิมพ์เล็กของชื่อคลาส POJO ฉันไม่รู้ว่าทำไม SpringMVC จึงทำการประมวลผลนี้ (ดูในภายหลัง) แอตทริบิวต์เป็นวัตถุที่มีอายุและชื่อ แต่มันเป็นโมฆะทั้งหมดในเวลานี้ WebDatabinding เป็นข้อมูลพิเศษที่ใช้สำหรับการเชื่อมโยงข้อมูลจากพารามิเตอร์การร้องขอเว็บไปยังวัตถุ Javabean การติดตามวิธี BindRequestParameters คุณจะพบสถานที่ที่คุ้นเคยมากเมื่อติดตามเป็นรูปต่อไปนี้ ชื่อพารามิเตอร์ได้มาโดยใช้ String[] values = request.getParameterValues(paramName); นี่คือวิธีการรับพารามิเตอร์ของ servlet ดังนั้นคุณสามารถทราบชื่อแอตทริบิวต์และค่าแอตทริบิวต์ของพารามิเตอร์ที่ร้องขอ
ถัดไปเป็นไปได้ว่าชื่อพารามิเตอร์นี้จะถูกแทนที่ด้วยชื่อแอตทริบิวต์ของถั่วและอายุชื่อพารามิเตอร์จะถูกแทนที่ด้วยอายุชื่อแอตทริบิวต์ ติดตามสถานที่นี้ Oragina เป็นคู่ค่าชื่อคุณสมบัติที่ได้รับจาก Serclet ด้านบนแปลงแผนที่นี้เป็น PropertyValue ที่นี่ (PropertyValue เป็นวัตถุที่เก็บข้อมูลและค่าของคุณสมบัติถั่วเดี่ยวโดยใช้วัตถุที่นี่แทนที่จะจัดเก็บคุณสมบัติทั้งหมดในแผนที่ที่พิมพ์ด้วยชื่อคุณสมบัติช่วยให้มีความยืดหยุ่นมากขึ้นและความสามารถใน การจัดการคุณสมบัติที่จัดทำดัชนี ฯลฯ ในวิธีที่เหมาะสม วัตถุอสังหาริมทรัพย์
เมื่อแปลงคุณจะไม่สนใจคุณลักษณะที่ไม่รู้จัก
ภาพด้านบนแสดงวิธีการแปลงเฉพาะซึ่งค่อนข้างยาว ประโยคต่อไปนี้กำหนดค่าโดยตรงให้กับถั่ว จากกระบวนการนี้ ตราบใดที่คุณสมบัติของวัตถุ JSON front-end นั้นเหมือนกับคุณสมบัติถั่วของ back-end Ajax ไม่ได้เขียนประเภทเนื้อหาและใช้ application/x-www-form-urlencoded; charset=UTF-8 คุณสามารถกำหนดค่าโดยตรง
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com