如何将列表从javascript传递到spring控制器

如何将列表从javascript传递到spring控制器,java,javascript,jquery,spring-mvc,freemarker,Java,Javascript,Jquery,Spring Mvc,Freemarker,我有一个问题,javaScript如何将两个separate列表传递给spring控制器。在我的freeMarker模板上,我选择了更改两个列表的集合。 这是两个列表的呈现: 编辑:我发现Jquery的Ui剽窃与 .sortable("toArray", { key: "id" }) 方法,所以我将Id值添加到标记中 <div class="span5" id="listBox"> <h3>Assigned Servers</h3>

我有一个问题,javaScript如何将两个separate列表传递给spring控制器。在我的freeMarker模板上,我选择了更改两个列表的集合。 这是两个列表的呈现:

编辑:我发现Jquery的Ui剽窃与

.sortable("toArray", { key: "id" }) 
方法,所以我将Id值添加到
  • 标记中

    <div class="span5" id="listBox">
                <h3>Assigned Servers</h3>
                <#if assignedServers?has_content>
                    <ul id="sortable1" class="connectedSortable">
                        <#list assignedServers as responsible >
                            <li class="ui-state-default"
                                id="${responsible.id}" >${responsible.server_name}</li>
                        </#list>
                    </ul>
                <#else>
                    <h4>This employee have no assigned servers yet.</h4>
                </#if>
            </div>
    
            <div class="span5" id="listBox">
                <h3>Available Servers</h3>
                <#if availableServers?has_content>
                    <ul id="sortable2" class="connectedSortable">
                        <#list availableServers as available >
                            <li class="ui-state-default"
                                id="${available.id}" >${available.server_name}</li>
                        </#list>
                    </ul>
                <#else>
                    <h4>There is no available servers to assign.</h4>
                </#if>
            </div>
    
    编辑:新ServersListModel-它是一个简单的POJO,有两个变量

    public class ServersListModel {
    
    private List<String> assignedServers;
    
    private List<String> availableServers;
    ...
    }
    
    但是,我仍然没有调整那个字符串的大小,我的模型中的变量在调试时仍然包含NULL。 将@RequestBody Anotion放置在@ModelAttributeserversListModel的位置会导致Jquery抛出BadRequest错误。 如果在方法体中,我调用

    String jsonBody = IOUtils.toString(request.getInputStream());
    
    它将返回id为Requered的JSON字符串对象,所以我马上就要回答了


    请帮我找出控制器中的错误。谢谢。

    我设法解决了我的问题,我想与您分享解决方案:

    我将型号更改为长型:

    public class ServersListModel {
    
    private List<Long> assignedServers;
    
    private List<Long> availableServers;
    
    最后,我的MVC控制器:

    @RequestMapping(value = "/{id}", method = RequestMethod.POST)
    public @ResponseBody ModelAndView onSubmit(
            @ModelAttribute("serversListModel") ServersListModel serversListModel,
            @PathVariable("id") Long responsibleId,
            BindingResult result,
            HttpServletRequest request,
            HttpServletResponse response,
            SessionStatus status) throws ParseException {
    
        if (!result.hasErrors()) {
            if (serversListModel.getAvailableServers() != null) {
                for (String id : serversListModel.getAvailableServers()) {
                    ServerEntity entity = employeeService.getServerById((long)Integer.parseInt(id));
                    entity.setResponsible(responsibleId);
                    adminService.updateServer(entity);
                }
            }
    
            if (serversListModel.getAssignedServers() != null) {
                for (String id : serversListModel.getAssignedServers()) {
                    ServerEntity entity = employeeService.getServerById((long)Integer.parseInt(id));
                    entity.setResponsible((long) 0);
                    adminService.updateServer(entity);
                }
            }
            status.setComplete();
            return new ModelAndView("redirect:/employee_management/employee_manager");
    
    
        } else {
            response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
            return new ModelAndView("redirect:/employee_management/serv_assignment");
        }
    
    }
    
    @RequestMapping(value = "/{id}", method = RequestMethod.POST)
    public @ResponseBody  ModelAndView onSubmit(
            @RequestBody ServersListModel serversListModel,
            @PathVariable("id") Long responsibleId,
            BindingResult result,
            SessionStatus status) throws ParseException, IOException {
    
        if (!result.hasErrors()) {
            if (serversListModel.getAssignedServers() != null) {
                for (Long id : serversListModel.getAssignedServers()) {
                    ServerEntity entity = employeeService.getServerById(id);
                    entity.setResponsible(responsibleId);
                    adminService.updateServer(entity);
                }
            }
    
            if (serversListModel.getAvailableServers() != null) {
                for (Long id : serversListModel.getAvailableServers()) {
                    ServerEntity entity2 = employeeService.getServerById(id);
                    entity2.setResponsible((long) 0);
                    adminService.updateServer(entity2);
                }
            }
            status.setComplete();
            return new ModelAndView("redirect:/employee_management/employee_manager");
        } else {
            return new ModelAndView("redirect:/employee_management/serv_assignment");
        }
    }
    

    一切都很完美。享受

    您的控制器方法是什么样子的?也可以看到:@superEb,我添加了控制器代码。POST请求的主体是什么样子的?使用HTTP代理捕获请求,如Chrome Dev Tools、Fiddler2、,或者Charles我不确定jQuery如何将JSON对象转换为application/x-www-form-urlencoded,但我猜jQuery发送的内容与控制器期望的内容不匹配。因此,您可能必须使用JavaScript进行自己的表单绑定/转换,并将processData设置为false,或者只发布JSON,并可能在控制器中使用@RequestBody而不是@ModelAttribute。
    public class ServersListModel {
    
    private List<Long> assignedServers;
    
    private List<Long> availableServers;
    
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
    
    <bean id="jacksonMessageConverter"
          class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter" />
            </list>
        </property>
    </bean>
    
    <bean id="defaultViews"
          class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
    
     $(function() {
                var assigned = "";
                var available = "";
    
                $('#sortable1').sortable({
                    connectWith: '#sortable2',
                    dropOnEmpty: true,
                    update: function(event, ui) {
                        assigned = $(this).sortable("toArray", { key: "id" });
                        }
                }).disableSelection();
    
                $('#sortable2').sortable({
                    connectWith: '#sortable1',
                    dropOnEmpty: true,
                    update: function(event, ui) {
                        available = $(this).sortable("toArray", { key: "id" });
                        }
                }).disableSelection();
    
                $('#assign').click(function(){
                    $.ajax({
                        type: "POST",
                        url: "/ServerMonitoring/employee_management/serv_assignment/2",
                        data: JSON.stringify({
                                assignedServers: assigned,
                                availableServers: available
                        }),
                        datatype: "json",
                        'scriptCharset': "utf-8",
                        'contentType': "application/json;charset=UTF-8",
                        success: function(data) {
                            //alert("Success");
                        },
                        error: function (e) {
                            //alert("Error: " + e);
                        }
                    });
                    return false;
                });
                //debugger
            });
    
    @RequestMapping(value = "/{id}", method = RequestMethod.POST)
    public @ResponseBody  ModelAndView onSubmit(
            @RequestBody ServersListModel serversListModel,
            @PathVariable("id") Long responsibleId,
            BindingResult result,
            SessionStatus status) throws ParseException, IOException {
    
        if (!result.hasErrors()) {
            if (serversListModel.getAssignedServers() != null) {
                for (Long id : serversListModel.getAssignedServers()) {
                    ServerEntity entity = employeeService.getServerById(id);
                    entity.setResponsible(responsibleId);
                    adminService.updateServer(entity);
                }
            }
    
            if (serversListModel.getAvailableServers() != null) {
                for (Long id : serversListModel.getAvailableServers()) {
                    ServerEntity entity2 = employeeService.getServerById(id);
                    entity2.setResponsible((long) 0);
                    adminService.updateServer(entity2);
                }
            }
            status.setComplete();
            return new ModelAndView("redirect:/employee_management/employee_manager");
        } else {
            return new ModelAndView("redirect:/employee_management/serv_assignment");
        }
    }