Java2008. 12. 8. 10:11

Log4J 란?

- apache 진영에서 나온 오픈소스

- 로그 메시지를 콘솔, 텍스트파일, html파일, xml 파일, 이메일등으로 전송 가능

- Logger(category) : 로그 파일을 작성하는 클래스,Appender 에 메시지를 전달

- Appender : 로그를 출력하는 위치

(ex)ConsoleAppender, FileAppender..

- Layout : Appender 로그를 생성하기 전에 메시지의 형식을 만드는 클래스

Log4J 설정파일

- log4j.properties(ç가장 사용하기 쉽고 직관적임)

- log4.xml

- java source

Logger -- 로깅레벨

- DEBUG < INFO < WARN < ERROR < FATAL

Appender Properties

u ConsoleAppender 옵션

# Threshold = WARN, categorypriority 가 더 낮게 설정되어 있다 하더라도 여기에

명시된 priority 보다 낮은 메시지들은 로깅하지 않음

# ImmediateFlush = true, 로그메시지가 버퍼되지 않음, 기본값은 true

# Target = System.err, 기본값은 System.out

u FileAppender 옵션

# Threshold = DEBUG

# ImmdiateFlush = true

# File = ./log/logfile.log, 로깅할 파일명

# append = false, 기본값은 true 이며, 파일끝에 추가

u RollingFileAppender 옵션

# Threadhold = WARN

# ImmediateFlush = true

# File = ./log/testlog.log

# Append = false

# MaxFileSize = 100KB(or MB, GB), 지정한 크기에 도달하면 로그파일을 교체

# MaxBackupIndex = 5, 최대 5개의 백업파일을 유지

u DailyRollingFileAppender 옵션

# Threadhold = WARN

# ImmediateFlush = true

# File = ./log/testlog.log

# Append = false

# DatePattern = ‘.’yyyy-mm, 매월 파일을 교체, 교체주기는 월, , ,시간,

Layout -- 표현식

%m = 로그 내용이 출력

%p = debug, info, warn, error, fatal 등의 우선순위를 출력

%r = 어플리케이션이 시작되어 로깅이벤트가 발생하는 시점까지의 경과

시간을 밀리세컨드로 출력

%c = logger a.b.c 처럼 되어 있다면 %c{2} b.c 가 출력

%n = 플랫폼 종속적인 개행문자가 출력(\r\n 또는 \n)

%d = 로깅 이벤트가 일어난 날짜출력(프로그램의 실행속도를 느리게 함)

ex) %d{HH:mm:ss} 또는 %d{dd MMMM yyyy HH:mm:ss}

%C = 호출자의 클래스명 출력

ex) org.apache.xyz.SomeClass 처럼 되어 있다면 %C{2}xyz.SomeClass 가 출력

%M = 로깅이 발생한 method 이름을 출력

%F = 로깅이 발생한 프로그램 파일명 출력

%l = 로깅이 발생한 caller 의 정보를 출력

%L = 로깅이 발생한 caller 의 라인수 출력

%x = 로깅이 발생한 thread 와 관련된 NDC(nested diagnostic context) 를 출력

%X = 로깅이 발생한 thread 와 관련된 MDC(mapped diagnostic context) 를 출력

%% = %표시를 출력

%t = 로그 이벤트가 발생한 쓰레드의 이름을 출력

Posted by la30321
Web_HTML2008. 12. 3. 20:04

원본 : http://iilii.egloos.com/4445254

차례

1. 정규식이란?

  • String의 검색,치환,추출을 위한 패턴.
  • 언어별 사용법은 대동소이함.
  • 패턴예>전화번호 형식, 이메일 형식 등.

2. 정규식 만들기

  1. Javascript
    • var regexp = /pattern/[flags] ;
      var test = regexp.test(to be checked)
    • var regexp = new RegExp("pattern"[, "flags"]);
      var test = regexp.test(to be checked)
    • flags for javascript
      • g : global match, 일반적으로 패턴이 1번만 발견되면 찾기를 종료하지만, g flag가 있으면, 문자열 내에서 모든 패턴을 찾는다.
      • i : ignore case, 대소문자를 고려하지 않고 체크한다.[a-z]와 [A-Z]는 같은 표현이 된다.
      • m : match over multiple lines, 여러 줄에 걸쳐 체크를 한다.
  2. Java
    • java.util.regex package
    • Pattern p = Pattern.compile("pattern");
      Matcher m = p.matcher("string to be checked");
      boolean b = m.matches();
    • boolean b = Pattern.matches("pattern", "string to be checked");

3. 정규식 표현법

*는 valid, 는 invalid
*두꺼운 글씨체는 매칭되는 부분.
*예제는 javascript 기준이며, 언어에 따라 다소 차이가 발생할 수 있다.

문자용도예제
\
  • 특수문자를 의미
  • 특수문자의 사용을 제외(특수문자 앞에서)
  • b는 b라는 글자를 의미 하지만 \b는 단어 경계를 의미
  • *은 0번이상 반복이라는 의미이지만, \*는 *이라는 글자를 의미.
^문자열의 시작. []안에서는 not의 의미
* ^A는 "A로 시작"이라기 보다는 "시작 직후에 A가 나온다"는 의미로 해석하는 것이 좋다. 즉, 시작과 끝과 같은 빈 공간을 하나의 문자로 간주하는 것이 좋다.
/^A/g
  • A string
  • an A
/[^A]/g
  • A string
  • an A
$문자열의 마지막
/t$/
  • eat
  • GREAT
*0번 이상 반복/ab*d/g
  • ad
  • abd
  • abdcdeabbbbdedb
  • ab
  • axd
+1번 이상 반복 ( = {1,} )/ab+d/g
  • ad
  • abd
  • abdcdeabbbbdedb
  • ab
  • axd
?0번 이나 1번/e?le?/g
  • angel
  • angle
  • element
/abc\-?d/g
  • abc-d
  • abcd
.new line 을 제외한 모든 글자/.n/g
  • nay, an apple is on the tree
  • nay
(x)x를 체크하고 체크한 값을 변수로 저장/(f..) (b..)/
  • foo bar
    1th :foo
    2th :bar
(?:x)x를 체크하고 체크한 값을 변수로 저장하지 않음/(?:f..) (b..)/
  • foo bar
    1th :bar
  • bar foo
x|yx 또는 y/green|red/
  • green apple
  • red apple
  • yellow apple
x(?=y)x후에 y가 나오고, x부분만 매칭되는 부분으로 간주/blah(?=soft|hard)/
  • blahsoft
  • blahhard
  • blah soft
/blah(?=soft).*/
  • blahsoft
  • blahhard
  • blah soft
x(?!y)x가 나오고 그 뒤에 y가 있으면 안 됨/blah(?!hard)/
  • blahsoft
  • blahhard
  • blah soft
{n}앞에 지정한 것이 n개/.{3}/
  • ab
  • abc
  • abcd
  • 홍길동
{n,}앞에 지정한 것이 n개 이상/.{3,}/
  • ab
  • abc
  • abcd
{n,m}앞에 지정한 것이 n~m개/.{3,5}/
  • ab
  • abc
  • abcd
  • 홍길동
[xyz]x나 y나 z. []안에는 얼마든지 쓸 수 있다./[abc]{2}/
  • ab
  • abc
  • adbd
[x-z]x에서 z까지/[a-z]{4,}/g
  • She sells sea shells by the sea shore는 Very 어렵다!
[^xyz]x,y,z를 제외한 나머지 모든 것/[^a-z]{2,}/g
  • I'm a good man
  • I am A good Man
[\b]백스페이스. \b와 혼동하지 말것./[\b]/g
  • abcd
일반적인 String에서는 \b가 백스페이스를 의미한다.
\b단어의 경계.[\b]와 혼동하지 말것./\bn[a-z]/g
  • I am not a boy
  • online
  • nope
\B\b 를 제외한 전부/\Bn[a-z]/g
  • noonday
  • online
  • nope
\cX컨트롤X와 매칭. \cM은 컨트롤M과 매칭
\d숫자.[0-9]와 같음/\d/g
  • 7 eight 9
  • 123
/^0[0-9]{2}/g
  • 0120
  • 12011
\D\d 를 제외한 전부/\D/g
  • 7 eight 9
  • 12?3
\fform-feed
\nnew line
\rcarriage return
\swhite space
ex>탭, 띄어쓰기, \n, \r
/k\s/g
  • korea
  • blank is
  • blank
\S\s 를 제외한 전부/k\S/g
  • korea
  • blank is
\t
\vvertical tab
\w알파벳+숫자+_. [A-Za-z0-9_]와 동일/\w/g
  • !@#$%^&*()+_-[]{}\|"':;,.<>?/
_가 <b>를 먹여도 별로 티가 안 난다.
\W\w 빼고 전부/\W/g
  • !@#$%^&*()+_-[]{}\|"':;,.<>?/
\n\n이 자연수일때, ()로 지정한 n번째 정규식/(.{2})e tru\1 is \1at/
  • the truth is that ...
    1th :th
(th)가 \1로 지정된다.
\xhhhh는 hexacode, /[\x21-\x40]/g
  • !@#$%^&*()po
Code table 보기
\uhhhhhhhh는 hexacode, /[\u3131-\u3163\uac00-\ud7a3]/g
  • blah .
코드 번호> 3131:ㄱ 3163:ㅣ ac00:가 d7a3:힣 (javascript, java)

4. 정규식 사용 예제

/^[0-9]/
  • 09없다
  • 100점
  • 집이 10평
/^\w+$/
  • blahsoft
  • blah(co)
  • blah soft
/^[a-zA-Z][\w\-]{4,11}$/
  • blah2010
  • blah-2010!
  • 2010blah
  • ILikegoooooooooooooooooogle
/^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}/
  • 02-6288-2114
  • 031-779-7114
  • 12-1234-5678
  • 02-6288-2114545
  • 02-0288-2114
/^0\d{1,2}-[1-9]\d{2,3}-\d{4}$/
  • 02-6288-2114
  • 031-779-7114
  • 12-1234-5678
  • 02-2123-12314545
  • 02-0288-2114
/^[\.a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/
  • r-d.blah.co.kr
  • r-d.blah.co.kr입니다.
  • blah..co.kr
  • a.com
/^(?:[\w\-]{2,}\.)+[a-zA-Z]{2,}$/
  • r-d.blah.co.kr
  • r-d.blah.co.kr입니다.
  • blah..co.kr
  • a.com
/^[_a-zA-Z0-9\-]+@[\._a-zA-Z0-9\-]+\.[a-zA-Z]{2,}/
  • abc@haha.co.kr
  • abc@haha..co.kr
  • hwang@a.com
/^[\w\-]+@(?:(?:[\w\-]{2,}\.)+[a-zA-Z]{2,})$/
  • abc@haha.co.kr
  • abc@haha..co.kr
  • hwang@a.com
/^([a-z]+):\/\/((?:[a-z\d\-]{2,}\.)+[a-z]{2,})(:\d{1,5})?(\/[^\?]*)?(\?.+)?$/i
  • http://www.blah.co.kr/main/index.jsp?var=value
    1th :http
    2th :www.blah.co.kr
    3th :
    4th :/main/index.jsp
    5th :?var=value
  • http://www.blah.co.kr/main/index.jsp
    1th :http
    2th :www.blah.co.kr
    3th :
    4th :/main/index.jsp
    5th :
  • http://blah.co.kr/
    1th :http
    2th :blah.co.kr
    3th :
    4th :/
    5th :
  • http://blah.co.kr
    1th :http
    2th :blah.co.kr
    3th :
    4th :
    5th :
  • http://blah.co.kr:8088/main/
    1th :http
    2th :blah.co.kr
    3th ::8088
    4th :/main/
    5th :
/^[ㄱ-ㅣ가-힣]+$/
  • 티맥스소프트
  • ㅜㅜ
  • ㅎㅎ

5. Javascript 정규식 함수

함수코드예제코드설명
Array RegExp.exec (to be checked)
varmyRe=/d(b+)(d)/ig;
varmyArray=myRe.exec("cdbBdbsbz");

/d(b+)(d)/ig

  • cdbBdbsbz
myArray.index =1 ; (처음으로 매칭되는 위치, 컴터가 늘 그렇듯 위치는 0번째부터 센다.)
myArray.input = cdbBdbsbz; (체크할 대상)
myArray[0] = dbBd;(검사에 통과한 부분)
myArray[1] = bB;(1번째 괄호에서 체크된 부분)
myArray[2] = d;(2번째 괄호에서 체크된 부분)

myRe.lastIndex =5 ; (다음번 체크를 하기위한 위치.)
myRe.ignoreCase = true; (/i 플래그 체크)
myRe.global = true; (/g 플래그 체크)
myRe.multiline = false; (/m 플래그 체크)

RegExp.$_ = cdbBdbsbz;(입력한 스트링)
RegExp.$1 = bB;(1번째 괄호에서 체크된 부분 )
boolean RegExp.test(to be checked)
varmyRe=/d(b+)(d)/ig;
varchecked=myRe.test("cdbBdbsbz");
d0cument.write("checked="+checked+";<br>");

/d(b+)(d)/ig

  • cdbBdbsbz
실행결과: checked = true;
String RegExp.toString()
varmyRe=/d(b+)(d)/ig;
varstr=myRe.toString();
d0cument.write(str);

실행 결과: /d(b+)(d)/ig
String String.replace(pattern or string, to be replaced)
varstr="abcdefe";
d0cument.write(str.replace("e","f"));
실행 결과: abcdffe

e가 2번 있지만, 첫번째 인자가 정규식이 아니라 문자열일 경우는 첫번째 것만 바꾼다.
varstr="aba";
d0cument.write(str.replace(/^a/,"c"));
실행 결과: cba
varre=/(\w+)\s(\w+)/;
varstr="JohnSmith";
newstr=str.replace(re,"$2,$1");
d0cument.write(newstr)
실행 결과: Smith, John

re에 의해서 찾아진 문자열 들은 re에서 ()로 표현된 순서대로 $1, $2와 같이 변수로 저장된다.
varre=/\s(?:http|https):\/\/\S*(?:\s|$)/g;
varstr="urlishttp://iilii.egloos.com/!!\n";
str+="blahhome:http://www.blah.co.kr";
newstr=str.replace(re,function(str,p1,offset,s){
return"<ahref='"+str+"'>"+str+"</a>";
}
).replace(/\n/,"<br>");
d0cument.write(newstr);
url is http://iilii.egloos.com/ !!
blah home: http://www.blah.co.kr

str: 찾은 문자열
p1: ()에서 검색된 1번째 문자열. 마찬가지로 p2,p3 등도 가능
offset: str을 찾은 위치
s : 원본 문자열.
Array String.match(regular expression
varstr="ABCdEFgHiJKL";
varmyResult=str.match(/[a-z]/g);
for(varcnt=0;cnt<myResult.length;cnt++){
d0cument.write(cnt+":"+myResult[cnt]+"<br>");
}

d0cument.write("비교<br>");

varstr="ABCdEFgHiJKL";
varmyResult=/[a-z]/g.exec(str);
for(varcnt=0;cnt<myResult.length;cnt++){
d0cument.write(cnt+":"+myResult[cnt]+"<br>");
}
실행 결과:
0:d
1:g
2:i
비교
0:d

String.match(RegExp) =>g flag가 있어도 다 찾아낸다.
RegExp.exec(String) =>g flag가 있으면, 한 개만 찾고 끝낸다.
Array String.split([separator[, limit]])
varstr="ABCdEFgHiJKL";
varmyResult=str.split(/[a-z]/g,3);
for(varcnt=0;cnt<myResult.length;cnt++){
d0cument.write(cnt+":"+myResult[cnt]+"<br>");
}
실행 결과:
0:ABC
1:EF
2:H

주어진 문자열을 separator를 기준으로 limit 만큼 자른다.

6. 정규식으로 만든 유용한 Javascript 함수

String removeTags(input)

HTML tag부분을 없애준다
functionremoveTags(input){
returninput.replace(/<[^>]+>/g,"");
};
example>
varstr="<b>blah</b><i>soft</i>";
d0cument.write(str+"<br>");
d0cument.write(removeTags(str));
result>
blah soft
blah soft

String String.trim()

문자열의 앞뒤 공백을 없애준다.
String.prototype.trim=function(){
returnthis.replace(/^\s+|\s+$/g,'');
};
example>
varstr="untrimedstring";
d0cument.write("========"+str+"==============<br>");
d0cument.write("========"+str.trim()+"==============");
result>
======== untrimed string ==============
========untrimed string==============

String String.capitalize()

단어의 첫 글자를 대문자로 바꿔준다.
String.prototype.capitalize=function(){
returnthis.replace(/\b([a-z])/g,function($1){
return$1.toUpperCase();
});
};
example>
varstr="koreafirstworldbest";
d0cument.write(str.capitalize());
result>
Korea First World Best

String number_format(input)

입력된 숫자를 ,를 찍은 형태로 돌려준다
functionnumber_format(input){
varinput=String(input);
varreg=/(\-?\d+)(\d{3})($|\.\d+)/;
if(reg.test(input)){
returninput.replace(reg,function(str,p1,p2,p3){
returnnumber_format(p1)+","+p2+""+p3;
}
);
}else{
returninput;
}
}
example>
d0cument.write(number_format(1234562.12)+"<br>");
d0cument.write(number_format("-9876543.21987")+"<br>");
d0cument.write(number_format("-123456789.12")+"<br>");
result>
1,234,562.12
-9,876,543.21987
-123,456,789.12

7. Java 정규식 함수

Pattern p = Pattern.compile("(a*)(b)");Matcher m = p.matcher("aaaaab");if (m.matches()) {    for (int i = 0; i < m.groupCount() + 1; i++) {        System.out.println(i + ":" + m.group(i));    }} else {    System.out.println("not match!");}result>0:aaaaab1:aaaaa2:b0번째는 매칭된 부분.
String a = "I love her";System.out.println(a.replaceAll("([A-Z])", "\"$1\""));result>"I" love her자바도 $1을 쓸 수 있다.
Pattern p = Pattern.compile("cat");Matcher m = p.matcher("one cat two cats in the yard");StringBuffer sb = new StringBuffer();while (m.find()) {    m.appendReplacement(sb, "dog");    System.out.println(sb.toString());}m.appendTail(sb);System.out.println(sb.toString());result>one dogone dog two dogone dog two dogs in the yard

Posted by la30321
Web_HTML2008. 11. 25. 15:29

function CheckGdSgGubun(){

var lo_this;
//IE 계열
if(event) {
lo_this= window.event.srcElement;
//none IE 계열
} else {
lo_this= window.e.getTarget();
}
var li_row_index = lo_this.parentNode.parentNode.rowIndex;
}

<tr><td>

<input type="buttom" onclick="CheckGdSgGubun()">

</td></tr>

이렇게 하면 onclick이벤트가 일어난 자기 자신의 rowIndex를 볼 수 있다.

lo_this.parentNode.parentNode.rowIndex 이부분에서 parentNode를 두번 썻는데 이는

tr => td =>속성순서이기 때문에 parent 를 두번호출한것이다.

Posted by la30321
Web_HTML2008. 11. 25. 12:47

자스에는 1차원 배열만을 지원합니다. 프로그램 언어상 2차원 배열은 없다고 할수 있죠.
그렇다고 할수 없다는거나, 구현이 불가능하다는건 아닙니다.

참조를 통해서 2차원 배열을 구현할수 있기 때문에 굳이 만들지 않은 셈이죠.

다차원(이차원 뿐만 아니라 여러차원의 배열도 가능하기 때문에) 배열의 구성은 간단한 개념으로
배열안에 배열을 넣어 원하는 차원의 배열을 구성할 수 있습니다.

2차원이라면 아래처럼 구성하면 됩니다.

a =new Array(2);
a[1] = new Array(3);

//값의 저장은
a[1][1] = "1st"

//값의 출력은.
d0cument.write(a[1][1]);
................................................

이차원 배열의 구성과 내용을 출력하는 예제입니다.<br>

<script laguage="javascript1.2">
//4열의 배열을 정의
a =new Array(4);
for (i=1; i <4; i++) {
//각 열에 3행의 배열을 정의
a[i] = new Array(3);
for (j=1; j <4; j++) {
a[i][j] = " [" + i +"열, "+j+"행의 값]";
}
}

//출력 부분
for (i=1; i <4; i++) {
for (j=1; j <4; j++) {
d0cument.write( a[i][j] + " " );
}
d0cument.write( "<br>" );
}
</script>

Posted by la30321
Web_HTML2008. 11. 24. 17:08

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title>동적 테이블 추가/삭제 및 폼 전송 예제</title>
<style>body { background-color:lightgrey; }</style>
<script language="javascript">
function addRow() {
var oRow = dyntbl1.insertRow();
oRow.onmouseover=function(){dyntbl1.clickedRowIndex=this.rowIndex};
var oCell1 = oRow.insertCell();
var oCell2 = oRow.insertCell();
var oCell3 = oRow.insertCell();
var oCell4 = oRow.insertCell();
oCell1.innerHTML = "<input type=text name=itemcode>";
oCell2.innerHTML = "<input type=text name=itemname>";
oCell3.innerHTML = "<input type=text name=itemnum>";
oCell4.innerHTML = "<input type=button value=\" X \" onClick=\"delRow()\">";
d0cument.recalc();
}
function delRow() {
dyntbl1.deleteRow(dyntbl1.clickedRowIndex);
}

function fixscreen() {
var buffer = d0cument.all.item(0).outerHTML;
d0cument.open("text/html", "replace");
d0cument.write(buffer);
d0cument.close();
}
</script>

</head>
<body>

<form>
<input type=button value="화면고정" onClick="fixscreen()">
<table id=dyntbl1 border=1>
<tr>
<th>품목코드</th>
<th>품목명</th>
<th>갯수</th>
<th><input type=button value=" + " onClick="addRow()"></th>
</tr>
<tr onMouseOver="dyntbl1.clickedRowIndex=this.rowIndex">
<td><input type=text name=itemcode></td>
<td><input type=text name=itemname></td>
<td><input type=text name=itemnum></td>
<td><input type=button name=dyntbl1_delRow value=" X " onClick="delRow()"></td>
</tr>
<tr onMouseOver="dyntbl1.clickedRowIndex=this.rowIndex">
<td><input type=text name=itemcode></td>
<td><input type=text name=itemname></td>
<td><input type=text name=itemnum></td>
<td><input type=button name=dyntbl1_delRow value=" X " onClick="delRow()"></td>
</tr>
</table>
</form>

</body>
</html>

Posted by la30321