我正在学习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;
}
}
答案 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。 这样我可以保留界面,但我必须做一些有约束力的工作。