目錄
一,MVC定義
二,SpringMVC的基本使用?
2.1建立連接 - @RequestMapping("/...")
?編輯
2.2請求
1.傳遞單個參數
2.傳遞多個參數
3.傳遞對象
4.參數重命名
5.傳遞數組
6. 傳遞集合
7.傳遞JSON數據
8. 獲取url中數據
9. 傳遞文件
10.獲取Cookie
11.獲取session
12.獲取header
?編輯
2.3響應
1.返回靜態頁面
2.返回html片段
3. 返回JSON
?4.設置狀態碼
5.設置Header
一,MVC定義
MVC,英文名Model-View-Controller,是軟件工程中的一種軟件架構模式。MVC模式分離了應用程序的數據訪問,用戶界面,和處理邏輯。
- Model(模型):模型是用來處理數據和業務邏輯,在MVC 模式中,模型與視圖是分離的,模型并不知道視圖的存在。
- View(視圖):視圖是用戶看到和交互的界面,例如網頁,窗口等。視圖通常是動態生成的。
- Controller(控制器):控制器接收用戶的請求,并調用模型和視圖去完成用戶的需求。控制器本身不輸出任何東西和做任何處理,它只是接收請求并決定調用哪個模型構件和哪個視圖來處理請求。
二,SpringMVC的基本使用?
學習Spring MVC 就是學習如何通過瀏覽器和用戶程序進行交互,主要分為一下三個方面:
- 建立連接:將瀏覽器于Java程序連接起來,就是訪問一個網址能調用Spring程序
- 接收請求:用戶請求可能會帶一些參數,要學會在程序中接收這些參數
- 返回響應:直接完業務邏輯后,要將程序運行的結果返回給用戶
2.1建立連接 - @RequestMapping("/...")
@RequestMapping 注解是用來注冊接口的路由映射的。表示服務接收到請求時,路徑為 /... 的請求會調用對應的方法。
該注釋既可以修飾方法也可以修飾類,如果兩者同時加注釋的話,它的訪問地址就是 類路徑 + 方法路徑,舉個例子:
@RestController
@RequestMapping("/test")
public class Test {@RequestMapping("/hello")public String test1(){return "hello world!";}
}
//這里的路徑是指:類路徑(/test)+ 方法路徑(/hello)
@RequestMapping注釋既支持post請求也支持get請求,也可以限定只支持其中一個請求方式,代碼如下:
@RestController
@RequestMapping("/test")
public class Test {//如果只有一個參數,就會默認賦值給value這個屬性,如果有多個參數,就需要屬性名 = ...//此處表示只支持post請求@RequestMapping(value = "/hello",method = RequestMethod.POST)public String test1(){return "hello world!";}
}
2.2請求
一般的參數名要與請求中給的數據一致
1.傳遞單個參數
@RequestMapping("/r1")public String r1(String name){return "name = " + name;}
2.傳遞多個參數
@RequestMapping("/r2")public String r2(String name, Integer age){return "name = " + name+", age = " + age;}
3.傳遞對象
@RequestMapping("/r3")public String r3(User user){//User是單獨創建的一個對象,需要有構造方法和get()return user.toString();}
4.參數重命名
當請求中的給的名稱與參數名不一致時,可以使用 @RequestParam注解
@RequestMapping("/r4")public String r4(@RequestParam("name") String username, Integer age){return "name = " + username+", age = " + age;}
使用@RequestParam注解還有一點需要注意:它修飾的參數默認是必須傳值的,如果沒有傳值,就會報錯。當然也可以設置為非必傳,代碼如下:
@RequestMapping("/r4")public String r4(@RequestParam(value = "name", required = false) String username, Integer age){return "name = " + username+", age = " + age;}
5.傳遞數組
@RequestMapping("/r5")public String r5(int[] arr){return Arrays.toString(arr);}
有兩種請求方式 :
6. 傳遞集合
@RequestMapping("/r6")public String r6(@RequestParam List<Integer> lst){return lst.toString();}
7.傳遞JSON數據
@RequestMapping("/r7")public String r7(@RequestBody User user){return user.toString();}
8. 獲取url中數據
這里需要使用@PathVariable,該注釋主要作用在url路徑的數據綁定上,即默認參數寫在url上。該注釋也可以設置成非必傳,但是一般都是默認的。
@RequestMapping("/r8/{name}")public String r8(@PathVariable String name){return name;}
9. 傳遞文件
@RequestMapping("/r9")public String r9(@RequestPart MultipartFile file) throws IOException {String filename = file.getOriginalFilename();//獲取文件名file.transferTo(new File("D:/二次元/"+filename));//將文件上傳到指定的路徑return filename;}
10.獲取Cookie
@RequestMapping("/r10")//這里的兩個參數,是spring內置的,用到的時候可以直接加上public String r10(HttpServletRequest request, HttpServletResponse response) {}//獲取cookie的第一種寫法,能得到所有的cookie@RequestMapping("/r10")public String r10(HttpServletRequest request) {Cookie[] cookies = request.getCookies();String res = "";for(Cookie x : cookies){res = res + x.getName() + ":" + x.getValue();}return res;}//第二種寫法,獲取名為Cookie_2對應value@RequestMapping("/r11")public String r11(@CookieValue("Cookie_2") String value) {return value;}
11.獲取session
//三種方式都行@RequestMapping("/r12")public String r12(HttpServletRequest request) {HttpSession session = request.getSession();String username = (String)session.getAttribute("username");return username;}@RequestMapping("/r13")public String r13(HttpSession session) {String username = (String)session.getAttribute("username");return username;}@RequestMapping("/r14")public String r14(@SessionAttribute("username") String name) {return name;}
12.獲取header
@RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){//請求頭中的數據是以鍵值對的形式存儲,所以和map的用法差不多String userAgent = request.getHeader("User-Agent");return userAgent;}@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent){return userAgent;}
2.3響應
1.返回靜態頁面
@Controller
@RequestMapping("/demo")
public class Demo {@RequestMapping("/r1")public String r1(){return "/index.html";}
}
這里需要講解一下@RequestController注解與@Controller注解的區別,先看一下它們的源碼:
//@Controller
@Target({ElementType.TYPE})//表示能作用的目標(比如:類,方法)
@Retention(RetentionPolicy.RUNTIME)//表示生命周期
@Documented
@Component
public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";
}
//@ResquestController
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
}
我們可以發現,@RequestController = @Controller + @ResponseBody,而@Controller注釋只負責告訴Spring幫我們管理哪些程序,所以關鍵是@ResponsBody注釋,它的作用是保證返回的一定是數據,如果不加該注釋,那么默認返回的是一個網頁。
?@ResponsBody注解既可以修飾類,也可以修飾方法,修飾類,那么該類中的所有方法都返回數據;修飾方法,表示該方法返回的數數據,當一個類中的方法既要返回數據也要返回頁面時,要給該類使用@Controller注解,再給返回數據的方法加上@ResponseBody注解。
2.返回html片段
直接返回數據,spring會根據返回的結果,動態設置response的content-type
@ResponseBody@RequestMapping("/r2")public String r2(){return "<h1>.....</h1>";}
3. 返回JSON
類和哈希都會自動轉換成 json格式來返回
@ResponseBody@RequestMapping("/r3")public User r3(){User user = new User();user.setName("zhangsan");user.setAge(18);user.setSex("男");return user;}
@ResponseBody@RequestMapping("/r4")public Map<String, String> r4(){HashMap map = new HashMap();map.put("key", "value");map.put("zhangsan", "lisi");return map;}
?4.設置狀態碼
@ResponseBody@RequestMapping("/r7")public String r7(HttpServletResponse response){response.setStatus(404);return "設置成功";}
5.設置Header
Http響應報頭也會向客戶端傳遞一些信息,比如服務程序的名稱,請求資源已移動到新地址等,如:Content-Type,Local等。這些信息通過@RequestMapping注解來實現,先看看它的源碼:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};
}
- value:指映射的URL
- method:指請求的method類型,比如:post,get,put...
- consumes:指處理請求(request)的提交內容類型(Content-Type)
- produces:指返回提交內容類型,僅當request請求頭中的Accept類型包含該指定類型才返回
- params:request中必須包含某參數值時,才讓該方法處理
- header:request中必須包含某指定的header參數值時,才讓該方法處理
?設置Content-Type
@ResponseBody@RequestMapping(value = "/r9",produces = "application/json")public String r9(){return "1111";}
自定義Header:這里的key和value是可以自己隨意指定的
@ResponseBody@RequestMapping("/r10")public String r10(HttpServletResponse response) {response.setHeader("key","value");return "設置成功";}
?