springmvc——一 站式web框架,核心是处理http请求响应。
前后端分离:需要序列化,服务端把数据序列化成字符串或者流给前端,前端又把json转成对象,前端的叫反序列化。前端把数据序列化转成字符串给服务器,服务器收到字符串转成对象。(转化为json字符串进行网络传输)
序列化:对象转字符串
反序列化:字符串转对象
@RequestMapping路径映射
路径位置通配符:多个都能匹配上,就精确优先
* : 匹配任意多个字符(0-n)不能匹配多个路径——使用/**解决
** :匹配任意多层路径
? : 匹配任意一个字符
精确程度:完全匹配——?——*——**
精确路径必须全局唯一
/*** //@RestController(处理请求和响应数据)<——@Controller、@ResponseBody* @ResponseBody:(告诉spring,把返回的内容写到响应体中,每次请求进来执行目标方法)*/
@RestController
public class HelloController {* @return*/@RequestMapping("/hello")public String hello(){return "Hello spring MVC 你好!";}}
请求限定
请求方式:method
请求参数:params
请求头:headers
请求内容类型:consumes
响应内容类型:produces
@RestController
public class HelloController {/*** 限定请求方式-接收post请求* GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS,TRACE;*/@RequestMapping(value = "/test01",method = RequestMethod.POST)public String test01(){return "Hello spring MVC 你好!";}/***限定请求参数-接收参数请求* name:表示必须包含name=username参数 (http://localhost:8080/test02?name=username)*/@RequestMapping(value = "/test02",params ={ "name=username"})public String test02(){return "Hello spring MVC 你好!";}/*** 限定请求头-接收请求头请求* accept:表示必须包含请求头Accept* @return*/@RequestMapping(value = "/test03",headers = {"Accept"})public String test03(){return "Hello spring MVC test03";}/*** 请求内容类型-接收请求内容类型请求* application/json:表示浏览器必须携带json格式数据。*/@RequestMapping(value = "/test04",consumes = {"application/json"})public String test04(){return "Hello spring MVC test04";}/*** 响应内容类型* text/html;charset=UTF-8:生产html页面* @return*/@RequestMapping(value = "/test05",produces = {"text/html;charset=UTF-8"})public String test05(){return "<h1>hello</h1>";}
}
请求处理
~使用普通变量,收集请求参数
~使用@RequestParam
~使用POJO,统一封装多个参数
~@CookieValue获取Cookie数据
~使用POJO,级联封装复杂对象
~使用@RequestBody,封装JSON对象
~使用@RequestPart/@RequestParam,封装文件对象
使用普通变量,收集请求参数
/***请求参数-使用普通变量* 要求:变量名和参数名保持一致*/@RequestMapping("/handle01")public String handle01(String username, String password) {System.out.println("username"+username+",password:"+password);return "success";}
使用@RequestParam
@RequestParam():取出某个请求参数的值,请求参数可以和变量名不一致。
/*** 默认一定要携带的参数,否则报错* required = false:可以不携带//默认为true* defaultValue:默认值,参数可以不带* 无论请求参数是来自请求体还是url?后面,都可以取到(请求参数)* @return*/@RequestMapping("/handle02")public String handle02(@RequestParam("username") String name,@RequestParam(value = "password", defaultValue = "123456")String pwd,@RequestParam("phone")String phone,@RequestParam(value="agreement",required = false)boolean agree) {System.out.println("username"+name+",password:"+pwd+",cellphone:"+phone+",agreement:"+agree);return "success";}
@PathVariable-路径变量
/*** @PathVariable路径变量标识-取路径id的值* @param id* @return*/@RequestMapping("/handle/{id}") //{id}路径变量,动态的public String handle08(@PathVariable Integer id) {System.out.println("id:"+id);return "success";}
使用POJO,统一封装多个参数
/***请求参数-pojo统一封装参数* 自动把请求参数和pojo属性进行匹配* 效果:pojo的所有属性值都来自请求参数* @return*/@RequestMapping("/handle03")public String handle03(Person person) {System.out.println(person);return "success";}
使用POJO,级联封装复杂对象
/***使用pojo级联封装复杂属性* 属性套属性,对象套对象* 例如:①address属性中有三个属性,可以把address当成对象。* ②前端传过来的属性能选多个,可以封装成数组。* @Data* public class Person {* private String username;* private Address address;* private String[] hobby;* }* @Data* class Address{* private String province;* private String city;* }* @return*/@RequestMapping("/handle06")public String handle05(Person person) {System.out.println(person);return "success";}
使用@RequestBody,封装JSON对象
/*** 接受json数据* @RequestBody 获取请求体的json数据,自动转为person对象(反序列化)* 发出:请求体是json字符串,不是key=value* @return*/@RequestMapping("/handle07")public String handle06(@RequestBody Person person) {System.out.println(person);return "success";}
使用MultipartFile封装文件对象
/***例:前端发送表单数据,表单包含数据,和头像图片和生活照图片* 接受文件上传* @RequestParam取出文件项(前端参数名称),封装到MultipartFile,就可以拿到文件内容* @param person* @return*/@RequestMapping("/handle08")public String handle07(Person person, @RequestParam("headerImage") MultipartFile headerImgFile,@RequestParam("lifeImage") MultipartFile[] lifeImgFiles) throws IOException {//1、获取原始文件名String originalFilename = headerImgFile.getOriginalFilename();//2、文件保存headerImgFile.transferTo(new File("E:\\img\\" + originalFilename));
// 以上处理了头像,下面处理多个生活照if (lifeImgFiles.length > 0) {for (MultipartFile imgFile : lifeImgFiles) {imgFile.transferTo(new File("E:\\img\\" + imgFile.getOriginalFilename()));}System.out.println("=======生活照保存结束==========");}System.out.println(person);//文件大小long size = headerImgFile.getSize();//获取文件流InputStream inputStream = headerImgFile.getInputStream();return "success";}
响应处理
1.@ResponseBody+对象:响应json等非页面数据
2.ResponseEntity<B> :响应头、响应体数据(文件下载)
@RestController
public class ResponseTestController {/*** 会自动返回的对象转为json* @return*/@RequestMapping("/resp01")public Person resp01() {Person person = new Person();return person;}/*** 文件下载* HttpEntity,拿到整个请求数据* ResponseEntity,拿到整个响应数据(响应头,响应体,状态码)* 可以用作文件下载模板-只需要修改文件下载位置和文件名即可。* @return*/@RequestMapping("/download")public ResponseEntity<InputStreamResource> download() throws Exception {FileInputStream fileInputStream = new FileInputStream("E:\\photo.png");// 一口气读会溢出 所以使用分段读- InputStreamResource
// byte[] bytes = fileInputStream.readAllBytes();// 文件名中文乱码-解决乱码问题String encode = URLEncoder.encode("1.jpg", "UTF-8");
// 解决文件太大会内存溢出问题InputStreamResource resource = new InputStreamResource(fileInputStream);return ResponseEntity.ok()
// 内容类型,流.contentType(MediaType.APPLICATION_OCTET_STREAM)
// 内容大小.contentLength(fileInputStream.available())
// Content-Disposition:内容处理方式.header("Content-Disposition","attachment;filename="+encode).body(resource);}
}