ฤดูใบไม้ผลิ - กรอบ MVC
เฟรมเวิร์ก Spring Web MVC มีสถาปัตยกรรม Model-View-Controller (MVC) และส่วนประกอบที่พร้อมใช้งานเพื่อพัฒนาเว็บแอปพลิเคชันที่ยืดหยุ่นและทำงานร่วมกันอย่างหลวม ๆ รูปแบบ MVC ส่งผลให้เกิดการแยกแง่มุมต่างๆของแอปพลิเคชัน (ตรรกะอินพุตตรรกะทางธุรกิจและตรรกะ UI) ในขณะที่ให้การเชื่อมต่อแบบหลวม ๆ ระหว่างองค์ประกอบเหล่านี้
Model ห่อหุ้มข้อมูลแอปพลิเคชันและโดยทั่วไปจะประกอบด้วย POJO
View รับผิดชอบในการแสดงผลข้อมูลแบบจำลองและโดยทั่วไปจะสร้างเอาต์พุต HTML ที่เบราว์เซอร์ของไคลเอ็นต์สามารถตีความได้
Controller รับผิดชอบในการประมวลผลคำขอของผู้ใช้และสร้างแบบจำลองที่เหมาะสมและส่งต่อไปยังมุมมองสำหรับการแสดงผล
DispatcherServlet
เฟรมเวิร์ก Spring Web model-view-controller (MVC) ได้รับการออกแบบโดยใช้DispatcherServletที่จัดการคำขอและการตอบกลับ HTTP ทั้งหมด ขั้นตอนการประมวลผลคำร้องขอของ Spring Web MVC DispatcherServletแสดงในแผนภาพต่อไปนี้ -
ต่อไปนี้เป็นลำดับของเหตุการณ์ที่สอดคล้องกับการร้องขอ HTTP ขาเข้าไปยังDispatcherServlet -
หลังจากได้รับการร้องขอ HTTP, DispatcherServletคำปรึกษาHandlerMappingจะเรียกที่เหมาะสมควบคุม
ควบคุมจะใช้เวลาการร้องขอและเรียกวิธีการบริการที่เหมาะสมขึ้นอยู่กับการรับใช้หรือวิธีการ POST วิธีการบริการจะกำหนดรูปแบบข้อมูลที่อยู่บนพื้นฐานของตรรกะทางธุรกิจที่กำหนดและผลตอบแทนที่ดูชื่อไป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-INFdirectory ของแอปพลิเคชัน ในกรณีนี้ไฟล์ของเราจะเป็นHelloWebservlet.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 ใด ๆ ที่กำหนดด้วยชื่อเดียวกันในขอบเขตส่วนกลาง
<บริบท: องค์ประกอบสแกน ... >แท็กจะใช้เพื่อเปิดใช้งานความสามารถในการสแกนคำอธิบายประกอบฤดูใบไม้ผลิ 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)ใช้เพื่อประกาศเมธอด theprintHello () เป็นวิธีการบริการเริ่มต้นของคอนโทรลเลอร์เพื่อจัดการคำขอ 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 ประเด็นสำคัญต่อไปนี้ควรสังเกตเกี่ยวกับคอนโทรลเลอร์ที่กำหนดไว้ข้างต้น -
คุณจะกำหนดตรรกะทางธุรกิจที่จำเป็นภายในวิธีการบริการ คุณสามารถเรียกใช้วิธีอื่นในวิธีนี้ได้ตามข้อกำหนด
ตามตรรกะทางธุรกิจที่กำหนดไว้คุณจะสร้างแบบจำลองภายในวิธีนี้ คุณสามารถใช้ setter แอตทริบิวต์โมเดลที่แตกต่างกันและคุณสมบัติเหล่านี้จะเข้าถึงได้โดยมุมมองเพื่อนำเสนอผลลัพธ์สุดท้าย ตัวอย่างนี้สร้างโมเดลที่มีแอตทริบิวต์ "message"
วิธีการบริการที่กำหนดสามารถส่งคืนสตริงซึ่งมีชื่อของ viewเพื่อใช้ในการแสดงผลแบบจำลอง ตัวอย่างนี้คืนค่า "hello" เป็นชื่อมุมมองเชิงตรรกะ
การสร้างมุมมอง JSP
Spring MVC รองรับมุมมองหลายประเภทสำหรับเทคโนโลยีการนำเสนอที่แตกต่างกัน ซึ่งรวมถึง - JSPs, HTML, PDF, แผ่นงาน Excel, XML, เทมเพลต Velocity, XSLT, JSON, Atom และฟีด RSS, JasperReports เป็นต้น แต่โดยทั่วไปเราใช้เทมเพลต JSP ที่เขียนด้วย JSTL
ให้เราเขียนง่ายๆ hello ดูใน /WEB-INF/hello/hello.jsp -
<html>
<head>
<title>Hello Spring MVC</title>
</head>
<body>
<h2>${message}</h2>
</body>
</html>
ที่นี่ ${message}เป็นแอตทริบิวต์ที่เราได้ตั้งค่าไว้ใน Controller คุณสามารถมีแอตทริบิวต์หลายรายการที่จะแสดงในมุมมองของคุณ
ตัวอย่างกรอบงาน Spring Web MVC
ตามแนวคิดข้างต้นให้เราตรวจสอบตัวอย่างที่สำคัญบางส่วนซึ่งจะช่วยคุณในการสร้าง Spring Web Applications ของคุณ -
ซีเนียร์ | ตัวอย่างและคำอธิบาย |
---|---|
1 | ตัวอย่าง Spring MVC Hello World ตัวอย่างนี้จะอธิบายวิธีการเขียนแอปพลิเคชัน Spring Web Hello World อย่างง่าย |
2 | ตัวอย่างการจัดการแบบฟอร์ม Spring MVC ตัวอย่างนี้จะอธิบายวิธีการเขียนแอปพลิเคชัน Spring Web โดยใช้แบบฟอร์ม HTML เพื่อส่งข้อมูลไปยังคอนโทรลเลอร์และแสดงผลลัพธ์ที่ประมวลผล |
3 | ตัวอย่างการเปลี่ยนเส้นทาง Spring Page เรียนรู้วิธีใช้ฟังก์ชันการเปลี่ยนเส้นทางเพจใน Spring MVC Framework |
4 | ตัวอย่าง Spring Static Pages เรียนรู้วิธีเข้าถึงเพจแบบคงที่พร้อมกับเพจแบบไดนามิกใน Spring MVC Framework |
5 | ตัวอย่างการจัดการข้อยกเว้นสปริง เรียนรู้วิธีจัดการข้อยกเว้นใน Spring MVC Framework |