springMVC框架詳細總結

什麼是MVC

  • MVC是模型(Model)、視圖(View)、控制器(Controller)的簡寫,是一種軟件設計規範。
  • 是將業務邏輯、數據、顯示分離的方法來組織代碼。
  • MVC主要作用是降低了視圖與業務邏輯間的雙向偶合
  • MVC不是一種設計模式,MVC是一種架構模式。當然不同的MVC存在差異。

Model(模型):數據模型,提供要展示的數據,因此包含數據和行爲,可以認爲是領域模型或JavaBean組件(包含數據和行爲),不過現在一般都分離開來:Value Object(數據Dao) 和 服務層(行爲Service)。

View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西。

Controller(控制器):接收用戶請求,委託給模型進行處理(狀態改變),處理完畢後把返回的模型數據返回給視圖,由視圖負責展示。也就是說控制器做了個調度員的工作。

最典型的MVC就是JSP + servlet + javabean的模式。

SpringMVC執行原理

 圖爲SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發者實現,虛線表示需要開發者實現。

簡要分析執行流程

  1. DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發出請求,DispatcherServlet接收請求並攔截請求。

    我們假設請求的url爲 : http://localhost:8080/SpringMVC/hello

    如上url拆分成三部分:

    http://localhost:8080服務器域名

    SpringMVC部署在服務器上的web站點

    hello表示控制器

    通過分析,如上url表示爲:請求位於服務器localhost:8080上的SpringMVC站點的hello控制器。

  2. HandlerMapping爲處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。

  3. HandlerExecution表示具體的Handler,其主要作用是根據url查找控制器,如上url被查找控制器爲:hello。

  4. HandlerExecution將解析後的信息傳遞給DispatcherServlet,如解析控制器映射等。

  5. HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。

  6. Handler讓具體的Controller執行。

  7. Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。

  8. HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。

  9. DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。

  10. 視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。

  11. DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。

  12. 最終視圖呈現給用戶。

註解:

@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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章