SpringMVC表单绑定到命令对象即接口

时间:2010-09-10 11:28:21

标签: spring forms binding spring-mvc command

我正在学习SpringMVC 2,我有一个需要绑定到对象(命令)的表单。但是,如果我需要这个命令对象作为一个接口,那么我可以使用不同的对象实现(当然所有的实现将具有相同的字段)。

用于绑定表示我拥有此控制器的帐户的表单。 是否有可能将表单绑定到帐户界面,所以我可以像之后的那样使用它?

或者告诉我一个流程的最佳弹簧实践是什么:  表格 - >做业务逻辑 - >保存到DB

public  class OpenAccountControllerSpring2
extends SimpleFormController {

private ClientDao clientDao;
private Account account;

public OpenAccountControllerSpring2() {
    setCommandClass( // dont know what to write here);
    setCommandName("newAccount");


}


protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,
        Object command, BindException bindExp)
    throws Exception {
    try {
                    //here i just want to create a new Account, add it to a Client (Interface), then transform the Client into a database-bean and save it.

        int client_id = Integer.parseInt(request.getParameter("clientId"));
        Account account = (Account) command;
        Client client = Transformer.toBusinessHeavy(clientDao.getClient(client_id));
        client.addAccount(account);
        clientDao.updateClient(Transformer.toEntity(client));
    } catch (Exception err) {
        return new ModelAndView(this.getFormView());
    }

    return new ModelAndView(this.getSuccessView());
}

public void setClientDao(ClientDao dao) {
    this.clientDao = dao;
}


public void setAccount(Account account) {
    this.account = account;
}

}

3 个答案:

答案 0 :(得分:2)

你绝对应该跳过Spring 2 MVC并直接进入Spring 3 MVC。这是一次重大的进化飞跃,将为您省去很多麻烦。但是,在尝试执行您想要执行的操作时,您仍会遇到同样的问题。 Spring必须能够实例化表单命令对象,就像你在获得的异常中所说的那样。它不能实例化接口,就像它说的那样。您将不得不尝试不同的方法,这可能涉及您的更多工作,而Spring MVC的帮助较少。您可以直接使用请求参数值,而不使用命令对象。您必须手动将参数绑定到正确的子类实​​例。或者你也许可以尝试为你的子类使用非抽象基类。这样你可以指定该类作为命令对象,Spring可以实例化它并将值绑定到它。您可以通过创建一个单独的类来对表单进行建模,而不是在现有的类层次结构中。但是,你必须将它翻译成你的课程。您可能还想检查对象模型并确保正确地对事物进行建模。一般来说,如果你正在做一些标准工具不支持的时髦的东西,你可能会徘徊在糟糕的territoy中。

答案 1 :(得分:0)

为什么要学习Spring MVC 2(其中大部分已被弃用),而不是Spring MVC 3?新的注释驱动控制器 更易于使用,并且在编写控制器的方式上提供了更大的灵活性。

如果您对Spring MVC 3感兴趣,here是我写的一系列可能有用的示例。

答案 2 :(得分:0)

我通过使用接口,注入它的实现并实现formBackingObject()来完成它,其中我从请求中获取信息并调用接口上的相应setter。 这样我可以保留界面,但我必须做一些有约束力的工作。