Programming

반응형
spring기반 json + ajax 처리

mappingJacksonHttpMessageConverter는 @ResponseBody, @RequestBody 어노테이션 사용시 JSON String을 javaClass(get, set)에 자동으로 맵핑이 되도록 변환을 해주는 스프링 애너테이션입니다.

우선 MappingJacksonHttpMessageConverter 관련 bean 설정이 필요합니다.

-board-servlet.xml

<bean id=jacksonMessageConverter class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter ">
</bean> 
<bean class=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter> 
	<property name="messageConverters"> 
		<list> 
			<ref bean="jacksonMessageConverter" /> 
		</list> 
	</property> 
</bean>

 

@RequestBody는 클라이언트에서 jsonObject로 전송되는 파라미터를 자동으로 javaClass 형식으로 변환한다. (UserBean Class 는 클라이언트에서 받을 파라미터를 get, set 으로 작성하면, bean에 등록된 massageConverters에서 자동으로 javaClass 형식에 맞게 컨버팅이 이뤄진다.)

@ResponseBody는 클라이언요청을 서버에서 처리 후 메소드가 리턴하는 오브젝트를 messageConverters를 통해 json 형태로 변환하여 리턴해주는 역활을 한다.

-UserController.java

  @RequestMapping(value="getLoginCheck.ajax", method=RequestMethod.POST) 
  public @ResponseBody UserBean loginCheck(@RequestBody UserBean userBean){ 	
  	logger.info("userBeanD.getJ_username(){}", userBean.getJ_username()); 	
  	userBean = userService.getUsers(userBean.getJ_username()); 	 	
  	return userBean; 
  }

 

ajax 통신을 위해 jquery ajax method 설정을 아래와 같이 jQuery로 선언해준다.

var _param = {j_username:$("#j_username").val(), j_password:$("#j_password").val()};

_data = JSON2.stringify(_param); //jsonString으로 변환

_url = "localhost:8080/login/getLoginCheck.ajax";

-common.js

$.ajax({   
	type : 'POST',   
    url : _url,   
    cache: false,   
    dataType: "json",   
    data: _data,      
    processData: false,   
    contentType: "application/json; 
    charset=utf-8",    
    success : function(data, status){       
    	console.log("status:"+status+","+"data:"+data);       
        alert(data.nm);    
    },   
    error: function(request, status, error){       
    	//alert("loading error:" + request.status);       
        console.log("code : " +  request.statusText  + "\r\nmessage : " + request.responseText);     
    } 
});
반응형

jquery ajax method 정리

2014. 3. 12. 09:53
반응형
$.ajax({
	type: 'POST',
	url: _url,
	cache: false,
	dataType: "json",
	data: _data,   
	processData: true,
	contentType: "application/json; charset=utf-8", 
	success: function(data, status){
	},
	error: function(request, status, error){
	}
});


 Name

 Value/Description

 파라메터는 한 개 이상의 name/value 쌍으로 표시

 async

 Boolean 값

 요청이 비동기식으로 처리되는지 여부를 나타냄 기본값은 true

 beforeSend(xhr)

 

 요청을 보내기 전에 실행되는 함수

 cache

 Boolean 값

 브라우저가 요청된 페이지를 캐싱해야 하는지 여부를 나타냄

 complete(xhr,status)  요청이 완료됐을 때 실행되는 함수
 contentType  서버로 보내지는 데이터의 content-type
기본값은 “application/x-www-form-urlencoded"
 dataFilter(data,type)  XMLHttpRequest의 응답 데이터를 처리할 때 사용되는 함수
 dataType  서버 응답으로 받는 데이터 타입
 error(xhr,status,error)  요청이 실패했을 때 실행되는 함수
 global Boolean 값 요청에 대해 전역 AJAX 이벤트를 실행할 지 여부를 명시함
 jsonp  jsonp 요청에서 callback 함수를 오버라이딩하는 문자열
 jsonpCallback  jsonp 요청에서 callback 함수 이름을 나타냄password
 password  HTTP 접근 인증(access authentication) 요청에 사용할 password를 나타냄
 processData Boolean 값 요청으로 보낸 데이터를 query string 형태로 변환할지 여부를 나타냄 기본값은 true
 scriptCharset  요청할 때의 charset을 나타냄
 success(result,status,xhr)  요청이 성공했을 때 수행되는 함수
 timeout  요청에 대해 로컬의 응답제한시간(timeout)을 밀리초로 나타냄
 traditional Boolean 값 파라미터 직렬화를 기존 방식으로 사용할 지 여부를 나타냄
 type  요청 type(GET 혹은 POST)을 명시함
 url  요청을 보낼 URL을 나타냄 기본값은 현재페이지
 xhr  XMLHttpRequest 오브젝트를 생성할 때 사용하는 함수


반응형
반응형
Spring AOP 메서드 추적 Flow

 

Spring AOP를 활용한 메소드 흐름을 로깅한 로직을 정리합니다.

Server.xml
<!-- spring aspect --> 
<bean id="loggingAspect" class="com.zz.framework.support.aspect.LoggingAspect" /> 
	<aop:config proxy-target-class="true"> 	
    <aop:aspect id="aspectLoggging" ref="loggingAspect"> 		
    	<aop:pointcut id="servicePointcut" expression="execution(* *..*.service.*Service*.*(..))" /> 		
    	<aop:around method="logAround" pointcut-ref="servicePointcut"  /> 	
    </aop:aspect> 
</aop:config>
 
LoggingAspect.java
public class LoggingAspect { 	
	private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
    
    public void logBefore(JoinPoint joinPoint) { 		
    	logger.debug("logBefore()"); 	
    }  	
    
    public void logAfter(JoinPoint joinPoint) { 		
    	logger.debug("logAfter()"); 	
    }  	
    
    /** 	 
    * 메소드 별 로그 앞뒤로 남기기 	 
    * @param joinPoint 	 
    * @return 	 
    * @throws Throwable 	 
    * @auther jp1020 2014. 1. 15. 	 
    */  	
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { 		
    	Object thisObj = joinPoint.getTarget(); 		
        String className = thisObj.getClass().getName(); 		
        Object[] args = joinPoint.getArgs(); 		
        long currentTime = System.currentTimeMillis();  		
      
        if(logger.isDebugEnabled()) { 			
        	logger.debug("================================================="); 			
        	logger.debug(">>>>>>>>> LOGGING START >>>>>>>>>>"); 			
            logger.debug("[class]:" + className); 			
            logger.debug("[method]:" + joinPoint.getSignature().getName() + "()"); 	
        }  		
        
        Object returnObj = joinPoint.proceed(); 		
        
        if(logger.isDebugEnabled()) { 			
        	logger.debug("[class]:" + className); 			
            logger.debug("[method]:" + joinPoint.getSignature().getName() + "()"); 	
            logger.debug("[소요시간]: {}ms", new Object[]{(System.currentTimeMillis()-currentTime)}); 
            logger.debug(">>>>>>>>>> LOGGING END >>>>>>>>>>"); 			
            logger.debug("================================================="); 		
        } 		
        
        return returnObj; 	
    } 
            
}

 

페이지 호출시 Console창에 출력된 로그를 확인 합니다.
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():46]:================================================= 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():47]:>>>>>>>> LOGGING START >>>>>>> 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():48]:[class]:com.zz.board.business.board.service.impl.BoardServiceImpl 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():49]:[method]:listBoard() 
[2014-02-13 17:52:23] DEBUG [AbstractBeanFactory.doGetBean():246]:Returning cached instance of singleton bean 'loggingAspect'  

내용생략......... 

[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():55]:[class]:com.zz.board.business.board.service.impl.BoardServiceImpl 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():56]:[method]:listBoard() 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():57]:[소요시간]: 281ms 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():58]:>>>>>>>> LOGGING END >>>>>>>> 
[2014-02-13 17:52:23] DEBUG [LoggingAspect.logAround():59]:=================================================

 

 

반응형

[C#] short url 생성(bit.ly)

2014. 2. 13. 13:16
반응형
  • C# bit.ly API 연동 방법

SNS를 연동하다 보면 url에 파라미터가 길게 늘어진 url이 보기 거슬릴때가 있다.  

bit.ly를 활용한 long url을 short url로 make해주는 api가 있는데 매우 효율적인 거 같다. 

다만, 일별 쿼터 제한이 있어 동적으로 사용할 경우 제한 횟수 이상의 요청은 원본 URL로 처리가 됨.

사용한 방식은 클라이언트에서 ajax로 bit.ly api를 호출하고 리턴 받은 short url이 쉐어되도록 개발을 진행.. 우선 개발을 하려면 bit.ly 사이트에서 계정을 발급 받아야 함. 

-share.js 

자바스크립트로 short url 생성 방식

<script>

function facebook_sharer(sharer_title, content_title, sharer_URL) {
    sharer_URL = fn_bitly(sharer_URL);
    var sharer_str = encodeURIComponent(sharer_title.replace(/#/gi, "") + content_title);
    var sharer_url = encodeURIComponent(sharer_URL);
    window.open("http://www.facebook.com/sharer.php?u=" + sharer_url + "&t=" + sharer_str, "facebook_sharer", "toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,width=800,height=600");
}

function url_sharer(sharer_URL) {
    sharer_URL = fn_bitly(sharer_URL);
    bResult = window.clipboardData.setData("Text", sharer_URL);
    if (bResult) alert('복사되었습니다. 블로그에서 붙여넣기(Ctrl+V)를 이용하세요.');
}

//Short Url Maker
function fn_bitly(longUrl) {
    var shortUrl = "";
    if (longUrl != "") {
        $J.ajax({
            url: '/ajax/bitlyToJson.aspx', //bit.ly api로 다이렉트로 호출해서 short url을 받아도 무방.
            type: 'POST',
            dataType: 'json',
            data: {
                longUrl: longUrl
            },
            timeout: 1000,
            async: false,
            error: function(xhr) {
                //alert('xhr (' + xhr.status + ':'+ xhr.statusText + ':' + xhr.responseText + ')');
            },
            success: function(response) {
                _jsonObject = response.data;
                shortUrl = _jsonObject.url;
            }
        });
        if (shortUrl == "") shortUrl = longUrl;
    }
    return shortUrl;
}

</script>
-bitlyToJson.cs

c# 에서 short url 생성 방식
 

/******************************************************************************
 *  제  목 : bitlyToJson
 *  작성자 : 이종필
 *  작성일 : 2012-11-08
 *  설  명 : Long Url -> Short Url로 Json 리턴
 ******************************************************************************/

#region shortUrl 생성
    ///    /// https://bitly.com/ 사이트에서 발급
    /// format : json
    /// apiKey : R_b7b8ddaf4734eba87237d5ad*******
    /// login : leejon****
    ///    
    private void MakeShorURL(string longurl)
    {
        StringBuilder sb = new StringBuilder();

        //base
        sb.Append(@"http://api.bit.ly/v3/shorten?login=leejon****l&apiKey=R_b7b8ddaf4734eba87237d5ad5*****&format=json&longUrl=");
        //server page
        sb.Append(Server.UrlEncode(longurl));

        // Make Short URL
        WebClient client = new WebClient();
        string shorturl = client.DownloadString(new Uri(sb.ToString()));

        Response.Write(shorturl);
    }

#endregion
결과는 아래와 같이 JSON, XML 데이타로 리턴된다. 
호출하는 데이타 format (json, xml) 파라미터로 제어 가능.
 
-JSON
 
{ "status_code": 200, "status_txt": "OK", "data": { "long_url": "http:\/\/www.naver.com\/", "url": "http:\/\/bit.ly\/YNBfGD", "hash": "YNBfGD", "global_hash": "md7fw", "new_hash": 0 } } 
 
-XML
<response>
 <status_code>200</status_code>
 <status_txt>OK</status_txt>
 <data>
  <url>http://bit.ly/YNBfGD</url>
  <hash>YNBfGD</hash>
  <global_hash>md7fw</global_hash>
  <long_url>http://www.naver.com/</long_url>
  <new_hash>0</new_hash>
 </data>
</response>

 

반응형
반응형

C#에서 http 프로토콜을 이용한 인터페이스.

protected void HttpCall()
{
    String callUrl = "http://localhost:8080/test/call";
    String[] data = new String[1];
    data[0] = "nikemodel";         // id
    data[1] = "password";          // pw
    
    String postData = String.Format("id=&pw=", data[0], data[1]); 
    HttpWebRequest httpWebRequest = (HttpWebRequest) WebRequest.Create(callUrl);

    //인코딩 UTF-8
    byte[] sendData = UTF8Encoding.UTF8.GetBytes(postData);
    httpWebRequest.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
    httpWebRequest.Method = "POST";
    httpWebRequest.ContentLength = sendData.Length;

    Stream requestStream = httpWebRequest.GetRequestStream();
    requestStream.Write(sendData, 0, sendData.Length);
    requestStream.Close();

    HttpWebResponse httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse();
    StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream(), Encoding.GetEncoding("UTF-8"));    
    String response = streamReader.ReadToEnd();

    streamReader.Close();
    httpWebResponse.Close();
 
    console.Write("response : " + response);
}
반응형

+ Recent posts

반응형