SpringMVC的運行流程+經常使用註解總結

1、SpringMVC簡介

參考於:https://www.cnblogs.com/myitnews/p/11565941.html#autoid-1-0-0html

Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即便用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助咱們簡化開發,Spring Web MVC也是要簡化咱們平常Web開發的。與之相反的是基於組件的、事件驅動的Web框架,如Tapestry、JSF等。前端

  • 前端控制器是DispatcherServlet;
  • 應用控制器其實拆爲處理器映射器(Handler Mapping)進行處理器管理和視圖解析器(View Resolver)進行視圖管理;
  • 頁面控制器/動做/處理器爲Controller接口(僅包含ModelAndView handleRequest(request, response) 方法)的實現(也能夠是任何的POJO類);
  • 支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;
  • 提供了很是靈活的數據驗證、格式化和數據綁定機制;
  • 提供了強大的約定大於配置(慣例優先原則)的契約式編程支持。

2、Spring的MVC運行流程

  1. 用戶請求發送給DispatcherServlet,DispatcherServlet調用HandlerMapping處理器映射器;java

  2. HandlerMapping根據xml或註解找到對應的處理器,生成處理器對象【其實返回的是一個執行器鏈:包含handler和多個攔截器Interceptor】返回給DispatcherServlet;web

  3. DispatcherServlet會調用相應的HandlerAdapter;spring

  4. HandlerAdapter通過適配調用具體的處理器去處理請求,生成ModelAndView返回給DispatcherServlet編程

  5. DispatcherServlet將ModelAndView傳給ViewReslover解析生成View返回給DispatcherServlet;json

  6. DispatcherServlet根據View進行渲染視圖,最後響應給用戶。設計模式

3、SpringMVC經常使用註解

@Controller

  • 標註控制層組件,標記的類就是一個SpringMVC Controller對象。
  • 分發處理器將會掃描使用了該註解的類的方法,並檢測方法是否使用使用@RequestMapping註解。
  • 能夠把request請求header部分的值綁定到方法參數上。
  • 在標註的方法上,試圖解析器能夠解析jsp、html等頁面,若要返回json,須要加上@ResponseBody 。

相似的表示組件做用的還有:架構

  • @Service:表示業務層組件。
  • @Repository:表示持久層組件。
  • @Component:通常組件。

@RestController

  • 等於@Controller + @ResponseBody
  • 直接返回json,試圖解析器沒法再解析html等頁面。
  • 若是想返回頁面,能夠返回一個ModelAndView對象:return new ModelAndView("index")
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "this is my spring-boot-quick-start...";
    }

    @GetMapping("go")
    public ModelAndView go(){
        ModelAndView mv = new ModelAndView("index");
        return mv;
    }
}

@ControllerAdvice

  • 用於全局異常處理,配合ExceptionHandler,捕獲Controller中拋出指定類型的異常。
@ControllerAdvice
public class GlobalExceptionHandler {

    @ResponseBody
    @ExceptionHandler(value = ApiException.class)
    public AjaxResult handle(ApiException e){
        if(e.getErrorCode()!=null){
            return AjaxResult.error(e.getErrorCode().getCode(), e.getMessage());
        }
        return AjaxResult.error(e.getMessag());
    }
}
  • 全局數據綁定,配合方法註解@InitBinder,用於request中自定義參數解析方式進行註冊,達到自定義指定 格式參數的目的。
@ControllerAdvice
public class MyControllerAdvice {

    @InitBinder
    public void globalInitBinder(WebDataBinder binder){
        binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
    }
}
  • 全局數據預處理,結合方法型註解@ModelAttribute,表示其標註的方法將會在目標Controller方法執行以前執行。
@ControllerAdvice
public class MyControllerAdvice {

    @ModelAttribute(value = "message")//在全部攔截器的preHandler方法執行以後執行
    public String globalModelAttribute(){
        System.out.println("MyControllerAdvice.globalModelAttribute");
        return "test";
    }
}

@RestController
public class HelloController {

    @GetMapping("go")
    public ModelAndView go(@ModelAttribute("message") String message){
        System.out.println(message); //"test"
        ModelAndView mv = new ModelAndView(message);
        return mv; //跳轉到 test.html頁面
    }
}

@RequestBody

  • 做用於形參列表,將前臺傳來的數據【xml或json】封裝爲javabean。一般用於接收post請求的請求體。

@ResponseBody

  • 做用於方法上,經過適當的HttpMessageConverter將Controller方法返回的對象進行轉換,寫入Response body。
  • 返回的數據是【xml或json】。

@RequestParam

  • 用於在SpringMVC後臺控制層獲取參數。
  • 有三個參數:
    • value:請求參數名(必須配置)
    • required:是否必需,默認爲 true,即 請求中必須包含該參數,若是沒有包含,將會拋出異常(可選配置)
    • defaultValue:默認值,若是設置了該值,required 將自動設爲 false,不管你是否配置了required,配置了什麼值,都是 false(可選配置)

@RequestHeader

  • 能夠把Request請求header部分的值綁定到方法的參數上。

@PathVariable

  • 用於將請求URL中的模板變量映射到功能處理方法的參數上。
@GetMapping("/go/{id}")
    public String PathVa(@PathVariable("id") Long id){
        System.out.println(id);
        return "test";
    }

@RequestMapping

  • 處理請求地址映射的註解,可用於類或方法上。mvc

  • 用於類上,表示類中的全部響應請求的方法都是以該地址做爲父路徑。

  • 參數:

    • value:指定請求的實際地址,指定的地址能夠是URI Template 模式;
    • method: 指定請求的method類型, GET、POST、PUT、DELETE等,在RequestMethod定義,同GetMapping等。@RequestMapping(value = "/go",method = RequestMethod.GET) = GetMapping("/go")
    • consumes: 指定處理請求的提交內容類型(Content-Type),例如application/json, text/html;
    • produces: 指定返回的內容類型,僅當request請求頭中的(Accept)類型中包含該指定類型才返回;
    • params: 指定request中必須包含某些參數值時,才讓該方法處理;
    • headers: 指定request中必須包含某些指定的header值,才能讓該方法處理請求;

@Autowired

  • 能夠對類成員變量、方法一級構造參數進行標註,完成自動裝配。

  • 首先將默認類型匹配的bean自動裝配到屬性中。

  • 若是類型匹配的bean不止一個,接着根據名稱匹配。

  • 若是查詢結果爲空,則拋出異常,若是想避免,可使用required = false

4、參考資料

相關文章
相關標籤/搜索