javascript
SpringMVC---(2)
?1)獲取到JSON格式的數據:使用RequestBody來進行接收
前端代碼:他是存放在idea中的resources目錄底下的static目錄下的一個html文件:
前端代碼: <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title> </head> <body><scriptsrc="https://code.jquery.com/jquery-3.6.0.js"integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="crossorigin="anonymous"></script><script>function load(){$.ajax({method:"POST",url:"WEB",contentType:"application/json;charset=utf-8",data:JSON.stringify({"username": "李佳偉","password":"12503487","ClassID":"1","UserID":"1"}),success:function(data,status){console.log(data);console.log(status);}});}load();</script> </body> </html>后端代碼:加上@RequestBody后表示要讀取一個JSON數據,加到對象前面就行了;
我們先創建一個User對象,來進行接收前端的參數: package com.example.demo; import lombok.Getter; import lombok.Setter; import lombok.ToString; @ToString @Setter @Getter public class User {public String username;public String password;public int ClassID;public int UserID; } 我們在進行創建一個Controller類: package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class UserController {@RequestMapping("/WEB")@ResponseBodypublic User start(@RequestBody User user){return user;} }1)我們在瀏覽器上面輸入:http://127.0.0.1:8080/Text.html
2_我們前后端的一個交互過程相當于是:我們先通過一個URL來進行訪問html界面,當html界面進行加載的時候,就會給服務器發送一個二次請求,發送一個格式為json格式數據的post請求,然后服務器會進行返回一個json格式的數據;
3)前端傳來的是一個json對象時:可以用Map獲取+@HashMap(只有鍵值對的方式)
4)當前端傳來這樣一個json數組:用List接收+@RequestBody
下面我們來進行演示一下:前端傳遞一大堆JSON對象,后端如何進行接受
@Controller @ResponseBody @RequestMapping("/Java100") public class UserController {@RequestMapping("/hello")public List<User> start(@RequestBody List<User> list){return list;} }
?補充:通過表單提交的方式來進行獲取參數
咱們在static目錄下面創建一個html文件:
?后端代碼:
@Controller @ResponseBody public class UserController {@RequestMapping("/hello")public String run(String username,String password){return username+password;} }2)獲取到特殊URL地址中的參數:@PathVariable,下面是后端代碼,而不是從URL中的參數部分來進行獲取參數
我們先創建一個User類: @ToString @Setter @Getter public class User {public String username;public String password;public int ClassID;public int UserID; } 我們進行訪問的地址:http://127.0.0.1:8080/host/李佳偉/12503487 @RequestMapping("/host/{username}/{password}")@ResponseBodypublic Object Start(@PathVariable String username,@PathVariable String password){User user=new User();user.setUsername(username);user.setPassword(password);return user;}3)上傳文件:我們想把文件傳遞給電腦上面,用的方法是transferTo,里面一共有兩個參數,一個是File,一個是Path
這個方法的主要作用是把當前文件的二進制流,放到一個目錄底下
@RequestMapping("/file")@ResponseBodypublic String upload(@RequestPart("myfile")MultipartFile file) throws IOException { //保存文件file.transferTo(new File(""d:/loggs/test.jpg""));//里面要創建一個新的文件對象return "上傳成功";} //@MultipartFile是專門用來接收文件的一個注解 //在@RequestPart注解里面,這個Key值可以任意設置,里面填寫的相當于是name屬性 //transfer把這個文件流轉化到我的一個文件里面1)我們直接可以進行點擊Body中的form-data,Key值選擇myfile,右鍵選擇file就可以進行上傳文件了
2)我們過來的文件一個是給開發環境用的,一個是給生產環境用的
3)我們這里面的@RequestMapping里面的參數表示路由地址,表示的是url中的地址,但是@RequestPart里面的參數表示的是form-data中的Key值
4)假設你想要修改頭像,你要修改哪一個人的頭像,你要注意此時不可以傳名字屬性,你要傳入唯一的屬性叫做ID,我們要根據ID來進行查找到數據庫中的唯一的語句,然后進行頭像修改
5)這里面要存放路徑+文件名稱
下面是Fidder抓包結果:?
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile;import java.io.File; import java.io.IOException;@Controller @ResponseBody public class UserController {@RequestMapping("/hello")public String run(@RequestPart("myfile")MultipartFile file,String id){//這兩個注解都是固定寫法boolean flag=false;try {file.transferTo(new File("D:\\test.png"));return true+"上傳成功"+id;} catch (IOException e) {e.printStackTrace();}return flag+ "上傳成功";} }
?
這里面傳輸圖片的時候,key相當于是form表單中的name屬性,idea天生支持yml的配置文件里面
?
1)我希望創建兩個配置文件,一個叫做application-dev1.properties,里面進行存放開發環境的配置文件,我峨嵋你在創建一個配置文件叫做application-dev2.properties里面存放生產環境的配置文件,我們在進行創建一個配置文件想我們再進行讀取配置文件的時候,我們的系統默認是會先從自帶的配置文件里面讀,就是從application.properties里面讀,所以我們要從系統配置文件里面設置;
2)多環境配置文件:不同環境配置一個文件,我們只需要進行修改application.properties中的配置文件即可
3)我們進行動態生成文件名的時候,一共是有兩種方法的,第一個就是根據時間戳,第二種方法就是根據UUID,但時間戳的方式是絕對不可以的,因為不同的用戶可能會在同一時間(精確到毫秒)里面上傳相同的文件,但是不同的時間內生成的時間戳的確是不同的;
4)application-隨便的名字.yml
1)目錄:設置到配置文件里面,一個設置開發環境的路徑,有C盤D盤,一個是線上環境的路徑,設置為linux的路徑,這樣就可以在不同的環境寫不同的配置文件,上線的時候只需要改參數就可以了,甚至說有的公司還有開發平臺,生產平臺,測試平臺,每一個平臺都對應著一個不同的路徑,
5)假設你要將100個圖片放在100個不同的路徑底下,我們只需要進行修改配置文件里面就可以了,這樣就就可以保證我們每進行修改一次配置文件,就換了一個不同的存放目錄,還要有主配置文件
2)圖片名稱------一種是使用時間戳,一種是使用UUID,一種是用用戶的唯一身份標識自增主鍵
3)獲取到原圖片上傳的格式:先獲取到文件的具體名字,在進行字符串截取文件格式是文件名的一部分
application.properties里面的代碼設置配置文件的活躍性:spring.profiles.active=dev1 //開發環境就設置配置文件是dev1(windoes上面的路徑),如果是生產環境就設置配置文件是dev2(linux環境上面的路徑) @Controller public class UserController {@Value("${FilePath.url}")//讀取配置文件里面的urlprivate String url;@PostConstructpublic void start(){System.out.print(url);}@RequestMapping("/file")@ResponseBodypublic String Upload(@RequestPart("myfile") MultipartFile file) throws IOException { //1上傳文件路徑,從配置文件中讀取,小心文件名重復而造成覆蓋String BasePath=url; //2生成動態的文件名,沒傳過來一個文件都要生成動態的文件名:xx.jpg String filename= UUID.randomUUID()+(file.getOriginalFilename() .substring(file.getOriginalFilename() .lastIndexOf(".")));System.out.println(filename);file.transferTo(new File(BasePath+filename));return "上傳成功";} }
application-dev1.yml里面的代碼:
#表示上產環境的配置文件,里面進行存放的是本地Windows系統上面的圖片保存路徑(父親路徑) img:ImageFatherPath: D:/Data/ #表示要存放圖片的父親目錄application-dev2.yml里面的代碼:
#表示開發環境的配置文件,最終保存在linux服務器上面,我們在這里面是要進行指定圖片的保存路徑的(因為他們沒有C盤D盤) img:path: /root/img //因為我們返回的是字符串,所以我們不光要添加對應的路由映射 還要添加返回的格式是一個字符串而不是一個頁面@Controller public class UserController {//從配置文件中讀取我們上傳的image圖片保存的父親路徑@Value("${img.ImageFatherPath}")private String fatherPath;@RequestMapping("/Java100")@ResponseBodypublic String run(@RequestPart("myfile")MultipartFile file) throws IOException {//1.獲取到原來要進行保存的文件的父親路徑:fatherPath//2.獲取到文件的名稱//3.獲取到原文件上傳的格式UUID是全球唯一IDString filename=file.getOriginalFilename();//xxx.png------得到原圖片的名稱filename=filename.substring(filename.lastIndexOf("."),filename.length());//png---得到原圖片的后綴filename=UUID.randomUUID().toString()+filename;file.transferTo(new File(fatherPath+filename));return "上傳成功";} }4)獲取到Cookie和Session和Header頭(這些都是系統自己產生的,不是用戶進行自定義的)----每一個方法都默認支持了兩個隱藏參數
所有的SpringMVC里面,所有映射方法中,都會內置兩個參數,HttpServletRequest和HttpServletResponse這兩個參數
@Controller class UserController{@RequestMapping("/Java")@ResponseBodypublic Cookie[] GetCookies(HttpServletRequest req,HttpServletRequest resp){Cookie[] arr1= req.getCookies();System.out.println(Arrays.toString(arr1));return arr1;} }
通過上面的方式就可以進行設置Cookie了?
@Controller public class User1Controller {@RequestMapping("/hello")@ResponseBodypublic HashMap<String,String> run(HttpServletRequest req, HttpServletResponse resp){HashMap<String,String> hashMap=new HashMap<>();Cookie[] cookies=req.getCookies();//獲取到每一個Cookie對象for(Cookie cookie:cookies){hashMap.put("Cookie的name"+" "+cookie.getName(),"Cookie的value"+" "+cookie.getValue());}return hashMap;} } //上面的cookie.getName()是拿取到Cookie中的key值 @Controller public class User1Controller {@RequestMapping("/hello")@ResponseBodypublic String run(@CookieValue("username") String username,@CookieValue("password") String password){ //上面的這種@CookieValue的方式是根據Cookie種的Key來進行獲取到valuereturn username+password; Cookie: username=abc; password=cde} }或者使用這種SpringMVC的專用方法也是可以獲取到Cookie字段的:
@Controller class UserController{@RequestMapping("/Java")@ResponseBodypublic String GetHeader(@RequestHeader("Cookie") String Cookie){return Cookie;} }@Slf4j//這個注解是一個類注解,而不是一個方法注解 @Controller public class User1Controller {@RequestMapping("/hello")@ResponseBodypublic void run(@RequestHeader("Cookie")String cookies){ //這個注解必須用一個字符串來進行接收,況且@RequestHeader里面填寫要獲取到哪一個字段String[] strings=cookies.split(" ");for(String s:strings){System.out.println(s);}} } //從上面結果也是可以看出,也是可以按照空格來進行分割的 username=abc; password=cde
獲取Header頭:
@Controller class UserController{@RequestMapping("/Java")@ResponseBodypublic String GetHeader(@RequestHeader("Host") String userAgent){return userAgent;} } package com.example.demo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.UUID; @Controller public class UserController {@RequestMapping("/Java100")@ResponseBodypublic void run(HttpServletRequest req, HttpServletResponse resp) throws IOException {resp.setContentType("text/html;charset=utf-8");Cookie[] cookies=req.getCookies();String username=req.getParameter("username");String password=req.getParameter("password");String data=req.getHeader("Host");//使用Servlet的方式獲取Header頭String accept=req.getHeader("Accept");resp.getWriter().write("你好呀"+username+password+data+accept);} } @Controller public class UserController {@RequestMapping("/Java100")@ResponseBodypublic String run(@RequestHeader("User-Agent") String UserAgent,@RequestHeader("Host") String host) throws IOException {return UserAgent+host;//host=127.0.0.1:8080} }設計登陸界面:-----存儲Session,獲取Session我們在POSTman是無法模擬Session的,因此Session非常安全
@Controller class UserController{@RequestMapping("/Java100")@ResponseBodypublic String login(HttpServletRequest req, String username, String password, HttpServletResponse resp) throws IOException {if(password==null||password.equals("")||username==""||username.equals("")){return "用戶名或者密碼錯誤";}if(!username.equals("李佳偉")||!password.equals("12503487")){return "用戶名錯誤或者密碼錯誤";}HttpSession httpSession=req.getSession(true); //自動根據SessionID去查找HttpSession //沒有回話就創建會話,r如果有回話就使用會話,沒有回話就創建會話httpSession.setAttribute("username",username);resp.sendRedirect("/Java101");return "";}@RequestMapping("/Java101")@ResponseBodypublic String GetSession(HttpServletRequest req){HttpSession session=req.getSession();if(session==null||session.equals("")){return "當前用戶沒有進行登錄";}String username=(String)session.getAttribute("username");if(username==null||username.equals("")){return "當前用戶沒有進行登錄";}return username+"當前用戶已經登陸成功";} }下面寫一種更加簡單的獲取Session的方法:(兩種方法)
@RequestMapping("/Java101")@ResponseBodypublic String GetSession(@SessionAttribute(value="username",required = false) String username){ //required=false,表示如果不進行添加的話那么當Session中不存在該屬性的時候會發生報錯return username;}?小結:SpringMVC進行獲取用戶的請求信息:
Session:Map<String,Object>
String:SessionID,Object:HttpSession
0)以后的SessionID返回給客戶端之后,下一次客戶端再次訪問瀏覽器的時候
Cookie:JSESESSIONID:一大堆字符串------>等價于是SessionID
1)獲取到單個參數:我們在方法里面進行獲取到對應的參數就可以實現(方法名的參數和前端的參數要一致)
2)獲取對象:在方法里面直接寫對象就可以進行實現,但是對象中的屬性要和前端url或者表單的參數是一致的
3)獲取到JSON對象:@RequestBody加到方法的參數的前面,表示服務器要進行讀取JSON格式的數據
4)獲取文件:@RequestPart,里面填寫的是前端已經上傳的key的屬性+@MultipartFile+自定義名字
5)獲取用戶的Cookie/Session/Header:
@CookieValue(里面填寫的是已知Cookie字段中的Key)+String XXX
/@SessionSttribute(value=里面填寫的是HttpSession中的Key)+String xxx
1)會自動根據SessionID來進行獲取到Session鍵值對中的HttpSession
2)還會自動根據里面填寫的value中的值作為HttpSession中的Key
3)根據HttpSession中的Key來自動獲取到Session字段并填充到咱們的String里面
4)如果說此時客戶端請求的Http報文里面沒有Session信息那么代碼會直接報錯,返回400直接報錯
/@RequestHeader(里面填寫的是HTTP請求報文中的原字段名)+String XXX
總結
以上是生活随笔為你收集整理的SpringMVC---(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java入门(3)——简易绘图板
- 下一篇: 海龟交易