formbackingobject和referencedata对象如何在Spring Web MVC Cycle中运行?

时间:2010-08-28 00:44:14

标签: java spring spring-mvc

我是Spring Framework的新手并尝试理解formBackingObject的功能并将其与referenceData方法进行比较,当我试图将它们与Spring的HTTP请求周期相关联时,这两个对象都让我感到困惑。 MVC的观点。

如果有人能够参考一个例子解释这两个对象,我真的很感激。

问: formbacking objectreference Data对象有什么区别?

3 个答案:

答案 0 :(得分:26)

当您加载网页时,您需要将数据传递给它,以便它可以呈现。

其中一些数据纯粹是信息性的,只读的;页面需要呈现的数据,但这不是当前事务的一部分。示例:填充下拉列表的国家/地区列表,用户可以购买的可能产品列表。

其他数据将用于读写:例如,表单的内容必须填充当前数据,但也可以由用户更新。这组数据将绑定到表单;发送到页面的数据将呈现,从页面(由用户)发送的数据将导致更新。示例:用户的姓名和地址;目前的订单。

所有这些数据通常都存储在页面需要访问的一个或多个对象中。

包含信息数据的对象应放在referenceData()方法提供的地图中。你可以拥有尽可能多的这类物品。

要绑定到表单的数据(读/写数据)必须包含在单个对象中。该对象应由formBackingObject()方法返回。

我将在最新版本的Spring中添加注释,而不是使用这些“内置”方法。

答案 1 :(得分:4)

此处有formBackingObject API

  

从给定的请求中检索当前表单的后备对象

某些情况

  • 遍历嵌套路径
  • 时避免NullPointerException

...

 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()方法返回。