【SpringMVC】参数传递 重定向与转发 REST风格

发布于:2024-12-07 ⋅ 阅读:(126) ⋅ 点赞:(0)

参数传递

ModelAndView:包含视图信息和模型数据信息

public ModelAndView index1(){
    // 返回页面
    ModelAndView modelAndView = new ModelAndView("视图名");
    // 或
    // ModelAndView modelAndView = new ModelAndView();
    // modelAndView.setViewName("视图名");
    
    // 添加数据模型 可在视图中使用 作用域为请求范围(request scope)
    modelAndView.addObject("键","值");
    return modelAndView;
}

Model:以Map方式进行存储,用于向作用域中存值

public String index1(Model model){
    // 在 Model 中增加模型数据 作用域为请求范围(request scope)
    model.addAttribute("userName","张三");
    return "/user.jsp";
}

在 Model 中增加模型数据,若不指定 key,则默认使用对象的类型作为 key

Map:以Map方式进行存储,用于向作用域中存值

public String index1(Map<String ,Object> map){
    map.put("userName","张三");
    return "/user.jsp";
}

使用 @ModelAttribute@SessionAttributes 注解来处理模型数据和会话数据。

@ModelAttribute 注解用于将方法参数绑定到模型中,或者将方法返回值添加到模型中。它可以在方法级别或方法参数级别使用。

@Controller
public class UserController {
    @RequestMapping(value = "/user")
    public String index1(@ModelAttribute("user") User user) {
        user.setUserName("张三");
        System.out.println(user.getUserName());
        return "/user.jsp";
    }
}

@SessionAttributes 注解用于将特定的模型属性存储在 HTTP 会话中。它可以定义在控制器类上,以指定哪些模型属性需要存储在会话中。

@Controller
@SessionAttributes(value = {"userName"})
public class IndexController {
    @RequestMapping("/user")
    public ModelAndView index() {
        ModelAndView modelAndView = new ModelAndView("/user.jsp");
        // 存入 Request 作用域和 Session 作用域
        modelAndView.addObject("userName", "张三");
        return modelAndView;
    }
}

@SessionAttributes 的不同用法

// 按属性名存储:将 model 中指定名称的模型属性存储在会话中。
@SessionAttributes(value = {"userName", "userPwd"})
// 按类型存储:将 model 中所有指定类型的模型属性存储在会话中。
@SessionAttributes(types = User.class)
@SessionAttributes(types = {User.class, Dept.class})
// 按属性名和类型存储:将 model 中所有指定名称和类型的模型属性存储在会话中。
@SessionAttributes(value = {"user1", "user2"}, types = {Dept.class})
// 组合存储:将 model 中多个属性名和类型的模型属性存储在会话中。
@SessionAttributes(value = {"user1", "user2"}, types = {User.class, Dept.class})

servlet 方式

<!-- 引入servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
public String cs(HttpServletRequest request
                 , HttpServletResponse response
                 , HttpSession session){
    session.setAttribute("userName","123");
    return "/user.jsp";
}

使用 Servlet 方式直接操作 HttpSession 对象,只存入 session 作用域中。

重定向与转发

@Controller
public class IndexController {
    @RequestMapping(value = "/index1", method = RequestMethod.GET)
    public String index1(User user, Model model) {
        // 设置用户姓名
        user.setUser_name("张三");
        model.addAttribute("user", user);
        // 重定向到 /user.jsp
        // return "redirect:/user.jsp";
        // 转发到 /user.jsp(forward:可省略)
        return "forward:user";
    }
}

配置视图解析器确保视图名称能够正确解析为视图文件。使用 InternalResourceViewResolver 示例配置:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

InternalResourceViewResolver 被配置为前缀为 /WEB-INF/views/,后缀为 .jsp,当控制器返回 forward:user 时,视图解析器会将 user 解析为 /WEB-INF/views/user.jsp

@ResponseBody:返回JSON数据 一般用于方法上

1、首先确保你的项目中已经包含了 Jackson 库

<!-- JSON依赖 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.4.3</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.3</version>
</dependency>

2、在 User 实体类上添加注解,控制 JSON 序列化

使用 @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)来指定当属性为null时不序列化该属性。

@JsonInclude(JsonInclude.Include.NON_NULL) // 代替@JsonSerialize
public class User {}

前端也能判断,一般不加注解。

3、调整 Controller

确保 Controller 可以正确处理请求并返回 JSON 格式的数据

@RestController // @Controller + @ResponseBody
@RequestMapping("/api")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/testjson")
    public User jsons(@RequestParam long userId) {
        User user = this.userService.getUserById(userId);
        return user; // 直接返回对象
    }
}

使用 ResultJSON 工具类

public class ResultJSON<T> {
    private Integer code;
    private String msg;
    private T data;
    public ResultJSON(Integer code, String msg,T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;

    }
    public static <T> ResultJSON success(T data){
        return new ResultJSON(200,"操作成功",data);
    }
    public static ResultJSON success(){
        return new ResultJSON(200,"操作成功",null);
    }
    public static ResultJSON success(Integer code,String msg){
        return new ResultJSON(code,msg,null);
    }
    public static ResultJSON error(){
        return new ResultJSON(400,"操作失败",null);
    }
    public static ResultJSON error(Integer code,String msg){
        return new ResultJSON(code,msg,null);
    }
	...
}
@RestController // @Controller + @ResponseBody
@RequestMapping("/provider")
public class ProviderController {
    @RequestMapping(value = "/findProviderById", method = RequestMethod.GET)
    public ResultJSON<Provider> findProviderById(@RequestParam Integer id) {
        // 创建一个示例Provider对象
        Provider provider = new Provider();
        provider.setId(111);
        provider.setProName("小米科技");
        // 返回成功结果(JSON数据)
        return ResultJSON.success(provider);
    }
}

可以返回集合

List<Provider> list = Arrays.asList(provider,provider1,provider2);
return ResultJSON.success(list);

@DateTimeFormat:用户对象属性,控制入参时日期类型转换

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") // 年月日时分秒
private Date userLoginEndtime;

@JsonFormat:返回 JSON 数据时日期类型处理

@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date userLoginEndtime;

最常用的还是把日期类型改为字符串(前端取到的数据是 String)

private String userLoginEndtime;

@RequestHeader:获取请求头中的参数

在这里插入图片描述

@ResponseBody
@RequestMapping(value = "/index",method = RequestMethod.POST)
public User index(@RequestHeader(value = "token"
                                 ,defaultValue = "1"
                                 ,required = false) int tokenid){
    ......
}

从 HTTP 头中获取名为 token 的值。如果这个头部信息不存在,它将使用默认值1。

REST风格

REST(Representational State Transfer)设计风格基于 HTTP 协议,利用 HTTP 的方法(如GET、POST、PUT、DELETE等)来操作资源。

在REST中,每个事物都被视为一种资源,可以是一个实体(例如用户、产品)、集合(例如用户列表)或更抽象的概念。每个资源都有一个唯一的标识符(URI),客户端通过这个标识符来访问资源。

@Controller
public class UserController {
    @RequestMapping(value = "/user/{userId}.html")
    public String index1(@PathVariable("userId") Long userId) {
        System.out.println("id : " + userId);
        return "user";  // 返回视图名称
    }
}
// 请求路径为:
.../user/userId.html 如 .../user/12.html

网站公告

今日签到

点亮在社区的每一天
去签到