Spring MVC 和 javascript(添加 Rows 函数) 绑定

Posted

技术标签:

【中文标题】Spring MVC 和 javascript(添加 Rows 函数) 绑定【英文标题】:Spring MVC and java script(addRows function) binding 【发布时间】:2012-10-07 07:40:32 【问题描述】:

我对 Spring MVC 中的 javascript 函数绑定有疑问/问题。根据我们的要求,当用户单击“添加”按钮时,我需要在表格中插入一个新行。

第 1 步:因此,当用户单击“添加更多”按钮时,我在表格中插入了一个新行,我正在使用 javascript 处理此问题

第 2 步:当用户点击提交按钮时,我需要将用户输入的值发送到我的控制器(Spring MVC 控制器)。

那么如何将值动态绑定到控制器?

请帮我尽快解决这个问题。

【问题讨论】:

如果您提供表格 html、JavaScript 和控制器代码的示例,回答这个问题会更容易。 【参考方案1】:

我使用 LazyList 实现了这一点。

您需要按照以下方式执行此操作。

Operation.java

    package com.xxx.xxx.model;
// Generated Feb 9, 2012 11:30:06 AM by Hibernate Tools 3.2.1.GA


import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.apache.commons.collections.FactoryUtils;
import org.apache.commons.collections.list.LazyList;

@Entity
@Table(name="Operations"
    ,schema="dbo"

)
public class Operations  implements java.io.Serializable 


     private int operationId;
     @Embedded
     private Services services;
     private String operationName;
     private String isHqlsql;
     private String isMultipleTables;
     private String listOfTablesAffected;
     private String hqlQuery;
     private String typeOfOperation;
     private String operationDetail;
     private String inputVariables;
     private String outputparamdatatype;
     private String isCountQuery;
     private String isDynamicWhereQry;
     private String isPaginationRequired;
     private String biInputParameters;
    private List<OperationParameters> operationParameterses = LazyList
            .decorate(new ArrayList<OperationParameters>(),
                    FactoryUtils.instantiateFactory(OperationParameters.class));

    public Operations() 
    


    public Operations(int operationId, Services services, String operationName) 
        this.operationId = operationId;
        this.services = services;
        this.operationName = operationName;
    
    public Operations(int operationId, Services services, String operationName, String isHqlsql, String isMultipleTables, String listOfTablesAffected, String hqlQuery, String typeOfOperation, String operationDetail, String inputVariables, String outputparamdatatype, String isCountQuery, List operationParameterses) 
       this.operationId = operationId;
       this.services = services;
       this.operationName = operationName;
       this.isHqlsql = isHqlsql;
       this.isMultipleTables = isMultipleTables;
       this.listOfTablesAffected = listOfTablesAffected;
       this.hqlQuery = hqlQuery;
       this.typeOfOperation = typeOfOperation;
       this.operationDetail = operationDetail;
       this.inputVariables = inputVariables;
       this.outputparamdatatype = outputparamdatatype;
       this.isCountQuery = isCountQuery;
       this.operationParameterses = operationParameterses;
    

    @Id 
    @GeneratedValue
    @Column(name="operationId", unique=true, nullable=false)
    public int getOperationId() 
        return this.operationId;
    

    public void setOperationId(int operationId) 
        this.operationId = operationId;
    

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="serviceId", nullable=false)
    public Services getServices() 
        return this.services;
    

    public void setServices(Services services) 
        this.services = services;
    

    @Column(name="operationName", nullable=false, length=250)
    public String getOperationName() 
        return this.operationName;
    

    public void setOperationName(String operationName) 
        this.operationName = operationName;
    

    @Column(name="isHQLSQL", length=50)
    public String getIsHqlsql() 
        return this.isHqlsql;
    

    public void setIsHqlsql(String isHqlsql) 
        this.isHqlsql = isHqlsql;
    

    @Column(name="isMultipleTables", length=50)
    public String getIsMultipleTables() 
        return this.isMultipleTables;
    

    public void setIsMultipleTables(String isMultipleTables) 
        this.isMultipleTables = isMultipleTables;
    

    @Column(name="listOfTablesAffected", length=500)
    public String getListOfTablesAffected() 
        return this.listOfTablesAffected;
    

    public void setListOfTablesAffected(String listOfTablesAffected) 
        this.listOfTablesAffected = listOfTablesAffected;
    

    @Column(name="hqlQuery")
    public String getHqlQuery() 
        return this.hqlQuery;
    

    public void setHqlQuery(String hqlQuery) 
        this.hqlQuery = hqlQuery;
    

    @Column(name="typeOfOperation", length=50)
    public String getTypeOfOperation() 
        return this.typeOfOperation;
    

    public void setTypeOfOperation(String typeOfOperation) 
        this.typeOfOperation = typeOfOperation;
    

    @Column(name="operationDetail")
    public String getOperationDetail() 
        return this.operationDetail;
    

    public void setOperationDetail(String operationDetail) 
        this.operationDetail = operationDetail;
    

    @Column(name="inputVariables", length=5000)
    public String getInputVariables() 
        return this.inputVariables;
    

    public void setInputVariables(String inputVariables) 
        this.inputVariables = inputVariables;
    

    @Column(name="outputparamdatatype", length=50)
    public String getOutputparamdatatype() 
        return this.outputparamdatatype;
    

    public void setOutputparamdatatype(String outputparamdatatype) 
        this.outputparamdatatype = outputparamdatatype;
    

    @Column(name="isCountQuery", length=10)
    public String getIsCountQuery() 
        return this.isCountQuery;
    

    public void setIsCountQuery(String isCountQuery) 
        this.isCountQuery = isCountQuery;
    

    public String getIsDynamicWhereQry() 
        return isDynamicWhereQry;
    


    public void setIsDynamicWhereQry(String isDynamicWhereQry) 
        this.isDynamicWhereQry = isDynamicWhereQry;
    


    public String getIsPaginationRequired() 
        return isPaginationRequired;
    


    public void setIsPaginationRequired(String isPaginationRequired) 
        this.isPaginationRequired = isPaginationRequired;
    

    public String getBiInputParameters() 
        return biInputParameters;
    


    public void setBiInputParameters(String biInputParameters) 
        this.biInputParameters = biInputParameters;
    

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="operations")
    public List<OperationParameters> getOperationParameterses() 
        return this.operationParameterses;
    

    public void setOperationParameterses(List<OperationParameters> operationParameterses) 
        this.operationParameterses = operationParameterses;
    


OperationParameters.java

package com.xxx.xxx.model;

// Generated Feb 9, 2012 11:30:06 AM by Hibernate Tools 3.2.1.GA


import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="OperationParameters"
    ,schema="dbo"

)
public class OperationParameters  implements java.io.Serializable 


     private int parameterId;
     private Operations operations;
     private String inputOutputParamName;
     private String inputOutputParamType;
     private String inputOutputParamDataType;

    public OperationParameters() 
    

    public OperationParameters(int parameterId, Operations operations, String inputOutputParamName, String inputOutputParamType, String inputOutputParamDataType) 
       this.parameterId = parameterId;
       this.operations = operations;
       this.inputOutputParamName = inputOutputParamName;
       this.inputOutputParamType = inputOutputParamType;
       this.inputOutputParamDataType = inputOutputParamDataType;
    

    @Id 
    @GeneratedValue
    @Column(name="parameterId", unique=true, nullable=false)
    public int getParameterId() 
        return this.parameterId;
    

    public void setParameterId(int parameterId) 
        this.parameterId = parameterId;
    
@ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="operationId", nullable=false)
    public Operations getOperations() 
        return this.operations;
    

    public void setOperations(Operations operations) 
        this.operations = operations;
    

    @Column(name="inputOutputParamName", nullable=false, length=250)
    public String getInputOutputParamName() 
        return this.inputOutputParamName;
    

    public void setInputOutputParamName(String inputOutputParamName) 
        this.inputOutputParamName = inputOutputParamName;
    

    @Column(name="inputOutputParamType", nullable=false, length=250)
    public String getInputOutputParamType() 
        return this.inputOutputParamType;
    

    public void setInputOutputParamType(String inputOutputParamType) 
        this.inputOutputParamType = inputOutputParamType;
    

    @Column(name="inputOutputParamDataType", nullable=false, length=250)
    public String getInputOutputParamDataType() 
        return this.inputOutputParamDataType;
    

    public void setInputOutputParamDataType(String inputOutputParamDataType) 
        this.inputOutputParamDataType = inputOutputParamDataType;
    





提供发布请求以添加新操作的控制器方法。

/**
     * Method that will serve the post request to add the operation and operation parameters submitted by the user.
     * @param operations
     * @param map
     * @return @link String The view name that will redirect to the get request to display the previous page with newly entered operation in the list. 
     */
    @RequestMapping(value="/add", method=RequestMethod.POST)
    public String addOperations(@ModelAttribute Operations operations, ModelMap map) 
        operations.getOperationParameterses().removeAll(Collections.singleton(null));

        for(int i=0; i<operations.getOperationParameterses().size(); i++) 
            System.out.println("parameterName :: " + ((OperationParameters)operations.getOperationParameterses().get(i)).getInputOutputParamName());
            if(((OperationParameters)operations.getOperationParameterses().get(i)).getInputOutputParamName() == null || "".equalsIgnoreCase((((OperationParameters)operations.getOperationParameterses().get(i))).getInputOutputParamName())) 
                operations.getOperationParameterses().remove(i);
                System.out.println("empty parameter removed....");
            
        

        return "redirect:/operations/" + operations.getServices().getServiceId();
    

希望对你有所帮助。

【讨论】:

一个JSP页面你是怎么添加动态行的?【参考方案2】:

如果你创建一个适当的类来保存表单数据,Spring 可以绑定映射和对象列表,然后在你的控制器方法上使用 @ModelAttribute 注释。

例如,如果您的 JavaScript 创建如下表格行:

<tr>
    <td><input name="bells[0]" /></td>
    <td><input name="whistles[0]" /></td>
</tr>
<tr>
    <td><input name="bells[1]" /></td>
    <td><input name="whistles[1]" /></td>
</tr>

然后您可以创建一个模型类,其中包含 HTML 表单中每个重复字段的列表,如下所示:

public class AsapForm 
    private List<String> bells;
    private List<String> whistles;

    // add getters and setters here

然后您可以创建一个控制器方法,使用该类作为带有@ModelAttribute 注释的参数:

public void postAsapForm(@ModelAttribute("contactForm") AsapForm asapForm, BindingResult result) 
    ...

然后您可以使用asapForm.getBells()asapForm.getWhistles() 等访问每一行的值。

【讨论】:

这不会绑定动态添加的行。您必须使用特定数量的大小初始化列表。【参考方案3】:

当我需要绑定来自前端的动态对象列表时,我会执行以下操作:

将数据发布为json array,即采用以下格式

数据:[a:1, b:2, a:3, b:4]

Controller

@RequestMapping(value="save", method=RequestMethod.POST)
public void save(JSONObject object)

 List<YourType> list = new ArrayList<YourType>();
 JSONArray array = object.getJSONArray("data")
 for(int i=0; i<array.length(); i++)
 
   //getObjectFromJson is your method for converting json to an object of your type.
   list.add(JsonUtils.fromJson(array.getJSONObject(i).toString(), YourType.class);
 

【讨论】:

以上是关于Spring MVC 和 javascript(添加 Rows 函数) 绑定的主要内容,如果未能解决你的问题,请参考以下文章

将JSON数组从javascript传递给spring mvc控制器

Spring MVC - 包含静态文件/javascript、css

使用 Spring MVC 访问 Javascript 中的模型属性

如何访问 JavaScript 文件中的 Spring MVC 模型对象?

Spring MVC 和表单绑定:如何从列表中删除项目?

CORS 和 Spring MVC 服务 - 如何设置跨域主机?