ฤดูใบไม้ผลิ - ภาพรวมกรอบ MVC
เฟรมเวิร์ก Spring Web MVC มีสถาปัตยกรรม Model-view-controller และส่วนประกอบที่พร้อมใช้งานเพื่อพัฒนาเว็บแอปพลิเคชันที่ยืดหยุ่นและทำงานร่วมกันอย่างหลวม ๆ รูปแบบ MVC ส่งผลให้เกิดการแยกแง่มุมต่างๆของแอปพลิเคชัน (ตรรกะอินพุตตรรกะทางธุรกิจและตรรกะ UI) ในขณะที่ให้การเชื่อมต่อแบบหลวม ๆ ระหว่างองค์ประกอบเหล่านี้
Model ห่อหุ้มข้อมูลแอปพลิเคชันและโดยทั่วไปแล้วจะประกอบด้วย POJO.
View มีหน้าที่ในการแสดงผลข้อมูลแบบจำลองและโดยทั่วไปจะสร้างขึ้น HTML เอาต์พุตที่เบราว์เซอร์ของลูกค้าสามารถตีความได้
Controller รับผิดชอบในการประมวลผล User Requests และ Building Appropriate Model และส่งไปยังมุมมองสำหรับการแสดงผล
DispatcherServlet
เฟรมเวิร์ก Spring Web model-view-controller (MVC) ได้รับการออกแบบโดยใช้ DispatcherServlet ที่จัดการคำขอและการตอบกลับ HTTP ทั้งหมด ขั้นตอนการประมวลผลคำร้องขอของ Spring Web MVC DispatcherServlet แสดงในภาพประกอบต่อไปนี้
ต่อไปนี้เป็นลำดับของเหตุการณ์ที่สอดคล้องกับคำขอ HTTP ขาเข้าไปยัง DispatcherServlet -
หลังจากได้รับการร้องขอ HTTP DispatcherServlet ให้คำปรึกษา HandlerMapping เพื่อเรียกตัวควบคุมที่เหมาะสม
ผู้ควบคุมรับคำขอและเรียกใช้วิธีการบริการที่เหมาะสมตามที่ใช้ GET หรือ POST method. วิธีการบริการจะตั้งค่าข้อมูลแบบจำลองตามตรรกะทางธุรกิจที่กำหนดไว้และส่งคืนชื่อมุมมองไปยัง DispatcherServlet
DispatcherServlet จะรับความช่วยเหลือจาก ViewResolver เพื่อรับมุมมองที่กำหนดไว้สำหรับคำขอ
เมื่อดูเสร็จสิ้น DispatcherServlet จะส่งข้อมูลโมเดลไปยังมุมมองซึ่งในที่สุดก็แสดงผลบนเบราว์เซอร์
ส่วนประกอบที่กล่าวถึงข้างต้นทั้งหมดเช่น HandlerMapping, Controller และ ViewResolver เป็นส่วนของ WebApplicationContextซึ่งเป็นส่วนขยายของที่ราบ ApplicationContext พร้อมคุณสมบัติพิเศษบางอย่างที่จำเป็นสำหรับเว็บแอปพลิเคชัน
การกำหนดค่าที่จำเป็น
เราจำเป็นต้องแมปคำขอที่คุณต้องการให้ DispatcherServlet จัดการโดยใช้การแมป URL ในไฟล์ web.xmlไฟล์. ต่อไปนี้เป็นตัวอย่างเพื่อแสดงการประกาศและการแมปสำหรับHelloWeb DispatcherServlet -
<web-app id = "WebApp_ID" version = "2.4"
xmlns = "http://java.sun.com/xml/ns/j2ee"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Application</display-name>
<servlet>
<servlet-name>HelloWeb</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWeb</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
</web-app>
web.xml ไฟล์จะถูกเก็บไว้ในไฟล์ WebContent/WEB-INFไดเรกทอรีของเว็บแอปพลิเคชันของคุณ เมื่อเริ่มต้นไฟล์HelloWeb DispatcherServlet เฟรมเวิร์กจะพยายามโหลดบริบทของแอปพลิเคชันจากไฟล์ชื่อ [servlet-name]-servlet.xmlอยู่ในไดเรกทอรี WebContent / WEB-INF ของแอปพลิเคชัน ในกรณีนี้ไฟล์ของเราจะเป็นHelloWeb-servlet.xml.
ถัดไป <servlet-mapping>แท็กระบุว่า URL ใดที่จะจัดการโดย DispatcherServlet ที่นี่คำขอ HTTP ทั้งหมดที่ลงท้ายด้วย. jsp จะถูกจัดการโดยไฟล์HelloWeb DispatcherServlet
หากคุณไม่ต้องการใช้ชื่อไฟล์เริ่มต้นเป็น [servlet-name]-servlet.xml และตำแหน่งเริ่มต้นเป็น WebContent / WEB-INF คุณสามารถกำหนดชื่อไฟล์และตำแหน่งนี้เองได้โดยการเพิ่มตัวฟัง servlet ContextLoaderListener ในไฟล์ web.xml ของคุณดังนี้ -
<web-app...>
<!-------- DispatcherServlet definition goes here----->
....
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/HelloWeb-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
ตอนนี้ให้เราตรวจสอบการกำหนดค่าที่จำเป็นสำหรับ HelloWeb-servlet.xml วางไว้ในไดเรกทอรี WebContent / WEB-INF ของเว็บแอปพลิเคชันของคุณ
<beans xmlns = "http://www.springframework.org/schema/beans"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package = "com.tutorialspoint" />
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "prefix" value = "/WEB-INF/jsp/" />
<property name = "suffix" value = ".jsp" />
</bean>
</beans>
ต่อไปนี้เป็นประเด็นสำคัญบางประการเกี่ยวกับ HelloWeb-servlet.xml ไฟล์ -
[servlet-name]-servlet.xml ไฟล์จะถูกใช้เพื่อสร้าง bean ที่กำหนดโดยแทนที่คำจำกัดความของ bean ใด ๆ ที่กำหนดด้วยชื่อเดียวกันในขอบเขตส่วนกลาง
<context:component-scan...> แท็กจะถูกใช้เพื่อเปิดใช้งานความสามารถในการสแกนคำอธิบายประกอบ Spring MVC ซึ่งอนุญาตให้ใช้ประโยชน์จากคำอธิบายประกอบเช่น @Controller และ @RequestMappingฯลฯ
InternalResourceViewResolverจะมีกฎที่กำหนดไว้เพื่อแก้ไขชื่อมุมมอง ตามกฎที่กำหนดไว้ข้างต้นมุมมองเชิงตรรกะที่มีชื่อว่าhello ได้รับมอบหมายให้ใช้มุมมองซึ่งอยู่ที่ /WEB-INF/jsp/hello.jsp.
ตอนนี้ให้เราเข้าใจวิธีการสร้างส่วนประกอบจริงเช่นตัวควบคุมโมเดลและมุมมอง
การกำหนดคอนโทรลเลอร์
DispatcherServlet มอบหมายการร้องขอไปยังคอนโทรลเลอร์เพื่อดำเนินการฟังก์ชันเฉพาะสำหรับมัน @Controllerคำอธิบายประกอบบ่งชี้ว่าคลาสหนึ่ง ๆ ทำหน้าที่เป็นตัวควบคุม @RequestMapping คำอธิบายประกอบใช้เพื่อแมป URL กับทั้งคลาสหรือวิธีการจัดการเฉพาะ
@Controller
@RequestMapping("/hello")
public class HelloController{
@RequestMapping(method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
@Controllerคำอธิบายประกอบกำหนดคลาสเป็นตัวควบคุม Spring MVC นี่คือการใช้งานครั้งแรกของ@RequestMapping บ่งชี้ว่าวิธีการจัดการทั้งหมดบนคอนโทรลเลอร์นี้สัมพันธ์กับ /hello เส้นทาง.
คำอธิบายประกอบถัดไป @RequestMapping (method = RequestMethod.GET) ใช้เพื่อประกาศไฟล์ printHello()เป็นวิธีการบริการเริ่มต้นของคอนโทรลเลอร์เพื่อจัดการคำขอ HTTP GET เราสามารถกำหนดวิธีการอื่นเพื่อจัดการคำขอ POST ใด ๆ ที่ URL เดียวกัน
นอกจากนี้เรายังสามารถเขียนตัวควบคุมข้างต้นในรูปแบบอื่นซึ่งเราสามารถเพิ่มแอตทริบิวต์เพิ่มเติมใน @RequestMapping ได้ดังนี้ -
@Controller
public class HelloController{
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "Hello Spring MVC Framework!");
return "hello";
}
}
value แอตทริบิวต์ระบุ URL ที่จะแม็พเมธอดตัวจัดการและ method แอตทริบิวต์กำหนดวิธีการบริการเพื่อจัดการคำขอ HTTP GET
ต่อไปนี้เป็นประเด็นสำคัญที่ควรสังเกตเกี่ยวกับคอนโทรลเลอร์ที่ระบุไว้ข้างต้น -
คุณจะกำหนดตรรกะทางธุรกิจที่จำเป็นภายในวิธีการบริการ คุณสามารถเรียกใช้วิธีอื่นในวิธีนี้ได้ตามข้อกำหนด
ตามตรรกะทางธุรกิจที่กำหนดไว้คุณจะสร้างแบบจำลองภายในวิธีนี้ คุณสามารถตั้งค่าแอตทริบิวต์ของโมเดลที่แตกต่างกันและคุณสมบัติเหล่านี้จะเข้าถึงได้โดยมุมมองเพื่อนำเสนอผลลัพธ์ ตัวอย่างนี้สร้างโมเดลที่มีแอตทริบิวต์ "message"
วิธีการบริการที่กำหนดสามารถส่งคืนสตริงซึ่งมีชื่อของ viewเพื่อใช้ในการแสดงผลแบบจำลอง ตัวอย่างนี้คืนค่า "hello" เป็นชื่อมุมมองตรรกะ
การสร้างมุมมอง JSP
Spring MVC รองรับมุมมองหลายประเภทสำหรับเทคโนโลยีการนำเสนอที่แตกต่างกัน ซึ่ง ได้แก่ -JSPs, HTML, PDF, Excel Worksheets, XML, Velocity Templates, XSLT, JSON, Atom และ RSS ฟีด JasperReportsฯลฯ อย่างไรก็ตามเทมเพลตที่ใช้กันทั่วไปคือเทมเพลต JSP ที่เขียนด้วย JSTL ดังนั้นให้เราเขียนมุมมองสวัสดีง่ายๆใน /WEB-INF/hello/hello.jsp -
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
ที่นี่ ${message}นี่คือแอตทริบิวต์ที่เราได้ตั้งค่าไว้ใน Controller คุณสามารถมีแอตทริบิวต์หลายรายการที่จะแสดงในมุมมองของคุณ