【Spring】Spring MVC入门(二)
目录
前言
请求
获取session
获取请求头header
响应
返回静态页面
返回数据
返回HTML代码片段
返回JSON
设置状态码
设置Header
设置响应的类型Content-Type
前言
在上一篇中,我们已经了解了什么是MVC、Spring MVC,以及对Spring MVC中的一些注解的学习,学习了Sring MVC项目中如何传递单个、多个参数、传递对象、数组、集合、JSON数据、文件等,那么本篇我们就接着上一篇的内容继续往下讲。
请求
获取cookie和session
在前面,我们已经学习了有关cookie和session的相关知识,那么现在我们就来学习如何获取cookie和session。
获取cookie
cookie是由浏览器在发送请求的时候带上的,所以这里我们需要用 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。
返回JSON
Spring 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 "状态码设置成功";
}
设置Header
Http响应报头也会向客户端传递一些附加信息,如服务程序的名称,请求的资源已移动到新地址等。在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 类型。
以上就是本篇所有内容~
若有不足,欢迎指正~