Model view controller 您如何在SpringMVC下为表单更改建模?

Model view controller 您如何在SpringMVC下为表单更改建模?,model-view-controller,spring,forms,web-applications,spring-mvc,Model View Controller,Spring,Forms,Web Applications,Spring Mvc,假设您正在使用SpringMVC版本2.5.6为水果供应商编写网页。在这个页面上,供应商可以做一些简单的事情,比如更改他们的姓名或地址。他们还可以根据填写当前库存选择的下拉列表更改库存 当此下拉列表选择更改时,整个表单将更改以匹配所选内容的清单。因此,一个股票选择可能有香蕉和梨,另一个可能有瓜,蓝莓和葡萄柚。 在每个库存选择中都有一个需要传播回数据库的输入字段,在本例中,假设用户输入水果的数量 在数据库中对此进行建模的方式是,每个股票名称存储在一个表中,该表与每个股票的内容有一对多的关系,在本

假设您正在使用SpringMVC版本2.5.6为水果供应商编写网页。在这个页面上,供应商可以做一些简单的事情,比如更改他们的姓名或地址。他们还可以根据填写当前库存选择的下拉列表更改库存

当此下拉列表选择更改时,整个表单将更改以匹配所选内容的清单。因此,一个股票选择可能有香蕉和梨,另一个可能有瓜,蓝莓和葡萄柚。

在每个库存选择中都有一个需要传播回数据库的输入字段,在本例中,假设用户输入水果的数量

在数据库中对此进行建模的方式是,每个股票名称存储在一个表中,该表与每个股票的内容有一对多的关系,在本例中,这就是水果的类型。然后,水果的类型与供应商选择的数量有一对多的关系。库存名称和每个库存中的水果类型存储在数据库中,用户不可更改,连接的水果数量表可编辑

我的问题是,如何在SpringMVC中建模上述表单?


我已经尝试重写和来促进表单更改,但是我认为我可能误解了这些方法的意图。当我在下一次发布页面时更改backing命令对象时,它会尝试将请求绑定到表单中,如果调整Stock数组的大小(例如从3到2,它会尝试绑定到第三个值,即使它是空的)。

如果不同的Stock数量有限,对于具有不同支持模型的每个处理程序,可以使用不同的处理程序映射:

@请求映射(params=“stock=example1”) ModelAndView handleExample1(@ModelAttribute(“stock”)AppleSRangeSpears stockObject)

@请求映射(params=“stock=example2”) ModelAndView handleExample2(@ModelAttribute(“股票”)BananasPotatos stockObject)


但我想情况并非如此,有很多不同的股票类型,它们是动态的。在这种情况下,您可以注册自定义属性编辑器(@InitBinder),并动态确定库存的支持对象的实际类型,然后进行验证,并显式地向其转换或从中转换

当下拉列表中的选择发生更改时,我最终会触发一个JavaScript事件。此JavaScript(如下所示)根据下拉列表的选择生成URL,并使用location.replace转到新URL,这将导致控制器生成新表单

使用此方法覆盖isFormChangeRequest和onFormChange使我能够避免由遗留的post数据导致的绑定错误

function changeUrl(selectionValue) {
    var param = getParams();
    param["dropdownselection"] = selectionValue;
    window.location.replace(getBaseUrl() + buildQueryString(param));
}

//taken from http://javascript.about.com/library/blqs1.htm
function getParams() {
    var qsParm = new Array();
    var query = window.location.search.substring(1);
    var parms = query.split('&');
    for (var i = 0; i < parms.length; i++) {
        var pos = parms[i].indexOf('=');
        if (pos > 0) {
            var key = parms[i].substring(0,pos);
            var val = parms[i].substring(pos+1);
            qsParm[key] = val;
        }
    }
    return qsParm;
}

function getBaseUrl() {
    var url = document.location.toString();
    if (url.indexOf('?') != -1) {
        url = url.substring(0, url.indexOf('?'));
    }
    return url;
}

function buildQueryString(param) {
    var queryString = "?";
    for (var key in param) {
        queryString += key + "=" + param[key] + "&";
    }
    //remove last "&"
    return queryString.substring(0,queryString.length - 1);
}
函数更改URL(selectionValue){
var param=getParams();
参数[“dropdownselection”]=selectionValue;
replace(getBaseUrl()+buildQueryString(param));
}
//取自http://javascript.about.com/library/blqs1.htm
函数getParams(){
var qsParm=新数组();
var query=window.location.search.substring(1);
var parms=query.split('&');
对于(变量i=0;i0){
var key=parms[i]。子字符串(0,pos);
var-val=parms[i]。子字符串(pos+1);
qsParm[key]=val;
}
}
返回qsParm;
}
函数getBaseUrl(){
var url=document.location.toString();
if(url.indexOf(“?”)!=-1){
url=url.substring(0,url.indexOf('?');
}
返回url;
}
函数buildQueryString(参数){
var queryString=“?”;
for(参数中的变量键){
queryString+=key+“=”+param[key]+“&”;
}
//删除最后一个“&”
返回queryString.substring(0,queryString.length-1);
}

我不确定是否遵循了您的答案。我不熟悉Spring MVC 3.0样式的注释,因此在理解第一部分时遇到困难,对于第二部分,我不确定我是否理解自定义属性编辑器将提供什么好处。你能跟我谈谈吗?谢谢