Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 处理同一类型的多个表单-不可能?_Spring_Spring Mvc - Fatal编程技术网

Spring 处理同一类型的多个表单-不可能?

Spring 处理同一类型的多个表单-不可能?,spring,spring-mvc,Spring,Spring Mvc,考虑以下场景: 我的表单模型 public class PersonForm { @NotNull private String name; /*usual getters and setters*/ } 我的控制器: @Controller @SessionAttribute(types={ PersonForm.class }) public class MyController { @RequestAttribute(...) public

考虑以下场景:

  • 我的表单模型

    public class PersonForm {
        @NotNull
        private String name;
    
        /*usual getters and setters*/
    }
    
  • 我的控制器:

    @Controller
    @SessionAttribute(types={ PersonForm.class })
    public class MyController {
    
        @RequestAttribute(...)
        public String render(final ModelMap map) {
            /* get list of info and for each info 
             * create a PersonForm and put it in the modelmap
             * under key p0, p1, p2, ..., pn
             */
        }
    
        public String submit(final ModelMap map,
                             @Valid final PersonForm form,
                             final BindingResult result) {
    
            if (result.hasErrors()) {
                // return to page
            } else {
                // do necessary logic and proceed to next page
            }
        }
    }
    
  • 最后是我的JSP视图

    ...
    <c:forEach ...>
        <form:form commandName="p${counter}">
            ... other form:elements and submit button goes here
        </form:form>
    </c:forEach>
    ...
    
    。。。
    ... 其他表单:元素和提交按钮位于此处
    ...
    
  • 如您所见,我正在尝试处理同一类类型的多种形式。submit很有效--它让我可以很好地使用submit(…)方法,验证也是如此。但是,重新呈现页面不会显示预期的错误消息

    更糟糕的是,我检查了提交头中传递的内容,但没有显示提交了哪个表单,因此无法区分不同表单。这让我相信同一类的多种形式是不可能的

    除了Ajax,还有其他方法可以做到这一点吗


    非常感谢。

    我认为,拥有多种形式会使事情变得过于复杂(或者至少使用spring)。此外,您正在使用多个表单,但只将提交一个表单

    因此,我建议最简单的管理方法是使用具有person属性的唯一隐藏外部表单。当按下其中一个按钮时,相应地填写表单的person属性并提交。有了它,您就可以实现典型的spring表单提交/验证


    也许这个解决方案需要一点JavaScript,但我不知道如何使用多个表单处理spring mvc,我一直试图避免它,因为以前的尝试不成功。

    我设法让这个“黑客”工作起来。这正是杰利斯所推荐的,因此功劳全归他了

    简单地说,概念是使用传统的
    构造预填充视图。棘手的是,每当按下相应行的“提交”按钮时,所有信息都必须被注入到一个隐藏的表单中,并强制提交给控制器。如果屏幕再次呈现时出现一些错误,则脚本必须负责将值注入回相应的行(包括错误)


    1) 我的模型

    2) 我的控制器

        @Controller
        @SessionAttribute(/* the hidden form name, the person list */)
        public class MyController {
    
            @RequestAttribute(...)
            public String render(final ModelMap map) {
                /* get list of info and for each info 
                 * create a PersonForm and put it in the modelmap
                 * under key p0, p1, p2, ..., pn
                 */
            }
    
            public String submit(final ModelMap map,
                                 @Valid final PersonForm form,
                                 final BindingResult result) {
    
                if (result.hasErrors()) {
                    // return to page
                } else {
                    // do necessary logic and proceed to next page
                }
            }
        }
    
    3) 我的看法

    。。。
    ...
    ...
    injectValuesAndForceSubmit=函数(id){
    $('#id').val(id);//填写隐藏表单的id
    $('#name').val($('#'+id+'name').val());//填写隐藏表单的名称
    $('#personForm').submit();//提交!
    }
    $(文档).ready(函数(){
    var id=$('#id').val();
    如果(id.trim().length==0){
    //空。此处无需执行任何操作,因为这是一个简单的渲染。
    }否则{
    //页面似乎从某种错误中返回…预填充相应的行!
    $('#'+id+'name').val($('#name').val());
    var hiddennemerorspan=$('#name.errors');
    如果(hiddenNameErrorSpan){
    $('#'+id+'nameErrorSpan').text(hiddenNameErrorSpan.html());
    }
    }//否则
    }
    


    正如您所看到的,该视图具有最令人毛骨悚然的部分——希望它仍能被证明对(不幸的)以下人员有用遇到了与我相同的情况。干杯!

    表单:表单标签的
    路径属性的目的是什么?我想这个spring标签中没有定义:。我的道歉——我是指commandName。原始线程已编辑。非常感谢您的回复!恐怕我在分配表单时仍然会有问题:错误。您是欢迎:)好吧,如果你只有一个表单,你就会知道错误在哪里。。。但再一次,需要一些额外的JS才能将它们移动到正确的位置。实际上我还没有想到。。。我可以用一些JS提取错误消息。这比使用AJAX要干净得多。谢谢是的,我提交了一份简明扼要的版本,我必须解释我是如何把它连接起来的。谢谢
    
        @Controller
        @SessionAttribute(/* the hidden form name, the person list */)
        public class MyController {
    
            @RequestAttribute(...)
            public String render(final ModelMap map) {
                /* get list of info and for each info 
                 * create a PersonForm and put it in the modelmap
                 * under key p0, p1, p2, ..., pn
                 */
            }
    
            public String submit(final ModelMap map,
                                 @Valid final PersonForm form,
                                 final BindingResult result) {
    
                if (result.hasErrors()) {
                    // return to page
                } else {
                    // do necessary logic and proceed to next page
                }
            }
        }
    
        ...
    
        <form:form commandName="personForm" cssStyle="display: none;">
            <form:hidden path="id"/>
            <form:hidden path="name" />
            <form:errors path="name" cssStyle="display: none;" />
        </form:form>
    
        ...
    
        <c:forEach var="p" items="${pList}">
            <input type="text" id="${ p.id }Name" value="${ p.name }" />
            <!-- to be filled in IF the hidden form returns an error for 'name' -->
            <span id="${ p.id }nameErrorSpan"></span>
            <button type="button" value="Submit" onclick="injectValuesAndForceSubmit('${ p.id }');" />
        </c:forEach>
    
        ...
    
        <script type="text/javascript">
    
        injectValuesAndForceSubmit = function(id) {
    
            $('#id').val( id ); // fill in the hidden form's id
            $('#name').val( $('#'+id+'name').val() ); //fill in the hidden form's name
    
            $('#personForm').submit(); //submit!
        }
    
    
    
        $(document).ready(function() {
    
            var id = $('#id').val();    
            if (id.trim().length == 0) {
                //Empty. Nothing to do here as this is a simple render.
            } else {
    
                //The page seems to be returning from some sort of error ... pre-fill the respective row!
                $('#'+id+'name').val($('#name').val());
                var hiddenNameErrorSpan = $('#name.errors');
                if (hiddenNameErrorSpan) {
                    $('#'+id+'nameErrorSpan').text(hiddenNameErrorSpan.html());
                }
            } //else
        }
        </script>