2013년 7월 9일 화요일

ajax 인코딩 관련

기본적으로 ajax 는 utf-8 로 통신하게 되어있기 때문에 한글을 보내거나 받을 경우
그에 맞는 인코딩 설정을 해주어야 한다.
단, json 객체로 보내게 되면 굳이 인코딩을 할필요는 없다.
json 객체를 전송할때는

contentType : "application/json",

json 객체를 받을때는

dataType : "json",

을 명시해주면 된다. 하지만 일반 text일 경우에는
추가로 설정이 필요하다.

전송할때

contentType:"application/x-www-form-urlencoded; charset=UTF-8",

추가해주고 받을때는 

별도의 설정은 필요없다.

컨트롤러단에서 @ResponseBody 사용시
@RequestMapping(value = "/test/encoding5", method = RequestMethod.GET, produces="text/plain; charset=UTF-8")
설정해주고 @ResponseBody 미사용시

response.setCharacterEncoding("utf-8");

이 구문을 추가해준다.

@RequestBody, @ResponseBody

소스부터..
var data = {usr_id : "jack" , usr_pw : "jack", usr_name : "jack"};
     
$.ajax({
 url : "/contextPath/test/json",
 method : "POST", 
 contentType : "application/json",
 data : JSON.stringify(data),           
 success : function() {
  alert("전송 성공");
 },
 error : function(XHR, textStatus, errorThrown) {
       
     alert("Error: " + textStatus);      
     alert("Error: " + errorThrown);

 }
});
위와 같이 json 객체를 JSON.stringify 를 이용하여 문자열로 변환후 전송하려 할때 spring에서를 어떻게 받아야 할까?
@RequestMapping(value = "/test/json", method = RequestMethod.POST, consumes="application/json")
public void ajax_sendJSON(@RequestBody Map< String, Object> data, HttpServletResponse response) {  
    
 logger.info("ajax_sendJSON\n"+data);   
  
 response.setStatus(HttpServletResponse.SC_NO_CONTENT);
        //응답 없음
}
위와 같이 받으면 된다. 만약에 json객체가 [] 로 된 배열형태라면
List< Map< String,Object>> 로 받으면 된다.

json객체를 내보낼때도 마찬가지다.
@ResponseBody
@RequestMapping(value = "/test/json", method = RequestMethod.GET, produces="application/json")
public List< Map< String, Object>> ajax_receiveJSON() {
  
 logger.info("ajax_receiveJSON");
  
 List< Map< String, Object>> list = new ArrayList< Map< String, Object>>();
  
 for(int i=0 ; i<3 ; i++) {
   
  Map< String, Object> map = new HashMap< String, Object>();
   
  map.put("id", "id"+i);
  map.put("name", "name"+i);
   
  list.add(map);
 }
  
 return list;    
} 
위와 같이 리턴해주면 json형태로 손쉽게 받을 수 있다.
$.ajax({
 url : "/contextPath/test/json",
 method : "GET",  
 dataType:"JSON",
 success : function(json) {
       
   alert(JSON.stringify(json));       
       
 },
 error : function(XHR, textStatus, errorThrown) {
       
     alert("Error: " + textStatus);      
     alert("Error: " + errorThrown);

 }
});
받는 것도 위 처럼 받으면 된다
매우 좋은 기능이지만 그냥 사용 할 수는 없다. pom.xml 에서 다음을 추가하면 된다.

 org.codehaus.jackson
 jackson-core-asl
 1.9.12


 org.codehaus.jackson
 jackson-mapper-asl
 1.9.12

그리고 전에 글에 servlet-context.xml 에서 처럼 json 관련 
bean을 추가해주면 된다.

ibatis 설정 및 간단한 구현

기본적으로 몇가지 jar들이 필요한대 그 목록은 다음과 같다.

1. ojdbc14 (oracle jdbc 라이브러리)
2. spring-orm (ibatis와 jdbc를 연결해주는 역할)
3. ibatis-sqlmap (ibatis 의 sqlmap 라이브러리)

Spring Template Project 를 사용하여 프로젝트를 생성했다면
기본적으로 maven이 포함되어 있다. pom.xml 을 수정하여 쉽게 추가가 가능하다.

참고로 Spring Template Project로 프로젝트 생성시 추가 작업으로는
Spring Library 추가 Server Library 추가가 있다.



com.oracle
    ojdbc14
    10.2.0.4.0

	


    org.springframework
    spring-orm
    ${org.springframework-version}


    org.apache.ibatis
    ibatis-sqlmap
    2.3.4.726

귀찮으면 위에꺼 가져가 쓰면 된다.
이제 몇가지 설정 파일이 필요한데 위치는 WEB-INF 밑에 classes 안에 자유롭게 배치해도 된다. 
classes 가 classpath 임.

data-context.xml 이름은 상관없다.


	   					   
	
	
		
		
		
		
	
	
	
		  
	
	      
	
	


sqlMapConfig.xml 이건 이름이 정해져있다.


		

	
        
		

usr.xml 쿼리가 들어가는 파일


		

        
	
	
	
	
	
	
	
		INSERT INTO usr(usr_uid, usr_id, usr_pw, usr_name, usr_enabled, usr_authority, usr_regdate, usr_upddate)
					VALUES
					(usr_seq.nextval, #usr_id#, #usr_pw#, #usr_name#, '1', 'ROLE_USER', sysdate, sysdate)
		
	

dao 구현
@Repository
public class UsrDao extends SqlMapClientDaoSupport {
	
	@Resource(name = "sqlMapClient") 
    public void setSuperSqlMapClient(SqlMapClient sqlMapClient){
		
        super.setSqlMapClient(sqlMapClient);
        
    } 
	
	public UsrVo selectOne(String usr_uid){
		
		return (UsrVo)getSqlMapClientTemplate().queryForObject("usr.selectOne", usr_uid);
		
	}
	
	public List selectAll(){
		
		return getSqlMapClientTemplate().queryForList("usr.selectAll");
		
	}
	
	public void insert(UsrVo usrVo) {
		
		getSqlMapClientTemplate().insert("usr.insert", usrVo);
		
	}
}
service 구현
@Service
public class UsrService {

	@Autowired
	private UsrDao usrDao;
	
	private static final Logger logger = LoggerFactory.getLogger(UsrService.class);
	
	public void getUsrList(Model model) {
		
		model.addAttribute("usrList", usrDao.selectAll());
		
	}
	
	public boolean checkUsrIdDup(String usr_id) {
		
			
		return usrDao.checkUsrIdDup(usr_id);		
		
	}
	
	public UsrVo findUsrDetail(String usr_uid) {
		
		return usrDao.selectOne(usr_uid);		
		
	}
	
	public void submitUsrJoin(UsrVo usrVo) {
		
		usrDao.insert(usrVo);		
		
	}
}

jQuery RESTful 요청

회원 목록

위와 같은 form 이 있을 경우 jquery를 이용하여 RESTful방식으로 요청하는 법.

$(".detailHandler").click(function() {		
					
	var usr_uid = $(this).attr("usr_uid");
	$("input[name=_method]").val("get");
	$("form")
		.attr("method","post")
		.attr("action","/contextPath/admin/usr/"+usr_uid+") 
		.submit();
});	
form 내부에 _method 이름으로 된 요소가 있을 경우 web.xml에서 HiddenHttpMethodFilter 필터를 설정했다면 
위와 같은 방법으로 spring에서도 delete,get,put,post 메소드를 사용 할 수 있다.

onclick 속성을 사용하지 않을 경우에 버튼 태그안에 임의의 속성을 주어 데이터를 저장하게 할 수 있다.
또한 contextPath는  태그를 사용하여 대체 가능하다.

중복 ID 체크


회원가입시 중복체크 쿼리. 
입력된 아이디와 기존 회원 테이블을 조인시켜 
입력된 아이디에 대한 정보가 null인지 아닌지 구분함.
dao 클래스에서 java.lang.Boolean 형식으로 받을 수 있다.
이후,

@ResponseBody 
@RequestMapping(value = "/usr/join_check", method = RequestMethod.POST)
public boolean usr_join_check(@RequestParam String usr_id) {
		
	logger.info("usr_join_check ajax\nusr_id : ["+usr_id+"]");
		
	return usrService.checkUsrIdDup(usr_id);		
}	
컨트롤러 단에서 @ResponseBody 를 이용하여 리턴해준다.