หัวข้อกระโดดง่ายๆ
โดยส่วนตัวแล้วฉันขอแนะนำให้ฝึกกระบวนการก่อสร้างอีกครั้ง หากคุณรู้สึกลำบากคุณสามารถคัดลอกโครงการก่อนหน้าโดยตรง แต่คุณต้องแก้ไขข้อมูลเล็กน้อยใน pom.xml
<RoupID> com.hanpang.springmvc </groupid> <ratifactid> SpringMvc-DEMO01 </artifactId> <Sersion> 0.0.1-SNAPSHOT </Sersion>
1. คลาสการกำหนดค่าหลักและคลาสการโหลด
แพ็คเกจ com.hanpang.config; นำเข้า org.springframework.context.annotation.componentscan; นำเข้า org.springframework.context.annotation.configuration; org.springframework.web.servlet.config.annotation.enablewebmvc;@การกำหนดค่า@enablewebmvc@componentscan (basepackages = "com.hanpang.
แพ็คเกจ com.hanpang.config; นำเข้า org.springframework.web.servlet.support.abstractannotationconfigdispatcherservletinitializer; webinitializer ระดับสาธารณะ {webConfig.class}; } @Override คลาสที่ได้รับการปกป้อง <?> [] getServletConfigClasses () {return null; } @Override String ที่ได้รับการป้องกัน [] GetSerVletMappings () {ส่งคืนสตริงใหม่ [] {"/"}; -2. วิธีการกระโดดเวที Javaweb
โปรดทราบพารามิเตอร์ที่เป็นทางการในเมธอด SpringMVC เฟรมเวิร์กเสร็จสิ้นการดำเนินการอินสแตนซ์สำหรับเรา
แพ็คเกจ com.hanpang.web; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletresponse org.springframework org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.servlet.modelandview; @controller // บอกว่ามันเป็นตัวควบคุมคลาสสาธารณะ คำขอ, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {system.out.println ("พารามิเตอร์ที่เป็นทางการถูกสร้างอินสแตนซ์โดยค่าเริ่มต้น"); request.getRequestDispatcher ("/web-inf/jsp/demo01.jsp"). forward (คำขอ, การตอบกลับ); คืนค่า null; } @RequestMapping (path = "/test02") โมเดลสาธารณะและวิววิวแบบดั้งเดิมแบบดั้งเดิม jump_redirect (คำขอ httpservletrequest, การตอบสนอง httpservletResponse) โยน ioexception {system.out.println ("พารามิเตอร์ที่เป็นทางการ Response.sendredirect (request.getContextPath ()+"/view/result01.jsp"); คืนค่า null; - หมายเหตุ: เราแทบจะไม่ใช้วิธีนี้อีกต่อไปเพียงการสาธิตและการตรวจสอบอย่างง่าย ๆ อย่างน้อยเราก็สามารถใช้วิธีนี้เพื่อรับ Servlet API !!!
3. แสดงให้เห็นว่าคอนโทรลเลอร์กระโดดไปยัง JSP ได้อย่างไร
ในตอนท้ายของตัวอย่างเราจะเพิ่มตัวแยกวิเคราะห์ JSP View ในตอนแรกเราจะยังคงทำตามวิธีการดั้งเดิมและมีกระบวนการทีละขั้นตอน
แพ็คเกจ com.hanpang.web; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletresponse org.springframework org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.servlet.modelandview; @คอนโทรลเลอร์ // บอกว่ามันเป็นตัวควบคุมระดับสาธารณะ ใหม่และวิวทิวทัศน์ (); mav.setViewName ("/web-inf/jsp/demo01.jsp"); กลับมา mav; } @RequestMapping (path = "/test04") โมเดลสาธารณะและวิวทิวทัศน์ตั้งค่าวิธีการเปลี่ยนเส้นทาง () {modelandView mav = new ModelAndView (); mav.setViewName ("เปลี่ยนเส้นทาง: /view/result01.jsp"); // หรือ //mav.setViewName(urlbasedViewResolver.redirect_url_prefix+"/view/result01.jsp "); กลับมา mav; - มันให้ความรู้สึกเหมือนวิธี Java Web Stage แต่มีคำนำหน้าง่าย ๆ ถูกตั้งค่าระหว่างการเปลี่ยนเส้นทาง
4. แสดงให้เห็นว่าคอนโทรลเลอร์กระโดดไปที่คอนโทรลเลอร์ได้อย่างไร
คล้ายกับการโทรจาก servlet หนึ่งไปยังอีก servlet
แพ็คเกจ com.hanpang.web; นำเข้า java.io.ioexception; นำเข้า Javax.servlet.servletexception; นำเข้า javax.servlet.http.httpservletrequest นำเข้า javax.servlet.http.httpservletresponse org.springframework org.springframework.web.bind.annotation.requestmapping; นำเข้า org.springframework.web.servlet.modelandview; @controller // บอกว่ามันเป็นตัวควบคุมคลาสสาธารณะ Demo01Controller ModelAndView (); mav.setViewName ("/test03"); กลับมา mav; } @RequestMapping (path = "/test06") โมเดลสาธารณะและการเปลี่ยนเส้นทางชุด () {modelandView mav = new ModelAndView (); mav.setViewName ("เปลี่ยนเส้นทาง:/test04"); กลับมา mav; - 5. เพิ่ม JSP View Parser
ในระหว่างการสาธิตข้างต้นเราพบว่า SetViewName ใน ModelAndView ใช้เพื่อการกระโดด ข้อมูลที่ส่งผ่านที่นี่เป็นสตริง แต่วิธีการประมวลผลแตกต่างกัน เมื่อเส้นทางกระโดดถูกนำไปเปลี่ยนเส้นทาง:, วิธีการประมวลผลแตกต่างกัน
นอกจากนี้หากเรามีหลายสตริงคล้ายกับ /web-inf/jsp/demo01.jsp เราพบว่ามีส่วนสาธารณะมากมาย SpringMVC ให้ชั้นเรียนที่เชี่ยวชาญในการจัดการคำขอคอนโทรลเลอร์ส่งต่อหน้า JSP
โปรดทราบคำอธิบายของฉัน: หากคุณพบว่าสตริงที่คุณผ่านไม่มีตัวระบุคำนำหน้าใด ๆ จากนั้นโดยค่าเริ่มต้นให้ใช้ตัวแยกวิเคราะห์การกำหนดค่า JSP View เพื่อจัดการและดำเนินการส่งต่อการร้องขอให้เสร็จสมบูรณ์
หมายเหตุ: กำหนดค่าคลาสการกำหนดค่าหลัก
แพ็คเกจ com.hanpang.config; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.componentscan; นำเข้า org.springframework.context.annotation.code org.springframework. org.springframework.web.servlet.config.annotation.enablewebmvc; นำเข้า org.springframework.web.servlet.view.internalresourceviewResolver; org.springframework.web.servlet.view.jstlview;@configuration@enablewebmvc@componentscan (basepackages = "com.hanpang. **. web") ชั้นเรียนสาธารณะ webconfig {@bean // InternalResourceViewResolver (); jspviewResolver.setViewClass (jstlView.class); // springmvc รองรับแท็ก JSTL jspviewResolver.setPrefix ("/web-inf/"); jspviewResolver.setSuffix (". jsp"); ส่งคืน JSPViewResolver; - ** หมายเหตุ: ** โปรดให้ความสนใจกับคำอธิบายประกอบในวิธี @Bean
วิธีนี้เทียบเท่ากับรหัสใน XML ดังนี้
<bean id = "jspresourceviewResolver"> <property name = "คำนำหน้า" value = "/web-inf/"/> <property name = "suffix" value = ". jsp"/> <property name = "viewclass" value = "org.springframework.web.servlet.view
ปรับปรุงรหัส Jump JSP คอนโทรลเลอร์
ตัวแยกวิเคราะห์มุมมองนี้สามารถส่งต่อคำขอ JSP เท่านั้นและไม่ถูกต้องสำหรับการเปลี่ยนเส้นทาง โปรดใส่ใจกับเนื้อหาความคิดเห็นของรหัส
@RequestMapping (path = "/test03") public modelandView โดยค่าเริ่มต้นจะมีการร้องขอการส่งต่อ () {modelandView mav = new ModelandView (); //mav.setViewName("/web-inf/jsp/demo01.jsp "); // ขั้นสูง: โดยค่าเริ่มต้นมันจะได้รับการจัดการโดยใช้ JSP View Parser, // คำนำหน้า+"jsp/demo01"+คำต่อท้าย => /web-inf/jsp/demo01.jsp mav.setViewName ("jsp/demo01"); // ฉันพบว่าสตริงไม่มีคำนำหน้าการดัดแปลงส่งคืน MAV; } @RequestMapping (path = "/test04") โมเดลสาธารณะและวิวทิวทัศน์ตั้งค่าวิธีการเปลี่ยนเส้นทาง () {modelandView mav = new ModelAndView (); // ตัวแยกวิเคราะห์ไม่ได้เปลี่ยนเส้นทาง mav.setViewName ("เปลี่ยนเส้นทาง: /view/result01.jsp"); กลับมา mav; - ปรับปรุงรหัสคอนโทรลเลอร์กระโดดคอนโทรลเลอร์
@RequestMapping (path = "/test05") public modelandView ตั้งค่าเส้นทางการแมปโดยตรง () {modelandView mav = new ModelAndView (); mav.setViewName ("/test03"); ส่งคืน mav;}หลังจากกำหนดค่า JSP View Parser ให้ทดสอบรหัสด้านบนอีกครั้งและดูผลลัพธ์การเข้าถึงด้วยความประหลาดใจ
มันสอดคล้องกับสิ่งที่เราพูดก่อนหน้า "/test03" เป็นสตริงที่จะประมวลผลโดยค่าเริ่มต้นโดยใช้ตัวแยกวิเคราะห์มุมมอง JSP แล้วจะปรับปรุงได้อย่างไร?
คุณสามารถตั้งค่าคำนำหน้า "ไปข้างหน้า:" และรหัสได้รับการปรับปรุงดังนี้:
@RequestMapping (path = "/test05") public modelandView ตั้งค่าเส้นทางการแมปโดยตรง () {modelandView mav = new ModelAndView (); mav.setViewName ("ส่งต่อ:/test03"); // หรือ //mav.setViewName(urlbasedViewResolver.forward_url_prefix+"/test03 "); ส่งคืน mav;} เมื่อพบว่าสตริงจะถูกแก้ไขด้วยการส่งต่อ:, สถานการณ์การประมวลผลเปลี่ยนไปเพื่อแปลงจากคำขอคอนโทรลเลอร์เป็นคอนโทรลเลอร์อื่น หากดำเนินการเปลี่ยนเส้นทางรหัสมีดังนี้:
@RequestMapping (path = "/test06") public modelandView set redirect () {modelandView mav = new modelandView (); mav.setViewName ("เปลี่ยนเส้นทาง:/test04"); ส่งคืน mav;} 6. ภาคผนวก InternalresourceViewResolver ภาคผนวก
InternalResourceViewResolver: มันเป็นคลาสย่อยของ urlbasedViewResolver ดังนั้นจึงรองรับคุณสมบัติทั้งหมดที่รองรับโดย URLBAsedViewResolver
ในการใช้งานจริง InternalResourceViewResolver ยังเป็นตัวแก้ไขมุมมองที่ใช้กันอย่างแพร่หลายมากที่สุด ดังนั้นคุณสมบัติที่เป็นเอกลักษณ์ของ InternalResourceViewResolver คืออะไร?
จากมุมมองที่แท้จริงเราสามารถตีความ InternalResourceViewResolver เป็นตัวแก้ไขมุมมองทรัพยากรภายใน นี่คือคุณสมบัติของ InternalResourceViewResolver
InternalResourceViewResolver จะแก้ไขชื่อมุมมองที่ส่งคืนลงในวัตถุ InternalResourceView InternalResourceView จะจัดเก็บแอตทริบิวต์ของโมเดลที่ส่งคืนโดยวิธีโปรเซสเซอร์คอนโทรลเลอร์ในแอตทริบิวต์คำขอที่สอดคล้องกันจากนั้นเปลี่ยนเส้นทางการร้องขอไปยัง URL เป้าหมายทางฝั่งเซิร์ฟเวอร์ผ่าน RequestDispatcher
ตัวอย่างเช่นใน InternalResourceViewResolver, prefix =/web-inf/, affix = .jsp ถูกกำหนดใน InternalResourceViewResolver จากนั้นชื่อมุมมองที่ส่งคืนโดยวิธีโปรเซสเซอร์คอนโทรลเลอร์ที่ร้องขอคือการทดสอบ ในเวลานี้ InternalResourceViewResolver จะแยกวิเคราะห์การทดสอบลงในวัตถุ InternalResourceView ก่อนอื่นจัดเก็บแอตทริบิวต์โมเดลที่ส่งคืนในแอตทริบิวต์ httpservletRequest ที่สอดคล้องกันจากนั้นใช้ requestDispatcher เพื่อส่งต่อคำขอไปยัง /web-inf/test.jsp บนฝั่งเซิร์ฟเวอร์ นี่เป็นคุณสมบัติที่สำคัญมากของ InternalResourceViewResolver เราทุกคนรู้ว่าเนื้อหาที่เก็บไว้ใน / web-inf / ไม่สามารถขอโดยตรงผ่านคำขอคำขอ ด้วยเหตุผลด้านความปลอดภัยเรามักจะวางไฟล์ JSP ในไดเรกทอรี Web-Inf และวิธีที่ InternalResourceView กระโดดบนฝั่งเซิร์ฟเวอร์สามารถแก้ปัญหานี้ได้ดี ด้านล่างนี้เป็นคำจำกัดความของ InternalResourceViewResolver ตามคำจำกัดความนี้เมื่อชื่อมุมมองเชิงตรรกะที่ส่งคืนคือการทดสอบ InternalResourceViewResolver จะเพิ่มคำนำหน้าและคำต่อท้ายที่กำหนดไว้ในรูปแบบ "/web-inf/test.jsp" จากนั้นใช้เป็น Url ภายในแหล่งข้อมูลภายในเพื่อสร้างวัตถุภายในตัวใหม่
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น