今天開始正式帶大家學習Spring部分的內容了,大家嘗試去弄個專業版嗷,學習起來爽一點
在idea中下載這個插件就行了
我們之后開始創建Spring項目,
藍色 部分自己起名,type選Maven,其他的默認就好了,之后next,
勾選完點擊next,就創建好了;
看下項目結構,藍色java包中的就是我們寫代碼的地方,之間javaSE怎么寫現在就怎么寫,
resources是寫前端代碼的地方,或者可以存放靜態資源,test中可以測試代碼;
這個東東是啟動類,跟以往的main函數不同,這個類一但運行就不會停止的,我們是服務器開發,服務器哪有停下來的道理;準備工作完畢,開始無聊的理論;
1,什么是Spring Web MVC
Spring Web MVC是基于servlet API構建的原始框架,servlet是一種實現動態界面技術,反正Spring Web MVC就是一套Web開發框架,我們可以簡稱為Spring MVC;
1)什么是MVC
model view controller的縮寫,是一種軟件架構設計模式,分別為模型,視圖,控制器,
模型:就是我們的程序,怎么來處理業務邏輯,怎么處理數據
視圖:指應用程序專門用來與瀏覽器交互的部分
控制器:選擇處理模型,選擇視圖
2)什么是Spring MVC
Spring MVC就是實現了MVC模式的Web框架,有同學可能會有疑問,我們創建的不是Spring Boot項目嗎,為啥變成MVC項目了,可以這么理解,Spring Boot只是實現SpringMVC的一種方式,Spring Boot可以添加不同的依賴來實現不同的功能,添加MVC就能實現MVC的功能了;
2,學習MVC?
我們學習MVC主要學習通過瀏覽器和用戶交互的程序,主要分三個方面
建立連接:講用戶(瀏覽器)和java程序連接起來,就是訪問一個地址能調用我們的Spring程序
請求:用戶訪問會攜帶一些參數,在程序中我們要想辦法獲取到參數
響應:我們根據獲取到的參數,執行業務邏輯,并返回程序運行的結果
1,建立連接
我們這里就要使用到注解了,
我們剛才看到的這個就是啟動類的注解,
那么我們如何通過注解建立連接呢,創建一個類,
之后再類的上面寫RequestMapping("/hello"),這樣就能實現URL路由映射,達到瀏覽器連接程序的效果;
路由映射的意思就是用戶訪問URL之后,就會請求到應用程序某個類的某個方法中;
@RequestMapping("Hello")
@RestController
public class HelloController {@RequestMapping("m1")public static String m1(){return "Hello yaoyu";}
}
這個RestController,可以起到序列化數據的作用,把它變成json和xml格式,并且我們創建的這個類可能和Spring內置的重名,我們Spring項目中那么多的類,我們不可能每次啟動程序來把所有東西掃描一變來獲得我們要的類,所以加上這個控制器,就可以就掃描帶有控制器的類,啟動項目更快;?
第一個Hello是類路徑,第二個m1是方式路徑
類路徑+方法路徑合起來就是我們要的資源路徑了;
我們去瀏覽器來訪問程序:
我們輸入http://127.0.0.1:8080/Hello/m1
就能看到你好yaoyu了;
我們這里的RequestMapping是啥請求呢,我們之前學過,get,post,put,delete,我們使用html,form表單來請求一下;前端代碼我們放到
這個static下面,前端代碼:
<form action="http://127.0.0.1:8080/Hello/m1" method="post"><input type="submit" value="yaoyu">
?后端代碼:
@RequestMapping("Hello")
@RestController
public class HelloController {@RequestMapping("m1")public static String m1(){return "Hello yaoyu";}
}
啟動程序,看效果:
我們點擊它,
就跳轉到我們的程序了;這里為啥用127.0.0.1:8080,因為是我們同一臺電腦上寫服務器并且測試,就先用127.0.0.1就行;我們這里使用的post請求,瀏覽器發送的請求是get,所以這個RequestMapping是支持很多請求的;
但是我們可以指定方法
@RequestMapping(value = "/m2",method = RequestMethod.GET)public static String m2(){return "我是get請求";}
來用postman訪問?
啥都不傳的get請求,看看效果:
得到結果了,那么我們使用post請求訪問會有問題嗎?
不行的,405是客戶端出錯,我們設定成get,客戶端使用post就會發生錯誤;
都是ok的,除此之外,我們還有專門的postMapping和getMapping來接收請求:
?
@GetMapping("a1")public static String a1(){return "我是get請求";}@PostMapping("a2")public static String a2(){return "我是post請求";}
2,工具使用
那我們每次都要寫前端代碼好麻煩呀,我們后端程序員往后不就會更多的前端代碼了嗎,莫得事,我們有工具,我們可以使用postman,來構建請求;
下載好后打開,點擊那個create Collection,之后點擊藍色的Add,自己給自己的請求起名字,
接下來就能使用我們的工具了,
3,傳遞參數
1,普通傳參
就是查詢字符串傳參;
這個Params,下面以鍵值對的方式放到URL中
2,form-data
可以提交文件和圖片等?
4,form表單
5,raw
這些都是我們之前說的請求正文的內容;對應content-type大家還記得不;?
4,請求傳參
接下來我們重點來學習用postman傳遞參數并且用在后端中接收參數
1,傳遞單個參數
@RequestMapping("/r1")public static String r1(String s){return "接收參數為" + s;}
來發請求,?
這里查詢字符串中的key就是s一定要和我們資源路徑里面方法參數的名字是一樣的,不然的話就找不到的;
再來看兩個代碼:
@RequestMapping("/r2")public static Integer r2(Integer s){return s;}@RequestMapping("/r3")public static int r3(int s){return s;}
這倆有啥區別呢,一個使用包裝類型,一個是基本類型,我們使用基本類型的時候參數是必須傳的,因為基本類型不能為null,
傳遞是成功的,現在我們不傳參數:
?不可以因為int a不能為null,我們再試試Integer,
?
?可以的,要是類型不匹配會發生400錯誤;
2,傳遞多個參數
@RequestMapping("/r4")public static String r4(String s1,String s2){return "第一個參數" + s1 + ",第二個參數" + s2;}
3,傳遞對象
先創建一個對象:
public class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
@RequestMapping("/r5")public static String r5(User user) {return user.toString();}
傳遞對象的時候就對對象內部的元素挨個賦值就行了,對象中有name和age,我們來傳遞?
?
4,參數綁定
?參數綁定,又叫參數重命名,參數映射,就是前端可能對參數進行加密,可能名字起的非常奇怪啊,那我們還要記一個小紙上嗎,顯然是不應該的,這里我們就使用參數綁定,對于前段加密復雜的參數我們讓他綁定一個易懂的參數名,我們使用RequestParam
@RequestMapping("/r6")public static String r6(@RequestParam(value = "p",required = false) String s){return "接收的參數為"+ s;}
這里的required說明是不是必須傳的,我們默認是必須傳遞的,我們加一個false就可以不傳遞;
我們改成true
?我們在改回來:
ok了;?
5,傳遞數組
@RequestMapping("/r7")public static String r7(String[] s){return Arrays.toString(s);}
這里可以有兩種方式來傳遞:
?可以用逗號分隔:
還可以
6,傳遞集合
傳遞集合的話我們得使用參數綁定,因為默認傳的是數組,
@RequestMapping("/r8")public static String r8(@RequestParam List<Integer> list){return list.toString();}
7,傳遞json
這里我們要使用RequestBody,可以把傳遞來的json轉變為對象,
@RequestMapping("/r9")public static String r9(@RequestBody User user){return user.toString();}
來個json的語法:
JSON的語法: 1. 數據在 鍵值對 (Key/Value) 中 2. 數據由逗號 , 分隔 3. 對象? {} 表? 4. 數組? [] 表? 5. 值可以為對象,也可以為數組,數組中可以包含多個對象 JSON的兩種結構 1. 對象:?括號 {} 保存的對象是?個?序的 鍵值對集合.?個對象以左括號 { 開始,右括號 } 結束。每個"鍵"后跟?個冒號 : ,鍵值對使?逗號 , 分隔 2. 數組:中括號 [] 保存的數組是值(value)的有序集合.?個數組以左中括號 [ 開始,右中括 號 ] 結束,值之間使?逗號 , 分隔;?
8,從URL中獲取參數
@RequestMapping("/r10/{id}/{type}")public static String r10(@PathVariable Integer id,@PathVariable("type") Integer newType){return "獲取文章id"+id+",獲取文章類型"+newType;}
?PathVariable是路徑變量,可能有網站會把參數設置到路徑上,我們就要從路徑上拿參數,第一個id對應路徑上的id第二個我們把type這個參數名綁定為newtype
來看效果:
9,上傳文件
使用RequestPart注解:
@RequestMapping("/r11")public static String r12(@RequestPart("file1") MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("C:/cctalk/java代碼容易犯錯的知識點/"+file.getOriginalFilename()));return "文還上傳成功";}
這個file1是我們前端傳入的參數我們把它綁定為file,我們要使用MultipartFile file,我們使用transferTo來快速上傳文件,這里跟我們之前學的文件操作是一樣的,就是進行了封裝,更好用了,
@RequestMapping("/r11")public static String r12(@RequestPart("file1") MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("C:/cctalk/java代碼容易犯錯的知識點/"+file.getOriginalFilename()));return "文還上傳成功";}
?
?