기본 콘텐츠로 건너뛰기

글

[Java] String null 체크 – 서블릿

자바로 서블릿 처리 할 경우, null 문자 체크가 중요함. 워낙에 간단해 보여서 내가 왜 틀렸는지 모르는 경우가 많음. 일반적으로 자바에서는 변수값이 null 상태일 경우 이걸가지고 작업하려고 하면 nullpointexception  떨어뜨림. String param; param = request.getparameter("key"); 시작이 중요함 여기서 만약에 값이 있으면 다행이지만 만약 없다면, String param = null ; 이상태 인거임. 그래서 이놈가지고 딴데가서 equal이나 이런거 하면 당연히 예외떨어짐. if(param == null && param.equals("")) 이런식으로 비교할 경우에는  '&&' 보다는 '||' 를 써줘야 함 &&는 앞에 연산후에 뒤연산도 수행지만 ||는 앞에서 끝나기 때문에 뒤연산을 하지 않음 null문자 대비해서 항상 StringUtils.defaultIfEmpty( request.getParameter("key"), StringUtils.EMPTY) 써주는게 좋음.

[spring] mvc:default-servlet-handler

오늘 스프링을 새로 깔아서 프로젝트를 띄웠는데, view 폴더 밑에 jsp들은 리졸버가 잘 가져오는거 같은데, 뷰에 include 되어있는 js/css 들이 로드 되지 않음. WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/css/test.css] in DispatcherServlet with name 'appServlet' WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/js/jquery.mobile-1.0a2.min.js] in DispatcherServlet with name 'appServlet' js/css 위치는 webapp/css webapp/js 이유가 뭘까 하다가. servlet-context.xml(dispatcher 설정된곳)에다가 <mvc:default-servlet-handler/> 추가하니까 해결됨. 스프링의 모든 url 요청은 DispatchServlet에서 받는다. 그리고 나서 적당한 컨트롤러에게 전달을 해주는것이다. 그런데 만약 해당되는 컨트롤러가 없을때 <mvc:default-servlet-handler/>를 적어주면 내부적으로 DefaultServletHttpRequestHandler가 처리하게 되는 것이다. 

[spring] json으로 떨궈주기

스프링에서 json으로 떨궈주는법. 생각보다 간단함. 1. @ResponsBody - 컨트롤러 함수 선언부에 @ResponsBody 추가 public @ResponseBody Map<String, Object> Test { ... return Map; } 2. dependency 추가 <dependency>      <groupId>org.codehaus.jackson</groupId>      <artifactId>jackson-mapper-asl</artifactId>      <version>1.6.4</version> </dependency> 끝.

Bootstrap 사용법

매번 테스트 하나 할때마다 화면 만드는거 때문에 귀찮았는데, 간단한 테스트 화면 만들기에는 딱인듯. css 랑 js만 있어서 쓰기도 편하고 ㅎ html5의 app cache하고 같이쓰면 앞으로 좀 더 유행하지 할 것 같은 느낌은 개인적은 느낌. ㅎㅎㅎ 1. 우선 다운.  ( http://twitter.github.com/bootstrap/assets/bootstrap.zip ) css하고 js라 사실 간단하다. http://twitter.github.com/bootstrap/index.html  여기서 원본 보시고, ㅎ 영어 읽기 귀찮으면 이거 계속 보는거고 ^^;; 2. Grid system 이게 사실 핵심인거 같은데, div 사이즈 조절하기가 겁나 편해졌다. <div class="container"> <div class="row"> <div class="span3"/> <!-- 왼쪽 사이드메뉴 영역 --> <div class="span9"> <!-- 오른쪽 바디 --> <div class="span2"/> <!-- 폼1--> <div class="span2"/> <!-- 폼2--> <div class="span2"/> <!-- 폼3--> <div class="span2"/> <!-- 폼4--> </div> </div> </div> 일반적으로 container를 가장 상위에 쓰는데 이놈은 span12사이즈로 정해져있다. 그래서 이놈을 3과 9로 구분한 다음에 남은 9안에다가...

[html5] application cache

안드로이드 아이폰 두 벌 만드느니, 차라리 웹 하나로 만들자 뜬구름 잡는 소린줄 알았는데, 이번에 application cache 보면서 html5가 새삼 다르게 보이는게 webos기반에서 html5로 만드는 앱이 나오긴 나올것 같다. 암튼지간에, application cache 쓰는법을 설명하자면. 1. manifest 파일을 하나 생성 2. 현재 html에서 참조하는, 캐싱이 필요한 js,css 목록들을 적어준다. 3. manifest 파일을 html에서 include 한다. 끝. 간단하다. 이렇게만 하면, 페이지에 처음 한번 접속한 이후부터는 오프라인 상태에서도 실행 할 수 있다.  manifest 파일 - 방금말한대로 캐싱할 파일들 목록을 적어주는 곳 - 'CACHE MANIFEST' 라는 문구로 시작 - 캐싱방법 . CACHE : 캐쉬할 파일 (문구 표기 생략가능) . NETWORK : 캐싱하면 안되는 파일 온라인 상태에서만 가능한 . FALLBACK : 캐싱실패 했을때 대체 파일 (ex: A   B - A가 없으면 B 호출) - 아직은 용량이 5MB 밖에 안됨. - 주석표시는 '#' 으로 ex) cache.manifest CACHE MANIFEST #v 1.0001 CACHE: css/jquery.mobile-1.0a2.min.css css/test.css js/jquery.mobile-1.0a2.min.js js/jquery-1.7.1.js NETWORK: test.jsp FALLBACK: A     B ex) test.jsp <! DOCTYPE html> < html manifest = "cache.manifest"  > ..... </html...

[linux] 모든 cron 확인

예전에 만들어놓은 cron이 요새 안돌고 있어서 찾아봤다. 물론 내가 만들었던 아니고ㅋ crontab -l no crontab for root 헐, 내가 찾던 cron이 안보인다. 분명히 예전 사수가 여기다 작업 해놓은것 같았는데... cron이 뭐하는 놈인지는 알아도, 어떻게 생겨먹은놈인지는 몰랐다ㅋ 이리저리 폴더 뒤져서 그때 스크립트 파일을 찾아보기 시작했다. 멍청한짓을 한 참 한후에 혹하는 마음에 로컬 사용자 뭐있나 찍어봄 cat /etc/passwd 찍어보믄 계정별로 결과가 쭈루루룩 나오는데, 뜻은 이거다. 계정:암호:UID:GID:정보:디렉토리:쉘 passwd 파일 설명은 ( http://www.linuweb.com/?p=248 ) 여기 님 블로그에 잘 되어있음. 암튼 결국 계정별로 cron 걸려있는거 죄다 찍어보니 for user in $(cut -f1 -d: /etc/passwd); do echo id $user; crontab -u $user -l ; done 한번에 다찍어주는 명령어는 따로 없나보다. 간단하게 스크립트로 찍어주는 수밖에. 결국 내가 찾던 cron은 처음보는 계정에 들어있었음. 그리고 cron이 안돌던 이유는 ftp가 막혀서였고 ㅋ

[Android] URL scheme - 주소창에서 앱실행, 앱간의 값 전달

뭐할때 쓰는 녀석이냐면 ㄱ. A앱에서 B앱을 호출하고 싶을때, ㄴ. 주소창에서 A앱을 실행시키고 싶을때, ㄷ. 1,2번을 하면서 parameter로 값을 전달하고 싶을때. 방법은 간단하다. 우선 andoridmanifest.xml을 열어서 해당 activity에 intent 필터를 추가 시키고, 아래처럼 내용으로 채워준다. <activity android:name=".ListViewActivity" android:label="@string/app_name"> <intent-filter>   <action android:name="android.intent.action.VIEW"/>    <category android:name="android.intent.category.DEFAULT"/>    <category android:name="android.intent.category.BROWSABLE" />    <data android:host="test2" android:scheme="bill" /> </intent-filter> </activity> 그리고 호출할때는 bill://test2 (스킴://호스트) 형식으로 하면 된다. 해석하면 bill://teset2를 주소창에 입력하면 ListViewActivity가 실행. 사실 이건 앱을 실행시킨다기보다는 해당 activity를 실행시키는 것이다. intent filter의 action하고 category를 왜저렇게 했는지 궁금하면 http://developer.android.com/training/basics/intents/filters.html 여기보면 나와있다. 일단 이렇게 만들고 안드로이드 브라우저에서 bill://test2를...