当前位置: 首页 > article >正文

【Spring】Spring MVC入门(二)

目录

前言

请求

获取cookie和session

获取cookie

获取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 类型。 


以上就是本篇所有内容~

若有不足,欢迎指正~


http://www.kler.cn/a/548639.html

相关文章:

  • 一键安装教程
  • Qt的isVisible ()函数介绍和判断窗口是否在当前界面显示
  • 蓝桥杯篇---超声波距离测量频率测量
  • 数据守护者:备份文件的重要性及自动化备份实践
  • 如何提升爬虫获取数据的准确性?
  • Element UI常用组件
  • CoralStyle CLIP 技术浅析(二):风格特征提取
  • 通过C或C++编程语言实现某一个或多个具体算法
  • UIView 与 CALayer 的联系和区别
  • DeepSeek自动化写作软件
  • 网络安全清单
  • set_intersection set_union set_difference set_symmetric_difference
  • 【Qt】模型/视图(Model/View)框架详解(一):基本概念
  • easyexcel解析excel文件的时候报错
  • SpringCloud整合seata,XA、AT、TCC、SAGA模式
  • Golang关于结构体组合赋值的问题
  • 带Web界面的yt-dlp视频下载器
  • Qt在函数中更新 UI 或重新绘制图形用replot和QTimer::singleShot的区别
  • 如何有效防止TikTok多店铺入驻时IP关联问题?
  • Tortoise Git