顧名思義MVC是M(model) V(view) C(controller)是一種軟件架構設計思想,將業務分層設計和實現。使程序具備更好的靈活性和可擴展性。html
結合操做的簡單實例來理解此圖像,能夠有更好的效果。
DispatcherServlet咱們叫它中央控制器,他比如大腦進行整個業務的操控。DispatcherServlet不是由咱們建立,而是由spring底層來建立。web
在咱們經過瀏覽器中輸入url進行訪問時
DispatcherServlet會把url傳給RequestMapping,經過它內部存儲url與handler之間的映射關係,用DispatcherServlet傳來的url來尋找到對應handler並傳回DispatcherServlet。一樣RequestMapping也不是咱們而是由底層建立的。spring
DispatcherMapping將request傳給對應的Handler,這個Hanndler是須要要咱們本身去實現。json
package com.cy.pj.health.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller //bean 對象 public class TemplateController {//在spring mvc中這個對象稱之爲handler(處理器) @RequestMapping("doTemplateUI") // @RequestMapping用於定義url請求的映射 public String doTemplateUI(){ return "default";//view name (視圖名) } }
@RequestMapper("abc")定義經過傳入abc來調用此方法。
所返回的值即是view name,講這個值返回給DispatcherServlet。瀏覽器
DispatcherServlet收到所返回的值後將其交給View Resovler架構
View Resovler一樣是由底層負責建立,咱們只須要在application.properties中添加咱們所學須要的配置mvc
spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html
View Resovler 增長前綴,後綴,數據。後返回DispatcherServlet。app
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>The defalut page of templates </h1> </body> </html>
再由DispatherSerlvet響應給用戶ui
package com.cy.pj.module.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class ModelViewController { @RequestMapping("/doModelAndView") public String doModelAndView(Model model) { model.addAttribute("username", "jason"); model.addAttribute("state", true); return "default"; } }
處理完用戶請求後,直接將響應數據封裝到model中,而後和
view一塊兒封裝成ModelAndView對象返回給DispatcherServlet。
ps.model是底層建立的而且是用map來存儲數據。url
界面顯示代碼以下
<div> <ul> <li>username:[[${username}]]</li> <li>state:[[${state}]]</li> </ul> </div>
可是上面的ModelAndView這將數據和頁面綁定到一塊兒了,若是咱們只須要數據的話,那麼就要用到Json了
@RestController public class JsonObjectController { @RequestMapping("/doConvertResponseToJson") public ResponseResult doConvertResponseToJson(){ ResponseResult rs=new ResponseResult(); rs.setCode(200); rs.setMessage("OK"); return rs; }
咱們使用本身建立的類去封裝信息。
@RestController註解中包含
@Controller
@ResponseBody
使用這個註解之後,該類中的全部方法都不須要在額外的添加@ResponseBody註解
@ResponseBody註解做用在,將返回值轉成Json格式字符串返回。
new ObjectMapper().writeValueAsString(rs);//本身將對象轉換爲json字符串時,使用的就是這行代碼。
定義pojo對象,用於接受客戶端請求參數時咱們能夠直接接收
或者本身建立一個pojo對象
//http://localhost/doParam01?name=mvc @RestController public class ParamObjectController { //基於直接量參數來接收請求中的參數數據,咱們定義的方法參數名應與請求中的參數名相同 @GetMapping("/doParam01")//這個註解描述的方法只能處理Get類型的請求 //@ResponseBody //@RequestMapping(value="/doParam01",method = RequestMethod.GET) public String doMethodParam(String name){ return "request params "+name; }
@GetMapping("/doParam02") public String doMethodParam(RequestParameter param){ //當使用pojo對象做爲方法參數接收客戶端參數數據時,pojo對象中應該提供與客戶端參數名匹配的set方法 return "request params "+param.toString(); }
用map接收請求參數,必須使用@RequestParam對參數進行描述
@GetMapping("/doParam03") public String doMethodParam(@RequestParam Map<String,Object> param){ //當方法參數是map類型,並且但願基於map接收客戶端請求參數 //可是,使用map做爲方法參數接收客戶端請求數據不太嚴謹(客戶端能夠傳遞任意參數). return "request params "+param.toString(); }