ฤดูใบไม้ผลิ - ภาพรวมกรอบ 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 คุณสามารถมีแอตทริบิวต์หลายรายการที่จะแสดงในมุมมองของคุณ