7

假设我有以下命令对象:

class BreakfastSelectCommand{
    List<Breakfast> possibleBreakfasts;
    Breakfast selectedBreakfast;
}

我怎样才能让春天用列表中的早餐填充“selectedBreakfast”?

我想我会在我的jsp中做这样的事情:

<form:radiobuttons items="${possibleBreakfasts}" path="selectedBreakfast"  />

但这似乎不起作用。有任何想法吗?

谢谢,

-摩根

4

1 回答 1

8

这一切的关键是 PropertyEditor。

您需要为早餐类定义一个 PropertyEditor,然后在控制器的 initBinder 方法中使用 registerCustomEditor 配置 ServletDataBinder。

例子:

public class BreakfastPropertyEditor extends PropertyEditorSupport{
    public void setAsText(String incomming){
        Breakfast b = yourDao.findById( Integer.parseInt(incomming));
        setValue(b);
    }
    public String getAsText(){
        return ((Breakfast)getValue()).getId();
    }
}

请注意,您将需要一些空值检查等,但您明白了。在您的控制器中:

public BreakfastFooBarController extends SimpleFormController {
    @Override
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) {
        binder.registerCustomEditor(Breakfast.class, new BreakfastPropertyEditor(yourDao));
    }
}

需要注意的事项:

  • PropertyEditor 不是线程安全的
  • 如果您需要spring bean,请手动注入它们或在spring中将它们定义为原型范围并使用方法注入到您的控制器中
  • 如果入站参数无效/未找到,则抛出 IllegalArgumentException,spring 会将其正确转换为绑定错误

希望这可以帮助。

编辑(回应评论):在给定的例子中看起来有点奇怪,因为 BreakfastSelectCommand 看起来不像一个实体,我不确定你的实际场景是什么。假设它是一个实体,例如Person具有一个breakfast属性,那么该formBackingObject()方法将从 the 加载 Person 对象PersonDao并将其作为命令返回。然后,绑定阶段将根据所选值更改早餐属性,以便到达的命令onSubmit已设置早餐属性。

根据您的 DAO 对象的实现,调用它们两次或尝试加载相同的实体两次实际上并不意味着您将运行两个 SQL 语句。这尤其适用于 Hibernate,它保证它将返回与给定标识符的会话中相同的对象,因此运行让绑定尝试加载Breakfast选择,即使它没有改变也不应该导致任何不当高架。

于 2009-02-08T10:19:44.753 回答