來自博客園的一位朋友解答:
為什么要 eval這里要添加 “("("+data+")");//”呢?
原因在於:eval本身的問題。 由於json是以”{}”的方式來開始以及結束的,在JS中,它會被
當成一個語句塊來處理,所以必須強制性的將它轉換成一種表達式。
加上圓括號的目的是迫使eval函數在處理JavaScript代碼的時候強制將括號內的表達式
(expression)轉化為對象,而不是作為語句(statement)來執行。舉一個例子,例如對
象字面量{},如若不加外層的括號,那么eval會將大括號識別為JavaScript代碼塊的開始和
結束標記,那么{}將會被認為是執行了一句空語句。所以下面兩個執行結果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]
對於這種寫法,在JS中,可以到處看到。
如: (function()) {}(); 做閉包操作時等。
注意:該例子使用的框架是spring+springmvc+mybatis plus
mybatis plus 是現有mybatis的增強版
官網為:http://mp.baomidou.com
這里有更為詳細介紹
代碼生成器可參考:人人開源 http://www.renren.io/
上述開源框架對於提高開發效率有很大的幫助
登錄驗證舉例(成功例子):
/**
* 登錄js
*/
$(function(){
$("#btn_login").click(function(){
var mobile = $("#mobile").val();
var password = $("#pwd").val();
alert(mobile+"||"+password)
$.ajax({
url:"/LMS/user/Login",
type:"POST",
data : {"mobile":mobile,"password":password},
dataType : 'json',
success:function(data){
var json = eval("("+data+")");
if(json.returnCode=="111111"){
alert(json.returnMsg);
}else if(json.returnCode=="222222"){
alert(json.returnMsg);
}else if(json.returnCode=="000000"){
alert(json.returnMsg);
}else{
alert("有異常,請和管理員聯系");
}
},error:function(){
alert("error");
}
});
});
});
@RestController @RequestMapping("/user") public class UserController { private static Logger logger = Logger.getLogger(UserController.class); @Autowired private UserService userService; @Autowired private UserAuthsService userAuthsService; @RequestMapping(value="/Login",method=RequestMethod.POST,produces="application/json;charset-utf8") @ResponseBody public String Login(String mobile,String password) { logger.info("用戶手機號:"+mobile); logger.info("用戶密碼:"+password); EntityWrapper<UserEntity> wrapper = new EntityWrapper<UserEntity>(); wrapper.eq("mobile", mobile); UserEntity user = userService.selectOne(wrapper); EntityWrapper<UserAuthsEntity> wrapper2 = new EntityWrapper<UserAuthsEntity>(); wrapper2.eq("identifier", user.getMobile()); UserAuthsEntity userAuth = userAuthsService.selectOne(wrapper2); logger.info("userEntity:"+user.getMobile()); logger.info("userAuth:"+userAuth.getCredential()); Map<String,Object> map = new HashMap<String,Object>(); if(!userAuth.getIdentifier().equals(mobile)) { map.put("returnCode", "111111"); map.put("returnMsg","手機號有誤"); }else if(!userAuth.getCredential().equals(password)) { map.put("returnCode", "222222"); map.put("returnMsg","密碼錯誤"); }else { map.put("returnCode", "000000"); map.put("returnMsg","通過驗證"); map.put("user", user); map.put("userAuth", userAuth); } return JSON.toJSONString(map); } }
失敗例子:
/**
* 登錄js
*/
$(function(){
$("#btn_login").click(function(){
var mobile = $("#mobile").val();
var password = $("#pwd").val();
alert(mobile+"||"+password)
$.ajax({
url:"/LMS/user/Login",
type:"POST",
data : {"mobile":mobile,"password":password},
dataType : 'json',
success:function(data){
if(data.returnCode=="111111"){
alert(data.returnMsg);
}else if(data.returnCode=="222222"){
alert(data.returnMsg);
}else if(data.returnCode=="000000"){
alert(data.returnMsg);
}else{
alert("有異常,請和管理員聯系");
}
},error:function(){
alert("error");
}
});
});
});
兩個例子進行對比,前者可成功返回json數據,而后者返回未定義
而當你將data.returnMsg或data.returnCode后面的returnMsg,returnCode去掉,直接alert(data) 是可以返回數據的
返回的數據直接是以json串(json字符串的形式{}),而並未將json進行格式化,所以直接取數據導致未定義
將json格式化有兩種方法:
方式一:
一種是上述 var json = eval("("+data+")"); 稱之為用eval解析
方式二:
var json = "{user:'user'}"
var obj = new Function("return"+json)//轉換后的json對象
alert(obj.name);
alert(obj.age);