ฤดูใบไม้ผลิ - กรอบ 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