我是Spring Framework的新手并尝试理解formBackingObject的功能并将其与referenceData方法进行比较,当我试图将它们与Spring的HTTP请求周期相关联时,这两个对象都让我感到困惑。 MVC的观点。
如果有人能够参考一个例子解释这两个对象,我真的很感激。
问: formbacking object
和reference Data
对象有什么区别?
答案 0 :(得分:26)
当您加载网页时,您需要将数据传递给它,以便它可以呈现。
其中一些数据纯粹是信息性的,只读的;页面需要呈现的数据,但这不是当前事务的一部分。示例:填充下拉列表的国家/地区列表,用户可以购买的可能产品列表。
其他数据将用于读写:例如,表单的内容必须填充当前数据,但也可以由用户更新。这组数据将绑定到表单;发送到页面的数据将呈现,从页面(由用户)发送的数据将导致更新。示例:用户的姓名和地址;目前的订单。
所有这些数据通常都存储在页面需要访问的一个或多个对象中。
包含信息数据的对象应放在referenceData()
方法提供的地图中。你可以拥有尽可能多的这类物品。
要绑定到表单的数据(读/写数据)必须包含在单个对象中。该对象应由formBackingObject()
方法返回。
我将在最新版本的Spring中添加注释,而不是使用这些“内置”方法。
答案 1 :(得分:4)
此处有formBackingObject API
从给定的请求中检索当前表单的后备对象
某些情况
...
public class Command {
private NestedClass nestedPath;
// getter's and setter's
}
注意上面的nestedPath字段尚未初始化。因此,如果您尝试在表单上检索其值,例如
<spring:form path="nestedPath.someProperty"/>
由于尚未初始化nestedPath,因此在遍历某些nestedPath属性时将获得NullPointerException。要避免NullPointException,请覆盖formBackingObject
public Object formBackingObject(HttpServletRequest request) throws Exception {
Command command = new Command();
command.setNestedPath(new NestedClass());
return command;
}
您提交某些命令的标识符(通常使用GET方法)以允许用户稍后更新
public Object formBackingObject(HttpServletRequest request) throws Exception {
if(request.getMethod().equalsIgnoreCase("GET")) {
return commandRepository.findById(Integer.valueOf(request.getParameter("id")));
}
}
和referenceData API
为给定的请求创建参考数据地图
您使用referenceData创建表单使用的数据,例如,类别列表
protected Map referenceData(HttpServletRequest request) throws Exception {
return new ModelMap().addAttribute(categoryRepository.findAll());
}
在表格上
<label>Select category</label>
<form:select path="category">
<form:option label="Select category" value=""/>
<form:options items="${categoryList}"
itemLabel="WHICH_PROPERTY_OF_CATEGORY_SHOULD_BE_USED_AS_LABEL"
itemValue="WHICH_PROPERTY_OF_CATEGORY_SHOULD_BE_USED_AS_VALUE"/>
</form:select>
答案 2 :(得分:1)
当您加载网页时,您需要将数据传递给它,以便它可以呈现。
其中一些数据纯粹是信息性的,只读;页面需要呈现的数据,但这不是当前事务的一部分。 示例:填充下拉列表的国家/地区列表,用户可以购买的可能产品列表。
其他数据将用于读写:例如,表单的内容必须填充当前数据,但也可以由用户更新。这组数据将绑定到表单;发送到页面的数据将呈现,从页面(由用户)发送的数据将导致更新。示例:用户的姓名和地址;目前的订单。
所有这些数据通常都存储在页面需要访问的一个或多个对象中。
包含信息数据的对象应放在referenceData()方法提供的地图中。可以有多少这样的对象。
要绑定到表单的数据(读/写数据)必须包含在单个对象中。该对象应该由formBackingObject()方法返回。