• 关于使用th:text获取不到值


    今天在使用thymeleaf模板引擎整合SpringBoot时,对于从controller层传递过来的参数“message”,无法获取。
    控制层代码如下:

    @PostMapping("/login")
        public String login(@RequestParam String username,
                            @RequestParam String password,
                            HttpSession session,
                            RedirectAttributes attributes){
            User user = userService.checkUser(username, password);
            if (user != null){
                user.setPassword(null);
                session.setAttribute("user",user);
    
                return "admin/index";
            }else{
                attributes.addAttribute("message","用户名或密码错误");
                return "redirect:/admin";
            }
    
        }
    

    页面获取message代码如下:

     <!--校验登陆失败-->
     <div class="ui mini negative message" th:unless="${#strings.isEmpty(message)}"
      th:text="${message}">
                            
      </div>
    
    

    仔细看了好久,开始以为是thymeleaf语法问题,后来查看官方文档没有问题。
    再然后看前台页面时,看出了一些毛病;
    在这里插入图片描述
    发现返回的值在URL中,这时在https://www.cnblogs.com/zhujiabin/p/4935557.html这位前辈中,找到的错误,原来是对RedirectAttributes 这个类的方法理解不到位,它是springmvc3.1之后出现的专门用于重定向跳转时还能携带参数,只不过他的两个方法差别很大。

    1. addAttribute()是直接将参数和值一块拼接到了URL中,然后再从页面或者前端控制器中取出URL后面的参数值,因此这是很不安全的,后台的一些信息直接显示给了用户。
    2. 另个方法 addFlashAttribute();它也能重定向带参,而且能隐藏参数,其原理就是放到session中,session在跳到页面后马上清除session。但是这也有缺点,就是只能在页面中获取。但到这里就可以解决我的问题了,将addAttribute改为addFlashAttribute。

    但是在此之前我还查了Model对象中设置的属性以及值,通过Thymeleaf获取时,获取失败,可能有以下几种原因:
    1、首先检查返回值,就比如我这个方法返回值是String,因此如果你在这个方法中使用Model设置值是在页面取不到的。可以将返回值改为Model或者Object类型。

     @PostMapping("/login")
        public Object login(@RequestParam String username,
                            @RequestParam String password,
                            HttpSession session,
                            Model attributes){
            User user = userService.checkUser(username, password);
            if (user != null){
                user.setPassword(null);
                session.setAttribute("user",user);
    
                return "admin/index";
            }else{
                attributes.addAttribute("message","用户名或密码错误");
                return attributes;
            }
    
        }
    
    

    2、第二种就是将一个controller中的请求转发或重定向到另一个controller,这时应该注意的是接收数据的类型,或者使用@ModelAttribute注解指明想要获取的参数名。

  • 相关阅读:
    bzoj 维护序列seq(双标记线段树)
    kmp算法总结
    2013蓝桥杯
    Longge的问题(欧拉,思维)
    mode(思维,注意内存)
    Jam's math problem(思维)
    77
    999
    888
    无 PowerShell.exe 执行 Empire 的几种姿势
  • 原文地址:https://www.cnblogs.com/itjiangpo/p/14181422.html
Copyright © 2020-2023  润新知