【问题标题】:Pass multiple values from spring form jsp to spring controller on submit在提交时将多个值从spring form jsp传递到spring控制器
【发布时间】:2015-10-09 11:13:48
【问题描述】:

我有一个表,它有多个列,就像我的数据库表一样。很少有列是可编辑的,用户输入的值应在单击提交时更新回数据库中。为此,我有一个 foreach 循环,其值为 bean 列表的 HashMap。 下面是我的 foreach 循环:

<c:forEach items="${feeType.value}" var="feeItem" varStatus="feeVar">                    
<td >[b]<form:checkbox disabled="true" class="editable${ifeeCount}" path="includeFeeValue" value="${feeVar.index}"/> [/b]</td>
<td >${feeItem.feetypeId} </td>
<td >${feeItem.feeValue} </td>
<td >[b]<form:input class="editable${ifeeCount}" disabled="true" path="${feeItem.overridenFee}" value="${feeItem.overridenFee}"/>[/b]</td>
    <td><form:errors path="overriddenFee" cssClass="error" /></td>
<td >${feeItem.lastUpdatedBy} </td>
<td >${feeItem.lastUpdatedDate} </td>

<td > ${feeItem.approvedBy}</td>
<td >${feeItem.approvalDate}</td>

<td align="left">[b]<form:input class="editable${ifeeCount}" disabled="true" path="feeComments[${feeVar.index}]"/>[/b]</td>
<td><form:errors path="feeComments" cssClass="error" /></td>

我正在遍历一个名为 feeApprovalByFundId 的地图,它是地图>。如何获取复选框、输入框等列的更新值?我能够进入一个字符串或字符串数​​组,但我不知道映射到哪个键。 (例如,Fund1 将收取 10 笔费用 - 我将拥有一个 hashmap 键)。 我试过这样迭代:

Collection<List<MyBaseBean>> newList = paswFeeMaintForm.getFeeApprovalByFundId().values();
for(List<MyBaseBean> myList: newList){
for(MyBaseBean myBean : myList){
    System.out.println("Overriden fee : "+myBean.getOverridenFee());
}
}

【问题讨论】:

    标签: java spring jsp spring-mvc jstl


    【解决方案1】:

    表单控件绑定中的path 是表示属性绑定表达式的字符串。当表单被渲染时,Spring 知道 feeItem 是由于表单控件被渲染的 JSTL 上下文。但是在 POST 上,该上下文丢失了,所以 feeItem 没有意义。

    相反,给定一个像这样的表单bean:

    public class FormBean {
        private Map<Integer, ChildBean> children = new HashMap<>();
    
        public Map<Integer, ChildBean> getChildren() { return children; }   
    }
    
    public class ChildBean {
        private String name;
        private String age;
    }
    

    还有这样的控制器:

    @ModelAttribute("formBean")
    public FormBean createFormBean() {
        FormBean bean = new FormBean();
        bean.add(new ChildBean("Joe", 5));
        bean.add(new Childbean("Sam", 10));
    }
    
    @RequestMapping(...)
    public String post(@ModelAttribute("formBean") FormBean formBean) { ... }
    
    @RequestMapping(...)
    public String get(@ModelAttribute("formBean") FormBean formBean) { ... }
    

    在视图中你会这样做:

    <form:form modelAttribute="formBean">
        <c:forEach items="${formBean.children}" varStatus="s">
            <form:input path="children[${s.index}].name" />
            <form:input path="children[${s.index}].age" />
        </c:forEach>
    </form:form>
    

    呈现的表单元素看起来像:

    <input type="text" name="children[0].name" />
    <input type="text" name="children[0].age" />
    <input type="text" name="children[1].name" />
    <input type="text" name="children[1].age" />
    

    请注意,这是标准的indexed property 语法。现在,在服务器端,有足够的上下文来确定应该修改集合中的哪个项目。

    对于地图,以下内容不再适用:

    另外注意,你不必返回一个列表,但可以指定bean方法来获取一个索引和单个项目,允许你定义稀疏集合(如果你没有提前构造集合) .

    【讨论】:

    • 根据每个基金代码,我应该显示它对应的费用类型
    • 你的答案是 List 但我有一个 Map> 有点复杂。
    • 然后将属性类型设为Map&lt;String, List&lt;Bean&gt;&gt;。
    • 你能改变你的答案吗?
    • 我编辑了答案 - 我所做的只是将文本 List&lt;ChildBean&gt; 更改为 Map&lt;Integer, ChildBean&gt;。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    相关资源
    最近更新 更多