Spring - Tổng quan về khung MVC

Khung công tác Spring Web MVC cung cấp kiến ​​trúc mô hình-view-controller và các thành phần sẵn sàng có thể được sử dụng để phát triển các ứng dụng web linh hoạt và được kết hợp lỏng lẻo. Mô hình MVC dẫn đến việc tách biệt các khía cạnh khác nhau của ứng dụng (logic đầu vào, logic nghiệp vụ và logic giao diện người dùng), đồng thời cung cấp sự kết hợp lỏng lẻo giữa các phần tử này.

  • Các Model đóng gói dữ liệu ứng dụng và nói chung, chúng sẽ bao gồm POJO.

  • Các View chịu trách nhiệm hiển thị dữ liệu mô hình và nói chung, nó tạo ra HTML đầu ra mà trình duyệt của khách hàng có thể hiểu.

  • Các Controller chịu trách nhiệm xử lý User RequestsBuilding Appropriate Model và chuyển nó sang dạng xem để kết xuất.

The DispatcherServlet

Khung công tác mô hình-view-controller (MVC) của Spring Web được thiết kế xung quanh DispatcherServlet để xử lý tất cả các yêu cầu và phản hồi HTTP. Quy trình xử lý yêu cầu của Spring Web MVC DispatcherServlet được hiển thị trong hình minh họa sau.

Sau đây là chuỗi các sự kiện tương ứng với một yêu cầu HTTP đến DispatcherServlet:

  • Sau khi nhận được một yêu cầu HTTP, DispatcherServlet sẽ tư vấn cho HandlerMapping để gọi Bộ điều khiển thích hợp.

  • Bộ điều khiển nhận yêu cầu và gọi các phương thức dịch vụ thích hợp dựa trên GET hoặc là POST method. Phương thức dịch vụ sẽ thiết lập dữ liệu mô hình dựa trên logic nghiệp vụ đã xác định và trả về tên chế độ xem cho DispatcherServlet.

  • DispatcherServlet sẽ nhận trợ giúp từ ViewResolver để chọn chế độ xem đã xác định cho yêu cầu.

  • Sau khi hoàn tất chế độ xem, DispatcherServlet chuyển dữ liệu mô hình sang chế độ xem, cuối cùng được hiển thị trên trình duyệt.

Tất cả các thành phần được đề cập ở trên, tức là HandlerMapping, Controller và ViewResolver là các phần của WebApplicationContext, là phần mở rộng của đồng bằng ApplicationContext với một số tính năng bổ sung cần thiết cho các ứng dụng web.

Cấu hình yêu cầu

Chúng tôi cần ánh xạ các yêu cầu mà bạn muốn DispatcherServlet xử lý, bằng cách sử dụng ánh xạ URL trong web.xmltập tin. Sau đây là một ví dụ để hiển thị khai báo và ánh xạ choHelloWeb 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>

Các web.xml tệp sẽ được giữ trong WebContent/WEB-INFthư mục của ứng dụng web của bạn. Khi khởi tạoHelloWeb DispatcherServlet, khung công tác sẽ cố gắng tải ngữ cảnh ứng dụng từ một tệp có tên [servlet-name]-servlet.xmlnằm trong thư mục WebContent / WEB-INF của ứng dụng. Trong trường hợp này, tệp của chúng tôi sẽHelloWeb-servlet.xml.

Tiếp theo, <servlet-mapping>cho biết URL nào sẽ được xử lý bởi DispatcherServlet nào. Tại đây, tất cả các yêu cầu HTTP kết thúc bằng .jsp sẽ được xử lý bởiHelloWeb DispatcherServlet.

Nếu bạn không muốn sử dụng tên tệp mặc định là [servlet-name]-servlet.xml và vị trí mặc định là WebContent / WEB-INF, bạn có thể tùy chỉnh tên và vị trí tệp này bằng cách thêm trình nghe servlet ContextLoaderListener trong tệp web.xml của bạn như sau:

<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>

Bây giờ, hãy để chúng tôi kiểm tra cấu hình cần thiết cho HelloWeb-servlet.xml , được đặt trong thư mục WebContent / WEB-INF của ứng dụng web của bạn.

<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>

Sau đây là một số điểm quan trọng về HelloWeb-servlet.xml tập tin -

  • Các [servlet-name]-servlet.xml tệp sẽ được sử dụng để tạo các bean được định nghĩa, ghi đè các định nghĩa của bất kỳ bean nào được xác định có cùng tên trong phạm vi toàn cục.

  • Các <context:component-scan...> sẽ được sử dụng để kích hoạt khả năng quét chú thích Spring MVC, cho phép sử dụng các chú thích như @Controller@RequestMapping, Vân vân.

  • Các InternalResourceViewResolversẽ có các quy tắc được xác định để giải quyết các tên chế độ xem. Theo quy tắc được xác định ở trên, một chế độ xem logic có tênhello được ủy quyền triển khai chế độ xem tại /WEB-INF/jsp/hello.jsp.

Bây giờ chúng ta hãy hiểu cách tạo các thành phần thực tế, tức là Controller, Model và View.

Xác định Bộ điều khiển

DispatcherServlet ủy quyền yêu cầu cho bộ điều khiển để thực thi chức năng cụ thể cho nó. Các@Controllerchú thích chỉ ra rằng một lớp cụ thể đóng vai trò của bộ điều khiển. Các@RequestMapping chú thích được sử dụng để ánh xạ một URL tới toàn bộ một lớp hoặc một phương thức xử lý cụ thể.

@Controller
@RequestMapping("/hello")
public class HelloController{
 
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

Các @Controllerchú thích định nghĩa lớp như một bộ điều khiển Spring MVC. Đây, cách sử dụng đầu tiên của@RequestMapping chỉ ra rằng tất cả các phương pháp xử lý trên bộ điều khiển này liên quan đến /hello con đường.

Chú thích tiếp theo @RequestMapping (method = RequestMethod.GET) được sử dụng để khai báo printHello()làm phương thức dịch vụ mặc định của bộ điều khiển để xử lý yêu cầu HTTP GET. Chúng tôi có thể xác định một phương thức khác để xử lý bất kỳ yêu cầu POST nào tại cùng một URL.

Chúng ta cũng có thể viết bộ điều khiển ở trên ở một dạng khác, nơi chúng ta có thể thêm các thuộc tính bổ sung trong @RequestMapping như sau:

@Controller
public class HelloController{
 
   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

Các value thuộc tính chỉ ra URL mà phương thức xử lý được ánh xạ tới và method thuộc tính xác định phương thức dịch vụ để xử lý yêu cầu HTTP GET.

Sau đây là một số điểm quan trọng cần lưu ý về bộ điều khiển được xác định ở trên:

  • Bạn sẽ xác định logic nghiệp vụ cần thiết bên trong một phương thức dịch vụ. Bạn có thể gọi một phương thức khác bên trong phương thức này theo yêu cầu.

  • Dựa trên logic nghiệp vụ được xác định, bạn sẽ tạo một mô hình trong phương pháp này. Bạn có thể đặt các thuộc tính mô hình khác nhau và các thuộc tính này sẽ được chế độ xem truy cập để trình bày kết quả. Ví dụ này tạo một mô hình với thuộc tính "message" của nó.

  • Một phương thức dịch vụ đã xác định có thể trả về một Chuỗi, chứa tên của viewđược sử dụng để kết xuất mô hình. Ví dụ này trả về "hello" làm tên dạng xem logic.

Tạo chế độ xem JSP

Spring MVC hỗ trợ nhiều kiểu xem cho các công nghệ trình chiếu khác nhau. Bao gồm các -JSPs, HTML, PDF, Excel Worksheets, XML, Velocity Templates, XSLT, JSON, AtomRSS nguồn cấp dữ liệu, JasperReports, v.v. Tuy nhiên, những cái phổ biến nhất là các mẫu JSP được viết bằng JSTL. Vì vậy, chúng ta hãy viết một dạng xem xin chào đơn giản trong /WEB-INF/hello/hello.jsp -

<html>
   <head>
      <title>Hello Spring MVC</title>
   </head>
   <body>
      <h2>${message}</h2>
   </body>
</html>

Đây ${message}Đây là thuộc tính mà chúng tôi đã thiết lập bên trong Bộ điều khiển. Bạn có thể có nhiều thuộc tính được hiển thị bên trong chế độ xem của mình.