本周在做自己的demo时候运用到了ajax,主要技术栈为SpringMvc框架等...
在做登录验证的时候想达到这种效果:当登录成功后alert(“登录成功”),然后直接跳转到指定页面。然而,在向后台发送数据库验证账号密码的时候发现传入参数绑定的值都为null。卡了好久最后从一篇博文中找到了解决办法:springMvc中前台ajax传json数据后台controller接受对象为null。作者在末尾会标记。
主要问题出现在:contentType:“application/json”这一段代码。
前端js代码如下:
后台controller代码如下:
@Controller
@ReuqestMapping(value= "/login.action")
public class LoginController {
@ResponseBody
@RequestMapping(value="/selectForLogin")
public Map selectForLogin(String userId,String password,HttpSession httpsession) {
User user = loginService.selectForLogin(userId,password);
Map map = new HashMap();
if (user!=null) {
map.put("result","OK");
httpsession.setAttribute("userSession",user);
}else {
map.put("result","Fail");
}
return map;
}
}
以上传参方式后台加System.out输出的user是null;当去掉了contentType:“application/json”一行代码之后问题解决。
我们后来研究ajax中contentType的作用:(以下引用作者的解析)
在jquery的ajax中,如果没加contentType:"application/json",那么data就应该对应的是json对象,反之,如果加了contentType:"application/json",那么ajax发送的就必须是字符串。不指定contentType则代表为默认的application/x-www-form-urlencoded(表单)类型,这种类型有一个好处,它可以支持很多种情况,并能配合查询字符串(key1=value1&key2=vlaue2)的形式发送到服务器。而且这种默认类型可以很好地配合参数processData(默认为true,可以不用管他),该参数为true的时候,开启自动转化功能,只要是一个合法对象,都能将该对象自动地转化成查询字符串的形式。
其中作者还延伸了一些几种正确和错误的传参方式,对初学者十分友好。原作者链接:虚拟WORLD-er,同时再次鸣谢。
ps:因为电脑不在身边,以上代码是凭记忆的大概盲敲的,整体逻辑没有什么错误,大家自行选择复制。
2020/10/21记录于公司。