什麼是MVC
- MVC是模型(Model)、視圖(View)、控制器(Controller)的簡寫,是一種軟件設計規範。
- 是將業務邏輯、數據、顯示分離的方法來組織代碼。
- MVC主要作用是降低了視圖與業務邏輯間的雙向偶合。
- MVC不是一種設計模式,MVC是一種架構模式。當然不同的MVC存在差異。
Model(模型):數據模型,提供要展示的數據,因此包含數據和行爲,可以認爲是領域模型或JavaBean組件(包含數據和行爲),不過現在一般都分離開來:Value Object(數據Dao) 和 服務層(行爲Service)。
View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。
Controller(控制器):接收用戶請求,委託給模型進行處理(狀態改變),處理完畢後把返回的模型數據返回給視圖,由視圖負責展示。也就是說控制器做了個調度員的工作。
最典型的MVC就是JSP + servlet + javabean的模式。
SpringMVC執行原理
圖爲SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發者實現,虛線表示需要開發者實現。
簡要分析執行流程
-
DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發出請求,DispatcherServlet接收請求並攔截請求。
我們假設請求的url爲 : http://localhost:8080/SpringMVC/hello
如上url拆分成三部分:
http://localhost:8080服務器域名
SpringMVC部署在服務器上的web站點
hello表示控制器
通過分析,如上url表示爲:請求位於服務器localhost:8080上的SpringMVC站點的hello控制器。
-
HandlerMapping爲處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。
-
HandlerExecution表示具體的Handler,其主要作用是根據url查找控制器,如上url被查找控制器爲:hello。
-
HandlerExecution將解析後的信息傳遞給DispatcherServlet,如解析控制器映射等。
-
HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。
-
Handler讓具體的Controller執行。
-
Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。
-
HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。
-
DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。
-
視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。
-
DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。
-
最終視圖呈現給用戶。
註解:
@RequestMapping是一個用來處理請求地址映射的註解(將請求映射到對應的控制器方法中),可用於類或方法上。
- 用於類上,表示類中的所有響應請求的方法都是以該地址作爲父路徑。
- 如果標註在某個controller的類級別上,則表名訪問此路徑下的方法都要加上其配置的路徑;
- 最常用是標註在方法上,表明哪個具體的方法類接受處理某次請求。
RequestMapping的屬性
@RequestMapping(value="/get{bookId}",method={RequestMethod.GET},params=")
- value:指定請求的實際url
- method:指定請求的method類型,get\post\put\delete等;
- params:指定request中必須包含某些參數值
@RequestParam綁定單個請求參數值
@RequestParam的屬性
@RequestParam(value="username",required=false)
- value:參數名字,即入參的請求參數名字
- required:是否必須,默認爲true
- defaultValue:默認值,設置該參數時,自動將required設爲false
@PathVariable綁定URL中模板變量值(將URL的參數映射到方法中的參數上)
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(
@PathVariable(value="userId") int userId,
@PathVariable(value="topicId") int topicId)
@ResponseBody@RequestBody
@Responsebody表示該方法的返回結果直接寫入HTTP response body中。一般在異步獲取數據時使用,在使用@RequestMapping後,返回值通常解析爲跳轉路徑,加上@Responsebody後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP response body中
@RequestBody讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然後把響應的數據綁定到要返回的對象上,再把返回的對象數據綁定到controller中方法的參數上
轉發和重定向
//無需視圖解析器
@Controller
public class ResultSpringMVC {
@RequestMapping("/rsm/t1")
public String test1(){
//轉發
return "/index.jsp";
}
@RequestMapping("/rsm/t2")
public String test2(){
//轉發二
return "forward:/index.jsp";
}
@RequestMapping("/rsm/t3")
public String test3(){
//重定向
return "redirect:/index.jsp";
}
}
數據處理
處理提交數據
1、提交的域名稱和處理方法的參數名一致
提交數據:http://localhost:8080//hello?name=zhangzong
處理方法:
@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);
return "hello";
}
後臺輸出:zhangzong
2、提交的域名稱和處理方法的參數名一致
提交數據:http://localhost:8080//hello?username=zhangzong
@ RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
後臺輸出:zhangzong