MVC模式
MVC 是一種分層開發的模式(軟體架構思想),其中:
- M:Model,業務模型,處理業務
- V:View,檢視,介面展示
- C:Controller,控制器,處理請求,呼叫模型和檢視
最典型的MVC就是JSP + servlet + javabean的模式,這裡使用此模式來說明,控制器(servlet)用來接收瀏覽器傳送過來的請求,控制器呼叫模型(JavaBean)來獲取資料,比如從資料庫查詢資料;控制器獲取到資料後再交由檢視(JSP)進行資料展示。
MVC 好處:
- 職責單一,互不影響。每個角色做它自己的事,各司其職。
- 有利於分工協作。
- 有利於元件重用
三層架構
在Java EE開發中,系統經典的三層架構包括表現層、業務層和持久層。三層架構中,每一層各司其職,表現層(Web層)負責接收客戶端請求,並向客戶端響應結果;業務層(Service層)負責業務邏輯處理,和專案需求息息相關;持久層(Dao層)負責和資料庫互動,對資料庫表進行增刪改查。
Spring MVC
Spring MVC作用於三層架構中的表現層,用於接收客戶端的請求並進行響應。Spring MVC中包含了控制器和檢視,控制器接收到客戶端的請求後對請求資料進行解析和封裝,接著將請求交給業務層處理。業務層會對請求進行處理,最後將處理結果返回給表現層。表現層接收到業務層的處理結果後,再由檢視對處理結果進行渲染,渲染完成後響應給客戶端。
spring mvc提供了 前端控制器DispatcherServlet,僅針對對客戶端的請求和響應進行統一 處理(就是說封裝了servlet),是個框架 。原先的Controller在實現本身的作用外(接收請求和響應瀏覽器外), 還需要呼叫View和Controller層。耦合嚴重。
Spring MVC入門程式
透過一個簡單的入門程式演示Spring MVC的使用。該程式要求在瀏覽器發起請求,由Spring MVC接收請求並響應,具體實現步驟如下。
(1)建立工程,配置POM檔案
<dependencies> <!--Spring 核心類--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!--Spring MVC--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.8.RELEASE</version> </dependency> <!-- servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--JSP--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> </dependencies> <!--構建--> <build> <!--設定外掛--> <plugins> <!--具體的外掛配置--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8080</port> <path>/chapter10</path> </configuration> </plugin> </plugins> </build>
(2)配置執行環境
在Run/Debug Configurations對話方塊中,單擊左上角的“+”按鈕,彈出Add New Configurations選單列表。
在Add New Configurations選單列表中,單擊左側選單中的“Maven”選項,進入Maven指令的配置介面。
(3)配置前端控制器
在專案的web.xml檔案中進行Spring MVC前端控制器的配置。
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 配置 Spring MVC 的前端控制器 --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!-- 配置初始化引數,用於讀取 Spring MVC 的配置檔案 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <!-- 應用載入時建立--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
(4)配置處理器對映資訊和檢視解析器
建立Spring MVC的配置檔案spring-mvc.xml,用於配置處理器對映資訊和檢視解析器。
<?xml version="1.0" encoding="UTF-8"?> <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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置 Spring MVC 要掃描的包 --> <context:component-scan base-package="controller"/> <!-- 配置檢視解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
(5)建立處理器
建立處理器FirstController類,用於處理客戶端的請求並指定響應時轉跳的頁面。
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; //設定當前類為處理器類 @Controller public class FirstController { //設定當前方法的訪問對映地址 @RequestMapping("/firstController") //設定當前方法返回值型別為 String,用於指定請求完成後跳轉的頁面 public String sayHello() { System.out.println("訪問到 FirstController!"); //設定具體跳轉的頁面 return "success"; } }
(6)建立檢視(View)頁面
建立名稱為page的資料夾,並在page資料夾下建立名稱為success的jsp檔案,用於對客戶端請求進行處理後的檢視展示。
<html> <body> <h2>Spring MVC FirstController!</h2> </body> </html>