spring在form标签中的modelAttribute和commandName属性之间的区别?

我是Spring 3的新手,所以我可能会问一个不好的标准问题。 我在jsp中看到了两个不同的表单标签属性

<form:form method="post" modelAttribute="login"> 

在这个属性modelAttribute是表单对象的名称,其属性是用来填充表单。 我用它发布表单和控制器我用@ModelAttribute来捕获价值,调用validation,应用业务逻辑。 这里一切都很好。 现在

 <form:form method="post" commandName="login"> 

这个属性期望什么,它也是一个表单对象,其属性我们将填充?

如果你看看支持你的<form>元素的FormTag (4.3.x)的源代码 ,你会注意到这一点

 /** * Set the name of the form attribute in the model. * <p>May be a runtime expression. */ public void setModelAttribute(String modelAttribute) { this.modelAttribute = modelAttribute; } /** * Get the name of the form attribute in the model. */ protected String getModelAttribute() { return this.modelAttribute; } /** * Set the name of the form attribute in the model. * <p>May be a runtime expression. * @see #setModelAttribute */ public void setCommandName(String commandName) { this.modelAttribute = commandName; } /** * Get the name of the form attribute in the model. * @see #getModelAttribute */ protected String getCommandName() { return this.modelAttribute; } 

他们都是指同一领域,因此具有相同的效果。

但是,正如字段名称所指出的, modelAttribute应该是首选的,正如其他人也指出的那样。

我刚刚有同样的问题,我不记得确切的差异,但从研究我确定commandName是旧的做法,在新的应用程序中,您应该使用modelAttribute

OLD WAY = commandName

 ... <spring:url value="/manage/add.do" var="action" /> <form:form action="${action}" commandName="employee"> <div> <table> .... 

NEW WAY = modelAttribute

 .. <spring:url value="/manage/add.do" var="action" /> <form:form action="${action}" modelAttribute="employee"> <div> <table> .. 

commandName =请求作用域或会话作用域中包含有关此窗体的信息的variables的名称,或者这是此视图的模型。 Tt应该是一个。

在基于xml的configuration中,我们将使用命令类在控制器和视图之间传递对象。 现在在注释中我们使用modelattribute