推薦博客:https://www.cnblogs.com/hellokuangshen/p/11263631.html
1.什麼是MVC
MVC : 模型、視圖、控制器 , 是一種軟件設計規範,說明不是設計模式;
本質:將業務邏輯 , 數據 , 顯示 分離的方式來編寫代碼; 前後端分離;
Model:數據模型,提供要展示的數據,一般我們都會把這兩個分離開來 , 數據Dao,服務層Service。
View :負責進行數據的渲染和展示;客戶端想要看到的東西
Controller:接收用戶請求,交給Model處理,從Model更新後的數據或者結果,返回給前端。調度員
面向接口編程;
最典型的案例就是:JSP:View + Servlet:Controller + JavaBean:Model;
Model1
在早期的Web開發中,就是用的Model1模式
只有兩層:視圖層和模型層;
優點:架構簡單,適合小型項目開發;
缺點:JSP職責不單一 , 承受它不該承受的壓力,不便於維護;
Model2
將項目分爲三個模塊:M:模型 V:視圖 C :控制器
職責分析:
controller:
- 取得表單的數據
- 調用業務的邏輯方法
- 轉向指定的頁面
Model:
- Dao:操作數據庫
- Service:業務邏輯
- 保存數據的更新狀態
View:
- 顯示頁面
Model2優化了Model1時代的缺點,讓所有層職責更加分明;降低了維護難度,
2.SpringMVC
Struct1/2 :比較簡單 , 更簡單SpringMVC;
什麼是SpringMVC
SpringMVC 是 Spring的一部分,是基於Java實現的MVC的輕量級Web框架
springMVC 的優點:
- 趨勢,使用的人多。
- 簡單,易學,輕量級
- 高效,基於請求和響應的MVC框架;
- 約定優於配置;
- 功能強大:RestFul、數據驗證、格式化{json}、主題,本地化、異常處理…
官網上說Spring的web模塊提供了大量獨特的功能,包括:
清晰的角色劃分:控制器(controller)、驗證器(validator)、 命令對象(command object)、表單對象(form object)、模型對象(model object)、 Servlet分發器(DispatcherServlet)、 處理器映射(handler mapping)、視圖解析器(view resolver)等等。 每一個角色都可以由一個專門的對象(類)來實現。< Bean>
強大而直接的配置方式:將框架類和應用程序類都能作爲JavaBean配置,而且支持跨多個context 的引用。
可適配、非侵入:可以根據不同的應用場景,選擇合適的控制器子類 (simple型、command型、form型、wizard型、multi-action型或者自定義),而不是從單一控制器 (比如Action/ActionForm)繼承。
可重用的業務代碼:可以使用現有的業務對象作爲命令或表單對象,而不需要去擴展某個特定框架的基類。
可定製的綁定(binding) 和驗證(validation):比如將類型不匹配作爲應用級的驗證錯誤, 這可以保存錯誤的值。再比如本地化的日期和數字綁定等等。在其他某些框架中,你只能使用字符串表單對象, 需要手動解析它並轉換到業務對象。
可定製的handler mapping和view resolution:Spring提供從最簡單的URL映射, 到複雜的、專用的定製策略。與某些web MVC框架強制開發人員使用單一特定技術相比,Spring顯得更加靈活。
靈活的model轉換:在Springweb框架中,使用基於Map的 鍵/值對來達到輕易地與各種視圖技術的集成。
可定製的本地化和主題(theme)解析:支持在JSP中可選擇地使用Spring標籤庫、支持JSTL、支持Velocity(不需要額外的中間層)等等。
簡單而強大的JSP標籤庫(Spring Tag Library):支持包括諸如數據綁定和主題(theme) 之類的許多功能。它提供在標記方面的最大靈活性。
JSP表單標籤庫:在Spring2.0中引入的表單標籤庫,使得在JSP中編寫 表單更加容易。
Spring Bean的生命週期可以被限制在當前的HTTP Request或者HTTP Session。 準確的說,這並非Spring MVC框架本身特性,而應歸屬於Sping MVC使用的WebApplicationContext容器。
正因爲SpringMVC較Struct2好 , 簡單 , 便捷 , 易學 , 天生和Spring無縫集成(使用SpringIoC和Aop) , 使用約定優於配置 . 能夠進行簡單的junit測試 . 支持Restful風格 .異常處理 , 本地化 , 國際化 , 數據驗證 , 類型轉換 , 攔截器 等等…所以我們要學習 .
DispatcherServlet
SpringMVC框架圍繞着DispatcherServlet(Servlet請求分發器)設計;
3.HelloSpringMVC
我們利用Maven創建一個web項目;
項目結構:
1.Maven及導包注意點
- 資源過濾問題;
- 導包不要漏;
<dependencies>
<!--junit包單元測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Spring MVC 及 Spring系列包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.24.RELEASE</version>
</dependency>
<!--jstl 和 jsp的包-->
<!--Servlet核心-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<!--解決資源導出問題-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
註冊SpringMVC核心Servlet(web.xml文件)
- 註冊DispatcherServlet
- 關聯SpringMVC的配置文件
- 啓動級別爲1
- 映射路徑爲 / 【不要用/*,會404】
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--關聯SpringMVC配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--這個東西要和服務器一起啓動;
load-on-startup,啓動級別,數字越小級別越高!-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--所有請求都會經過這個DispatcherServlet請求分發器-->
<!--
/和/*的區別:
< url-pattern > / </ url-pattern > 不會匹配到.jsp, 只針對我們編寫的請求;
即:.jsp不會進入spring的 DispatcherServlet類 。
< url-pattern > /* </ url-pattern > 會匹配*.jsp,
會出現返回jsp視圖時再次進入spring的DispatcherServlet 類,導致找不到對應的controller所以報404錯。
-->
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
編寫SpringMVC的配置文件
- 讓IOC的註解生效
- 靜態資源過濾 :HTML . JS . CSS . 圖片 , 視頻 …
- MVC的註解驅動 :
- 配置視圖解析器
編寫Controller類
- 需要給類加註解 :@Controller , 可以讓IOC容器管理 , 等價於Bean
- 請求映射的路徑 :@RequestMapping (“路徑”),如果類上有就先寫類的,在寫方法的;
- Model :模型傳遞參數
- return “hello”; 它會去視圖解析中拼接前綴和後綴來找到對應的視圖
@Controller
@RequestMapping("/hello")
public class HelloWorldController {
//請求映射("路徑")
@RequestMapping("/hello")
public String hi(Model model){
model.addAttribute("msg","Hello,SpringMVC");
System.out.println("進入HELLO");
return "hello"; //WEB-INF/jsp/hello.jsp
}
}
視圖層
- 注意視圖的位置,要和視圖解析器對應 web-inf / jsp , 爲什麼需要在web-inf路徑下 , 因爲這個路徑下的東西用戶無法直接訪問 , 更加安全;
- 可以通過EL表示取出Model中存放的值,或者對象;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC</title>
</head>
<body>
${msg}
</body>
</html>
測試
啓動Tomcat進行測試,
運行結果
流程
- 建立web項目
- 導包
- 編寫web.xml
- 編寫springmvc的配置文件 【servletname】-servlet.xml
- 編寫控制類
- 編寫視圖層
- 測試