SpringMvc相較於Servlet開發簡單了很多只需要常用的註解,我們需要記住的是它用了那些方式去傳輸數據和驗證數據,方便以後對java框架的審計,mvc有很多內容是和Servlet重覆的我只需要大概的複習一遍,解下來還有最後一點mvc的只是就是攔截器。 ...
0x00前言
Spring MVC 是 Spring 提供的一個基於 MVC 設計模式的輕量級 Web 開發框架,本質上相當於 Servlet。
Spring MVC 是結構最清晰的 Servlet+JSP+JavaBean 的實現,是一個典型的教科書式的 MVC 構架,不像 Struts 等其它框架都是變種或者不是完全基於 MVC 系統的框架。
Spring MVC 角色劃分清晰,分工明細,並且和 Spring 框架無縫結合。Spring MVC 是當今業界最主流的 Web 開發框架,以及最熱門的開發技能。
在 Spring MVC 框架中,Controller 替換 Servlet 來擔負控制器的職責,用於接收請求,調用相應的 Model 進行處理,處理器完成業務處理後返回處理結果。Controller 調用相應的 View 並對處理結果進行視圖渲染,最終客戶端得到響應信息
0x01springmvc介紹
- SpringMVC一種基於Java實現MVC模型的輕量級Web框架
- 使用簡單方便開發,是簡化版的servlt
- 用於表現層開發的一種框架
- 現在都採用註解開發更加方便
0x02SpringMVC簡單入門
是屬於sping容器的spring又是ioc模式的所要把所有都配置成bean
寫一個配置類
//springmvc配置類,本質上還是一個spring配置類
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringMvcConfig {
}
寫載入類去載入spring容器里的bean
package com.itheima.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web容器配置類
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//載入springmvc配置類,產生springmvc容器(本質還是spring容器)
protected WebApplicationContext createServletApplicationContext() {
//初始化WebApplicationContext對象
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//載入指定配置類
ctx.register(SpringMvcConfig.class);
return ctx;
}
//設置由springmvc控制器處理的請求映射路徑
protected String[] getServletMappings() {
return new String[]{"/"};
}
//載入spring配置類
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
控制器
package com.itheima.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
//定義表現層控制器bean
@Controller
public class UserController {
//設置映射路徑為/save,即外部訪問路徑
@RequestMapping("/save")
//設置當前操作返回結果為指定json數據(本質上是一個字元串信息)
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
//設置映射路徑為/delete,即外部訪問路徑
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
}
- 簡單配置就說的是用@@RequestMapping作為訪問的路徑
- @ResponseBody寫在函數上面就可以用該函數的返回值作為響應值,也可以設置請求方式
0x03MVC常用註解
0x1配置簡化開發
package com.itheima.config;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
//web配置類簡化開發,僅設置配置類類名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
/*
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
protected WebApplicationContext createRootApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
*/
0x2路徑配置
@Controller
//類上方配置的請求映射與方法上面配置的請求映射連接在一起,形成完整的請求映射路徑
@RequestMapping("/user")
public class UserController {
//請求路徑映射
@RequestMapping("/save")
@ResponseBody
public String save(){
System.out.println("user save ...");
return "{'module':'user save'}";
}
//請求路徑映射
@RequestMapping("/delete")
@ResponseBody
public String delete(){
System.out.println("user delete ...");
return "{'module':'user delete'}";
}
}
- 訪問第一個方法的路徑是/user/save
- 第二個方法的路徑是/user/delete
0x3請求方式和註解
//請求參數
@Controller
public class UserController {
//普通參數:請求參數與形參名稱對應即可完成參數傳遞
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){
System.out.println("普通參數傳遞 name ==> "+name);
System.out.println("普通參數傳遞 age ==> "+age);
return "{'module':'common param'}";
}
//普通參數:請求參數名與形參名不同時,使用@RequestParam註解關聯請求參數名稱與形參名稱之間的關係
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){
System.out.println("普通參數傳遞 userName ==> "+userName);
System.out.println("普通參數傳遞 age ==> "+age);
return "{'module':'common param different name'}";
}
//POJO參數:請求參數與形參對象中的屬性對應即可完成參數傳遞
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo參數傳遞 user ==> "+user);
return "{'module':'pojo param'}";
}
//嵌套POJO參數:嵌套屬性按照層次結構設定名稱即可完成參數傳遞
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){
System.out.println("pojo嵌套pojo參數傳遞 user ==> "+user);
return "{'module':'pojo contain pojo param'}";
}
//數組參數:同名請求參數可以直接映射到對應名稱的形參數組對象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("數組參數傳遞 likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
//集合參數:同名請求參數可以使用@RequestParam註解映射到對應名稱的集合對象中作為數據
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合參數傳遞 likes ==> "+ likes);
return "{'module':'list param'}";
}
//集合參數:json格式
//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
//2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的集合對象中作為數據
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("list common(json)參數傳遞 list ==> "+likes);
return "{'module':'list common for json param'}";
}
//POJO參數:json格式
//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
//2.使用@RequestBody註解將外部傳遞的json數據映射到形參的實體類對象中,要求屬性名稱一一對應
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("pojo(json)參數傳遞 user ==> "+user);
return "{'module':'pojo for json param'}";
}
//集合參數:json格式
//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
//2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的保存實體類對象的集合對象中,要求屬性名稱一一對應
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)參數傳遞 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
//日期參數
//使用@DateTimeFormat註解設置日期類型數據格式,預設格式yyyy/MM/dd
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
System.out.println("參數傳遞 date ==> "+date);
System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("參數傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}";
}
}
- 請求方式的配置是在路徑也就是@RequestMapping後面配上method=request.get/post/put/delete
- 當輸入的參數和獲取的參數不同時候用,@RequestParam("name")這種類似的標簽給形參綁定值,如果形參和傳入值相同的話可以不用謝註解
0x4JSON傳輸
package com.itheima.controller;
import com.itheima.domain.User;
import org.springframework.format.annotation.DateTimeFormat;
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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
//請求參數
@Controller
public class UserController {
//普通參數:請求參數與形參名稱對應即可完成參數傳遞
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name ,int age){
System.out.println("普通參數傳遞 name ==> "+name);
System.out.println("普通參數傳遞 age ==> "+age);
return "{'module':'common param'}";
}
//普通參數:請求參數名與形參名不同時,使用@RequestParam註解關聯請求參數名稱與形參名稱之間的關係
@RequestMapping("/commonParamDifferentName")
@ResponseBody
public String commonParamDifferentName(@RequestParam("name") String userName , int age){
System.out.println("普通參數傳遞 userName ==> "+userName);
System.out.println("普通參數傳遞 age ==> "+age);
return "{'module':'common param different name'}";
}
//POJO參數:請求參數與形參對象中的屬性對應即可完成參數傳遞
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo參數傳遞 user ==> "+user);
return "{'module':'pojo param'}";
}
//嵌套POJO參數:嵌套屬性按照層次結構設定名稱即可完成參數傳遞
@RequestMapping("/pojoContainPojoParam")
@ResponseBody
public String pojoContainPojoParam(User user){
System.out.println("pojo嵌套pojo參數傳遞 user ==> "+user);
return "{'module':'pojo contain pojo param'}";
}
//數組參數:同名請求參數可以直接映射到對應名稱的形參數組對象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("數組參數傳遞 likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
//集合參數:同名請求參數可以使用@RequestParam註解映射到對應名稱的集合對象中作為數據
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合參數傳遞 likes ==> "+ likes);
return "{'module':'list param'}";
}
//集合參數:json格式
//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
//2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的集合對象中作為數據
@RequestMapping("/listParamForJson")
@ResponseBody
public String listParamForJson(@RequestBody List<String> likes){
System.out.println("list common(json)參數傳遞 list ==> "+likes);
return "{'module':'list common for json param'}";
}
//POJO參數:json格式
//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
//2.使用@RequestBody註解將外部傳遞的json數據映射到形參的實體類對象中,要求屬性名稱一一對應
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("pojo(json)參數傳遞 user ==> "+user);
return "{'module':'pojo for json param'}";
}
//集合參數:json格式
//1.開啟json數據格式的自動轉換,在配置類中開啟@EnableWebMvc
//2.使用@RequestBody註解將外部傳遞的json數組數據映射到形參的保存實體類對象的集合對象中,要求屬性名稱一一對應
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json)參數傳遞 list ==> "+list);
return "{'module':'list pojo for json param'}";
}
//日期參數
//使用@DateTimeFormat註解設置日期類型數據格式,預設格式yyyy/MM/dd
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern="yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss") Date date2){
System.out.println("參數傳遞 date ==> "+date);
System.out.println("參數傳遞 date1(yyyy-MM-dd) ==> "+date1);
System.out.println("參數傳遞 date2(yyyy/MM/dd HH:mm:ss) ==> "+date2);
return "{'module':'data param'}";
}
}
public String listPojoParamForJson(@RequestBody List<User> list)
- 這個方法中註解代表的意思是形參接受的是請求頭中的流量
- 在config文件裡面加上//開啟json數據類型自動轉換 @EnableWebMvc
- json是以後很常用的傳輸方式
0x5響應
@Controller
public class UserController {
//響應頁面/跳轉頁面
//返回值為String類型,設置返回值為頁面名稱,即可實現頁面跳轉
@RequestMapping("/toJumpPage")
public String toJumpPage(){
System.out.println("跳轉頁面");
return "page.jsp";
}
//響應文本數據
//返回值為String類型,設置返回值為任意字元串信息,即可實現返回指定字元串信息,需要依賴@ResponseBody註解
@RequestMapping("/toText")
@ResponseBody
public String toText(){
System.out.println("返回純文本數據");
return "response text";
}
//響應POJO對象
//返回值為實體類對象,設置返回值為實體類類型,即可實現返回對應對象的json數據,需要依賴@ResponseBody註解和@EnableWebMvc註解
@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json對象數據");
User user = new User();
user.setName("itcast");
user.setAge(15);
return user;
}
//響應POJO集合對象
//返回值為集合對象,設置返回值為集合類型,即可實現返回對應集合的json數組數據,需要依賴@ResponseBody註解和@EnableWebMvc註解
@RequestMapping("/toJsonList")
@ResponseBody
public List<User> toJsonList(){
System.out.println("返回json集合數據");
User user1 = new User();
user1.setName("傳智播客");
user1.setAge(15);
User user2 = new User();
user2.setName("黑馬程式員");
user2.setAge(12);
List<User> userList = new ArrayList<User>();
userList.add(user1);
userList.add(user2);
return userList;
}
}
- 想返回一個頁面直接把方法的返回值寫成String然後返回那個頁面的名字寫在哪裡
- 響應文本數據
返回值為String類型,設置返回值為任意字元串信息,即可實現返回指定字元串信息,需要依賴@ResponseBody註解 - 響應POJO對象
//返回值為實體類對象,設置返回值為實體類類型,即可實現返回對應對象的json數據,需要依賴@ResponseBody註解和@EnableWebMvc註解 - 響應POJO集合對象
返回值為集合對象,設置返回值為集合類型,即可實現返回對應集合的json數組數據,需要依賴@ResponseBody註解和@EnableWebMvc註解
0x04總結
SpringMvc相較於Servlet開發簡單了很多只需要常用的註解,我們需要記住的是它用了那些方式去傳輸數據和驗證數據,方便以後對java框架的審計,mvc有很多內容是和Servlet重覆的我只需要大概的複習一遍,解下來還有最後一點mvc的只是就是攔截器。