一、三層架構
-
表現層(WEB 層)
-
定義 :是應用程序與客戶端進行交互的最外層,主要負責接收用戶的請求,并將處理結果顯示給用戶。
-
作用 :在 Spring MVC 中,表現層通常采用 MVC 設計模式來構建。
-
技術 :一般會使用 JSP、HTML 等技術來展示數據給用戶。
-
-
業務層
-
定義 :位于表現層和持久層之間,是應用程序的核心部分。
-
作用 :負責處理公司具體的業務邏輯,對數據進行處理和分析,實現業務規則和流程的控制。
-
-
持久層
-
定義 :是應用程序與數據庫進行交互的底層。
-
作用 :負責數據的持久化操作,如數據的增刪改查等,將業務數據存儲到數據庫中或者從數據庫中讀取數據。
-
二、MVC 概念
-
Model(模型)
-
定義 :是應用程序的數據模型,通常是一個 JavaBean 類。
-
作用 :用于封裝數據,將數據以對象的形式進行存儲和傳遞,便于數據的管理和使用。
-
-
View(視圖)
-
定義 :是應用程序的用戶界面,通常由 JSP、HTML 等技術實現。
-
作用 :用于展示數據給用戶,將模型中的數據顯示在界面上,讓用戶能夠直觀地看到和操作數據。
-
-
Controller(控制器)
-
定義 :是應用程序的控制中心,通常是一個 Java 類。
-
作用 :用于接收用戶的請求,對請求進行處理和調度,調用相應的業務邏輯方法,對數據進行校驗等操作。
-
三、Spring MVC 入門案例
-
創建 WEB 工程
-
使用開發工具(如 Eclipse、IntelliJ IDEA 等)創建一個新的 WEB 工程。
-
-
引入開發的 jar 包
-
在項目的 pom.xml 文件中添加以下依賴,引入 Spring 相關的 jar 包:
-
<properties><spring.version>5.0.2.RELEASE</spring.version>
</properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency>
</dependencies>
-
編寫 index.jsp 頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>入門程序</title>
</head>
<body><h3>入門</h3><a href="/hello.do" >入門程序</a>
</body>
</html>
-
編寫 suc.jsp 頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>成功</title>
</head>
<body><h3>入門成功了2...</h3>
</body>
</html>
-
編寫 Controller 類和方法
package cn.tx.demo1;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class HelloController {@RequestMapping(path = "/hello.do")public String sayHello(){System.out.println("入門方法執行了2...");return "suc";}
}
-
配置核心的控制器(配置 DispatcherServlet)
<servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>*.do</url-pattern>
</servlet-mapping>
-
編寫 springmvc.xml 的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.qcbyjy"></context:component-scan><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"></property><property name="suffix" value=".jsp"></property></bean><!-- <mvc:annotation-driven></mvc:annotation-driven>--></beans>
-
啟動 Tomcat 服務器,進行測試
-
啟動 Tomcat 服務器后,訪問 index.jsp 頁面中的超鏈接,會觸發對 hello.do 的請求。
-
請求會被 DispatcherServlet 攔截,根據配置找到 HelloController 中的 sayHello 方法進行處理。
-
處理完成后,返回 suc.jsp 頁面進行展示。
-
四、Spring MVC 執行流程
-
啟動 Tomcat 服務器
-
當服務器啟動時,由于在 web.xml 中配置了 load-on-startup 標簽,會創建 DispatcherServlet 對象,并加載 springmvc.xml 配置文件。
-
-
創建控制器對象
-
配置了注解掃描后,Spring 會掃描指定的包及其子包,找到帶有@Controller 注解的類,并創建其對象。
-
-
接收請求
-
客戶端發送請求到服務器,請求 URL 會被 DispatcherServlet 攔截。
-
-
查找處理器
-
DispatcherServlet 根據請求 URL 和控制器類中@RequestMapping 注解的配置,找到對應的處理器方法。
-
-
執行處理器方法
-
調用處理器方法,處理業務邏輯。
-
-
返回視圖名稱
-
處理器方法執行完成后,返回一個字符串形式的視圖名稱。
-
-
解析視圖
-
根據配置的視圖解析器,將視圖名稱解析為具體的視圖資源路徑。
-
-
渲染頁面
-
Tomcat 服務器根據解析后的視圖路徑,渲染頁面并返回給客戶端。
-
五、@RequestMapping 注解
-
作用
-
用于建立請求 URL 和處理方法之間的對應關系。
-
-
使用位置
-
可以作用在類上和方法上。
-
作用在類上 :作為第一級的訪問目錄。
-
作用在方法上 :作為第二級的訪問目錄。
-
-
屬性
-
path :指定請求路徑的 URL。
-
value :與 path 屬性作用相同。
-
method :指定該方法的請求方式,如 GET、POST 等。
-
params :指定限制請求參數的條件。
-
六、請求參數的綁定說明
-
綁定機制
-
表單提交的數據都是以 k=v 的形式存在的,如 username=haha&password=123。
-
SpringMVC 的參數綁定過程是將表單提交的請求參數作為控制器中方法的參數進行綁定。
-
-
要求
-
提交表單的 name 屬性和參數的名稱必須相同,并且區分大小寫。
-
-
支持的數據類型
-
基本數據類型和字符串類型
-
提交表單的 name 和參數的名稱相同。
-
-
實體類型(JavaBean)
-
提交表單的 name 屬性需要與 JavaBean 中的屬性名稱一致。
-
如果一個 JavaBean 類中包含其他的引用類型,表單的 name 屬性需要編寫成:對象. 屬性,例如:address.name。
-
-
集合數據類型(List、Map 集合等)
-
在 JSP 頁面中,可以通過 list[0]. 屬性 的形式來提交集合屬性的數據。
-
-
七、解決中文亂碼問題
-
配置過濾器
-
在 web.xml 中配置 Spring 提供的 CharacterEncodingFilter 過濾器類,以解決中文亂碼問題。
-
<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>