@PathVariable
pathvariable:路径变量
和字⾯表达的意思⼀样,这个注解主要作⽤在请求URL路径上的数据绑定
@RequestMapping("/m5/{name}/{id}") public String m5(@PathVariable Integer id, @PathVariable("name") String username) { return "Hello,world person:"+ id+username; }
如果⽅法参数名称和需要绑定的URL中的变量名称⼀致时,可以简写,不⽤给@PathVariable的属性赋值,否则需要@PathVariable的属性value赋值
@RequestPart
上传⽂件使用@RequestPart 注解
@RequestMapping("/m6") public String m6(@RequestPart MultipartFile file) throws IOException { String fileName = file.getOriginalFilename(); file.transferTo(new File("C:\\Users\\HP\\Desktop\\"+fileName)); return "接收文件名称:"+fileName; }
Cookie/Session
Cookie和Session的区别:
- Cookie是客⼾端保存⽤⼾信息的⼀种机制;Session是服务器端保存⽤⼾信息的⼀种机制
- Cookie和Session之间主要是通过SessionId关联起来的;SessionId是Cookie和Session之间的桥梁
- Cookie和Session经常会在⼀起配合使⽤,但是不是必须配合
◦ 完全可以⽤Cookie来保存⼀些数据在客⼾端这些数据不⼀定是⽤⼾⾝份信息,也不⼀定是SessionId
◦ Session中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,⽐如通过URL传递
传统获取Cookie:
@RequestMapping("/m8") public String m8(HttpServletRequest request, HttpServletResponse response) { Cookie[] cookies = request.getCookies(); StringBuilder builder = new StringBuilder(); if(cookies!=null) { for (Cookie ck:cookies) { builder.append(ck.getName()+":"+ck.getValue()); } } return "Cookie:"+builder; }
简洁获取Cookie:
@RequestMapping("/m8") public String m9(@CookieValue("test") String test) { return "Cookie:"+test; }
获取Session:
Session是服务器端的机制,我们需要先存储,才能再获取;Session也是基于HttpServletRequest来存储和获取的
@RequestMapping("/m9") public String m9(HttpServletRequest request) { HttpSession session = request.getSession(); if(session!=null) { session.setAttribute("test","hello"); } return "session set"; } @RequestMapping("/m10") public String m10(HttpSession session) { return "session:"+session.getAttribute("test"); }
说明:
- HttpSession getSession(boolean create):参数如果为true,则当不存在会话时新建会话;参数如果为false,则当不存在会话时返回null
- HttpSession getSession():和getSession(true)含义⼀样,默认值为true
- void setAttribute(Stringname,Objectvalue):使⽤指定的名称绑定⼀个对象到该session会话
- ObjectgetAttribute(Stringname):返回在该session会话中具有指定名称的对象,如果没有指定名称的对象,则返回null
简洁获取Session:
@RequestMapping("/m11") public String m11(@SessionAttribute(value = "username",required = false) String name) {//获取指定key return "session:"+name; }
public String m10(HttpSession session) { return "session:"+session.getAttribute("test"); }
获取Header
获取Header也是从 HttpServletRequest 中获取
@RequestMapping("/param10") public String param10(HttpServletRequest request, HttpServletResponse response) String userAgent = request.getHeader("User-Agent"); return name + ":"+userAgent; }
@RequestMapping("/header") public String header(@RequestHeader("User-Agent") String userAgent) { return "userAgent:"+userAgent; }
响应
Http响应结果可以是数据,也可以是静态⻚⾯,也可以针对响应设置状态码,Header信息等
返回静态页面
@Controller public class IndexController { @RequestMapping("/index") public Object index(){ //返回index.html return "/index.html"; } }
@RestController = @Controller + @ResponseBody
@Controller :定义⼀个控制器,Spring框架启动时加载,把这个对象交给Spring管理
@ResponseBody :定义返回的数据格式为⾮视图,返回⼀个text/html信息
如果想返回视图的话,只需要把 @ResponseBody 去掉就可以了,也就是 @Controller
@ResponseBody
@ResponseBody 表⽰返回数据
@ResponseBody 既是类注解,⼜是⽅法注解:
- 如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据
- 如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注解
返回HTML代码⽚段
后端返回数据时,如果数据中有HTML代码,也会被浏览器解析
响应中的Content-Type常⻅取值有以下⼏种:
- text/html:body数据格式是HTML
- text/css:body数据格式是CSS
- application/javascript:body数据格式是JavaScript
- application/json:body数据格式是JSON
如果请求的是js⽂件,SpringMVC会⾃动设置Content-Type为 application/javascript
如果请求的是css⽂件,SpringMVC会⾃动设置Content-Type为 text/css
返回JSON
SpringMVC也可以返回JSON,后端⽅法返回结果为对象
@RequestMapping("/returnJson") @ResponseBody public HashMap<String, String> returnJson() { HashMap<String, String> map = new HashMap<>(); map.put("Java", "Java Value"); map.put("MySQL", "MySQL Value"); map.put("Redis", "Redis Value"); return map; }
设置状态码
SpringMVC会根据我们⽅法的返回结果⾃动设置响应状态码,程序员也可以⼿动指定状态码
通过SpringMVC的内置对象HttpServletResponse提供的⽅法来进⾏设置
@RequestMapping(value = "/setStatus") @ResponseBody public String setStatus(HttpServletResponse response) { response.setStatus(401); return "设置状态码成功"; }
状态码不影响⻚⾯的展⽰
设置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类型,如GET,POST等
- consumes:指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html;
- produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
- Params:指定request中必须包含某些参数值时,才让该⽅法处理
- headers:指定request中必须包含某些指定的header值,才能让该⽅法处理请求
设置Content-Type
通过设置produces属性的值,设置响应的报头Content-Type
@RequestMapping(value = "/returnJson2",produces = "application/json") @ResponseBody public String returnJson2() { return "{\"success\":true}"; }
如果不设置produces,⽅法返回结果为String时,SpringMVC默认返回类型,是text/html
设置响应编码
@RequestMapping(value = "/returnJson2",produces = "application/json;charset=ut @ResponseBody public String returnJson2() { return "{\"success\":true}"; }
设置其他Header
使⽤SpringMVC的内置对象HttpServletResponse提供的⽅法来进⾏设置
@RequestMapping(value = "/setHeader") @ResponseBody public String setHeader(HttpServletResponse response) { response.setHeader("MyHeader","MyHeaderValue"); return "设置Header成功"; }
设置⼀个带有给定的名称和值的header,如果name已经存在,则覆盖旧的值
返回类型,是text/html
设置响应编码
@RequestMapping(value = "/returnJson2",produces = "application/json;charset=ut @ResponseBody public String returnJson2() { return "{\"success\":true}"; }
设置其他Header
使⽤SpringMVC的内置对象HttpServletResponse提供的⽅法来进⾏设置
@RequestMapping(value = "/setHeader") @ResponseBody public String setHeader(HttpServletResponse response) { response.setHeader("MyHeader","MyHeaderValue"); return "设置Header成功"; }
设置⼀个带有给定的名称和值的header,如果name已经存在,则覆盖旧的值