2010년 11월 6일 토요일

스크립트 javascript 반올림...

<script type="text/javascript">
    var num = 3.1415926535897932384626433832795;

    //그대로 출력
     document.write("num = " + num, "<br />");
    //출력 결과 : 3.1415926535897932384626433832795

    //소수점 이하 2자리로 출력
     document.write("소수점 이하 2자리 : " + num.toFixed(2), "<br />");
    //출력 결과 : 3.14

    //소수점 이하 6자리로 출력
     document.write("소수점 이하 6자리 : " + num.toFixed(6), "(반올림됨)<br />");
    //출력 결과 : 3.141593(반올림됨)
</script>
 
-----------------------------------------------------------------------------
 
// 소숫점 이하 숫자는 무조건 올림
var n = 123.123;

 document.write(Math.ceil(n));

// 출력결과 124

// 소숫점 이하 숫자는 무조건 버림
var n = 123.5412;

 document.write(Math.floor(n));

// 출력결과 123



// 반올
 document.write(Math.round(실수))

www.dude.co.kr

 


P 이경철님의 파란블로그에서 발행된 글입니다.

JavaScript의 String,Date,Math 객체

http://www.dude.co.kr


사용자가 정의하는 것이 아닌 JavaScript 자신이 제공 하는 객체들이 있으며 이는 내장된 객체, HTML 객체, browser 객체의 3가지 범주로 나눌 수 있다.
값이 string인 변수는 실제로 string 객체이며 이를 생성 할 때  keyword 'new'를 사용하지도 않는다.
(JavaScript에서 string 은 객체라기 보다 사실상 data type 으로 처리하는 셈이다)

string 객체는 1개의 속성(string 길이를 제공하는 length 속성)과 여러 method를 가지고 있다.
string 객체의 method중 일부를 보였다.
charAt(index)           string에서 index 값에 위치한 해당 문자를 추출한다.
substring(from, to)    from 위치에서 to 위치까지의 문자들을 추출한다.
toLowerCase()         string을 모두 소문자로 대체한다.
toUpperCase()         string을 모두 대문자로 대체한다.
예)
var  teststr="this was test string" ;
일때
teststr.charAt(5) 는 "w" 가 된다.
(JavaScript에서 array 의 index 는 C와 마찬가지로 0부터 시작하며 'this' 와 'was' 사이의 빈칸도 포함하므로)
var str2 = "gildong";
일때
str2.length 는  문자열 길이인 7 이다.

new Date();
         위와 같이 인수가 없는 경우 현재 날짜와 시간(시,분,초)을 갖는 instance를 구성한다.

new Date(문자열);
          "May 3, 2006" 형태의 string을 Date instance 로 변환한다.
          "May 3, 2006 13:02:21" 식으로  시:분:초를 표시 할 수도 있다.
new Date(년, 월, 일);
          "2006, 5, 3" 형태의 string을 Date instance 로 변환한다.(2006년 5월 3일)
          "2006, 5, 3, 13, 5, 21"  식으로  시, 분, 초를 표시 할 수도 있다.(2006년 5월 3일 오후 1시 5분 21초)
다음에 Date 객체의 여러 method를 보였다.
getDate() 1 ~ 31 사이의 정수를 이용해 날짜를 표시
getDay() 일요일= '0' , 월요일= '1' .....식으로 요일을 표시
getHours() 0과 23 사이의 정수로 시간을 표시
getMinute() 0과 59 사이의 정수로 분을 표시
getMonth() 1월을 '0'으로 하고 2월을 '1'로 대표한 숫자로 달을 표시
getSeconds() 0과 59 사이의 정수로 초를 알려줌
getTime() 1970년 1월 1일 00:00:00 이후의 밀리초의 숫자를 표시
getImezoneOffset() 그리니치 표준시와 현재위치와의 시간차를 표시
getYear() 연도를 두 개의 숫자로 알려줌
parse() 1970년 1월 1일 00:00:00 이후의 밀리초의 숫자를 문자열로 표시
setDate() 1부터 31까지의 숫자로 날짜를 설정함
setHours() 0부터 23까지의 숫자로 시간을 설정함
setMinutes() 0부터 59까지의 숫자로 분을 설정함
setMonth() 0부터 11까지의 숫자로 달을 설정함
setSeconds() 0부터 59까지의 숫자로 초를 설정함
setTime() 1970년 1월 1일 00:00:00 이후의 밀리초의 숫자를 설정함
setYear() 1900보다 큰 연도를 4개의 숫자로 설정함
toString() 현재의 날짜를 문자열로 표시해 알려줌
toGMTString 인테넷의 GMT 표현법(예:Mon, 18 Dec 1998 14:12:30 GMT)을 이용해서 현재의 날짜와 시간을 표시
toLocaleString() 날짜를 "MM/DD/YY HH:MM:SS"의 형태로 표시
Math 객체는 삼각함수, 대수함수등을 계산 하기위한 여러 method 와 표준 상수를 나타내는 여러 속성들을 가지고 있다.
(각도는 도 단위가 아닌 radian 이다)

abs(number)         number 의 절대값
sin(angle)             각도 angle(radian 으로 표시)의 sin 값
cos(angle)          각도 angle 의  cos 값
tan(angle)           각도 angle 의  tan 값
random()             0 ~ 1 사이의 random number 반환
Math.PI               원주율을 나타내는 상수

JavaScript는 자체 내장 함수들도 있다. 이들은 method 가 아니라  keyword 'function'을 사용해 만드는 일반 함수들과  같은 위치에 있다.
이들중 다음의 데이터유형변환(casting) 함수들과 eval() 함수가 자주 사용된다.
parseInt(string, radix)    문자열을 정수로 변환한다.
이때 radix 로 나타낸 진법(2, 8 ,10, 16진법등)을 사용한다.
parseFloat(string)         문자열을 부동소수점 수로 변환한다.

eval(string)                  문자열을  수식으로 계산한다.
예)
 parseInt("1101", 2)         문자열 "1101"을 2진수로 변환    
 parseFloat("3.141579")
 eval("y*14-23") 


P 이경철님의 파란블로그에서 발행된 글입니다.

자바스크립트(java script) Date 내장 객체...

javascript 내장객체 Date

Date 객체는 날짜와 시간을 다루는 객체입니다. Date 객체는 다음과 같이 선언합니다.
today = new Date();
new 연산자를 사용해서 객체를 생성합니다. 그럼 Date 객체에 사용되는 메소드를 알아보겠습니다.
Date 객체의 메소드 - 날짜와 시간 얻기
getYear() 연도를 리턴합니다.
getMonth() 0에서 11사이의 정수 달을 리턴합니다. 1월=0, 12월=11
getDate() 한 달 내의 날짜를 리턴합니다.
getDay() 한 주 내의 요일의 수를 리턴합니다. 일요일=0
getHours() 0에서 23사이의 정수 시간을 나타냅니다.
getMinutes() 0에서 59까지의 정수 분을 나타냅니다.
getSeconds() 0에서 59까지의 정수 초를 나타냅니다.
getTime() 1970년 1월 1일 이후의 시간을 천분의 1초 단위로 리턴합니다.
getTimezoneOffset() 그리니치 표준시와 지방시와의 차이를 문으로 리턴합니다.
parse() 1970년 1월 1일 자정으로부터 지정된 날짜와 시간 값의 차이를 천분의 1초 단위로 리턴합니다.
UTC 1970년 1월 1일 자정으로부터 경과 시간을 그리티치 표준시를 지군으로 천분의 1초 단이다.

Date 객체의 메소드 - 날짜와 시간 설정하기
setYear() 2자리 연도를 설정합니다.
setMonth() 0에서 11사이의 정수 달을 설정합니다. 1월=0, 12월=11
setDate() 한 달 내의 날짜를 설정합니다.
setDay() 한 주 내의 요일의 수를 설정합니다. 일요일=0
setHours() 0에서 23사이의 정수 시간을 설정합니다.
setMinutes() 0에서 59까지의 정수 분을 설정합니다.
setSeconds() 0에서 59까지의 정수 초를 설정합니다.
setTime() 1970년 1월 1일 이후의 시간을 천분의 1초 단위로 설정합니다.
setFullYear() 4자리 연도를 설정합니다.
setMillseconds() 천분의 1초 값을 0부터 999까지의 값으로 설정합니다.

다음의 예제로 날짜를 구해보겠습니다.
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<SCRIPT LANGUAGE="JavaScript">
<!--
function date(){
var a=new Date();
var b=a.getYear();
var c=a.getMonth()+1;
var d=a.getDate();
var e=a.getHours();
var f=a.getMinutes();
var g=a.getSeconds();
alert(b+"년 "+c+"월 "+d+"일 "+e+"시 "+f+"분 "+g+"초 입니다.");
}
//-->
</SCRIPT>
</HEAD>
<BODY>
<form>
<input type="button" value="현재 날짜와 시간은 어떻게 되지요?" onClick="date()">
</form>
</BODY>
</HTML>
< 결과 > 현재 날짜와 시간은 어떻게 되지요? 의 버튼을 누르면
현재날짜와 시간은 00년 00월 00일 00시 00분 00초 입니다. 라고 출력됨.

date라는 함수를 선언하고, 그 안에 Date 객체를 생성합니다. 이 객체는 현제 시간을 나타냅니다.
그러므로, 현재 그 객체의 년도(getYear()), 월(getMonth()+1), 일(getDate())을 구하고, 시(getDate()),
분(getMinues()), 초(getSeconds())를 구합니다.

<html>
<head>
 <title>한국형 시계</title>
</head>
<script language = javascript>
function Start(){
   now=new Date()
   yeon=now.getYear() //70~99,70년에 유닉스를 만들었기 때문에  :2000~
   dal=now.getMonth() //0~11 : +1==> 우리의 달과 맞추기 위해서
   il=now.getDate() //0~31
   yoil=now.getDay() // 0~6  0=일요일
   si=now.getHours() //0~23 (24시간제)
   bun=now.getMinutes()//0~59
   cho=now.getSeconds()//0~59
   if(yoil==0) yoil="일요일"
   if(yoil==1) yoil="월요일"
   if(yoil==2) yoil="화요일"
   if(yoil==3) yoil="수요일"
   if(yoil==4) yoil="목요일"
   if(yoil==5) yoil="금요일"
   if(yoil==6) yoil="토요일"

   ampm=(si>12) ? "오후":"오전" //3항 연산자 조건을 따져서 참이면 앞을
   // 거짓이면 뒤의 값을 취한다
  

      si=(si>12) ? si-12:si
   bun=(bun<10) ? "0"+bun : bun
   cho=(cho<10) ? "0"+cho : cho

   mytime="19"+yeon+" 년 "+(dal+1)+" 월 "+il+" 일 "+ yoil + ampm+si+" 시 "+bun+" 분 "+ cho +" 초 "
    document.myform.mytext.value=mytime
   //속성
    t=setTimeout("Start()",1000)
    }
function Stop(){
 clearTimeout(t)
}
</script>
<body>
<form name=myform>
<input type=text value="버튼을 누르셔요" name=mytext size=45 >
<input type=button value="시계보기" onclick="Start()">
<input type=button value="시계 멈추기" onclik="Stop()"></form>


</body>
</html>

<실행결과>


인풋박스에 "버튼을 누르셔요"라고 나오고, 시계보기 버튼과 시계 멈추기 버튼이 나온다.

시계보기 버튼을 누르면 초단위로 시간이 계속 변하고,
멈추기 버튼을 누르면 시간이 멈춘다.


※ 3항 연산자 표기법

(조건) ? a:b
a: true
b: false

http://www.dude.co.kr





P 이경철님의 파란블로그에서 발행된 글입니다.

[ Java Script 특수문자 처리 ] escape, encodeUR...

시간이 없어서 간단 요약.

  escape 함수 : ASCII 범위를 벗어난 문자열들을 ASCII 형식으로 변환.

  encodeURI 함수 : ASCII 범위를 벗어난 문자열들을 URI 형식으로 변환. 단, '/'나 '?' 등 URI에서 사용하는 예약 문자 등은 변환하지 않는다.

  encodeURIComponent 함수 : 기본적으로는 encodeURI 함수와 같지만 encodeURI 함수가 변환하지 않는 '/'나 '?' 등의 문자들까지 전부 변환한다.

  상황에 맞춰서 쓰면 될 듯.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> escape, encodeURI, encodeURIComponent </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<style type="text/css">
.field
{
 width:100%;
}
</style>
<SCRIPT LANGUAGE="JavaScript">
<!--
function enc()
{
 var s_in =  document.getElementById("in").value;
 var s_esc   = escape(s_in);
 var s_encUri  = encodeURI(s_in);
 var s_encUriComp = encodeURIComponent(s_in);

  document.getElementById("esc").value = s_esc;
  document.getElementById("encUri").value = s_encUri
  document.getElementById("encUriComp").value = s_encUriComp;
}
//-->
</SCRIPT>
</HEAD>


<BODY>
<textarea id="in" class="field">ASCII 이외에 한글이나 특수문자 등이 섞이면?</textarea>
<button onclick="enc();">인코딩하기</button><br/>
escape
<textarea id="esc" class="field">ASCII 이외에 한글이나 특수문자 등이 섞이면?</textarea>
encodeURI
<textarea id="encUri" class="field">ASCII 이외에 한글이나 특수문자 등이 섞이면?</textarea>
encodeURIComponent
<textarea id="encUriComp" class="field">ASCII 이외에 한글이나 특수문자 등이 섞이면?</textarea>
</BODY>
</HTML>


escape_encodeURI_encodeURIComponent.html

 

 

출처: http://byulbada.egloos.com/2638761

방장은 누규: 화상채팅, 애인대행, 이색대행 등의 채팅사업에 관심이 많으며 현재 http://www.dude.co.krhttp://www.joytingstory.co.kr을 운영중에 있다.

 

 

 



P 이경철님의 파란블로그에서 발행된 글입니다.

자바스크립트 특수문자 처리(따옴표 등등...)

특수 문자
Javascript는 직접 입력할 수 없는 일부 문자를 문자열에 포함시킬 수 있는 특수 문자를 제공한다. 각 특수 문자는 역슬래시로 시작한다. 역슬래시는 다음 문자가 특수 문자임을 Javascript 해석기에 알려주는 데 사용되는 이스케이프 문자이다.  document.write('escape("\\b")=',escape('\b')); escape("\b")=%08
이스케이프 시퀀스 문자 ASCII 영문
\b 백스페이스 8 Backspace
\t 수평 탭(Ctrl-I) 9 Tab
\n 줄 바꿈 10 Newline, Line feed
\f 용지 공급 12 Form feed
\r 캐리지 리턴 13 Carriage return
\" 이중따옴표 34 Duble quotation
\' 단일따옴표 39 Single quotation
\\ 역슬래시 92 Back slash
역슬래시 자체는 이스케이프 문자로 사용되므로 스크립트에서 직접 입력할 수 없다.
역슬래시를 사용하려면 역슬래시를 두번 입력해야 한다(\\).


 escape (jsString) 
누구나 ASCII 글자로 접속할 수 있도록 엔코딩(encoding)한다.
인수
escape : (엔코딩 기능함수)
필수적인 인수로 최상위 내장 기능함수이다.
jsString : (엔코딩할 문자열)
엔코딩할 문자열의 개체이거나 문자열이다.

설명
unescape() 기능함수와 같이 보면 쉽게 이해될 것이다.
escape() 기능함수는 문자열을 네트워크를 통하여 누구나 ASCII 글자로 접속할 수 있도록 엔코딩한다.
아래 ASCII 69의 글자는 escape()하나 unescape()하나 아무 변화가 없으나, 그 이외의 글자는 모두 엔코딩하여야 다른 사용자가 널리 사용할 수 있기 때문이다.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
1234567890
@*-_+./
모든 다른 문자들은 escape() 기능함수로 엔코딩 표준에 따라서 16진수 2 디짓(%xx)이나 4 디짓(%uxxxx) 데이터로 전환하여야 한다. 예를 들어 빈칸(' ')은 %20, 세미콜론(;)은 %3B, '한글'은 '  document.write(escape('한글')) %uD55C%uAE00'이 된다.
escape() 기능함수로 엔코딩 된 데이터는 unescape() 기능함수로 원래 상태로 디코딩하게 된다.
특기
escape()unescape() 기능함수는 자체가 메서드 역할을 하므로 어떤 object에서도 method와 연관되지 않는다.
문자열등 String 개체에서는 이들 기능함수들은 전역 기능성 메서드로 사용된다.
escape()unescape() 메서드는 URI(Uniform Resource Identifiers)를 인코딩하는 데는 사용할 수 없으므로, 대신 encodeURI, decodeURIencodeURIComponent, decodeURIComponent 메서드를 사용한다.



expTdArray=new Array(); expTdArray.push('../refers/msversion.html','JScript 버전 1
'); expTdArray.push('../refers/msversion.html','Javascript 버전 1.0'); expTable('ver',expTdArray) expTdArray=new Array(); expTdArray.push('../object/Global.html','Global 개체'); expTable('apply',expTdArray) expTdArray=new Array(); expTdArray.push('../function/escape.html','escape() 기능함수'); expTdArray.push('../method/encodeURI.html','encodeURI 메서드'); expTdArray.push('../method/encodeURIComponent.html','encodeURIComponent 메서드'); expTdArray.push('../function/unescape.html','unescape() 기능함수'); expTdArray.push('../method/decodeURI.html','decodeURI 메서드'); expTdArray.push('../method/decodeURIComponent.html','decodeURIComponent 메서드'); expTdArray.push('../object/String.html','String 개체'); expTdArray.push('http://trio.co.kr/webrefer/ascii.html','ASCII 조견표'); expTdArray.push('http://trio.co.kr/webrefer/html/sgml/entities.html','HTML 4의 글자 엔티티(entity)'); expTable('refer',expTdArray);

expTdArray=new Array(); expTdArray.push('../refers/specialchar.html','
특수문자'); expTdArray.push('../function/escape.html','escape() 기능함수'); expTdArray.push('../refers/reguSyntax.html','정규식 특수문자'); expTdArray.push('http://trio.co.kr/webrefer/ascii.html','ASCII 조견표'); expTdArray.push('http://trio.co.kr/webrefer/html/sgml/entities.html','HTML 4의 글자 엔티티(entity)'); expTable('refer',expTdArray);


http://www.dude.co.kr




P 이경철님의 파란블로그에서 발행된 글입니다.

2010년 11월 2일 화요일

JSP, JAVA Session 사용법

Session : Cookie에서도 그렇듯 상태유지를 위한 특별한 기법있다. 상태유지는 다른 페이지로 이동하더라도 그전 페이지의 정보가 유지되어아 하는것을 말한다.
Cookie는 client의 하드웨어를 이용하여 정보를 저장하였다가 사용함으로서 페이지가 이동하더라도 상태가 유지되는 기술인데, PC방같이 여러사람이 PC를 공유하는 경우 정보가 유출될수 있는 단점과 저장할수있는 데이터도 1.2MB로 한계가 있다.
이러한 단점을 극복하기 위해 Session을 사용한다.
Session의 장점

1)JSP(server)에만 접근 가능하므로 보안유지에 강력하다.
2)저장할수 있는 데이터에 한계가 없다.
Session은  web browser당 하나씩만 발급된다.

■ Session객체가 제공하는 메소드
1)
리턴값 java.lang.Object
메소드 getAttribute(java.lang.String name) :
세션에 바인딩된 객체중 name에 해당되는 객체 값을 가져온다.없을겨우에는 null을 반환
반환값은 Object형 이므로 반드시 형변환을 하여 사용한다.
2)
리턴값 java.util.Enumeration
메소드 getAttributeNames() :
세션에 바인딩된 모든 객체들의 이름을 Enumeration형으로 되돌려 준다.
서블릿 2.1과 이전 API들의 getValueNames메소드 대신 이것을 사용한다.
3)
리턴값 long
메소드 getCreationTime() :
세션이 만들어진 시간을 반환한다. 반환값은 long형이며 이값은 GMT 시간으로 1970.1.1
자정을 기준으로 단위의 값을 반환한다.
4)
리턴값 java.lang.String
메소드 getId() :
해당 세션을 가리키는 고유 id값을 String 형으로 변환한다.
5)
리턴값 long
메소드 getLastAccessedTime() :
해당 세션이 client가 마지막으로 request를 보낸 시간을 long형으로 반환한다.
반환값은 long형이며 이값은 GMT시간으로 1970.1.1 자정을 기준으로 한 밀리second
단위의 값을 되돌려 준다.
6)
리턴값 int
메소드 getMaxInactiveInterval() :
사용자가 다음 요청을 보낼때까지 세션을 유지하는 최대시간(초 단위)을 반환한다.
7)
리턴값 boolean
메소드 isNew() :
해당 세션이 처음 생성되었으면 true값을 반환하고 이전에 생성이 된 세션이라면 false
를 반환한다.
8)
리턴값 void
메소드 removeAttribute(java.lang.Strng name) :
지정된 이름에 해당하는 객체를 이 세션에서 제거한다. 서블릿 2.1과 이전 API들의
removeValue 메소드 대신 이것을 사용한다.
9)
리턴값 void
메소드 setAttribute(java.lang.String name,java.lang.Object value) :
지정된 이름을 사용하여 이 세션에 객체를 바인딩 시킨다.이전의 putValue메소드 대신 이것
을 사용해야 한다.
10)
리턴값 void
메소드 setMaxInactiveInterval(int interval) :
사용자가 다음 요청을 보낼때 까지 세션을 유지하는 최대시간(초단위)을 설정한다.
이 시간을 넘기면 서블릿 엔진은 세션을 종료한다.
11)
리턴값 void
메소드 Invalidate() :
해당 세션을 없애고 세션에 속해있는 값들을 없앤다.


■ session에  저장된 값을 얻기 위해서는 session 의 getAttribute 메소드를 사용.
session객체 안에 지정한 name에 해당속성이 없으면 null값을 되돌린다. 반환값이 Object형이기 때문에 반드시
형변환(casting)을 해야 한다.
형식 : Object getAttribute(String anme);
ex1) String ls_test="세션에 저장된 데이터";
     session.setAttribute("Testing",ls_test);
ex2) Object lobj_getdata=session.getAttribute("Testing");
       String ls_getdata=(String)lobj_getdata;
에문)
file 이름 : getAttribute.jsp
<%@ page contentType="text;charset=euc-kr"%>
<html>
<body>
<center><h3>[ 세션 값을 얻어오는 예제 ]</h3></center>
<hr>
얻어온 값은 다음과 같다.
<hr>
<%
Object lobj_getdata=session.getAttribute("Testing");
String ls_getdata=(String)lobj_getdata;

int li_primitive=(Integer)session.getAttribute("Mydata");

out.println(" 설정된 세션값 [1] : "+ls_getdata+"<br><br>");/*
String ls_test="세션에 저장된 데이터";
session.setAttribute("Testing",ls_test);//"Testing"을 키로 문자열을 저장.result=>세션에 저장된 데이터
*/
out.println(" 설정된 세션값 [2] : "+li_primitive+"<hr>");
/*session.setAttribute("Mydata",10);//"Mydata"를 키로 정수를 저장.
result=> 10*/
%>
</body>
</html>
 
 
SESSION 정보얻기

getId() 메소드 : 세션 ID를 되돌리는 메소드로서 해당 세션을 가리키는 고유 ID값을 String형으로 변환한다.

getCreationTime() 메소드 : getCreation 메소드는 세션이 만들어진 시간을 반환.웹브라우저를 띄울때 마다
                                      세션이 생성되므로 그때의 시간을 되돌린다.

getLastAccessedTime() 메소드 : 이미 띄운 웹브라우저에서 다른 페이지로 이동했다가 돌아오는 경우
                                             사이트를 떠날 당시 시간을 얻고 싶을때 사용한다.
                                             getLastAccessedTime메소드는
                                             해당 세션이 client가 마지막으로 request를 보낸 시간을 long형으로
                                             반환한다.

isNew() 메소드 : 해당 세션이 처음 생성되었다면 true값을 반환하고 이전에 생성되었다면
                         false값을 반환하는 메소드
                         웹브라우저를 새로 띄워서 사이트에 접속하면 true 다른 페이지로 갔다가 해당 페이지로
                         돌아왔을 경우는 false를 리턴한다.

getMaxInactiveInterval() 메소드 : 세션의 유효시간 은 사용자의 마지막 요청(request)이 있은 후부터
                                              tomcat 홈의 conf 폴더의 web.xml파일에 저장되어있다.
                                              기본적으로 30분이다. 유효시간 단위는 분이다.
                                 web.xml : <session-config>
                                              <session-timeout>30</session-timeout>
                                              </session-config>
예제)
file 이름 : infoSession.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
<%@ page import="java.util.*" %>
<html>
<body>
<center><h3> 세션  예제  </h3></center>

<%
//고유한 세션 객체의 ID를 되돌려준다.
String id_str=session.getId();
//세션에 마지막으로 엑세스한 시간을 되돌려준다.
long lasttime=session.getLastAccessedTime();
//세션이 생성된 시간을 되돌려 준다.
long createdtime=session.getCreationTime();
//세션에 마지막으로 엑세스한 시간에서 세션이  생성된 시간을 빼면
//웹사이트에 머문시간이 계산된다.
long time_used=(lasttime-createdtime)/60000;
//세션의 유효시간 얻어오기
int inactive=session.getMaxInactiveInterval()/60;
//세션이 새로 만들어졌는지 알려 준다.
boolean b_new=session.isNew();
%>
[1] 세션 ID는 [<%=session.getId()%>] 입니다.<br>
[2] 당신의 웹사이트에 머문 시간은 <%=time_used%> 입니다.<br>
[3] 세션의 유효시간은 <%=inactive%> 분입니다.<br>
[4] 세션이 새로 만들어 졌나요?<br>
<%
if(b_new)
 out.println(" 새로운 세션 생성.");
else
 out.println("  새로운 세션 생성하지 않음");
%>
<hr>
</body>
</html>
결과------------------------>

 세션 예제

[1] 세션 ID는 [53C42CA9973718029CD17B48F3A9756F] 입니다.

[2] 당신의 웹사이트에 머문 시간은 0 입니다.
[3] 세션의 유효시간은 30 분입니다.
[4] 세션이 새로 만들어 졌나요?
새로운 세션 생성하지 않음


■ getAttributeNames 메소드 : 세션에 들어있는 모든 키 값을 가져오기 위해서 사용되는 메소드이다.
   이 키 값들은 Enumeration형으로 반환된다.
형식 : Enumeration getAttributeNames()

Enumeration형은 데이터를 뽑아올때 유용한 인터페이스 Enumeration객체는 java.util 팩키지에 정의 되어있으므로
java.util.Enumeration을 import 시켜야 한다.

setAttribute 메소드에 의해 설정된 세션값들이 getAttributeNames에 의해 Enumeration형으로 반환된다.
Enumeration 객체는 여러 아이템들을 저장하는 컬렉션 클래스의 일종이며,Enumeration객체에서 아이템을 뽑아
오기 위해서는 hasMoreElements와 nextElement 메소드를 적절히 사용해야 한다.

메소드
hasMoreElements : Enumeration 객체에 뽑아올 데이터가 있는지를 검사하여 있다면 true를 더 이상
                          데이터가 존재하지 않는다면 false를 리턴
nextElement : 다음 아이템이 존재한다는 전재하에 아이템을 하나씩 뽑아오는 역할을 한다.
                  nextElement 메소드도 getAttribute 메소드처럼 Object 형으로 값을 반환해 주므로 이를
                  형변환(casting)해야 한다.

※ 션에 저장된 여러개의 값들을 얻어오기 위한 방법
ex)
Enumeration enum_app=session.getAttributeNames();
while(enum_app.hasMoreElements()){
ls_name=enum_app.nextElement().toString();
ls_value=session.getAttribute(ls_name).toString();

out.println("얻어온 세션 이름 : "+ls_name+"<br>");
out.println("얻어온 세션의 값 : "+ls_value+"<br>");
}
예제)
file 이름 : getAttributeNames.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import="java.util.Enumeration" %>   
<html>
<body>
<center><h3>[ 설정된 세션값을 얻어오는 예제 - 2 ]</h3></center>

getAttributeNames() 메소드를 사용하여 세션값을 얻어오는 예제입니다.
<hr>
<%
String ls_validate="현재 페이지는 물론 이전 페이지에서 설정된 세션값들도 나타납니다.";
session.setAttribute("Validate",ls_validate);
String ls_name="";
String ls_value="";
Enumeration enum_app=session.getAttributeNames();
int i=0;
while(enum_app.hasMoreElements()){
 i++;
 ls_name=enum_app.nextElement().toString();
 ls_value=session.getAttribute(ls_name).toString();

 out.println("얻어온 세션이름 : ["+ i +"]"+ls_name+"<br>");
 out.println("얻어온 세션 값 : ["+ i +"]"+ls_value+"<br>");
}
%>
</body>
</html>
결과------------------------>

[ 설정된 세션값을 얻어오는 예제 - 2 ]

getAttributeNames() 메소드를 사용하여 세션값을 얻어오는 예제입니다.
얻어온 세션이름 : [1]Validate
얻어온 세션 값 : [1]현재 페이지는 물론 이전 페이지에서 설정된 세션값들도 나타납니다.
  session에 값을 저장하기 위해서는 session 객체의 setAttribute메소드를 사용.    형식 : session.setAttribute(String name,Object value);
           name은 String형으로 들어가고,value는 Object형 이어야만 한다.
   ex) String ls_test="세션에 저장된 데이터";
        session.setAttribute("Testing",ls_test);
예문)
file 이름 setAttribute.jsp
<%@ page contentType="text/html;charset=euc-kr"%>
<%
String ls_test="세션에 저장된 데이터";
session.setAttribute("Testing",ls_test);//"Testing"을 키로 문자열을 저장.
session.setAttribute("Mydata",10);//"Mydata"를 키로 정수를 저장.
%>
<html>
<body>
<center><h3>[ session값을 설정하는 예제 ]</h3></center>
<hr>
세션을 설정하는 페이지
<hr>
</body>
</html>


http://www.dude.co.kr



P 이경철님의 파란블로그에서 발행된 글입니다.



2010년 10월 14일 목요일

POI 쓰기...

등록이라 할수있는 쓰기를 해본다.

필요한 파일은

 
소스출처 http://www.jakartaproject.com/article/jakarta/110932237561300
jsp로 되어있는것을 자바로 좀 바꾸었다.

/*
 * exwrite.xls 가 생성된다.기존의 있다면 지워지고 생성된다.
 * */

package poiWrite;

import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

public class PoiWriteEx{
 
 static String fileUrl = "E:\\exwrite1.xls";                //생성될 파일이름
 public static void main(String[] args){
 
 
  try{
   String[] cell_value = {"1","1번째칸","정주형","011-227-1355","=A2"};  //셀에 들어갈 데이터 입력
   
   HSSFWorkbook workbook = new HSSFWorkbook();      //워크북 생성
   HSSFSheet sheet = workbook.createSheet();      //생성한 워크북에 시트 생성
   workbook.setSheetName(0,"연습",HSSFWorkbook.ENCODING_UTF_16); //시트이름을 한글로 생성하려면..이렇게..
   
   HSSFCellStyle style = workbook.createCellStyle();    //셀의 스타일 구성 (셀의 선이라든지 색깔지정)
   style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
   style.setBottomBorderColor(HSSFColor.BLACK.index);
   style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
   style.setLeftBorderColor(HSSFColor.GREEN.index);
   style.setBorderRight(HSSFCellStyle.BORDER_THIN);
   style.setRightBorderColor(HSSFColor.BLUE.index);
   style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
   style.setTopBorderColor(HSSFColor.BLACK.index);
   
   HSSFRow row = sheet.createRow(1);        //로우 생성(1번째로우, 참고-0번째로우가 첫째줄이다.)
   for(int i=0;i<cell_value.length;i++){
    HSSFCell cell = row.createCell((short)i);     //셀을 생성하고 스타일을 주고 값을입력
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    cell.setCellStyle(style);
    cell.setCellValue(cell_value[i]);
   }
   
   FileOutputStream fs = null;
   try{
    fs = new FileOutputStream(fileUrl);
    workbook.write(fs);
   }catch(Exception e){
   }finally{
    if(fs != null) fs.close();
   }
   System.out.println("성공");    //파일을 돌리면 "성공"이라는 메시지가 찍히고 E드라이브에 파일생성됨
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}

이미지를 클릭하시면 원본크기로 보실수 있습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.



E드라이브에 생성됐음을 확인할수 있다.
열어보면 딱 한줄 생성됐다..ㅋ

P 이경철님의 파란블로그에서 발행된 글입니다.

엑셀 시트 복사하기(with POI) + 리팩터링

좋아요 좋아... ㅎㅎㅎ  

 

private void copySheet(HSSFSheet from, HSSFSheet to) {
        HSSFRow firstRow = from.getRow(0);
        HSSFRow secondRow = from.getRow(1);
        HSSFRow thirdRow = from.getRow(2);
        
        HSSFRow firstRow2 = to.createRow(0);
        HSSFRow secondRow2 = to.createRow(1);
        HSSFRow thirdRow2 = to.createRow(2);
        
        Iterator<HSSFCell> iterator = firstRow.cellIterator();
        short col = 0;
        while(iterator.hasNext())
            addCell(firstRow2, col++, iterator.next().getStringCellValue());
        
        col = 0;
        iterator = secondRow.cellIterator();
        while(iterator.hasNext())
            addCell(secondRow2, col++, iterator.next().getStringCellValue());

        col = 0;
        iterator = thirdRow.cellIterator();
        while(iterator.hasNext())
            addCell(thirdRow2, col++, iterator.next().getStringCellValue());
    }

무려 세 번이나 중복되고 있지만, 일단 기능이 제대로 돌아가는지부터 보려고 허겁 지겁 코딩을 하고 결과를 확인해 보니 괜춘하네요. 여기서 그만 둘까도 생각했지만, 에이~ 뭐 시간도 많은데 저런걸 그냥 두긴 뭐하다 싶어서 리팩터링..

    private void copySheet(HSSFSheet from, HSSFSheet to, int fromRowCnt, int toRowCnt) {
        HSSFRow fromRow = null;
        HSSFRow toRow = null;
        for(int i = fromRowCnt ; i <= toRowCnt ; i++){
            fromRow = from.getRow(i);
            toRow = to.createRow(i);
            Iterator<HSSFCell> iterator = fromRow.cellIterator();
            short col = 0;
            while(iterator.hasNext())
                addCell(toRow, col++, iterator.next().getStringCellValue());
        }
    }

리팩터링 하는 김에 좀 더 Generic하게 만들어서 몇 번째 줄부터 몇 번째 줄까지 복사할지 인자로 넘겨주도록 수정 함. 이제 저 메소드는 ExcelUtils로 옮기면 ExelView쪽 코드는 약간 더 깔끔해지겠죠. 그건 뭐 간단하니 생략합니다.

 

 

출처: http://whiteship.tistory.com/1708


 



P 이경철님의 파란블로그에서 발행된 글입니다.

Character Set과 Encoding

문자셋과 인코딩의 정의

  • 문자셋 (charset, Character Set)
하나의 언어권에서 사용하는 언어를 표현하기 위한 모든 문자(활자)의 모임을 문자셋(charater set)이라고 한다. 다시 말하면 우리가 얘기하는 언어를 책으로 출판할 때 필요한 문자(활자)를 모두 모은 것이라고 생각하면 된다. 추가적으로 부호와 공백 등과 같은 특수 문자도 문자셋에 포함된다.
영어의 경우 알파벳 대소문자와 특수 문자 등으로 간단하게 문자셋을 구성할 수 있지만 한글의 경우 출판에서 가,나,다 등으로 출판함으로 훨씬 다양한 문자셋을 가지고, 또한 한자를 병행해서 사용함으로 문자셋의 범위는 더욱 넓어진다.
  • 추상적인 글자 셋은 여러 개의 인코딩을 가질 수 있다.
  • MIME 문자셋은 IANA에서 정의하며 인터넷 및 XML 파일에서 사용한다.
  • 인코딩 (encoding)
인코딩은 문자셋을 컴퓨터가 이해할 수 있는 바이트와 매핑하는 규칙이다. 예를 들면 ASCII Code에서 A,B,C 등은 문자셋이고 A는 코드 65, B는 코드 66 등 바이트 순서와 매핑한 것이 인코딩이다. 따라서 문자셋을 어떻게 매핑하느냐에 따라 하나의 문자셋이 다양한 인코딩을 가질 수 있다.
  • 추상적인 문자셋을 구체적인 bit-stream으로 표기하는 방법
  • 여러가지 문자셋을 동시에 표시할 수 있다.
  • 대부분의 인코딩에서는 대소문자를 구분하지 않는다.
  • 대한민국 문자셋(charater set)에서 가장 많이 사용하는 인코딩은 "UTF-8", "KSC5601", "ISO-8859-1" 이다.
  • 문자셋(인코딩)의 예
  • 한글 : 8bit KSC5601 (8bit EUC-KR, 7bit ISO-2022-KR, ISO-2022-Int)
  • 영문 : KSC5636, US-ASCII (둘 간의 차이는 화페 단위 뿐)
  • 한글+영문 : KSC5861 (EUC-KR), KSC5636 + KSC5601를 모두 포함한다.
  • 유니코드 : 4byte Unicode < ISO-10646 UCS (ISO-8859-1, UTF-8, UTF-16)

문자셋과 인코딩은 동일한 명칭을 가질 수 있어 서로 혼용하여 사용되는 경우가 많다.
EUC-KR은 원래 유닉스용 표준이었는데 인터넷으로 확장되어 사용된다.
KSC5601은 인터넷에서 원활한 한글(완성형) 사용을 위하여 정의된 표준이다.
EUC (Extended UNIX Code), UTF (UCS Transformation format)

기본 인코딩

  • Windows : 시스템 언어와 관련된 코드 페이지를 따름
    • 영문 Windows는 CP1252 인코딩을 사용
    • 한글 Windows는 MS949 인코딩을 사용
  • Unix : LANG 환경 변수로 지정된 로케일에 해당하는 인코딩
    • Solaris는 LANG 환경 변수가 ko, ko_KR일 경우 EUC-KR 인코딩을 사용
    • HP는 LANG 환경 변수가 ko_KR, ko_KR.eucKR일 경우 EUC-KR 인코딩을 사용
    • Unix에서 locale -a 명령을 사용하여 LANG 환경 변수에 지정 가능한 문자셋을 확인할 수 있다.
  • HTML : ISO-8859-1와 ISO-10646
  • XML : UTF-8
  • 웹 브라우져 : 내부적으로 모두 유니코드로 처리를 한다.
  • HTTP/1.0 : ISO-8859-1
  • HTTP (URL,URI) : US-ASCII, %hexadecimal_code, JavaScript escape() 함수 사용
  • Java : 유니코드 2.0
  • 직렬화된 Java Class : UTF-8
  • J2EE : ISO-8859-1
  • Oracle : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)

이미지를 클릭하시면 원본크기로 보실수 있습니다.


 



다양한 환경에서 인코딩 설정

웹 브라우져 설정

  1. "도구 -> 인터넷 옵션 -> 언어" 메뉴를 선택한다.
  2. 영어[en]와 한국어[ko]를 추가하고 원하는 언어를 가장 상단에 위치한다.

JVM 설정

  • 일반적으로 LANG 환경 변수를 설정해 주면 자동으로 설정이 된다.
locale -a                               Solaria unix 명령어로 지원 가능한 encoding을 확인한다.
env LANG ko csh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
LANG=ko ksh에서 Encoding을 설정한다. (KSC5601, EUC-KR)
  • JVM 옵션 설정 (UTF-8, ISO-8859-1, KSC5601)
-Dfile.encoding=8859_1                  필수 항목
-Dfile.client.encoding=8859_1
-Dclient.encoding.override=8859_1 JVM 버전에 따라 (사용안함)
  • JSP를 사용하여 JVM 옵션 확인 (encoding.jsp)
file.encoding = <%= System.getProperty("file.encoding") %><br>
file.client.encoding = <%= System.getProperty("file.client.encoding") %><br>
client.encoding.override = <%= System.getProperty("client.encoding.override") %><br>

HTML 설정

HTML 파일을 UTF-8로 만들어 저장한다.

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

XML 설정

XML 파일을 UTF-8로 만들어 저장한다.

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

JSP 설정

JSP 파일을 UTF-8로 만들어 저장한다.

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html;charset=UTF-8" %>

Servlet 설정

HTTP 요청의 인코딩 지정

request.setCharacterEncoding("UTF-8");

HTTP 응답의 인코딩 지정

response.setContentType("text/html; charset=UTF-8");

web.xml 설정

<mime-mapping>
<extension>html</extension>
<mime-type>text/html;charset=UTF-8</mime-type>
</mime-mapping>

Default Oracle Database 문자셋

  • Default Oracle Database 문자셋 : UTF-8 (AL32UTF8), 한국에서는 KSC5601 (KO16KSC5601)
  • AL32UTF8, KO16KSC5601 (KSC5601), WE8ISO8859P1 (8859_1)
  • Default Oracle Database 문자셋 확인 방법
sqlplus system/manager

select parameter || ' : ' || value parameter_value
from NLS_DATABASE_PARAMETERS
where parameter = 'NLS_CHARACTERSET'
or parameter = 'NLS_NCHAR_CHARACTERSET';

select name || ' : ' || substr(value$, 1, 40) parameter_value
from sys.props$
where name = 'NLS_CHARACTERSET';

select parameter || ' : ' || value parameter_value
from NLS_INSTANCE_PARAMETERS, V$NLS_PARAMETERS, NLS_SESSION_PARAMETERS;
  • Oracle Database 문자셋 변경 방법
환경 변수 또는 %ORACLE_HOME%/dbs/init[SID].ora 을 설정한다.
NLS_LANG='American_America.Ko16ksc5601'
ORA_NLS33='$ORACLE_HOME/ocommon/nls/admin/data'
NLS_DATE_FORMAT='YYYY-MM-DD'
  • DriverManager에서 문자셋 설정 방법
java.util.Properties props = new java.util.Properties();
props.put("charSet", "KSC5601" );
DriverManager.getConnection(dbUrl, props);


P 이경철님의 파란블로그에서 발행된 글입니다.

2010년 9월 17일 금요일

꽤 괜찮은 프로젝트 관리 툴! (Project Mgt tool ...

Project Mgt tool - qdPM & dotProject

Web based project mgt tool 중, 분명 공개소스가 있을 것이여~~~~~
...하고선 여기저기를 찾아 돌아다녔는데 처음에 발견한 것이 dotProject 이다...
신선한 느낌과 함께 "쓸만하다"란 생각을 가지게 만들어줬었다!
이후 관심을 가지고 좀 더 깊이 파고 들어가보니....
약간의 아쉬운 부분들이 발견 되었고 dotProject는 더 이상 update가 없는 개발멈춰버린 죽은project로 보인다.
완성도가 높고 보다 강력하기로는 pdPM이 좋은 것 같다.


찬찬히 들여다 보니 꽤나 유용한 개념을 담고 있었고
크게는 다음과 같은 Category를 가지고 있었다.

1. Projects Mgt 프로젝트 관리
2. Tasks Mgt
3. Tickets Mgt
4. Reprots Mgt
5. User Mgt

실제로 설치해서 돌려 보니 회사별 프로젝트 관리가 가능했고
MS Project와 같은 개념으로 worksheet를 생성할 수 있었다.
글구... My page가 나름 잘 구성되어 있어서
자신에게 할당된 job, event, wbs, worksheet, tickets만을 filtering해서 보여주는 것이 인상적이었다.
더불어 CSR(Customer Service Request), (Trouble Tickets, Change Request) 등을 관리할 수 있다는 점도 인상적이었고
그리고 각각에 대해서 Forum을 만들 수 있다는 것도 매우 매력적이었다.

다만 어떤 Service를 request할 때 참조파일을 첨부하거나 캡쳐와 함께 상황설명하기 마련인데
WebEditor가 좀 빈약했다. 단순히 textArea를 사용해서 그림을 넣어서 표현할 수가 없었고
파일첨부등은 별도의 Category에서 관리하기 때문에 일장일단이 있었다.

설치는 매우 쉬운편이고 자동화가 되어 있어서 별다른 조작 없이도
자신의 PC 설치해 볼 수가 있다.


이를 설치하기 위해서는 다음과 같은 준비물들이 필요하다....

1. APMSETUP7_2010010300.exe -> 편리하게 한 방에 아파치, PHP, MySQL5.1 을 설치해 준다...
2. 각각의 사이트에서 설명도 좀 읽고... demo도 보시고... 소스도 다운 받는다...
    1) dotProject - http://www.dotproject.net/
    2) qdPM -  http://qdpm.net/

3. 다음과 같이 받은 소스를 압축을 풀고 아래와 같이 위치시킨다.
  
이미지를 클릭하시면 원본크기로 보실수 있습니다.



4
각각 압축을 풀고 안에 있는 dotproject 폴더랑 qdpm만 copy해서
아파치의 context root디렉토리인 htdocs 디렉토리로 가져 갑니다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.


아래 install.html 을 꼭~ 확인하세요!
설치 및 문제해결과 관련하여 잘 정리가 되어 있습니다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.



5. 아파치 htdocs에 copy해서 위치시킨 모습....
이미지를 클릭하시면 원본크기로 보실수 있습니다.





왜 제가 한꺼번에 설명하고 있쪄? 이게 뭐하는 짓인겨???  ㅡ,.ㅡb....
자자... 지금부터 나누어서 다시 설명하겠습니다....
먼저 Dotproject 부터...


1. Dotproject  http://localhost/dotproject/install/
아래와 같은 그림이 나오면서 설치가 시작됩니다....
저의 경우는 이미 설치했기 땜시 start upgrade버튼이 보이는데
처음 설치하시는 분들은 start install이라는 버튼이 보이게 됩니다.
일단 이 버튼을 클릭하시면 이후 설치진행은 직관적이어서 쉽게 이해하고 설치하실 수 있습니다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.



설치가 끝나고 http://localhost/dotproject 를 입력하시면 아래와 같이 로그인 화면이 나옵니다.
최초 ID/PWD는 admin/passwd 입니당~
이미지를 클릭하시면 원본크기로 보실수 있습니다.


로그인 완료!!! 캬~~~~~~~~~~~~~~~~~~~ ^^
이미지를 클릭하시면 원본크기로 보실수 있습니다.


2. qdPM
1) DB및 table생성 - 압축을 풀었던 곳의 install.sql을 사용.
이미지를 클릭하시면 원본크기로 보실수 있습니다.

phpMyAdmin으로 pdpm 이라는 이름으로 db를 생성하고 해당 db내에 다음과 같이 install.sql을 import하여 table을 생성한다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.




2) D:\APM_Setup\htdocs\qdpm\core\config에 아래 선택된 두 개의 파일을 열어서 수정합니다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.

3) 각각 다음과 같이 수정....
이미지를 클릭하시면 원본크기로 보실수 있습니다.


이미지를 클릭하시면 원본크기로 보실수 있습니다.



4) 로그인합니다...
http://localhost/qdpm
최초 ID/PWD는 admin@localhost.com/admin 입니다.
참고로 이 계정으로 로그인하면 설정화면이 나옵니다.
별도의 계정을 생성하시고 해당 계정으로 다시 로그인하셔야만
아래와 같이 프로젝트를 생성할 수 있는 화면이 나옵니다...
이미지를 클릭하시면 원본크기로 보실수 있습니다.



5) 이제부터 열심히 PROJECT, TASK 등을 만드시고 일 하시면 됩니닷! ㅡ,.ㅡB
이미지를 클릭하시면 원본크기로 보실수 있습니다.


http://www.dude.co.kr





P 이경철님의 파란블로그에서 발행된 글입니다.

2010년 8월 31일 화요일

JAVA(J2SE 1.4.1) 메모리 영역 구조

1. Sun Microsystyems의 자바 HotSpot VM은 힙을 세 개의 영역으로 나누고 있다.
 힙의 세 영역은 다음과 같다:
 1) Permanent space: JVM 클래스와 메소드 개체를 위해 쓰인다.
 2) Old object space: 만들어진지 좀 된 개체들을 위해 쓰인다.
 3) New(young) object space: 새로 생성된 개체들을 위해 쓰인다.
New object space는 세 부분으로 다시 나누어진. 모든 새로 생성된 개체들이 가는 Eden, 그리고 그 개체들이 나이들게(Old) 되기 전에 가는 Survivor space(From, To) 1과 2가 있다.


2. Garbage Collector
프로그램은 프로그램을 진행하면서 데이터들을 저장하는 것이 필요하다. 데이터들은 모두 메모리에 저장이 되는데, 저장할 데이터가 있으면 메모리의 일정 공간을 할당받아서 사용하게 된다. 프로그램 내에서 사용하게 되는 메모리를 'heap'이라고 한다. 더 이상 사용되지 않는 데이터에게 메모리를 계속 할당해 주는 것은 메모리를 낭비하는 것이므로, 그 데이터가 사용하던 메모리를 회수하는 것이 필요하다. 이러한 사용되지 않는 메모리에 대한 회수를 'Garbage Collection'이라고 한다. 자바에서는 프로그램이 사용하는 메모리를 JVM(Java Virtual Machine)이 모두 관리한다.


3. OutOfMemory Error 및 해결방법
자바는 객체, 변수등의 생성과 동시에 메모리(Heap)를 차지하게 되고, 문제는 이 객체와 변수를 너무 많이 발생시킴으로 해서 현재 할당된 메모리(Heap)를 초과하게 된다
그래서 더이상 할당받을 메모리(Heap)가 부족하게 되면 OutOfMemory Error 발생하게 된다.
OutOfMemory Error 해결방법으로는 jdk1.4에서 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC 옵션을 사용한  GC한 상태의 Heap메모리 정보출력 한다. GC정보를 통하여 New, Old, Perm 등의 영역중 실제 어느 부분이 부족하여 OutOfMemory가 발생하는지 찾은후 부족한 영역의 충분하 size를조절해 주는 방법으로 해결할 수 있다.


4. Heap layout 할당에 영향을 주는 스위치들

5. New Generation 메모리 할당 공식
   Eden = NewSize - ((NewSize/(SurvivorRatio + 2)) * 2)
   From space = (NewSize - Eden)/2
   To space = (NewSize - Eden)/2

6. Old Generation 메모리 할당 공식
   Old = Xmx - MaxNewSize

7.  JVM 스위치 설정 예제
 1) 현재 http://www.affis.net 서비스는 2200개의 Jsp파일을 가지고 있고 주로 정적이 페이지들이므로      Jsp 파일 로딩에 필요한 Perm size 위주로 메모리 튜닝을 하였다.
 2) 현재 http://club.affis.net 서비스는 어플리케이션 동적이페이지들로 작성되어 있고 어플리케이션        처리에 필요한  New size 위주로 메모리 튜닝을 하였다.

8. 맺음말
OutOfMemory 발생한다면 GC로그를 찍어본다. 로그를 분석해보면 New(eden, from, to), Old, Perm 등의 영역중에서 GC가 발생해도  메모리 영역이 계속 100%로 할당되는 영역이 보일것이다. 부족한 영역에 충분한 size 메모리를 할당해 주면 OutOfMemory 해결 된다.
그러나 부족한 영역에 계속해서 메모리 할당을 해주어도 사용률이 100%가 나온다면 프로그램 누수일수 있으니 프로그램을 점검해 봐야 할 것이다.

http://www.dude.co.kr
P 이경철님의 파란블로그에서 발행된 글입니다.

2010년 8월 4일 수요일

tomcat에 context 추가하기!!!

이젠 뭘 하나 하려면...  기억이 나질 않는다.... 된장.. ㅠ.ㅜ

$Tomcat\conf\Catalina\localhost 의 위치에 Default 로 설치된 admin.xml 파일을 복사하여
파일명을 원하는 컨텍스트명으로 변경한다.

 이미지를 클릭하시면 원본크기로 보실수 있습니다.




예제와 같이 http://localhost:8080/client/와 같은 컨텍스트명을 원하면 client.xml로 한다.


client.xml 파일의 내용은 다음과 같다.

----[ client.xml  ]----------------------------------
<Context
    docBase="E:\workspace\eclipse\tomcatClient"
    privileged="true"
    reloadable="true">
</Context>

reloadable = true 는 클래스 변경시 자동반영 옵션이다..
--------------------------------------------------

docBase 의 위치는 소스파일(물리적인 공간) 의 위치를 입력한다.

Context 추가 후 테스트를 위해 JSP 파일을 생성한다.
테스트를 위한 index.jsp 파일의 소스는 다음과 같다.


----[ index.jsp ]-----------------------------------

<%@ page contentType="text/html; charset=euc-kr" %>
<HTML>
<HEAD>
<TITLE> New Context Client </TITLE>
</HEAD>
<BODY>
Hello New Context ~~~  client  : 안녕
<%
 out.println("ContextPath : " + request.getContextPath());
%>
</BODY>
</HTML>

--------------------------------------------------

위의 내용을 실행한 결과는 다음과 같다.

이미지를 클릭하시면 원본크기로 보실수 있습니다.



Context 추가 완료~!!

http://www.dude.co.kr


P 이경철님의 파란블로그에서 발행된 글입니다.

Do you know tomcat monitoring tool is that Lam...

아~~따라~ 역쉬... 찾아 보면 다~~ 있어!!!!! 핫~ ㅋㅋ
일단 해당 사이트는 여기... http://www.lambdaprobe.org/d/installation.shtml


글구... 설정법... 적을려고 했는데...
이 것도 누군가가 잘~ 설명을 해두셨네...  캬~~~~~~~

------------------------------------------------------------------------------------

압축 푸신 후에 war파일을 webapps에 올려주시고
conf디렉토리 밑에 있는 tomcat-users.xml 수정해주세요.

 

<?xml version='1.0' encoding='utf-8'?>
    <tomcat-users>
          <role rolename="manager"/>
          <role rolename="admin"/>

          <role rolename="poweruser"/>
          <role rolename="probeuser"/>
          <role rolename="poweruserplus"/>
          <user username="admin" password="admin" roles="manager,admin,poweruser,poweruserplus,probeuser"/>

          <user username="tomcat" password="s3cret" roles="manager,admin"/>

    </tomcat-users>           

 
그리고
 내컴퓨터>속성>고급>환경변수>시스템 변수 에 다음을 추가해 줍니다.

    JAVA_OPTS
    -Dcom.sun.management.jmxremote



아마 Lambda Probe 사이트가 현재 안 열리고 있다.
그냥 이 파일 다운 로드 해서 사용하면 됩니다.^^

사용법은

probe.war를 $tomcat_home/webapps 에 올려놓고 tomcat을 시작하면 됩니다.
http://localhost:8080/probe/index.jsp


출처: http://www.voiceportal.co.kr/418

http://www.dude.co.kr




P 이경철님의 파란블로그에서 발행된 글입니다.

Junit 사용법

Junit Test case, suit 는 java application 을 위해 존재하는 것들이다.
Java application 이 아니고 web servlet 을 테스트 하고 싶을 때 Servlet Test Case 위자드를
사용하여 파일을 생성해서 테스트 해볼수 있다.이미지를 클릭하시면 원본크기로 보실수 있습니다.

보는 바와같이 상속받는 TestCase 클래스가 ServletTestCase 로 바뀌었다.
그리고 선택 옵션들이 많아졌다.
이미지를 클릭하시면 원본크기로 보실수 있습니다.

위자드로 자동 생성된 소스이다.

 public class JunitServletTest extends ServletTestCase {
       public JunitServletTest(String arg0) {
             super(arg0);
       }

       protected void setUp() throws Exception {
             super.setUp();
       }
       public void testMain(){
       }
       public void begin(WebRequest request) throws Exception {
       }
       public void end(WebRequest request) throws Exception {
       }
}
아래소스는 상속받은 ServletTestCase 클래스의 내용이다. Servlet 테스트를 하기위해 필요한
httpServletResponse 등과 같은 http관련 클래스 변수가 아래에 보일것이다.
public class ServletTestCase extends AbstractCactusTestCase
    implements CactusTestCase
{

    public ServletTestCase()
    {
    }

    public ServletTestCase(String theName)
    {
        super(theName);
    }

    public ServletTestCase(String theName, Test theTest)
    {
        super(theName, theTest);
    }

    protected ProtocolHandler createProtocolHandler()
    {
        return new HttpProtocolHandler(new DefaultServletConfiguration());
    }

    public HttpServletRequestWrapper request;
    public HttpServletResponse response;
    public HttpSession session;
    public ServletConfigWrapper config;
}
이와 관련된 로직을 이해하기 위해서는 Cactus 작동원리를 알아야한다.이미지를 클릭하시면 원본크기로 보실수 있습니다.

그림을 설명하자면 먼저 브라우저에서 URL TestCase 를 호출하게 되면
Junit Test Runner YYYTestCase runTest() 메서드를 호출하게 된다.
그 메서드는 begin(), beginXXX() 차례로 수행하면서 beginXXX 에 전달된
WebRequest 매개변수를 이용해서 HTTP 관련변수를 셋팅한다.
다음은 Redirector Proxy HTTP 연결을 확립하여 설정된 헤더 및 매개변수를 전달한다.

Redirector Proxy 는 이름 그대로 대리자 역할을 하는데 Client 에 생성했던것과 같은
Junit Test Runner 을 서버측에서 다시 한번 인스턴스를 생성한다. 서버측은 클라이언트와 달리
setUp, testXXX, tearDown 으로 실행된다.
testXXX 메서드는 Junit assert API 를 사용하여 테스트를 수행하고 서버측  서블릿코드를
호출하게 된다. 그리고 서버객체에 대한 레퍼(Wrappers) HTTP세션을 생성한다.

Exception 이 발생하게 되면 Redirector Proxy 에 의해 검출되며 클라이언트 측에 전달하여
Junit 에 의해 화면에 출력된다.

정상수행일 경우 YYYTestCase.runTest() 메소드는 endXXX, end 를 차례대로 호출한다.

서블릿 테스트 코드를 만들면 다음과 같이 간단하게 만들었다.
호출할 Servlet 서버소스 이다.
public class LoginServlet extends HttpServlet {
       public void doGet(HttpServletRequest req, HttpServletResponse res)
                   throws ServletException, IOException{
             PrintWriter out = res.getWriter();
             HttpSession session = req.getSession();
             String id = req.getParameter("id");
             String passwd = req.getParameter("passwd");
             if (checkLogin(id, passwd)){
                    session.setAttribute("id", id);
                    out.print(id+"Login Failed");
             }else{
                    out.print(id+"Login Success");
             }
       }
       private boolean checkLogin(String id, String passwd){
             return true;
       }
}

다음은 TestCase 클래스이다.
import javax.servlet.ServletException;
import org.apache.cactus.ServletTestCase;
import org.apache.cactus.WebRequest;

import com.meterware.httpunit.WebResponse;

public class JunitServletTest extends ServletTestCase {

       public JunitServletTest(String arg0) {
             super(arg0);
       }

       protected void setUp() throws Exception {
             super.setUp();
       }
       public void testMain(){
             LoginServlet servlet = new LoginServlet();
             try {
                    servlet.init(config);
                    servlet.doGet(request, response);
             } catch (ServletException e) {
                    e.printStackTrace();
             } catch (IOException e) {
                    e.printStackTrace();
             }
             assertEquals("bcho", session.getAttribute("id"));
       }
       public void begin(WebRequest request) throws Exception {
       }
       public void beginLogin(WebRequest request) throws Exception {
             request.addParameter("id", "bcho");
             request.addParameter("passwd", "passwd");
       }
       public void endLogin(WebResponse response) throws Exception {
             String responseTxt = response.getText();
             assertTrue(responseTxt.indexOf("success") > 0);
       }
       public void end(WebResponse response) throws Exception {
       }
}


http://www.dude.co.kr





P 이경철님의 파란블로그에서 발행된 글입니다.