【Spring】SpringMVC入门(二)
- 创业
- 2025-09-10 01:18:02

目录
前言
请求
获取session
获取请求头header
响应
返回静态页面
返回数据
返回HTML代码片段
返回JSON
设置状态码
设置Header
设置响应的类型Content-Type
前言
在上一篇中,我们已经了解了什么是MVC、Spring MVC,以及对Spring MVC中的一些注解的学习,学习了Sring MVC项目中如何传递单个、多个参数、传递对象、数组、集合、JSON数据、文件等,那么本篇我们就接着上一篇的内容继续往下讲。
请求 获取cookie和session在前面,我们已经学习了有关cookie和session的相关知识,那么现在我们就来学习如何获取cookie和session。
获取cookiecookie是由浏览器在发送请求的时候带上的,所以这里我们需要用 HttpServletRequest 类来获取cookie。在HttpServletRequest 中存储着请求的所有内容,简单来说,如果我们想要获取到请求中的内容,都可以通过HttpServletRequest 来获取。
@RequestMapping("/param") @RestController public class ParamController { @RequestMapping("/getCookie") public String getCookie(HttpServletRequest request){ Cookie[] cookies=request.getCookies(); //空指针检验 if(cookies==null){ return "cookie获取失败"; } for(Cookie cookie:cookies){ System.out.println(cookie.getName()+"--"+cookie.getValue()); } return "cookie获取成功"; } }将上面的代码运行请来后,我们利用postman来构建请求,看能不能获取到cookie:
可以看到,当我们运行起来后,构建请求并不能获取到cookie,是因为当前还没有设置cookie。
我们来设置一下:
在选框中填上域名,但这里我们使用的是本地服务器,所以用环回IP
点击add admin后,在下面点击add cookie进行添加cookie。
我们将cookie改一下:
当点击保存后,我们可以在Headers中看到cooki中存储的键值对。
接着我们再来发送请求试试:
可以看到,我们现在能成功的获取到cookie,再后端控制台看一下是不是我们想要的结果:
除了上面的通过 HttpServletRequest 类获取cookie外,Spring MVC还给我们提供了一种更加便捷的方式来获取cookie。
/** * 处理获取特定cookie的请求 * 该方法通过请求中的Cookie来获取用户信息 * * @param name Cookie中名为"name"的值,用于标识用户 * @return 返回包含用户信息的字符串 */ @RequestMapping("/getCookie2") public String getCookie2(@CookieValue("name") String name){ return "接收到参数 name:" + name; }这种方式一个注解只能获取一个cookie,如果我们需要获取多个,那么就需要使用第一种方式。
获取session由于session是服务器端的机制,我们需要先存储,才能获取,session也是基于 HttpServletRequest 类来存储和获取的。服务端如果想要获取到session,需要浏览器发来的请求中的cookie携带的sessionId来进行获取。
@RequestMapping("setSession") public String setSession(HttpServletRequest request){ //获取Session对象 HttpSession session=request.getSession(); if(session!=null){ session.setAttribute("name","zhangsan"); } return "Session存储成功"; }当我们设置完session后,我们可以查看cookie,会发现多了一个cookie,里面就存储着sessionId。
当设置完后,我们就可以来尝试获取session。
@RequestMapping("getSession") public String getSession(HttpServletRequest request){ HttpSession session=request.getSession(); if(session!=null){ String name=(String)session.getAttribute("name"); return "Session存储成功,name:"+name; } return "Session获取失败"; }
在Spring MVC中,提供了几种更为简便的方法来帮助我们获取到session中的属性值。
@RequestMapping("getSession2") public String getSession2(HttpSession session){ if(session!=null){ String name=(String)session.getAttribute("name"); return "name:"+name; } return "获取失败"; }//法三 @RequestMapping("getSession3") public String getSession3(@SessionAttribute("name") String name){ return "name:"+name; } 获取请求头header
传统获取header也是通过 HttpServletRequest 类来获取的。
@RequestMapping("getHeader") public String getHeader(HttpServletRequest request){ String header=request.getHeader("user-agent"); return "获取到请求头:"+header; }我们可以从postman中Headers来查看是否一样:
当然,在Spring MVC中,给我们提供了一种更加便捷的方式来获取header中的值。
@RequestMapping("getHeader2") public String getHeader2(@RequestHeader("user-agent") String header){ return "获取到请求头:"+header; }
通过以上的内容,我们能够初步掌握spring mvc的一些基本操作和注解。
响应在前面的学习以及讲解中,我们返回的都是一些数据类型,或者文件等,但在返回响应的时候,其实也可以返回一些HTML界面、设置状态码、Header信息等。
返回静态页面在某些情况下,我们希望接收到的响应是一个静态页面,那么这个时候后端应该如何返回?
我们先来写一个简单的HTML页面。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>你好</title> </head> <body> <h1>欢迎登录界面</h1> </body> </html>后端代码:
@RestController public class ResponseController { /** * 处理根路径的请求 * * 该方法响应根路径的HTTP请求,返回一个字符串,指示客户端访问的资源 * 这里使用了Spring框架的@RequestMapping注解,将HTTP请求映射到这个方法 * * @return 返回字符串"/index.html",通常这表示重定向或指示客户端请求该资源 */ @RequestMapping("/index") public Object index(){ return "/index.html"; } }我们来测试一下能不能获得HTML界面:
可以看到并不能获取到html界面,我们来抓下包:
我们可以看到内容类型,Content-Type: text/html;charset=UTF-8:表示响应的内容类型是HTML文档,字符编码为UTF-8。简单来说,就是Spring MVC将“/index.html”当成了一个数据返回,这是为什么?
其实这是注解 @RestController 作用的结果,这个注解会将响应内容都看成hi数据,如果我们想要返回一个html界面,我们需要使用 @Controller 注解。
@Controller public class ResponseController { /** * 处理根路径的请求 * * 该方法响应根路径的HTTP请求,返回一个字符串,指示客户端访问的资源 * 这里使用了Spring框架的@RequestMapping注解,将HTTP请求映射到这个方法 * * @return 返回字符串"/index.html",通常这表示重定向或指示客户端请求该资源 */ @RequestMapping("/index") public Object index(){ return "/index.html"; } }这两个注解有什么联系?
我们可以看下 @RestController 和 @Controller 的源码:
可以看到:
@RestController 注解可以写成是 @Controller 和 @ RespouseBody 。
@Controller :定义一个控制器,Spring框架启动时加载,把这个对象交给Spring管理。@ResponseBody:定义返回的数据格式为非视图,返回一个 text/html 信息。所以,如果我们想要返回视图的话,就将 @ResponseBody 注解去掉即可。
返回数据要返回数据,其实就是在 @Controller 注解的基础上再加上 @ResponseBody 注解即可。
@ResponseBody 既是类注解,也是方法注解。
如果作用在类上,表示该类的所有方法,返回的都是数据;如果作用在方法上,表示该方法返回的是数据。
简单来说:在类上加@ResponseBody 相当于在所有的方法上都添加该注解;同样,如果类上有 @RestController 也是同理。
如果一个类的方法里,既有返回数据的,也有返回界面的,就将 @ResponseBody 加在对应的方法上。
@Controller public class ResponseController { @ResponseBody @RequestMapping("/index") public Object index(){ return "/index.html"; } } 返回HTML代码片段当后端返回数据的时候,如果数据中有HTML带吗,也会被浏览器解析。
@RequestMapping("/returnHtml") @ResponseBody public String returnHtml(){ return "<h1>Hello,world~</h1>"; }那么如果我们用postman构建请求,获取到的是什么呢?
我们可以发现,通过postman构建的请求,获取到的类型是 text/plain 而不是html 类型。
这个是取决于发送方的所能接收的数据类型,postman可以接收任意类型的数据,而我们用浏览器发送的请求是有限制的。浏览器能接收的类型没有 text/plain,所以浏览器会对返回的数据进行解析,这里由于我们返回的是一个html片段,所以会被解析为 html 类型。
响应中 Content-Type 常见取值有以下几种:
text/html:body 数据格式是html;text/css:body 数据格式是css;application/javaScript:body数据格式是 JavaScript;application/json:body 数据格式是JSON。 返回JSONSpring MVC不仅可以接收SON数据,还可以返回 JSON 数据。
@ResponseBody @RequestMapping("returnJson") public HashMap<String,String> returnJson(){ HashMap<String,String> map=new HashMap<>(); map.put("name","张三"); map.put("age","20"); return map; }可以看到,返回的数据类型为json:
设置状态码
Spring MVC 设置状态码需要使用 HttpServletResponse 类 中的serStatus() 方法。
@RequestMapping("setStatus") @ResponseBody public String setStatus(HttpServletResponse response){ response.setStatus(444); return "状态码设置成功"; } 设置HeaderHttp响应报头也会向客户端传递一些附加信息,如服务程序的名称,请求的资源已移动到新地址等。在Spring MVC 设置请求头要使用 HttpServletResponse 类中的setHeader() 方法。
@RequestMapping("/setHeader") @ResponseBody public String setHeader(HttpServletResponse response){ response.setHeader("name","zhangsan"); return "头设置成功"; } 设置响应的类型Content-Type在我们返回响应的时候,SpringMVC会自动将我们返回的数据或者视图设置对应的数据类型,当然,我们也可以通过代码来对返回类型进行设置。在Spring MVC中,我们设置响应的类型需要更改 @RequsetMapping 中的 produes 参数的值。
name():指定注解的名称,默认值为空字符串。value() 和 path():这两个属性是互为别名的,它们指定了请求映射的路径。如果未指定,默认为空数组。method():这个属性指定了请求方法类型,例如 GET、POST、PUT 等。默认为空数组。params():这个属性指定了请求参数,默认为空数组。headers():这个属性指定了请求头信息,默认为空数组。consumes():这个属性指定了请求内容类型,默认为空数组。produces():这个属性指定了响应内容类型,默认为空数组。假设现在我们要返回一个指定类型为JSON的字符串:
@ResponseBody @RequestMapping(value = "setType",produces = "application/json") public String setType(){ return "{\"name\":\"zhangsan\"}"; }
那么如果我们不设置这个参数,会是什么样的?
@ResponseBody @RequestMapping(value = "setType") public String setType(){ return "{\"name\":\"zhangsan\"}"; }可以看到,此时返回的数据类型是text/plain 类型。
以上就是本篇所有内容~
若有不足,欢迎指正~
【Spring】SpringMVC入门(二)由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“【Spring】SpringMVC入门(二)”