目录
前言
请求
获取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")@ResponseBodypublic 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")@ResponseBodypublic String setStatus(HttpServletResponse response){response.setStatus(444);return "状态码设置成功";}
设置Header
Http响应报头也会向客户端传递一些附加信息,如服务程序的名称,请求的资源已移动到新地址等。在Spring MVC 设置请求头要使用 HttpServletResponse 类中的setHeader() 方法。
@RequestMapping("/setHeader")@ResponseBodypublic 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 类型。
以上就是本篇所有内容~
若有不足,欢迎指正~