如何将列表从javascript传递到spring控制器
我有一个问题,javaScript如何将两个separate列表传递给spring控制器。在我的freeMarker模板上,我选择了更改两个列表的集合。 这是两个列表的呈现: 编辑:我发现Jquery的Ui剽窃与如何将列表从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>
.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");
}
}