前后端交互问题
2017-08-31 本文已影响0人
esileme
前端传一个数组到后台接收问题
有这样一个功能需求:前端有多个checkbox,现在选中任意个checkbox将它的id传到后台中,因为向后台发送的数据是多个,如果还是使用普通方式接收会造成只接收到一个的问题,所以在后台组中使用数组的方式接收。
前台jsp页面的checkbox业务逻辑:
<div class="form-group">
<c:forEach items="${resources}" var="resource">
<input type="checkbox" name="id" id="${resource.id}" value="${resource.id}"
<c:if test="${resource.id == myid}">checked="checked"</c:if> />
${resource.name}
</c:forEach>
</div>
在一个form表单中有多个checkbox,首先遍历出所有的资源,每个checkbox会显示一个内容,当选中一个checkbox时,会获取到它的value值,也就是资源id,选中多个,就可以获取到多个资源id的集合了。
后台接收业务逻辑:
@RequestMapping(value = "add.action", method = RequestMethod.POST)
public String addRolePost(ModelMap model, SysUser sysUser, @RequestParam("id") int[] ids) {
String algorithmName = "md5";
String salt1 = username;
String salt2 = new SecureRandomNumberGenerator().nextBytes().toHex();
System.out.println(salt2);
sysUser.setSalt(salt2);
int hashIterations = Global.hashIterations;
SimpleHash hash = new SimpleHash(algorithmName, password, salt1 + salt2, hashIterations);
String encodedPassword = hash.toHex();
System.out.println(encodedPassword);
sysUser.setPassword(encodedPassword);
sysUser.setRoleIds(roleIds);
System.err.println(sysUser.toString());
sysRoleService.addSysUser(sysUser);
return "redirect:/admin/login.action";
}
主要看参数列表中,前台传入到后台的参数是id,在后台中使用int[ ] 数组,加上@RequestParam
接收id值,也可以直接用int[] id
直接获取到也行。
前台将List数据封装成json到后台接收的问题 (使用ajax)
在SpringMVC中参数如果想要接收复杂类型比如List<Object> ,一个常见的方案是前台把数据以json的形式传过去.
一个简单的例子说明前台向后台传入json , Controller是如何接收的.
在前台要实现这样一个功能:选中多个多选框,并将多个多选框的数据发送到后台,进行批量删除操作。这时可以将数据封装成一个Json,前台的JS代码如下:
function batchDelete(){
var totalArr = [];
//遍历checkBox是否被选中,如果被选中,创建一个video对象,
//将id传到video中,同时给video设置一个videoTitle。
$('input:checkbox[name=checkid]:checked').each(function(){
var video=new Object();
video.id = $(this).val();
video.videoTitle="测试";
totalArr.push(video);
});
console.log(JSON.stringify(totalArr));
$.ajax({
type: "POST",
url: "http://localhost:8080/VIDEO1/admin/video/batchDelete.action",
data:JSON.stringify(totalArr),
// 参数类型是json 形式
contentType:"application/json",
dataType: "json",
success: function (response) {
console.log(response['content']);
location.reload();
}, error: function (re) {
alert("error");
}
})
}
前台使用Post的方式向后端发送数据,后端接收数据如下:
@RequestMapping("/admin/video/batchDelete.action")
@ResponseBody
public OpreationResult batchDelete(@RequestBody List<Video> videos) {
OpreationResult result = new OpreationResult();
videoService.batchDelete(videos);
result.setErrorCode("0");
result.setErrorMessage("正常");
result.setContent(videos);
return result;
}
在后台接收数据时,在参数上加@RequestBody
使用List的形式接收。
js中字典数组的简易使用:http://blog.csdn.net/anialy/article/details/8295765
使用js加载页面
jsp代码:
<div id="content">
</div>
js代码:
<script>
$(function() {
var id = $('#videoId').val();
$('#content').load('front/video/videoData.action?videoId=' + id);
});
</script>
Controller层代码:
@RequestMapping("front/video/videoData.action")
public String videoData(int videoId, ModelMap model) {
//简单的数据处理
Video video = videoService.findVideoById(videoId);
Course course = courseService.getCourse(video.getCourseId());
Speaker speaker = sperakerService.getSpeakerById(video.getSpeakerId());
model.put("video", video);
model.put("course", course);
model.put("speaker", speaker);
//返回一个jsp页面
return "/front/video/content.jsp";
}