2009년 12월 27일 일요일

jQuery Plugin (폼 체크)

오랫만의 포스팅..

프로젝트하랴.. 친구들 상대하랴.. 연말이랴...

나 자신에 대한 기록들을 소홀히 한 것 같아 내 자신에게 미안해지는구나!

 

 

내 스스로의 기록들을 위한 포스팅..

 

지금 프로젝트에 쓰이고 있는 효과인데.. 간단한 플러그인을 만들어보았다.

 

지겨운 alert창 .... 일일이 텍스트필드를 체크하며 아래와 같은 소스코드를 반복한다.

 

if(sadasd.value=="")

  alert("xxxxx를 입력하세요");

  sadasd.focus();

else if(sdsad1.value=="")

  alert("yyyy를 입력하세요..");

else...

.

else..

 

 

 

입력텍스트가 수십개라면 저렇게 일일이 체크하고 설명하고, 포커스를 갖다줘야 하는가?

 

저짓은 정말... 개발자나 유저에게나 서로에게 힘든일인것 같다.

간단하면서도 심플한 시각적인 효과로 필수 입력창을 알리면

개발자도 편하고 유저의 입장에서도 짜증나는 얼럿 경고창 확인 눌러대지 않아도 된다.

 

그래서 만든 텍스트 입력창 체크 플러그인.....( 이런건 널렸지만..)

 

 

 
이런 텍스트가 입력 필드가있다.

 

 
입력하지 않고 ADD를 누르면 주어진 색깔대로 배경을 바꾼다.

 

 
주어진 시간 경과후 다시 원래 색깔대로 돌아간다.

 

 

 

소스는 더럽게 허접하고 간단해서..... 1초만 봐도 알게된다..;

 

2009년 10월 25일 일요일

Struts2 jQuery JSON 으로 구현한 더블셀렉트

•본 코드는 개인적인 공부용으로 또는 그냥 생각나는 데로 만들어 본, 초보 개발자의  

쓰레기 코드 입니다. 아무렇게나 수정 하실 수 있으며 코드에 관한 개선사항은 언제든지 환영합니다.

 

예전에 지금 진행 하고 있는 프로젝트에 대비해 한번 만들어 본것인데..

역시나 간단하다. 조금 까다로운게 있다면 Struts2 는 Dojo 라는 자바스크립트 툴을 사용 한다는 것인데

 

Struts2 관련 서적을 뒤져봐도 Struts2 와 Dojo 를 사용한 예제는 극히 적으며

외우기도 힘든 struts2 tag library 를 사용해가며 낯선 Dojo 를 사용 할 바에야

그냥 jQuery 로 갖다 쓰기로 했다-_-;

 

jQuery 로 비동기 통신한 데이터를 javascript 단에서 처리 하려면 json 으로 데이터를 받는것이

반드시 필요하다.

 

struts2 는 json 을 완벽히(?) 그리고 간단하게 지원해주고 있다.

먼저 struts2 에서 result type으로 json 으로 받으려면 json 라이브러리를 추가 해주어야 한다.

 

struts2 최신 버전은 2.1.8 버전 부터는 번들로 포함 되어 있다고 하는데

지금 구버전이라 ..;;

 

위의 라이브러리 파일을 WEB-INF/lib 에 추가하고 작업을 시작한다.

 

먼저 struts.xml 파일에서 result type을 json 으로 사용 하려면 다음과 같이 해야 한다.

 

 <package name="example" namespace="" extends="json-default">
     <action name="JSONExample" class="JSONExample">
        <result type="json"/>
     </action>
     <action name="JSONForm" class="JSONForm">
        <result type="json"/>
     </action>
  </package>

 

중요한 부분은 빨간색 표시 해두었다.

 

반드시 package가 json-default를 상속 받아야 하며 result type에는 json을 명시하여야 한다.

또한 json 은 주로 비동기 요청 (Ajax) 에서 요청 되어지므로 결과 페이지는 안적어두 된다..

 

이제 jQuery에서 $.getJSON 메소드를 사용할 준비가 되었다.

 

 

먼저..

Action 파일을 작성 해보자. 첫번째 action 요청은 MakeSelect.java 파일에서 이루어진다

 

MakeSelect.java

 

import java.util.*;

import com.opensymphony.xwork2.*;

 

public class MakeSelect extends ActionSupport{

 

 private HashMap hm = new HashMap();
 
 public String execute() throws Exception {
 
  hm.put("001", "서울시");
  hm.put("002", "부산시");
  hm.put("003", "마산시");
 
  return SUCCESS;
 }

 public HashMap getHm() {
  return hm;
 }

 public void setHm(HashMap hm) {
  this.hm = hm;
 }
 
}

그리고 view 페이지에서 첫번째 셀렉트를 고르면 보여줄 두번째 셀렉트 리스트를 위한 액션

JSONExample.java

import com.opensymphony.xwork2.*;
import java.util.*;

public class JSONExample extends ActionSupport{

 private Map hMap = new HashMap();
 private String value; // 셀렉트 구분값

 

 public String execute() {
 
  if(value.equals("001"))
  {
   hMap.put("001001","종로구");
   hMap.put("001002","중구");
   hMap.put("001003","강남구");
  }
  else if(value.equals("002"))
  { 
   hMap.put("002001","몰라 부산1");
   hMap.put("002002","모른다니까 부산2");
   hMap.put("002003","아아아아");
   hMap.put("002004","kaskdkasd");
  }
  else
  {
   hMap.put("003001","회원구");
   hMap.put("003002","합포구");
  }
  return SUCCESS;
    }
 

 public Map getHMap() {
  return hMap;
 }
 
 public void setHMap(Map hMap) {
  this.hMap = hMap;
 }

}

액션을 만들었으니 struts.xml 에서 매핑을 시켜줘야겠지..

struts.xml

<struts>

    <!-- 첫번째 액션에서는 json 타입이 아니다. -->

    <package name="default" namespace="" extends="struts-default">
        <action name="myaction" class="MakeSelect">
         <result>/jsp/myaction.jsp</result>
        </action>
    </package>

   <!-- 비동기 요청이 이루어질 액션 -->

 

    <!-- Add JSON packages here -->
 <package name="example" namespace="" extends="json-default">
     <action name="JSONExample" class="JSONExample">
        <result type="json"/>
     </action>

 </package>

</struts>

 

이제 비동기 요청을 할 자바스크립트 파일..

jQuery-getJSON.js

// 첫번쨰 인자 url 은  요청 주소, param은 파라미터, callback은 알다시피..;

function jqGetJSON(url,param,callback,indicator)
{
 if(indicator)   //indicator 는 로딩 이미지 표시 여부
 
{
  makeLoadingDiv();

 

//ajax 요청이 시작되기 전에 일어나는 전역함수 ajaxStart

//로딩중 이미지를 표시한다.
  $("#divLoading").ajaxStart(function(){
   $(this).show();
  });
 }
 

//jQuery 의 getJSON 요청 시작
 $.getJSON(url,param,callback);
 

// 로딩 이미지를 표시 했다면 숨긴다.
 if(indicator)
 {
  $("#divLoading").ajaxStop(function(){
   $(this).hide();
  });
 }
}

 

// 로딩 이미지 영역을 만든다.

function makeLoadingDiv()
{
 if (document.getElementById("divLoading"))
 {
  var str = '';
  str += "<div id='divLoading' style='display:none;z-index:1002;position:absolute;'>";
  str += " <img src='./img/indicator.gif' alt='로딩중..' />";
  str += "</div>";
 
  $("body").append(str);
 }
}

 

 

이제 view 페이지

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="java.util.*"%>
<%
 HashMap hm = (HashMap)request.getAttribute("hm");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>


<script type="text/javascript" src="./script/jquery-1.3.2.js"></script>
<script type="text/javascript" src="./script/jQuery-getJSON.js"></script>
<script type="text/javascript">
 $(function() {


  // 첫번째 셀렉트 박스에서 change 이벤트가 일어나면 ajax 요청

  $("#s1").change(function(){
   jqGetJSON("JSONExample.action",{value:$(this).val()},loadSelect,true);
  });

 

 });

 function loadSelect(data)
 {
  var sval = $("#s1").val();
  if(sval!="none")
  {
   $("#s2").attr("disabled",false);
   $("#s2").each(function(){ this.options.length=0;});
   

 //넘어온 JSON의 property 들로 option을 생성한다.
   for(var myData in data.HMap)
   {
    $("#s2").each(function(){
     var option = new Option(data.HMap[myData], myData);
     if($.browser.msie)
      this.add(option);
     else
      this.add(option,null);    
    });
   }
  }
  else if(sval=="none")
  {
   $("#s2").attr("disabled","true");
   
  }
 }

 

</script>


<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>

<!-- 본문 시작 -->

<!-- 첫번쨰 액션에서 받아온 데이터로 셀렉트 리스트를 만든다. -->

  <select name="s1" id="s1">
   <option value="none">-----선택--------</option>
<%
 Iterator it = hm.keySet().iterator();
 while(it.hasNext())
 {
  String key = (String)it.next();
  String value = (String)hm.get(key);
%>
  <option value=<%=key %>><%=value %></option>
<%
 }
%>
  </select>
    &nbsp;  &nbsp;  &nbsp;  &nbsp;
  <select name="s2" id="s2" disabled="disabled">
   <option value="none">---시를 선택하세요---</option>
  </select>
 </body>
</html>

 

....

여기까지다..

struts2에서 json 타입을 사용하면 알아서 json 구조로 바꿔서 넘어오니

eval 함수를 사용할 필요도 없고 너무너무 간단해진다..

 

2009년 10월 13일 화요일

closure 의 기본 사용법

 

 

What’s A Closure?

 

Closure는 자신의 코드 블록 상위에 선언된 코드를 포함하는 함수이다. 따라서 함수는 자신의 코드 블록이 포함되어 있는 상위 요소를 참조한다. 이 경우 C# 2.0에서는 익명 메소드(anonymous method)가 해당되고, 이 익명 메소드는 자신의 코드 블록 상위의 메소드에 포함된다. 이것은 부모 메소드에 존재하는 지역 변수를 익명 메소드의 코드 블록에 참조 할 수 있다는 것을 의미한다. 아래의 코드는 우리가 예상하는 것과 같이 콘솔 창에 0을 출력하게 된다.

delegate void Action();

static void Main(string[] args)
{
  int x = 0;
 
 
Action a = delegate { Console.WriteLine(x); };

  a(); 
}

 

대부분의 개발자들은 위 코드에 대해서 아무런 의문도 갖지 않는다.

지역변수 “x”는 선언되자마자 0으로 초기화 되었고, 그리고 나서 Action 타입의 delegate 변수 “a”가 선언 된 후, 콘솔 창에 변수 “x”를 출력하는 익명 메소드로 할당 되었다. 코드는 마지막으로 “a”를 호출하면서, 그 결과로 콘솔에 변수 “x”의 값을 출력한다.

여기에서 문제는 코드가 아래처럼 변경되었을 때 나타난다.

delegate void Action();

static void Main(string[] args)
{
  int x = 0;

 
Action a = delegate { Console.WriteLine(x); };

  x = 1;

  a();
}

 

현재 “x” delegate 변수 “a”가 호출되기 이전에 값 1로 다시 할당되었다. 그렇다면 콘솔 창에 출력되는 값은 무엇일까?

 

정답은 0이 아니라 1이다. 이렇게 된 이유는, 익명 메소드는 closure이고 반드시 부모 메소드의 코드 블록 안에 위치해야 하며, 지역 변수를 자신의 코드 블록 안에 포함해야 한다. 중요한 차이점은 그것은 반드시 값이 아닌 변수를 참조한다는 것이다. 다른 말로 “x”의 값은 “a”가 익명 메소드로 할당 된 후에 “x”의 값이 복사되지 않고 “x”의 참조가 사용된다. 그렇기 때문에 “a”는 항상 “a”가 호출되기 전에 가장 마지막으로 할당된 “x”의 값을 사용 할 것이다. 사실 “x”의 참조는 “x”가 포함 된 코드블럭을 벗어난다 해도 지속될 것이다. 아래 코드를 살펴보자.

delegate void Action();

static Action GetAction()
{
  int x = 0;

 
Action a = delegate { Console.WriteLine(x); };

  x = 1;

  return a;
}

static void Main(string[] args)
{
 
Action a = GetAction();

  a();
}

 

위 코드는 “a”가 호출되는 시점에서 변수 “x”의 실행 범위가 끝났다 하더라도, 호출된 “a”의 결과값은, 어김없이 콘솔 창에 1을 출력할 것이다. 어떻게 이렇게 되었을까? 이것은 컴파일러를 통해 처리되었다. 런타임은 closure를 처리하기 위해 아무런 지원도 하지 않는다. 이 말은 여러분은 익명 메소드의 사용 없이도 closure를 처리하기 위해 컴파일러가 처리하는 것과 같은 동일한 방법을  사용 할 수 있다는 것이다. 실제로 이 방법은 C# 1.0에서도 동작한다.

자바스크립트 완벽 가이드 (Javascript The Definitive Guide) 5판

 

자바스크립트 완벽 가이드 5판

(Javascript The Definitive Guide 5/E)

데이비드 플래너건 지음, 송인철외 번역

 

 

2009년 10월 13일 구입

무지막지하게 비싼 가격이다.. 회사에 구입을 해달라고 할 수도 있었지만..

책사는데 절대 돈 아끼면 안된다는 신념과.. 이런 명서는 반드시 소장해야 한다는 생각과..뭐.. 이런저런..

 

..

.

 

 

jQuery, Ajax를 공부함에 있어서 막히는 부분이 많았다.

특히나 자바스크립트의 함수동작에 관한 부분과 이펙트, 애니메이션 관련 부분

 

이 책을 다 읽고 나면 나의 궁금증을 풀어주겠지

 

하루만에 꽤 많이 읽었는데... 정말.... 좋은 책이다

ㅠㅠ 감동의 서적이다

 

자바스크립트가 이렇게 유연하고도 멋진 언어 였던가!?!

 

그동안 정적언어만 공부하다 보니 동적언어의 개념이 잘 이해되진 않지만

문법자체나 사용법에 관해서는 슈슈슉 읽혀진다.

 

 

읽고나서..

 

좋은 책이다.. 정말 말 그대로 완벽한 가이드이며

두말할것 없는 명서!

 

 

 

2009년 10월 11일 일요일

Java 언어로 배우는 디자인 패턴 입문

 

 

YUKI HIROSHI, 영진닷컴

 

 

2009년 9월 말 경 구입

 

천천히 두고 봐야 할 책이다..

나같은 초짜 프로그래머는 몇몇 디자인 패턴 말고는

효용성을 전혀 모르겠다-_-

 

꼬박꼬박 읽고 공부해나가보자..

서평은 다읽고 느껴본 후에!

 

일단.. 이것 역시 설명은 아주 쉽게 잘되어있다

 

근데 .. 디자인 패턴에 필요성에 관한 설명은 적다.

문제를 먼저 보여주고, 디자인패턴을 적용해 문제를 해결해 나가는 식의 접근이었다면

이해도가 높았을 테지만..

인터넷에서 좋은 책이라 소문이 자자하길래 .. 한번 소스코드 다 뚜드려보고.. 공부해보고

다시 읽어보고.. 그렇게 이해될때까지 곁에 두고 읽어보자

Struts2


성윤정 지음 , 대림출판사

 

 

2009년 10월 초 구입

 

회사에서... 나는 충남으로 프로젝트를 나갈 줄 알았다..

(난 입사한지 아직 한달 밖에 안됐고 실무경험은 0 인 초보 프로그래머임)

 

근데 이런저런 업무 사정상 생애 첫 프로젝트는 계속 연기되고..

회사 과장님께서 가실 프로젝트에 스터디를 같이 하게 되었다.

 

Struts2+iBatis 를 공부해야 했는데..

시간이 일주일밖에 없어서 , Struts2는 잘 몰라서 -_-

역시나 내가 좋아하는 얇은책, 쉬운책 을 골라보게 되었다.

심오한 부분이나 모르는 부분은 인터넷을 통해 배우면 되니까..;

 

나온지 일주일 정도된 따끈한 책!

몇년전에 JSP 공부를 처음할때 성윤정씨가 지은 JSP 서적을 쉽고 편하게 읽은 기억이 있어서..

결정하고 사서 보았다만..

 

이건 Struts2 입문 책인가 아예 컴맹 입문 책인지 모를 정도로

설치 설명으로 페이지 다잡아 먹고, 똑같은 소스코드로 페이지 다잡아 먹고..

소스 코드의 수준은 너무 쉽고..

게다가 초판이라 그런지, 나온지 일주일도 안되서 그런지, 엄청난 오타와

잘못 인쇄된 부분, 밀려서 인쇄된 부분은 소스코드를 보는데 굉장한 인내심을 유발한다.

(내가 찾은 인쇄 미스 부분만 10군데는 넘는다..)

또한 설치부터 굉장히 차곡차곡 설명해 나가는 듯 싶다가

챕터 후반 iBatis 부분부터는 날치기 설명으로 돌입,

끝에는 별다른 설명없이 게시판 하나 만들어버린다-_-

 

 

여튼.. 후딱 다 읽어 버렸다..

 

다시 들추게 될 일은 없을 책인듯 하지만

 

그래도 책은 책이니.. Struts2에 관한 전반적인 이해, Struts2 로 게시판 만드는 것 정도는

너무너무 쉽고 간단하게 배워볼수 있다.

 

나도 초보지만... 나보다 더한 초보에게는.. 아주 좋은 책인듯 싶다... 라고 하고 싶지만

초보들은 소스코드에 밀려서 인쇄된 부분을 알아볼수 있을까라는 의문에 그것도 아니고

.... 뭐 추천 하긴 좀 그런 책이다.

 

최범균의 Ajax Programming 기초부터 중급까지

최범균의 Ajax Programming

가메 출판사

 

 

 

2008년 12월인가 11월 인가 그 즈음에 구입했으나 당시에 시간 관계상

읽다가 말다가 읽다가 말다가.. 그랬지만 끝끝내 다 읽게 되었다.

 

javascript 의 기초가 없는 사람은 봐선 안될 책이다.

쉽게 시작하지만 가면 갈수록, 확실히 제목 그대로 기초부터 중급까지 수준은 올라간다.

 

Ajax의 기본 개념과 설명, 간단한 Ajax 프로그램을 만들어보고

자바스크립트의 이벤트, 매쉬업 서비스 활용해보기 등의 구성은 만족스럽다.

 

개인적으로는 굉장히 재미있게 많이 배우며 읽은 책이지만

적당히 얇은 두께 (400p)라 그런지 세세한 설명은 빠져 있다.

하지만 Ajax의 전체적인 흐름, 구현 방식, 소스코드들을 이해 하는데 필요한 설명은 충분하다.

 

Javascript의 기본이 되어있고 Ajax의 원리를 공부해보고 싶은 사람에게는

더할 나위 없는 책이다.

 

jQuery in Action

 

프로그래밍 jQuery (jQuery in Action) 증보판

베어바이볼트, 예후다카츠 지음

김성안,송효종,이두원 옮김

 

 

2009년 9월 중순 구입

 

Javascript 로 구현한 UI 에 관한 개인적인 호기심과

회사의 팀장님께서 jQuery 사용을 추천해주셔서 사보게 된 책이다..

 

400페이지 정도의 적당히 얇은 분량과 적당히 작은 사이즈는 출퇴근 시에 지하철 내에서

읽어보기 딱 좋았다.

 

책의 제본 상태도 좋았고 오타도 거의 발견 할 수 없다.

(내가 오타찾기 도사임에도 불구하고!)

 

jQuery의 기초를 잘 설명하고 있으며 jQuery 의 기본적 함수들은 거의 다 다루고 있다.

고급 이펙트 구현 방법이나 예제는 없지만 곁에서 두고 레퍼런스용으로 보기 좋다.

 

부록으로 javascript의 closure 부분과 jquery plugin 소개 및 사용법이 포함 되어있어서

javascript 의 초보자나 jquery 의 강력한 plugin 들을 가져다 쓰기 쉽도록 안내한다.

 

jQuery 의 기초를 공부 하고 간단 간단한 참고용 레퍼런스 책을 원한다면

이책을 사는 것을 적극 추천

 

 

jQuery Modal창 Overay 효과

•본 코드는 개인적인 공부용으로 또는 그냥 생각나는 데로 만들어 본, 초보 개발자의  

쓰레기 코드 입니다. 아무렇게나 수정 하실 수 있으며 코드에 관한 개선사항은 언제든지 환영합니다.


jQuery로 만들어진 멋진 UI의 해외 싸이트를 구경 다녀 보면 "도대체 어떻게 이렇게 만들었지?"

라는 의문이 내 가슴을 뛰게 한다 -.-;

 

그 멋진 싸이트들에서 보면 빠지지 않고 등장하는 것이 overay, expose, modal window 등등인데

뭐.. 어떤 소스코드도 참고하지 않은채 그냥 생각나는데로 만들어 봤다.

 

반투명 div 태그에 투명도를 주고 전체를 덮어 버리면 overy 효과다;

동시에 숨겨 뒀던 div 태그를 보여주면 이것 또한 완벽한! modal window가 된다..

오버레이 효과로 반투명하게 뒤 덮는 것과 모달 창의 효과는

z-Index 의 순서가 담당한다..

 

.

.

 

안습이다.. ㅠㅠ

 

아직 jQuery도 초짜고 javascript 의 effect 부분에서도 초짜지만..

뭐 비슷하겠지..?

 
 

1. 글자 test for html 의 아래 텍스트 필드에 마우스를 올리면

이벤트가 발동한다

 

나머지 test 버튼이나 ds 테이블은 그냥 있는거다..;

 

 2. 배경은 다 회색으로 덮는다.

(overay),

동시에 덮혀진 div 태그로 인해

z-index가 아래에 있는 태그 컨트롤들은 작동 불가(modal)

 

 

 3. 아이디를 적고 버튼을 누르면 적용된다

 
OK

 

 

 

Source (Noname1.html)

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE> Study jQuery </TITLE>
  <script type="text/javascript" src="jquery-1.3.2.js"></script>
  <script type="text/javascript">
   $(function() { // jQueryStart

    // 오버레이 효과를 낼 div 를 만들어서 body의 끝에 달아둔다.

   //  z-index 가 중요하다..
    $("body").append( $("<div id='bgdiv'></div>").css(
      {background: '#333333',
      width:'100%',
      height:'100%',
      position:'absolute',
      opacity:'0.6',
      'top':'0',
      'left':'0',
      'z-index':'10',
      'display':'none'
      }
    ));

// 텍스트 필드에 focus 이벤트 등록

// overay용 bgdiv 를 보여주고 modal 역할을 할 div를 보여준다.
    $("#fts").focus( function() {
     $("#bgdiv").show("fast");
     $("#login").css("z-index","15").show("slow");
     $("#logintext").focus();
    });
    $("#close_btn").click( function() {
     var id_val = $("#logintext").val();
     $("#fts").val(id_val);
     $("div#login").hide("slow");
     $("#bgdiv").hide("fast");
    });
   } );  // jQueryEnd
  </script>
 </HEAD>

 <BODY>
  <br>
  <br>
   <div>test for html</div>

   <input type="text" id="fts"/>
  <br>
  <table border="2">
   <tr><td>ds</td></tr>
  </table>
  <br>
   <input type="button" value="test"/>
 

<!-- modal window div -->
  <div id="login" style="position:absolute; display:none">
   <table width="100" height="50" border="2" bgcolor="blue">
    <tr>
     <td bgcolor="white">
      아이디:
     </td>
     <td bgcolor="white">
      <input type="text" id="logintext"/><input type="button" id="close_btn" value="apply">
     </td>
    </tr>
   </table>
  </div>
 </BODY>
</HTML>


 

jQuery 자바스크립트 파일을 준비하고

본 코드를 그대로 복사해서 가져다 써보면 작동한다.

 

근데..

 

 

..... 해외싸이트들도 이렇게 적용 시켰을까? -_-;

볼려고 해도 허벌나게 긴 소스들 보면 질려 ㅠㅠ