캠핑과 개발

DOCTYPE.

DEVELOPMENT/HTML & CSS2009. 10. 28. 01:07

HTML 편집기를 이용하여 html 파일을 생성하면 상단에 DOCTYPE이라고 선언된 걸 볼 수가 있다. 이는 브라우저가 어떤 방식으로 렌더링 해야 하는지를 알려주는 역활을 한다.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 문서에 완벽한 DOCTYPE을 지정한 경우에 보통 표준 호환 모드로 화면을 표시하고,
HTML 문서에 Strict DTD를 지정한 경우는 표준 모드로 동작을 하게 된다. 또 한 transitional DTD를 지정한 경우는 비표준 확장 모드로 동작을 하게 된다.

만약, DOCTYPE을 선언하지 않았거나 잘못 쓴 경우는 HTML 문서나 XHTML 문서 모두 비표준 확장 모드로 표시가 된다. 하지만 모든 브라우저가 이러한 규칙을 따르는 것이 아니지만 가급적으면 사용하도록 하는것이 좋다. 
사이트 내의 모든 페이지에 완벽한 DOCTYPE 선언을 하고 HTML 문서일 경우에는 strict DTD를 사용하는 것이 좋다.

그리고 XHTML 문서를 작성하게 되면 DOCTYPE 선언 앞 부분에 XML 선언을 추가 해줘야 되는데 하지만 IE 6 에서는 DOCTYPE 선언이 제일 앞에 오지 않으면 자동으로 비표준 모드로 동작을 하기 때문에 페이지를 XML 문서로 서비스 하는 경우가 아니라면 XML 선언은 하지 않는게 좋다.    

<?xml version="1.0" encoding="utf-8"?>


   


선택자 활용 기초

1. 타입선택자(type selector)
타입 선택자는 앵커, 문단, 테이블등과 같이 제목 엘리먼트 같은 특정 유형의 엘리먼트를 지정하는것
p {color: block}
a {text-decaration: underline}
h1 {font-weight: blod}

2. 하위 선택자(descendant selector)
특정 엘리먼트나 엘리먼트 묶음의 하위에 나오는 엘리먼트를 지정하는것으로, 하위 선택자는 두 개의 선택자를 공백으로 분리해서 저장

li img {cursor: pointer;}

3. ID 선택자
ID선택자란 엘리먼트를 아이디 값으로 스타일일 지정하는 것으로 선택자는 #문자를 사용한다.

#title {font-align: center;}

4. 클래스 선택자
클래스 선택자란 엘리먼트의 클래스명을 선택하여 지정하는 방법으로 선택자는 .문자를 사용한다.

.intro {boarder-style: solid;}

5. 유사 클래스 선택자
문서 구조를 기반으로 엘리먼트를 지정하는 것이 아니라, 폼 요소나 링크의 다양한 상태에 대해서 스타일을 지정해야 하는 경우가 있다. 유사 클래스 선택자를 사용하면 이런 작업을 할수 있다.

/* 방문하지 않은 링크를 파란색으로 표시 */
a:link {color: blue;}

/* 방문하지 않은 링크를 녹색으로 표시 */
a:link {color: green;}

/* 마우스가 올라오거나 클릭했을 때 링크를 빨간색으로 표시 */
a:hover, a:active {color: red;}

/* 테이블 행에 마우스가 올라올 때 빨간색으로 표시 */
tr:hover {color: red;}

/* 입력요소에 포커스가 갔을 때 노란색으로 표시 */
input:focus {background-color: yellow;}

6. 전체 선택자

와일드 카드처럼 모든 가능한 엘리먼트를 지정하는데 사용한다.
전체 선택자는 * 문자를 사용하며 주로 페이지 안에 모든 엘리먼트에 스타일을 지정할 때 사용

* {
    padding: 0;
    margin: 0
}


'DEVELOPMENT > HTML & CSS' 카테고리의 다른 글

[canvas] 2D를 이용한 객체 회전  (0) 2016.06.01
[canvas] 키보드를 이용한 객체 이동  (0) 2016.06.01
CSS framework  (0) 2014.01.17
[TIP] <IMG> 태그의 ALT에 줄바꿈 하기  (0) 2009.10.29
DOCTYPE.  (0) 2009.10.28


ckeditor를 사용하던 중에 파일 업로드와 관련하여 업로드 처리를 하였으나 업로드 후
이전 페이지에 완료된 값을 보내주는 리턴값에 대해서 한참 시간을 보냈다.

하지만 의외로 간단하게 함수 하나만 호출해 주면 된다.

String funcNum = request.getParameter("CKEditorFuncNum");
String fileUrl = 업로된 파일의 경로
out.write("<script>window.parent.CKEDITOR.tools.callFunction(" + funcNum + ", '" + url + "');</script>");

HTTPService를 사용하여 파라미터를 전송하는 경우이다.
어떤 값을 요청하여 거기에 해당 하는 값을 받아와서 뿌려준다.
실패했을 경우와 성공했을경우 evnet를 사용하여 해당 메세지를 보여준다.
 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
 <mx:Script>
  <![CDATA[
   import mx.utils.ObjectUtil;
   import mx.rpc.events.FaultEvent;
   import mx.rpc.events.ResultEvent;
   import mx.controls.Alert;
   
   public function faultHandler(event:FaultEvent):void{
    Alert.show(ObjectUtil.toString(event));
   }
   public function resultHandler(event:ResultEvent):void{
    Alert.show(ObjectUtil.toString(event));
   }
  ]]>
 </mx:Script>
 <mx:HTTPService id="freeRequest"
  url="http://www.anaconda.pe.kr/test.jsp"
  fault="faultHandler(event)"
  result="resultHandler(event)"
  useProxy="false">
  <mx:request xmlns="">
   <id>{cd.selectedItem}</id>
  </mx:request>   
 </mx:HTTPService>
 <mx:Panel title="example"
  height="100%" width="90%"
  paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"
  layout="vertical">
  <mx:DataGrid id="dbPosts"
   dataProvider="{freeRequest.lastResult.result_set.record}"
   width="100%"/>
  
  <mx:ControlBar horizontalAlign="center">
   <mx:Label text="ID 선택" />
   <mx:ComboBox id="cd" change="freeRequest.send();">
    <mx:ArrayCollection>
     <mx:String>0</mx:String>
     <mx:String>1</mx:String>
     <mx:String>2</mx:String>
     <mx:String>3</mx:String>
     <mx:String>4</mx:String>
     <mx:String>5</mx:String>
    </mx:ArrayCollection>
   </mx:ComboBox>
  </mx:ControlBar> 
 </mx:Panel>
</mx:Application>


'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글

[Flex] PieChart  (0) 2009.11.24
[Flex] LineChart  (0) 2009.11.24
[Chart] ColumnChart, BarChart  (0) 2009.11.24
[FLEX] HTTPService 서비스 사용하기 - 데이터그리드 결과값 바인딩  (0) 2009.10.25
crossdomain.xml  (0) 2009.10.25


플렉스 공부한지 이주가 지났다. 게을러서 많이 나가지 않는다..
하지만 공부를 할수록 정말 편하다는 느낌을 많이 받는다. 여러가지가 개발자가 할 코딩이 많이 줄었다, 지금까지 사용하던 문법과 틀려서 오타가 많이 나오긴 하지만 배우는 재미는 있다.

Flex 작업을 하다 보면 외부와의 통신을 해야 하는 경우가 있다.
CRUD작업을 하다 보면 결과값을 반환을 받아와 보여 주는 경우가 있는 이런 경우에 HTTPService를 사용하면 상당히 편하다
결과 값이 많을 경우는 속도면에서 RemoteObject가 빠르지만 그다지 많지 않은 경우에 사용하면 편할꺼 같다

우선 출력되는 xml 형태를 보자


위와 같은 결과 값이 출력이 될 경우 화면에 Grid를 통해서 알맞게 보여 주는 예제이다.
쉽다.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="freeRequest.send()">
 <mx:HTTPService id="freeRequest" url="http://www.flexgrocer.com/units.xml" useProxy="false" />
 <mx:Panel title="HTTPService Example"
  height="100%" width="90%"
  paddingTop="10" paddingLeft="10" paddingBottom="10" paddingRight="10"
  layout="vertical">
  <mx:DataGrid id="dgPosts" height="30%"
   dataProvider="{freeRequest.lastResult.allUnits.unit}" width="100%">
   <mx:columns>
    <mx:DataGridColumn headerText="unitName" dataField="unitName"/>
    <mx:DataGridColumn headerText="unitID" dataField="unitID"/>
   </mx:columns>
  </mx:DataGrid>
 </mx:Panel>
</mx:Application>


결과값


오오 정말 간단하게 뿌려준다.

'DEVELOPMENT > FLEX & AIR' 카테고리의 다른 글

[Flex] PieChart  (0) 2009.11.24
[Flex] LineChart  (0) 2009.11.24
[Chart] ColumnChart, BarChart  (0) 2009.11.24
[FLEX] HTTPService를 사용하여 파라미터 전송하기  (0) 2009.10.25
crossdomain.xml  (0) 2009.10.25


crossdomain.xml파일은 자기 서버에 있는 데이터와 파일들을 다른 도메인에 있는 swf가 읽어 갈수 있도록 셋팅해 주는 파일이다.
웹루트에 파일을 올려두면 된다.

crossdomain.xml
<xml version="1.0"?>
<cross-domain-policy>
    <allow-access-from domain="*"/>
</cross-domain-policy/>

리눅스상에서도 대부분 rpm버전을 깔 수 있지만 특수한 경우 mysql을 컴파일해야만 할 때가 있다.
다음과 같은 절차로 컴파일하면 된다.

1. mysql홈페이지에서 mysql 소스 다운(tar.gz파일)

2. 압축을 해제하고 그 디렉토리에서 ./configure 실행
./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --sysconfdir=/etc --without-debug --with-charset=utf8 --with-extra-charsets=all --with-plugins=innobase
   --prefix : 설치될 경로
   --localstatedir : 디비파일이 설치될 경로
   --sysconfdir : 환경설정파일이 저장될 경로
   --without-debug : 디버그옵션 off 로 성능 향상
   --with-plugins=innobase : 트랜잭션사용을 위해 innobase 선택

3. make

4. make install

5. 기본 테이블을 만들어주는 스크립트 실행
/usr/local/mysql/bin/mysql_install_db

6. 데몬 실행
/usr/local/mysql/bin/mysqld_safe &
 - 이때 다음과 같은 에러가 발생하고 데몬이 뜨지 않으면 chown -R mysql.mysql /usr/local/mysql 명령을 실행후 다시 데몬을 시작한다.
14:46:27 mysqld_safe Logging to '/usr/local/mysql/var/localhost.localdomain.err'.
090520 14:46:27 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
090520 14:46:27 mysqld_safe mysqld from pid file /usr/local/mysql/var/localhost.localdomain.pid ended

7. innodb형식으로 테이블 생성
트랜잭션을 사용하기 위해 테이블생성시 다음과 같이 INNODB옵션을 준다.
CREATE TABLE Temp( col1 varchar(10) not null,
                                        col2 varchar(10)) TYPE=INNODB;


이클립스 신규로 받으면 추가적으로 사용해야 하는 유용한 플러그인들이 있다.

SVN : http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
SVN : http://subclipse.tigris.org/update_1.4.x
Spring IDE
http://springide.org/updatesite
Eclibatis : http://eclibatis.sourceforge.net/updatesite/
log4e : http://log4e.jayefem.de/update
Call Hierarchy :
http://eclipse-tools.sourceforge.net/updates/
maven :
http://m2eclipse.sonatype.org/update/
pmd : http://pmd.sf.net/eclipse 
ibator : http://ibatis.apache.org/tools/ibator
AJDT : http://download.eclipse.org/tools/ajdt/35/update
QuantumDB : http://quantum.sourceforge.net/update-site
                  http://sourceforge.net/projects/quantum/files/quantum-plugin/
jrebel : http://www.zeroturnaround.com/update-site/
* -noverify -javaagent:D:\DEV\jrebel\jrebel.jar -Drebel.spring_plugin=true

PropertiesEditor : http://propedit.sourceforge.jp/eclipse/updates

Flex plug-in
FlexUnit - http://www.codesquared.com/eclipse

이전 내용--
1. Subversion : http://subclipse.tigris.org/update_1.2.x
2. Maven2 : http://m2eclipse.codehaus.org/update-dev/
3. Log4E : http://log4e.jayefem.de/update
4. Spring IDE : http://springide.org/updatesite/
5. DBViewer(DB쿼리툴) : http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/
6. EclEmma(코드 커버리지 툴) : http://update.eclemma.org/
7. Implementor : http://eclipse-tools.sourceforge.net/updates/ 



#tip
weblogig plug-in 
  http://download.oracle.com/otn_software/oepe/europa
  
http://download.oracle.com/otn_software/oepe/ganymede
  http://download.oracle.com/otn_software/oepe/galileo

'DEVELOPMENT > IDE' 카테고리의 다른 글

eclipse copy & Paste 느린 현상  (0) 2015.04.02
eclipse.ini 설정  (0) 2014.04.22
eclipse workspace 바로가기 링크 만들기  (0) 2010.11.17
[eclipse] 자주쓰는 이클립스 단축키  (0) 2008.12.24
Eclipse plug-in  (0) 2008.12.06

최범균의 ajax를 공부를 하면서 필요한 부분을 기술하였으며 해당 부분은 ajax.js로 만들어서 사용을 할수가 있습니다.

var ajax = {};
ajax.xhr = {};
ajax.Event = {};

/*
 * Ajax(Asynchronous Javascript and XML) 개념 익히기
 *
 * XMLHttpRequest 사용하기
 *
 * XMLHttpRequest 객체를 사용해서 요청 전송할때 필요한 함수
 *
 * open() : 요청의 초기화. GET/POST선택. 접속할 URL 입력
 * send() : 웹 서버에 요청 전송
 * onreadystatechange = callbackFunction
 *
 * open() 인자 설명
 *
 * 1번째 인자 : HTTP 메소드 지정 (form 메소드)
 * 2번째 인자 : 접속할 URL
 * 3번째 인자 : 동기/비동기 방식 지정
 *
 * ex)
 *
 * GET 방식일 경우
 *
 * httpRequest = getXMLHttpRequest();
 * httpRequest.open("GET", "/test.jsp", true);
 * httpRequest.send(null);
 *
 * POST 방식일 경우
 *  
 * httpRequest = getXMLHttpRequest();
 * httpRequest.open("GET", "/test.jsp", true);
 * httpRequest.send("id=admin&pw=1234");
 */


/*
 * onreadystatechange 프로퍼티 설명
 *
 * XMLHttpRequest 객체에 onreadystatechange 프로퍼티에 콜백 함수를 지정하면 웹 서버로부터
 * 응답이 도착했을 때 콜백 함수가 호출된다. 이 때 실제로 onreadystatechange에서 명시한 콜백 함수
 * 는 readyState라는 프로퍼티의 값이 변경될 때마다 호출된다.
 *
 *
 * readyState 프로퍼티 설명
 *
 *  0 : UNINITIALIZED - 객체만 생성되고 아직 초기화되지 않은 상태(open 메서드가 호출되지 않음)
 *  1 : LOADING - open 메서드가 호출되고 아직 send 메서드가 불려지지 않은 상태
 *  2 : LOADED - send 메서드가 불려졌지만 status와 헤더는 도착하지 않은 상태
 *  3 : INTERACTIVE - 데이터의 일부만 받은 상태
 *  4 : COMPLETED - 데이터를 전부 받은 상태. 완전한 데이터의 이용 가능
 * 
 *  ex)
 *  function callbackFunction(){
 *   if(httpRequest.readyState == 1){
 *     
 *   }else if(...){
 *   
 *   }else if(httpRequest.readyState == 4){
 *    //서버로부터 응답이 도착
 *          //완료후 작업할 내용을 작성한다.
 *   }
 *  }
 *   
 */

/*
 * 서버로부터의 응답 상태 : status / statusText
 *
 * 웹 서버로부터 응답이 도착하면 웹 서버에서 처리가 올바르게 수행되었는지 확인해야 한다.
 * 웹 서버는 작업을 올바르게 실행했는지, 처리 도중에 에러가 발생했는지등의 상태 코드를 통해서 알려주는데,
 * XMLHttpRequest 객체는 웹 서버가 전달한 상태 코드를 status 프로퍼티에 저장한다. status 프로퍼티에
 * 저장되는 주요 상태 코드는 다음과 같다.
 *
 *  HTTP 주요 상태 코드
 * 
 *  200 : OK - 요청설명
 *  403 : Forbidden - 접근 거부
 *  404 : Not Found - 페이지 없음
 *  500 : Internal Server Error - 서버 오류 발생
 * 
 *  ex)
 * 
 *  function callbackFunction(){
 *   if(httpRequest.readyState == 4){
 *    if(httpRequest.status == 200){
 *     //정상적인 수행
 *        //완료후 작업할 내용 작성
 *       }else{
 *        alert('에러 발생' + httpRequest.status);
 *       }
 *      }
 *  }
 */


/*
 * 응답 데이터 사용하기 : responseText, responseXML
 *
 * XMLHttpRequest에서 정상적인 요청이 이루어질 경우 요청한 페이지에서 넘겨준 값을 알맞게 처리할때
 * 사용한다. 텍스트 형식과, XML형식이 있다.
 *
 * function callbackFunction(){
 * if(httpRequest.readyState == 4){
 *   if(httpRequest.status == 200){
 *    var txt = httpRequest.responseText; //text일 경우
 *     var xml = httpRequest.responseXML; //XML 형식인 경우
 *  
 *     alert(txt);
 *   }
 *  }
 * }   
 */

/*
 * 동기 방식과 비동기 방식의 실행 차이
 *
 * XMLHttpRequest의 open() 함수는 인자를 세 개를 받는데, 그 중 마지막 인자는 동기/비동기 여부를
 * 표시한다. 아래 코드처럼 open() 함수에 세 번째 인자 값을 true로 지정하기 되면 비동기 방식으로 호출된다.
 *
 *  1. httpRequest = getXMLHttpRequest();
 *  2. httpRequest.onreadystatechange = callbackFunction;
 *  3. httpRequest.open('GET', '/test.jsp', true) <-- 마지막 인자
 *  4. httpRequest.send(null);
 *  5. //비동기 방식
 *  6. callSomeFunction();
 * 
 * 
 *  비동기 방식 - send()함수가 호출된 뒤 곧바로 6.줄의 callSomeFunction 함수가 실행된다.
 *  동   기 방식 - send()함수가 호출되면, 서버와의 통신이 완전히 완료된 이후에 send() 함수 이후의
 *          코드 6.줄의 callSomeFunctiong함수가 실행된다.
 */


/*
 * 파라미터의 한글 처리 방법 : "name=" + encodeURIComponent('한글');
 */

 

/*
 * ajax 실행
 *
 * 사용법
 * new ajax.xhr.Request('targetPage.jsp', 'num=1&id=test', targetFunction, 'POST');
 * @param url 요청 URL
 * @param params 인자값
 * @param callback 콜백함수
 * @param method POST,GET
 */
ajax.xhr.Request = function(url, params, callback, method){
 this.url = url;
 this.params = params;
 this.callback = callback;
 this.method = method;
 this.send();
}

ajax.xhr.Request.prototype = {
 /**
  * Ajax HttpRequest 객체를 구한다.
  * @return
  */
 getXMLHttpRequest: function(){
  if(window.ActiveXObject){ //IE에서 XMLHttpRequest 구하기
   try{
    return new ActiveXObject("Msxml2.XMLHTTP"); //IE중에서도 Microsoft.XMLHTTP 보다 이전 버전 이므로 먼저 구한다.
   }catch(e){
    try{
     return new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e1){
     return null;
    }
   }
  }else if(window.XMLHttpRequest){ //IE 이외의 파폭,오페라 같은 브라우저에서 XMLHttpRequest 구하기
   return new XMLHttpRequest;
  }else{
   return null;
  }
 },
 /**
  * Ajax 통신을 한다.
  * @return
  */
 send: function(){
  this.req = this.getXMLHttpRequest();
  
  var httpMethod = this.method ? this.method : 'GET';
  if(httpMethod != 'GET' && httpMethod != 'POST'){
   httpMehtod = 'GET';
  }
  
  var httpParams = (this.params == null || this.params == '') ? null : this.params;
  var httpUrl = this.url;
  
  if(httpMethod == 'GET' && httpParams != null){
   httpUrl = httpUrl + "?" + httpParams;
  }
  
  this.req.open(httpMethod, httpUrl, true);
  this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  
  var request = this;
  this.req.onreadystatechange = function(){
   request.onStateChange.call(request);
  }
  this.req.send(httpMethod == 'POST' ? httpParams : null);
 },
 /**
  * 콜백함수 호출
  * @return
  */
 onStateChange: function(){
  this.callback(this.req);
 }  
}
/**
 * 이벤트 리스너 등록
 */
ajax.Event.addListener = function(element, name, observer, useCapture){
 useCapture = useCapture || false;
 
 if(element.addEventListener){ //기타 브라우저
  element.addEventListener(name, observer, useCapture);
 }else if(element.attachEvent){  //IE 브라우저
  element.attachEvent('on' + name, observer);
 }
}
/**
 * 등록된 이벤트 리스너 삭제
 */
ajax.Event.removeListener = function(element, name, observer, useCapture){
 useCapture = useCapture || false;
 
 if(element.removeEventListener){ //기타 브라우저  
  element.removeEventListener(name, observer, useCapture);
 }else if(element.detachEvent){  //IE 브라우저
  element.detachEvent('on' + name, observer);
 }
}

/**
 * 이벤트 대상 반환
 */
ajax.Event.getTarget = function(event){
 if(event == null) return null;
 if(event.target) return event.target; //W3C 표준 이벤트 타켓
 else if(event.srcElement) return event.srcElement; //구버전의 IE 타겟
 return null;
}

/*
 * 마우스 이벤트 종류
 *
 * click : 마우스 버튼 클릭시 발생
 * dbclick : 마우스 버튼 더블 클릭 발생시 발생(비표준)
 * mousedown : 마우스 버튼이 눌렸을 때
 * mouseup : 마우스 버튼을 뗐을 때
 * mouseover : 마우스가 영역 안으로 들어왔을 때
 * mousemove : 마우스가 영역 안에서 이동할 때
 * mouseout : 마우스가 영역 밖으로 나갈 때
 *
 */


/*
 * 마우스 클릭 버튼 판별하기
 *
 * button 프로퍼티를 사용(event.button)
 * 또는 which 프로퍼티 사용(파이어폭스, 사파리, 모질라 지원)
 *
 * button 프로퍼티 (파이어 폭스/모질라)
 * 0 : 일반버튼(보통 왼쪽 버튼)
 * 1 : 추가 버튼(보통 가운데, 또는 휠 관련)
 * 2 : 콘텍스트 버튼(보통 오른쪽 버튼)
 *
 * button 프로퍼티 IE 
 * 1 : 왼쪽 마우스 버튼 (단 click 이벤트일 경우는 0 을 반환)
 * 2 : 오른쪽 마우스 버튼
 * 3 : 휠(가운데)
 *
 * which 프로퍼티 사용 (IE 경우 undefind 값이 없음)
 * 1 : 왼쪽
 * 3 : 오른쪽
 * 2 : 휠(가운데)
 *
 */

/*
 * 마우스 발생 위치 정보
 *
 * clientX : 웹 브라우저에서 출력되는 영역에서 X 좌표값을 반환 --> X
 * clientY : 웹 브라우저에서 출력되는 영역에서 Y 좌표값을 반환 
 * screenX : 전체 화면에서 X 좌표값을 반환한다. --> X
 * screenY : 전체 화면에서 Y 좌표값을 반환한다.
 *
 */

/*
 * 브라우저 안에 스크롤 된 마우스의 마우스의 좌표 구하기
 *
 * scrollLeft, scrollTop를 이용
 *
 * clientX, clientY의 마우스 좌표를 구한 영역에 위에 코드를 사용하여 스크롤 된
 * 영역만큼 더해준다.
 */


/*
 * 마우스 이벤트로 작업을 할 경우는 오른쪽 마우스 클릭은 가급적 사용하지 않느것이 좋다
 * 이유는 클릭 이벤트 자체를 지원하지 않는 브라우저가 있기 때문이다.
 */


/**
 * 마우스 좌표값을 반환한다.
 */
ajax.Event.getMouseXY = function(event){
 var mouseX = event.clientX;
 var mouseY = event.clientY;
 
 var dd = document.documentElement; //W3C 표준 (최신 브라우저에서는 지원)
 var db = document.body; //구버전의 경우 (document.documentElement 미지원 경우)
 
 if(dd){
  mouseX += dd.scrollHeight;
  mouseY += dd.scrollTop;
 }else if(db){
  mouseX += db.scrollHeight;
  mouseY += db.scrollTop;
 }
 
 return {x: mouseX, y: mouseY};
}

/**
 * 마우스 왼쪽 버튼 클릭 여부를 boolean 형식으로 반환한다.
 */
ajax.Event.isLeftButton = function(event){
 return (event.which) ? //which 프로퍼티 여부가 존재하는지 여부
   evnet.which == 1 && event.button == 0 : //파이어폭스/모질라
    (event.type == 'click') ? event == 0 : event.button == 1; //IE경우
}

/**
 * 마우스 오른쪽 버튼 클릭 여부를 boolean 형식을 반환한다.
 */
ajax.Event.isRightButton = function(event){
 return event.button == 2; //오른쪽 버튼의 경우는 IE, 파이어폭스/모질라가 모두 동일
}

/*
 * 키보드 이벤트
 *
 * keydown : 키보드를 누를 때 발생한다.
 * keyup : 키보드에서 뗄 때 발생한다.
 * keypress : 키보드를 누를 때 발생한다.(비표준)
 */

/*
 * 키보드 이벤트 프로퍼티
 *
 * keyCode : 키 코드값
 * ctrlKey : Ctrl 키를 누른 경우 true
 * shiftKey : Shift 키를 누른 경우 true
 * altKey : Alt 키를 누른 경우 true 
 */



ibatis 작업중 로그를 보여줍니다.


사용법 
1. ibatis-2.3.0.677.jar 파일을 WEB-INF/lib 폴더 아래로 복사합니다.
2. log4j.properties 파일에 다음 줄을 추가해줍니다.

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

간혹 안나오는 경우는 log4j.jar 파일이 WEB-INF/lib 폴더에 존재하는지 확인하기 바란다.