spring mvc的簡單應用

MVC 是什麼

MVC是一種軟件架構設計思想,基於MVC架構將咱們的應用軟件進行分層設計和實現,例如能夠分爲視圖層(View),控制層(Controller),模型層(Model),經過這樣的分層設計讓咱們程序具有更好的靈活性和可可擴展性.由於這樣能夠將一個複雜應用程序進行簡化,實現各司其職,各盡所能.比較適合一個大型應用的開發.css

Spring MVC 概述

Spring MVC是MVC設計思想在Spring框架中的一種實現,基於這樣的思想spring框架設計了一些相關對象,用於更好的基於MVC架構處理請求和響應,其簡易架構如圖所示:
image.png
其中:
1)DispatcherServlet是客戶端全部請求處理的入口,負責請求轉發。
2)RequestMapping負責存儲請求url到後端handler對象之間的映射。
3)Handler 用於處理DispatcherServlet對象轉發過來的請求數據。
4)ViewResolver負責處理全部Handler對象響應結果中的view。html

Spring MVC 快速入門

準備工做

第一步:建立項目module,基本信息如圖所示:java

image.png

第二步:添加項目依賴(能夠在module建立時,也能夠建立後),代碼以下:web

Spring Web 依賴(提供了spring mvc支持而且會嵌入一個tomcat)spring

<!--添加spring web模塊依賴支持(這個依賴中默認會嵌套一個tomcat服務器)-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Thymeleaf 依賴(提供了以html做爲頁面模板進行解析和操做的相關對象)數據庫

<!--spring boot 中默認支持的一個模板引擎,這個引擎能夠以html做爲模板,
咱們能夠在模板上添加thymeleaf自定義的標籤屬性,而後基於屬性操做數據,
這種引擎主要是用於取代jsp技術-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

第三步:啓動項目檢測控制檯啓動狀態是否OKjson

static 目錄分析及應用

static 目錄爲springboot工程建立時添加了web依賴之後自動建立的目錄,此目錄中能夠存儲html、css、js、image,這些資源能夠在啓動服務器之後,直接在瀏覽器進行訪問。例如:
第一步:在static目錄下建立一個index.html頁面,代碼以下:segmentfault

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
   <h1>The First Html Page</h1>
</body>
</html>

第二步:啓動服務器並直接進行訪問測試,如圖所示後端

image.png

templates 目錄分析及應用

templates 目錄爲springboot工程建立時添加了thymeleaf依賴之後自動建立的目錄,此目錄中要存儲一些html模板,這個模板頁面不能直接經過瀏覽器url進行訪問,須要基於服務端控制器,在方法中定義頁面響應,例如:瀏覽器

image.png

第一步:定義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/ 默認前綴
spring.thymeleaf.prefix=classpath:/templates/module/

第三步:啓動服務進行訪問測試,如圖所示:

image.png

第四步:訪問過程當中的BUG分析

第五步:thymeleaf頁面緩存設置
假如咱們但願在修改了頁面內容之後,不從新啓動服務,直接刷新便可看頁面改動,能夠執行以下操做:
修改配置文件內容,添加以下語句:
image.png

image.png

SpringMVC 響應數據處理

ModelAndView 應用

咱們有一業務,如今須要將響應數據封裝到ModelAndView對象,而後響應到客戶端,如何實現呢?

第一步:定義ModelViewController以及方法,代碼以下:

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 "view";
    }
}

第二步:在templates相關目錄下定義view.html,並在頁面中添加呈現數據的代碼,例如:

<div>
    <ul>
        <li>username:[[${username}]]</li>
        <li>state:[[${state}]]</li>
    </ul>
</div>

第三步:啓動項目進行訪問測試,並檢測輸出結果,例如:

image.png

小結:
image.![image.png
png](https://image-static.segmentf...

第四步:運行過程當中的結果分析

image.png

JSON數據響應

咱們有一業務不須要頁面,只須要將響應數據轉換爲json,而後響應到客戶端,如何實現呢?
第一步:定義ResponseResult對象用於封裝響應數據,例如:

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;
    }
}

第二步:定義JsonObjectController以及方法,代碼以下:

package com.cy.pj.module.controller;

@RestController
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);
    }
    
}

第三步:啓動服務器分別進行訪問測試,代碼以下:

image.png

小結:
當對象把響應結果轉換成json格式字符串時,底層會調用對象中的get方法,此時頁面中關鍵字code和 message 與 pojo對象中get方法名有關(規則:將「get」去掉後的首字母改小寫),而與屬性名無關,本例中即與方法名「getCode」、「getMessage」有關,而與pojo對象中屬性名「code」、「message」無關。
第四步:啓動或訪問過程當中的問題分析

image.png

image.png

image.png
形成此問題緣由通常是POJO對象中的get方法名後面的的關鍵字段與客戶端訪問時錄入的關鍵字段名不匹配形成的。

SpingMVC 請求參數數據處理

咱們在執行業務的過程當中一般會將一些請求參數傳遞到服務端,服務端如何獲取參數並注入給咱們的方法參數的呢?

準備工做

定義一個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對象方式

定義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();
}

另一個問題場景分析:
image.png

假如未來咱們在向數據庫插入某個數據時,如"insert into table () values (#{name},{message}) ",頁面上也輸入了數據,可是數據庫當中仍是提示數據爲空,這裏就要求pojo對象中需提供與參數名相匹配的set方法。(能夠經過在上圖中第25行打斷點查看param參數有沒有值,或將param值打印輸出看看有沒有值)
啓動服務進行訪問測試,能夠這樣傳參,例如:

http://localhost/doParam02?name=beijing

Map對象方式

有時候咱們不想使用pojo對象接收請求參數,咱們能夠使用map對象來接收,又該如何實現呢?

定義Controller方法,基於map對象接收請求參數,例如:

@GetMapping("/doParam03")
public String doMethodParam(@RequestParam Map<String,Object> param){
 return "request params "+param.toString();
}

image.png
因map做爲方法參數能夠接受任意類型的請求數據,通常只用做一些外包項目,非外包性質、不趕工期的項目仍是儘可能別用,不太嚴謹!

其中,map接收請求參數,spring默認map是用來接收響應結果集(responseResult)用的,因此這裏必須使用@RequestParam對map類型的參數做用進行描述.

啓動服務進行訪問測試,能夠這樣傳參,例如:

http://localhost/doParam03?name=beijing

總結(Summary)

本章節對springboot工程下spring mvc技術的應用作了一個入門實現,並結合實際項目中的業務應用,講解了MVC中請求數據的獲取和響應數據處理的一個基本過程.~~~~

相關文章
相關標籤/搜索