- Controller
// 아이디 중복체크 (비동기방식 처리)
// 페이지를 리턴하는 것이 아니라 데이터를 리턴하는 것이기 때문에 @ResponseBody를 써줘야한다.
// return값이 페이지가 아니라 데이터리턴을 리턴하는거
@ResponseBody
@RequestMapping(value="/idCheck.do", method = RequestMethod.POST)
public ResponseEntity<ServiceResult> idCheck(@RequestBody Map<String, String> map){ //@RequestBody 비동기처리 시 사용, Map으로 받아야지 json형식대로 쓸 수 있다.(String으로 하면 그냥 한줄로 온다)
/*
* 단일 데이터를 꺼낼 때,
* 1) ajax 설정에서 ContentType 설정을 하지 않고 데이터만 {memId : id} 설정해서 넘길 때
* - String memId로 데이터를 꺼낼 수 있다.
*
* 2) ajax 설정에서 ContentType 설정을 하지 않고, 데이터만 JSON.stringify일 때
* - @RequestBody로 String memID를 꺼내면 '%7B%22memId%22%3A...' 이런 데이터가 넘어옴
*
* 3) ajax 설정에서 ContentType 설정을 하고, 데이터만 JSON.stringify일 때 (데이터 JSON객체로 넘어감)
* - @RequestParam으로 String memId를 꺼내면 400에러가 발생한다.
*
* 4) ajax 설정에서 ContentType 설정을 하고, 데이터만 JSON.stringify일 때 (데이터 JSON객체로 넘어감)
* - @RequestBody Map<String,String> map으로 꺼내면 'a001' 데이터가 넘어온다.
*
*/
String id = map.get("memId").toString(); // map.get(key)를 넣어서 value를 꺼내쓴다.
log.info("넘겨받은 아이디 : " + id);
ServiceResult result = noticeService.idCheck(id);
return new ResponseEntity<ServiceResult>(result, HttpStatus.OK); // 데이터를 리턴
}
- jsp
// 방법 2)
// 보낼 data를 JSON.stringify()로 묶어서 json 객체로 데이터를 보내고
// contentType : "application/json; charset=utf-8"
// 위와 같은 설정으로 진행하면, request header 정보에
// contentType은 json으로 넘어가고, payload는 json 객체 형식으로 데이터가 넘어감
var data = {
memId : id
};
$.ajax({
type : "post",
url : "/notice/idCheck.do",
// data : {memId : id}, //방법 1) contentType 설정 안함, data도 {id : 1} 과 같이 설정
data : JSON.stringify(data), // 방법2) 서버로 보내는 데이터(json으로 받을꺼면 json형태로 감싸줘야한다)
contentType : "application/json; charset=utf-8", // 방법2) 어떤 타입으로 데이터를 보낼지
success: function(res){
console.log("아이디 중복 확인 결과 : " + res);
if(res == "NOTEXIST"){ // 아이디 사용가능
alert("사용 가능한 아이디입니다!");
idCheckFlag = true; // 가입하기 버튼을 클릭할 때 아이디 중복 체크를 했는지 여부를 알려주는 플레그
}else{ // 아이디 사용 불가능
alert("이미 사용 중인 아이디입니다!");
}
}
});