在大型軟件系統設計時,業務通常會相對複雜,假如全部業務實現的代碼都糾纏在一塊兒,會出現邏輯不清晰、可讀性差,維護困難,改動一處就牽一髮而動全身等問題。爲了更好解決這個問題就有了咱們如今常說的分層架構設計。css
MVC是一種軟件架構設計思想,基於MVC架構將咱們的應用軟件進行分層設計和實現,例如能夠分爲視圖層(View),控制層(Controller),模型層(Model),經過這樣的分層設計讓咱們程序具有更好的靈活性和可可擴展性.由於這樣能夠將一個複雜應用程序進行簡化,實現各司其職,各盡所能.比較適合一個大型應用的開發.html
Spring MVC是MVC設計思想在Spring框架中的一種實現,基於這樣的思想spring框架設計了一些相關對象,用於更好的基於MVC架構處理請求和響應,其簡易架構如圖所示:java
其中:
1)DispatcherServlet是客戶端全部請求處理的入口,負責請求轉發。
2)RequestMapping負責存儲請求url到後端handler對象之間的映射。
3)Handler 用於處理DispatcherServlet對象轉發過來的請求數據。
4)ViewResolver負責處理全部Handler對象響應結果中的view。web
第一步:建立項目module,基本信息如圖所示:spring
第二步:添加項目依賴(能夠在module建立時,也能夠建立後),代碼以下:json
Spring Web 依賴(提供了spring mvc支持而且會嵌入一個tomcat)segmentfault
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Thymeleaf 依賴(提供了以html做爲頁面模板進行解析和操做的相關對象)後端
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
第三步:啓動項目檢測控制檯啓動狀態是否OK瀏覽器
statics 目錄爲springboot工程建立時添加了web依賴之後自動建立的目錄,此目錄中能夠存儲html、css、js、html等相關資源,這些資源能夠在啓動服務器之後,直接在瀏覽器進行訪問。例如:
第一步:在statics目錄下建立一個index.html頁面,代碼以下:tomcat
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>The First Html Page</h1> </body> </html>
第二步:啓動服務器並直接進行訪問測試,如圖所示
templates 目錄爲springboot工程建立時添加了thymeleaf依賴之後自動建立的目錄,此目錄中要存儲一些html模板,這個模板頁面不能直接經過瀏覽器url進行訪問,須要基於後端控制器,在方法中定義頁面響應,例如:
第一步:定義TemplateController及方法,代碼以下:
package com.cy.pj.health.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class TemplateController { @RequestMapping("doTemplateUI") public String doTemplateUI(){ return "default"; } }
第二步:在templates目錄中定義模板頁面default.html,代碼以下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>The Default Template page</h1> </body> </html>
其中,假如default.html要在放在templates子目錄中,則還須要在配置文件中配置thymeleaf的前綴,例如:
spring.thymeleaf.prefix=classpath:/templates/module/
第三步:啓動服務進行訪問測試,如圖所示:
SpringMVC 響應數據處理
咱們有一業務,如今須要將響應數據封裝到ModelAndView對象,而後響應到客戶端,如何實現呢?
第一步:定義### ModelAndViewontroller以及方法,返回頁面和數據形式:
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"; } }
返回頁面形式代碼:
package com.cy.pj.health.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class PageController { //返回頁面 @RequestMapping("/getview") public String doHealthUI(){ return "default"; } }
第三步:啓動項目進行訪問測試,並檢測輸出結果,例如:
咱們有一業務不須要頁面,只須要將響應數據轉換爲json,而後響應到客戶端,如何實現呢?
第一步:定義ReponseResult對象用於封裝響應數據,例如:
package com.cy.pj.module.pojo; public class ResponseResult { private Integer code; private String message; public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
第二步:定義JsonObjctController以及方法,代碼以下:
package com.cy.pj.module.controller; @RestController //@RestController=@Controller+@ponseBody public class JsonObjectController { @RequestMapping("/doConvertResponseToJson") public ResponseResult doConvertResponseToJson(){ ResponseResult rs=new ResponseResult(); rs.setCode(200); rs.setMessage("OK"); return rs; } @RequestMapping("/doConvertMapToJson") public Map<String,Object> doConvertMapToJson(){ Map<String,Object> map=new HashMap<>(); map.put("username","劉德華"); map.put("state",true); return map; } @RequestMapping("/doPrintJSON") public void doPrint(HttpServletResponse response)throws Exception{ Map<String,Object> map=new HashMap<>(); map.put("username","劉德華"); map.put("state",true); //將map中的數據轉換爲json格式字符串 ObjectMapper om=new ObjectMapper(); String jsonStr=om.writeValueAsString(map); System.out.println("jsonStr="+jsonStr); //將字符串響應到客戶端 //設置響應數據的編碼 response.setCharacterEncoding("utf-8"); //告訴客戶端,要向它響應的數據類型爲text/html,編碼爲utf-8.請以這種編碼進行數據呈現 response.setContentType("text/html;charset=utf-8"); PrintWriter pw=response.getWriter(); pw.println(jsonStr); } }
第三步:啓動服務器分別進行訪問測試,代碼以下:
異常分析:
請求資源不存在,頁面顯示404
模板解析不正確或不存在頁面顯示500
咱們在執行業務的過程當中一般會將一些請求參數傳遞到服務端,服務端如何獲取參數並注入給咱們的方法參數的呢?
定義一個controller對象,用戶處理客戶端請求,例如:
package com.cy.pj.module.controller; import com.cy.pj.module.pojo.RequestParameter; import org.springframework.web.bind.annotation.*; import java.util.Map; @RestController public class ParamObjectController {}
在ParamObjectController中添加方法,基於直接量方式接受客戶端請求參數,例如:
@GetMapping("/doParam01") public String doMethodParam(String name){ return "request params "+name; }
訪問時,能夠這樣傳參,例如:
http://localhost/doParam01?name=beijing
定義pojo對象,用於接受客戶端請求參數,例如:
package com.cy.pj.module.pojo; public class RequestParameter { private String name; //...... public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "RequestParam{" + "name='" + name + ''' + '}'; } }
定義Controller方法,方法中使用pojo對象接收方法參數,例如:
@RequestMapping("/doParam02") public String doMethodParam(RequestParameter param){//pojo對象接收請求參數,pojo對象中需提供與參數名相匹配的set方法 return "request params "+param.toString(); }
啓動服務進行訪問測試,能夠這樣傳參,例如:
http://localhost/doParam02?name=beijing
有時候咱們不想使用pojo對象接收請求參數,咱們可使用map對象來接收,又該如何實現呢?
定義Controller方法,基於map對象接收請求參數,例如:
@GetMapping("/doParam03") public String doMethodParam(@RequestParam Map<String,Object> param){ return "request params "+param.toString(); }
其中,map接收請求參數,必須使用@RequestParam對參數進行描述.
啓動服務進行訪問測試,能夠這樣傳參,例如:
http://localhost/doParam03?name=beijing
本章節對springboot工程下spring mvc技術的應用作了一個入門實現,並結合實際項目中的業務應用,講解了MVC中請求數據的獲取和響應數據處理的一個基本過程.