Srping MVC中Controller的void方法声明误区
Controller中定义void方法,这种场景一般是通过HttpServletResponse对象来输出页面内容。注意:Controller的void方法中一定要声明HttpServletResponse类型的方法入参!
void方法不定义HttpServletResponse类型的入参,HttpServletResponse对象通过RequestContextHolder上下文获取,这种方式是不可行的,
void方法不定义HttpServletResponse类型的入参,Spring MVC会认为@RequestMapping注解中指定的路径就是要返回的视图name
页面上访问 http://127.0.0.1:8080/MavenSpringMvcDemo/voidMethod/demo2,接着会将
http://127.0.0.1:8080/MavenSpringMvcDemo/jsp/voidMethod/demo2.jsp 作为此次请求的响应内容,如果这个jsp文件项目中不存在则报错
例子:
Controller
@PostMapping("/appreciate")//点赞功能
public void appreciate(@RequestParam(value = "isAppreciate") Boolean isAppreciate, @RequestParam(value="blogId") Long blogId){
Blog blog = blogService.findById(blogId);
if (isAppreciate){//点赞 数据库appreciateNum+1
blog.setAppreciateNum(blog.getAppreciateNum()+1);
}else{//取消点赞 数据库appreciateNum-1
blog.setAppreciateNum(blog.getAppreciateNum()-1);
}
blogService.updateAppreciateNum(blog);
}
错误
因为上面说的用了void方法之后会把RequestMapping的路劲当成页面返回,所以就会报template中没有找到/blogDetail/appreciate页面的错误
更改
将void方法换成String方法
因为前段的请求是ajax的post请求,所以返回一个String然后到前端console.log(data)更好
Controller
@PostMapping("/appreciate")//点赞功能
@ResponseBody
public String appreciate(@RequestParam(value = "isAppreciate") Boolean isAppreciate, @RequestParam(value="blogId") Long blogId){
Blog blog = blogService.findById(blogId);
if (isAppreciate){//点赞 数据库appreciateNum+1
blog.setAppreciateNum(blog.getAppreciateNum()+1);
}else{//取消点赞 数据库appreciateNum-1
blog.setAppreciateNum(blog.getAppreciateNum()-1);
}
blogService.updateAppreciateNum(blog);
return "更新成功!";
}
JS
function appreciate(){//点赞功能数据库appreciateNum+1
var isAppreciate = $("#dianzan-btn").hasClass('red')?'true':'false';
console.log(isAppreciate);
var blogId = $("#blogId").val();
console.log(blogId);
var adata = {
"isAppreciate":isAppreciate,
"blogId":blogId
};
$.ajax({
url : "/blog/blogDetail/appreciate", //请求的url。与后端@Request Mapping注解中的值一致。 注意:/blog前缀是项目名一定要加上
type : "post",//通过post方式上传请求
// contentType : "application/json",//上传内容格式为json结构
data : adata, //上传的参数
async: true, //默认为true异步,false表示同步,异步不需要等待,同步需要等待回调方法做完
success : function(data) { //请求成功的回调函数
console.log(data);
},
error : function(e) { //请求失败的回调函数
console.log(e);
}
})
};