springMVC-请求响应
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";
}
使用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);
}
}