SpringMVC基础(下)

简介: SpringMVC基础(下)

@PathVariable

pathvariable:路径变量

和字⾯表达的意思⼀样,这个注解主要作⽤在请求URL路径上的数据绑定

@RequestMapping("/m5/{name}/{id}")
public String m5(@PathVariable Integer id, @PathVariable("name") String username) {
    return "Hello,world person:"+ id+username;
}


3fca9b7036945f8e29b951ec4e244281.png

如果⽅法参数名称和需要绑定的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;
}


253ee086731b754181cae9cf9b228da5.png


Cookie/Session

Cookie和Session的区别:

  1. Cookie是客⼾端保存⽤⼾信息的⼀种机制;Session是服务器端保存⽤⼾信息的⼀种机制
  2. Cookie和Session之间主要是通过SessionId关联起来的;SessionId是Cookie和Session之间的桥梁
  3. 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");
}


46bf14adb908407017298efd6584de88.png

说明:

  1. HttpSession getSession(boolean create):参数如果为true,则当不存在会话时新建会话;参数如果为false,则当不存在会话时返回null
  2. HttpSession getSession():和getSession(true)含义⼀样,默认值为true
  3. void setAttribute(Stringname,Objectvalue):使⽤指定的名称绑定⼀个对象到该session会话
  4. 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 既是类注解,⼜是⽅法注解:

  1. 如果作⽤在类上,表⽰该类的所有⽅法,返回的都是数据,如果作⽤在⽅法上,表⽰该⽅法返回的是数据
  2. 如果类上有 @RestController 注解时:表⽰所有的⽅法上添加了 @ResponseBody 注解


返回HTML代码⽚段

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

响应中的Content-Type常⻅取值有以下⼏种:

  1. text/html:body数据格式是HTML
  2. text/css:body数据格式是CSS
  3. application/javascript:body数据格式是JavaScript
  4. 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;
}


4afa408049ae8e7758447f5e6a4602b0.png

设置状态码

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 {};
}


说明:

  1. value:指定映射的URL
  2. method:指定请求的method类型,如GET,POST等
  3. consumes:指定处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html;
  4. produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
  5. Params:指定request中必须包含某些参数值时,才让该⽅法处理
  6. 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已经存在,则覆盖旧的值

相关文章
|
设计模式 前端开发 Java
SpringMVC系列(一)之SpringMVC入门详细介绍
SpringMVC系列(一)之SpringMVC入门详细介绍
|
2月前
|
JSON Java 应用服务中间件
SpringMVC基础
SpringMVC基础
|
7月前
|
JSON 前端开发 Java
SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目
SpringMVC概述、SpringMVC的工作流程、创建SpringMVC的项目
49 2
|
JSON 前端开发 Java
SpringMVC基础(上)
SpringMVC基础(上)
|
JSON 前端开发 Java
springMVC基础技术使用
springMVC基础技术使用
47 0
|
存储 XML JSON
一篇让你知道SpringMVC中的所有基础使用技术
一篇让你知道SpringMVC中的所有基础使用技术
51 0
|
关系型数据库 MySQL 数据库
42SpringMVC - SpringMVC小案例
42SpringMVC - SpringMVC小案例
32 0
|
前端开发 Java 应用服务中间件
SpringMVC学习
SpringMVC学习
56 0
|
前端开发 Java 程序员
|
Java 容器 Spring
SpringMVC学习(十一):注解配置SpringMVC
使用配置类和注解代替web.xml和SpringMVC配置文件的功能
144 0