Spring MVC 保存并获取属性参数

Spring MVC保存并获取属性参数

在java web学习中,我们会暂存(共享)数据到http的request对象或者session对象中,在开发控制器的时候,有时也需要保存对应的数据到这些对象中去,或者从中获取数据。而spring mvc提供了支持,主要注解有三个:@RequestAttribute@SessionAttribute@SessionAttributes,它们的作用如下:

  • @RequestAttribute:获取http的请求(request)对象属性值,用来传递给控制器的参数。
  • @SessionAttribute:在http的会话(session)对象属性值中,用来传递给控制器的参数。
  • @SessionAttributes:可以给它配置一个字符串数组,这个数组对应的是数据模型对应的键值对,然后将这些键值对保存到session中。

也许你会留意到并没有@RequestAttributs这个注解,那是因为在请求的范围中,springmvc更希望你使用它所提供的数据模型。它的数据模型本身就是在请求的生命周期中存在的。

注解@RequestAttribute

主要作用是从http的request对象中取出请求属性,它的范围周期在一次请求中存在。

package com.controller;

import com.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/attribute")
public class AttributeController {

    @RequestMapping("/set")
    public String setAttribute(Model model) {
        model.addAttribute("message", "Welcome to Spring MVC");
        /**
         * Spring MVC 约定
         *      forward:请求分发
         *      redirect:重定向,重新发起请求
         */
        return "forward:show"; // request.getRequestDispatcher("/attribute/show").forward(request, response);
    }

    /**
     * 注解:@RequestAttribute
     *  从request对象中获取属性值
     *      name/value;属性名,默认参数名
     *      required;属性值是否必须,默认true
     * @param message 从 request 请求范围内获取的属性值
     */
    @RequestMapping("/show")
    @ResponseBody
    public String showAttribute(@RequestAttribute String message) {
        return message;
    }

}

image

输入localhost:8080/attribute/set 先进入public String setAttribute(Model model),然后保存request 属性值,转发到http://localhost:8080/attribute/show,显示request保存的message属性值,但不访问 localhost:8080/attribute/set,只访问http://localhost:8080/attribute/show,出现下面的情况:

image

因为这一次请求,并没有message属性值。

注解@SessionAttribute@SessionAttributs

这两个注解和http的session会话对象有关,可以让我们在和服务器会话期间通过它读/写会话对象的属性,缓存一定数据信息。

先来设置会话属性,在控制器中可以使用注解@SessionAttributes来设置对应的键值对,不过这个注解只能对类进行标注,不能对方法或者参数标注。可以配置属性名称或者属性类型。它的作用是:当这个控制器被注解后,SpringMVC执行完控制器的逻辑后,将数据模型中对应的属性名称或者属性类型保存到http的session对象中。

package com.controller;

import com.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

/**
 * @SessionAttributes: 根据共存属性的名称或者类型将共享属性保存进session作用域中
 *      names/value: 共享属性名
 *      types: 共享属性类型
 */
@Controller
@RequestMapping("/attribute")
@SessionAttributes(names = {"user"}, types = {User.class})
public class AttributeController {

    @RequestMapping("/set")
    public String setAttribute(Model model) {
        model.addAttribute("message", "Welcome to Spring MVC");
        /**
         * Spring MVC 约定
         *      forward:请求分发
         *      redirect:重定向,重新发起请求
         */
        return "forward:show"; // request.getRequestDispatcher("/attribute/show").forward(request, response);
    }

    /**
     * 注解:@RequestAttribute
     *  从request对象中获取属性值
     *      name/value;属性名,默认参数名
     *      required;属性值是否必须,默认true
     * @param message 从 request 请求范围内获取的属性值
     */
    @RequestMapping("/show")
    @ResponseBody
    public String showAttribute(@RequestAttribute String message) {
        return message;
    }

    @RequestMapping("/login")
    public String login(User user, Model model) {

        user.setUsername("admin");

        user.setPassword("admin");
        if ("admin".equals(user.getUsername()) && "admin".equals(user.getPassword())) {
            // 登录成功,将用户信息保存在session中
            model.addAttribute("user", user); // 默认保存范围是request
            // 重定向到首页(重新发送请求)
            return "redirect:/index.html";
        } else {
            // 重定向到登录页面
            return "redirect:/login.html";
        }
    }

    /**
     * 注解:@SessionAttribute
     *  从session对象中获取属性值
     *      name/value;属性名,默认参数名
     *      required;属性值是否必须,默认true
     * @param user 从 session 获取的属性值
     */
    @RequestMapping("/show/me")
    @ResponseBody
    public User showMe(@SessionAttribute User user) {
        return user;
    }
}

第一次请求

http://localhost:8080/attribute/login

image

出现 404 是因为没有写 index.html

第二次请求

http://localhost:8080/attribute/show/me

image

{
"id":null,
"username":"admin",
"password":"admin"
}

注解@CookieValue和注解@RequestHeader

从名称而言,这两个注解都很明确,就是从cookie和http请求头获取对应的请求信息,它们的用法比较简单,其大同小异。

@RequestMapping("/read")
@ResponseBody
public Map<String, String> read(@CookieValue(value = "JSESSIONID", required = false) String sessionId,
                                @RequestHeader(value = "User-Agent", required = false, defaultValue = "attribute") String userAgent) {
    return Map.of("sessionId", sessionId, "userAgent", userAgent);
}

请求 localhost:8080/attribute/read

image

但前提是存在 "JSESSIONID" 与 "User-Agent"。

posted @ 2025-12-25 09:30  Jing61  阅读(0)  评论(0)    收藏  举报