当前位置: 首页 > 知识库问答 >
问题:

@模型属性混淆

贺博厚
2023-03-14

我有一个具有登录功能的控制器类。当我输入用户名和密码并按submit时,它将调用此控制器并在会话中存储客户信息。但有一件事让我感到困惑,那就是@model属性

@Controller
@SessionAttributes("customer")
public class LoginController {
    
    @Autowired
    CustomerService customService;
    
    @ModelAttribute("customer")
    public Customer getCustomer(@ModelAttribute Customer customer) {
        Customer c = customService.getCustomer(customer.getUsername(), customer.getPassword());
        
        return c;
    }
    
    @RequestMapping(method=RequestMethod.POST,value="/login")
    public String submitLoginForm( Model model) {
        
        return "redirect:/";
    }
    
}```


我将使用@ModelAttribute Customer存储我输入的用户名和密码,并使用Customer c存储我从customService获得的所有信息,并将其存储到会话中。但是会话存储的是客户。

如果我这样改变论点。它工作正常

public Customer getCustomer(@RequestParam String username, @RequestParam String password) {
        Customer c = customService.getCustomer(username, password);
        
        return c;
    }

共有1个答案

金旺
2023-03-14

您的结果可能会因@Model属性而异

@ModelAttribute("customer")
public Customer getCustomer(@ModelAttribute Customer customer) {
    Customer c = customService.getCustomer(customer.getUsername(), customer.getPassword()); 
    return c;
}

它类似于:

@ModelAttribute

    public void initCustomer(@ModelAttribute Customer customer,Model model) {
        Customer c = customService.getCustomer(customer.getUsername(), customer.getPassword()); 
        model.addAttribute("customer",c);
    }

initClient(@ModelAtoun顾客,...)上面的客户实例解析如下

  • 如果已通过模型添加,则从模型中删除
  • 通过@SessionAttributes从HTTP会话
  • 从通过转换器传递的URI路径变量(下面的示例)
  • 从默认构造函数的调用
  • 通过调用参数与Servlet请求参数匹配的“主构造函数”;参数名称通过JavaBeans@ConstructorProperties或字节码中运行时保留的参数名称确定

如您所见,第一次调用时,参数值将分配给客户。。。

但在以后的调用中,会话属性与优先级一起使用。

PS:你的代码可能会很混乱。请参阅:https://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation

 类似资料:
  • 问题内容: 我是使用属性的新手,因此我进行了如下所示的简单测试。在测试中,我创建了两个类“ Test1”和“ Test2”,每个类都持有一个值。我正在尝试使用属性来控制对伪隐藏的“ val”属性的访问。当前测试不限制“ val”属性的任何输入或输出,因为该程序仅是概念证明。下面显示的两个测试类产生相同的结果,并被认为代表了构造属性的不同方法。我要引用的属性的示例使用在python docs上找到。

  • 在ORM映射类上定义具有“混合”行为的属性。 “混合”是指属性在类级别和实例级别定义了不同的行为。 这个 hybrid 扩展提供了一种特殊形式的方法修饰器,大约有50行代码,几乎不依赖于其他的sqlacalchemy。理论上,它可以与任何基于描述符的表达式系统一起工作。 考虑映射 Interval ,表示整数 start 和 end 价值观。我们可以在生成类级SQL表达式的映射类上定义更高级别的函

  • 模型和一些关联具有一个或多个属性,每个属性有类型以及一些可选设置,你可以自行选择它们(或使用默认设置)。 类型 受支持的类型是: text:文本字符串; number:浮点数。你可以指定size为2 | 4 | 8; integer:整数。你可以指定size为2 | 4 | 8; boolean:true或false的值; date:日期对象。你可以指定time为true; enum:一个备选列表

  • 以前我使用过的ORM将数据库列直接映射到类属性,这允许您查看特定的属性可见性,就像您通常会限制对某些属性(例如密码)的访问一样。 有了雄辩,我似乎无法复制这一点,因为数据库列映射到不包含可见性的内部属性数组。 我的愿望是将用户密码的访问范围仅限于对象,即私有。 设置具有可见性的类属性不起作用,因为该属性超出了雄辩模型属性的范围,因此该属性未映射到列。 雄辩的$隐藏和$保护属性不起作用,因为它们处理

  • 我在videorequest应用程序中制作简单模型 当我试图运行python manage时,代码cmd中显示了什么错误。py运行服务器查询 由启动的线程中存在未处理的异常。0x0446E7C8处的包装器

  • 英文原文:http://emberjs.com/guides/object-model/computed-properties/ 什么是计算属性? 简单地来说,计算属性就是将函数声明为属性。通过定义一个如同函数一般的计算属性,Ember将会自动调用该函数来获取计算属性的值,此后就可以如同使用普通静态属性一样来使用计算属性。 在需要使用一个或者多个属性的变形,或者手动修改其数据的时候非常有用。 计算