'분류 전체보기'에 해당되는 글 304건

  1. 2008.07.25 gcc 사용
  2. 2008.07.25 gcc install
  3. 2008.07.25 tomcat
  4. 2008.07.25 jdk
  5. 2008.07.25 chown
  6. 2008.07.24 DOM property, method
  7. 2008.07.24 xml document handling
  8. 2008.07.24 동적 input 생성
  9. 2008.07.24 [tomcat]web.xml
  10. 2008.07.10 tomcat + mysql 한글깨짐

gcc 사용

Linux 2008. 7. 25. 15:29

2. gcc 강좌

2.1 gcc 에 대한 기본 이해

명령행 상태에서 다음과 같이 입력해봅시다. 여러분이 사용하같고 있는 gcc 버전은 알아두고 시작하셔야겠죠?

 [yong@redyong yong]$ gcc -v
 Reading specs from /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs
 gcc version 2.7.2.1
 [yong@redyong yong]$ 

gcc -v 이라고 입력하니까 ``Reading specs from..'' 이라같고 말하면서 그 결과값을 ``gcc version 2.7.2.1''이라고 말해주고 있습니다. 자, 어디서 gcc 에 대한 정보를 읽어오는지 봅시다.

  /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs

gcc 를 여러분이 소스를 가져다 손수 설치해보신 적은 없을 것입니다. 보통은 바이너리 패키지로 된 것을 가져다 설치하지요. 나중에 정말 휴일에 너무 심심하다 싶으면 gcc 의 소스를 가져와서 컴파일해보십시요. 참, 재미있는 경험이 될 것입니다. 이미 여러분이 갖고 있는 gcc 를 가지고 새로운 gcc 를 컴파일하여 사용합니다. C 컴파일러를 가지고 새 버전의 C 컴파일러를 컴파일하여 사용한다! 이런 재미있는 경험을 또 어디서 해보겠습니까?

gcc 패키지가 어떤 것으로 구성되어 있는지.. gcc 가 제대로 설치되어 있는지 알아보면 좋겠죠?

다음과 같습니다.

 /lib/cpp       -----------> /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp ( 링크임 )
 /usr/bin/cc    -----------> gcc ( 링크임 )
 /usr/bin/gcc                C 컴파일러 ``front-end''
 /usr/bin/protoize
 /usr/bin/unprotoize
 /usr/info/cpp.info-*.gz     GNU info 시스템을 이용하는 화일들
 /usr/info/gcc.info-*.gz                        
 /usr/lib/gcc-lib

마지막 /usr/lib/gcc-lib 디렉토리에 아래에 gcc 에 관한 모든 내용이 설치됩니다.

보통 다음과 같은 디렉토리 구조를 가집니다.

        /usr/lib/gcc-lib/<플랫폼>/< gcc 버전 >

보통 우리는 리눅스를 i386 ( 인텔 환경 )에서 사용하고 있으므로 다음과 같이 나타날 것입니다.

        /usr/lib/gcc-lib/i386-linux/2.7.2.1

( i386-linux, i486-linux, i586-linux 는 각기 다를 수 있습니다. 하지만 상관없는 내용입니다. 미친 척 하고 다른 이름을 부여할 수도 있습니다. )

그럼 계속 해서 /usr/lib/gcc-lib 밑의 내용을 살펴보죠.

 /usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/cpp
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/include/*.h
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/libgcc.a
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/specs

cc1이 진짜 C 컴파일러 본체입니다. gcc 는 단지 적절하게 C 인가, C++ 인가 아니면 오브젝티브 C 인가를 검사하고 컴파일 작업만이 아니라 ``링크''라는 작업까지 하여 C 언어로 프로그램 소스를 만든 다음, 프로그램 바이너리가 만들어지기까지의 모든 과정을 관장해주는 ``조정자'' 역할을 할 뿐입니다.

C 컴파일러는 cc1, C++ 컴파일러는 cc1plus, 오브젝티브 C 컴파일러는 cc1obj 입니다. 여러분이 C++/오브젝티브 C 컴파일러를 설치하셨다면 cc1plus, cc1obj 라는 실행화일도 찾아보실 수 있을 겁니다. cpp 는 "프리프로세서"입니다. #include 등의 문장을 본격적인 cc1 컴파일에 들어 가기에 앞서 먼저(pre) 처리(process)해주는 녀석입니다.

참고로 g++ 즉 C++ 컴파일러( 정확히는 C++ 컴파일러 프론트 엔드 )에 대한 패키지는 다음과 같습니다.

 /usr/bin/c++   --------------------------->    g++ 에 대한 링크에 불과함
 /usr/bin/g++
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1plus    ( 진짜 C++ 컴파일러 )

오브젝티브 C 컴파일러 패키지는 다음과 같습니다.

 /usr/lib/gcc-lib/i386-linux/2.7.2.1/cc1obj
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/include/objc/*.h
 /usr/lib/gcc-lib/i386-linux/2.7.2.1/libobjc.a

구성요소가 어떤 것인지 아셨으니 좀 도움이 되셨을 겁니다.

2.2 gcc 사용하기

hello.c 라는 지긋지긋한 소스 하나를 기준으로 설명합니다 ^^


#include <stdio.h>

int
main ( void )
{
  (void) printf ( "Hello, Linux Girls! =)\n" );
  return 0;
}

참고로 제일 간단한 소스는 다음과 같은 것입니다. ^^


main () {}

컴파일을 해보겠습니다! $ 는 프롬프트이지 입력하는 것이 아닌 것 아시죠?

 $ gcc hello.c
 $

무소식이 희소식이라... gcc <C소스 화일명> 이렇게 실행하고 나서 아무런 메시지도 나오지 않고 다음 줄에 프롬프트만 달랑 떨어지면 그것이 바로 컴파일 성공입니다.

여러분은 무심코 다음과 같이 결과 프로그램을 실행시키려 할 것입니다.

 $ hello
 bash: hello: command not found
 $

예. 땡입니다. ^^

여러분은 다음과 같이 실행시켜야 합니다.

 $ ./a.out

맨 앞의 도트 문자(.)는 현재 디렉토리를 의미합니다. 그 다음 디렉토리 구분 문자 슬래쉬(/)를 쓰고 유닉스 C 에서 ``약속한'' C 컴파일러의 출력 결과 바이너리 화일인 a.out 을 써줍니다.

이러한 습관은 아주 중요합니다. 여러분이 현재 디렉토리에 어떤 실행 화일을 만들고 나서 테스트를 해 보려고 한다면 꼭 ./<실행 화일명> 이라고 적어줍니다.

유닉스는 기본적으로 PATH 라는 환경변수에 있는 디렉토리에서만 실행화일을 찾을 뿐입니다. 만약 PATH 라는 환경변수에 현재 디렉토리를 의미하는 도트 문자(.)가 들어있지 않으면 현재 디렉토리의 실행화일은 절대 실행되지 않습니다. 게다가 현재 디렉토리를 PATH 환경 변수에 넣어준다 할 지라도 도스처렁럼 현재 디렉토리를 먼저 찾는다든지 하는 일은 없습니다. 오로지 PATH 에 지정한 순서대로 수행합니다.

실행 바이너리명이 계속 a.out 으로 나오면 좀 곤란하죠. 뭐 물론 mv 명령으로 a.out 의 이름을 바꾸면 되지만서도...

-o 옵션

-o 옵션( 소문자 o 임! )은 출력(output) 화일명을 정하는 옵션입니다. 위에서 우리는 hello.c 라는 소스를 가지고 일반적으로 hello 라는 이름의 실행화일을 만들고 싶어할 것입니다.

 $ gcc -o hello hello.c
       ^^^^^^^^

또는 다음과 같이 순서를 바꿔도 무방합니다.

 $ gcc hello.c -o hello
               ^^^^^^^^

워낙 유닉스 쪽은 명령행 방식이 전통적으로 주된 방식이라 명령행에서 하는 일은 뛰어납니다.

당연히 실행을 하려면 ./hello 라고 하셔야 합니다. 결과는 다음처럼 나오겠지요?

 $ ./hello
 Hello, Linux Girls! =)
 $

주의

제일 안좋은 습관 중 하나가 바로 테스트용으로 만든 소스라고 다음처럼 하는 것입니다.

 $ gcc -o test test.c
 $ test
 $

문제를 알아내기 위하여 위에서 작성한 hello.c 를 컴파일/링크해봅시다.

 $ gcc -o test hello.c
 $ test
 $

원하는 문자열이 출력되지 않았습니다. -.-

 $ ./test
 Hello, Linux Girls! =)
 $

-c 옵션

어떤 이유로 오로지 컴파일(compile) 작업만 하고 싶은 경우가 있습니다. 그럴 때는 다음과 같이 합니다.

 $ gcc -c hello.c
 $

그 결과 만들어지는 화일은 전통적으로 hello.c 에서 .c 부분을 떼어내고 .o 를 붙인 화일입니다. 오브젝트 화일, 목적 화일이라고 하지요.

hello.o 라는 화일이 만들어집니다.

여러분은 C 언어로 조금이라도 복잡한 프로그램을 만들기 시작하면 여러 개의 소스로 나누어서 전체 프로그램을 짜게 됩니다. 그럴 때는 각 소스가 전체 기능에 기여하는 특정 기능의 함수들을 가지게 되고 오로지 한 녀석만 main 함수를 가집니다.

만약 어떤 프로그램이 foo.c, bar.c 이렇게 두 개의 소스로 이루어져 있다고 합시다. 이럴 때는 다음과 같이 하는 것이 가능합니다.

방법(1)

 $ gcc -o baz foo.c bar.c
 $ ./baz
방법(2)

 $ gcc -c foo.c
 $ gcc -c bar.c

          또는
 
 $ gcc -c foo.c bar.c
 $ gcc -o baz foo.o bar.o
              ^^^^^^^^^^^
 $ ./baz

위에서 보면 "아니! C 컴파일러에 .c 즉 소스 화일이 아닌 오브젝트 화일도 막 써주나?"라는 생각을 하시게 될 겁니다.

그렇습니다! 왜냐? gcc 는 정확히 말해서 C 컴파일러가 아닙니다. gcc 라는 실행 화일 자체는 "C 컴파일러를 돌리는 녀석"입니다.

더욱 더 정확히 말해보겠습니다.

C 언어는 기본적으로 두 가지 과정을 거쳐야만 실행화일을 만들어냅니다.

  1. 컴파일 ( .c -------> .o )
  2. 링크 ( .o -------> 실행화일 a.out )

1. 과정을 실제로 맡는 것은 cc1 이라는 녀석이고 2. 과정을 맡는 것은 ld 라는 링커(linker)입니다.

gcc 는 상당히 편리한 도구로서 .c, .o 등의 화일명 꼬리말을 보고 적절하게 C 컴파일러와 링커를 불러다가 원하는 실행화일을 만들어줍니다. gcc 는 "컴파일러와 링커를 불러주는 대리인"입니다.

hello.c 를 괜히 어렵게 컴파일/링크해봅시다 ^^

 $ gcc -c hello.c
          ^^^^^^^
 $ gcc -o hello hello.o
                ^^^^^^^

gcc 가 얼마나 똑똑피한 놈인지 알아보죠.

 $ gcc -c hello.o

이게 무슨 의미가 있겠습니까? ^^

 gcc: hello.o: linker input file unused since linking not done

위와 같이 불평합니다. 링크 과정을 수행하지 않으므로 링커에 대한 입력 화일인 hello.o 를 사용하지 않았다!

-I 옵션

#include 문장에서 지정한 헤더 화일이 들어있는 곳을 정하는 옵션입니다. 아주 많이 사용되는 옵션 중 하나입니다.


 #include <stdio.h>
 #include "my_header.h"

전자( <> 문자를 쓴 경우 )는 시스템 표준 헤더 디렉토리인 /usr/include를 기준으로 화일을 찾아서 포함시킵니다. 표준 디렉토리이지요.

후자( "" 문자를 쓴 경우 )는 지금 컴파일러가 실행되고 있는 현재 디렉토리를 기준으로 헤더 화일을 찾습니다.

이 두 디렉토리가 아닌 곳에 대해서는 명시적으로 -I<디렉토리> 로 정해줍니다.

 $ gcc -c myprog1.c -I..
 $ gcc -c myprog1.c -Iinclude

첫번째는 헤더 화일이 현재 소스 하위 디렉토리(..)에 있다는 뜻이며 두번째는 현재 디렉토리의 include라는 디렉토리에 들어있다는 뜻입니다.

-I 옵션은 얼마든지 여러번 쓸 수 있으며 주어진 순서대로 헤더 화일을 검색합니다.

주의

디렉토리명은 -I 라는 문자 바로 다음에 붙여서 씁니다. 즉 -I <디렉토리>라는 식이 아니라 -I<디렉토리> 입니다. 또한 유닉스에 있어 표준 헤더 화일 디렉토리는 /usr/include 라는 사실을 기억하시기 바랍니다. 또한 리눅스에 있어서는 커널 소스가 아주 중요한데 리눅스 고유의 기능을 쓰는 리눅스용 프로그램의 경우에는 /usr/include/linux, /usr/include/asm, /usr/include/scsi (최신 커널의 경우) 라는 디렉토리가 꼭 있어야 하며 각각은 커널 소스의 헤더 디렉토리에 대한 링크입니다. 따라서 커널 소스를 꼭 설치해두셔야 합니다.

 /usr/include/linux   -------------->  /usr/src/linux/include/linux
 /usr/include/asm     -------------->  /usr/src/linux/include/asm  
 /usr/include/scsi    -------------->  /usr/src/linux/include/scsi

( 위에서 /usr/src/linux/include/asm은 사실 대부분의 경우 /usr/src/linux/include/asm-i386 이라는 디렉토리에 대한 링크입니다 )

각각 linux는 일반적인 C 헤더 화일, asm은 각 아키텍쳐별 의존적인 어셈블리 헤더 화일, 맨 마지막은 SCSI 장치 프로그래밍에 쓰이는 헤더 화일이 들어있는 곳입니다.

일반적으로 커널 소스( 약 6 메가 이상되는 소스 )는 /usr/src 에서 tar, gzip으로 풀어두는 것이 관례입니다.

맨 처음 프로그래밍을 할 때는 그렇게 많이 쓰지는 않는 옵션이지만 여러분이 다른 소스를 가져다 컴파일할 때 아주 많이 보게 되는 옵션이므로 일단 이해는 할 수 있어야겠죠?

-l 옵션과 -L 옵션

옵션을 제대로 이해하기에 앞서 ``라이브러리''라는 것에 대한 이야기를 먼 저 하지 않으면 안될 듯 하군요.

  • 라이브러리


       ``라이브러리(Library)''라는 것은 개념상 영어 단어 그대로입니다.
      무엇인가 유용한 지식을 한 곳에 모아둔 곳이라는 개념이지요.

       C 프로그래밍을 하다 보면 반복적으로 사용하게 되는 함수들이 있기
      마련이고 그것은 하나의 함수로 떼내어 어디에서든 유용하게 사용할
      수 있도록 합니다.

       이 함수가 극도로 많이 사용되는 경우에는 ``라이브러리''라는 것으
      로 만들어두고 매번 컴파일해둘 필요없이 가져다 사용할 수 있도록
      하지요.

       라이브러리에 대한 얘기는 다음 번에 또 하게 되겠지만 일단 지금
      필요한 지식만 쌓기로 하겠습니다.

       일반적으로 관례상 라이브러리는 화일명 끝이 .a 로 끝납니다.
      여기서 a 는 Archive 라는 의미일 것입니다.

       라이브러리의 예를 들어보도록 하죠. 지금 /usr/lib 디렉토리를 한
      번 구경해보십시요. 정말로 많은 라이브러리들이 있지요.

      libc.a
      libm.a
      libdb.a
      libelf.a
      libfl.a
      libg++.a
      libg.a
      libncurses.a
      libreadline.a
      libvga.a
      등등...

       이러한 라이브러리는 우리가 컴파일 과정을 거쳐서 만든 .o 화일을
      한 곳에 통들어 관리하는 것에 불과합니다. 따라서 archive 를 의미
      하는 .a 라고 이름을 짓게 된 것이죠. 라이브러리는 ``도서관''으로
      서 그냥 .o 를 무작위로 집어넣은 것은 아니고 당연히 도서관에는
      소장하고 있는 책에 대한 목록(index)을 가지듯 포함되어 있는 .o
      에 대한 인덱스(index)를 가지고 있습니다.

       라이브러리는 다음과 같이 구성되어 있다고 할 수 있는 것입니다.

            라이브러리 = 목차(index) + ( a.o + b.o + c.o + ... )
        
       libc.a 를 가지고 한 번 놀아볼까요? 라이브러리 아카이브를 관리하
      는 ar 이라는 GNU 유틸리티를 써보겠습니다.

      $ cd /usr/lib
      $ ar t libc.a
      assert-perr.o
      assert.o
      setenv.o
      ftime.o
      psignal.o
      mkstemp.o
      sigint.o
      realpath.o
      cvt.o
      gcvt.o
      ctype-extn.o
      ctype.o
      <등등... 계속>

      $ ar t libc.a | grep printf
      iofprintf.o
      ioprintf.o
      iosprintf.o
      iovsprintf.o
      iovfprintf.o
      printf_fp.o
      vprintf.o
      snprintf.o
      vsnprintf.o
      asprintf.o
      vasprintf.o
      printf-prs.o
      reg-printf.o
      $

       위에서 볼 수 있다시피 .o 화일들이 그 안에 들어있습니다.

       <주목>
       유닉스에서 라이브러리 이름은 lib 로 시작합니다.

간단하게 라이브러리를 하나 만들어서 사용해보도록 합시다.

이번 예제는 3 개의 화일로 이루어졌습니다.

        myfunc.h
        myfunc.c
        hello.c

첫번째 myfunc.h 헤더 화일의 내용입니다.


extern void say_hello ( void );

두번째 myfunc.c, 실제 함수 정의부입니다.


#include <stdio.h>
#include "myfunc.h"

void 
say_hello ( void )
{
  printf ( "Hello, Linux guys!\n" );
}

마지막으로 메인 함수(main)가 들어있는 hello.c 입니다.


#include "myfunc.h"

int
main ( void )
{
  say_hello ();
  return 0;
}

main 함수에서 say_hello 라는 함수를 사용하게 됩니다. 이 정도야 그냥 이렇게 해버리고 말죠 ^^

 $ gcc -o say_linux hello.c myfunc.c

하지만 라이브러리를 만들어보고 시험해보려고 하는 것이므로 일부러 어렵게 한 번 해보기로 하겠습니다.

 $ gcc -c myfunc.c
 $ ar r libmylib.a myfunc.o
 $ ar s libmylib.a
 $ ar t libmylib.a
 myfunc.o
 $ gcc -o say_linux hello.c -lmylib
                            ^^^^^^^^
 ld: cannot open -lmylib: No such file or directory

흠... 처음부터 만만치 않죠? ^^ 실패하긴 했지만 몇 가지를 일단 알아봅시다.

-l 옵션

링크(link)할 라이브러리를 명시해주는 옵션이 바로 -l ( 소문자 L ) 옵션입니다.

-I 옵션과 마찬가지로 바짝 붙여서 씁니다. 절대 떼면 안됩니다.

우리는 libmylib.a 라는 라이브러리를 만들어두었습니다. 그것을 사용하기 위해서는 -lmylib 라고 적어줍니다. 라이브러리 화일명에서 어떤 글자들을 떼내고 쓰는지 주목하십시요.

 libmylib.a
    ^^^^^  

앞의 lib 를 떼내고 맨 뒤에 붙는 .a 를 떼냅니다.

링크(link)라는 것이 어떤 것이 모르신다면 당장 C 프로그래밍 책을 다시 읽어보시기 바랍니다. 이 글에서 설명할 범위는 아닌 듯 합니다.

-L 옵션

ld 는 유닉스에서 사용되는 링커(Linker)입니다. C 프로그램 컴파일의 맨 마지막 단계를 맡게 되지요.

위에서 우리는 다음과 같은 에러 메세지를 만났습니다.

 ld: cannot open -lmylib: No such file or directory

자, 이제 배워야 할 옵션은 ``라이브러리의 위치를 정해주는'' -L ( 대문자 L ) 옵션입니다. 사용형식은 -L<디렉토리명> 입니다.

리눅스에서 어떤 라이브러리를 찾을 때는 /lib, /usr/lib, /usr/local/lib와 같은 정해진 장소에서만 찾게 되어 있습니다. 그것은 규칙이지요.

중요한 사실은 아무리 여러분 라이브러리를 현재 작업 디렉토리에 놓아두어도 ld 는 그것을 찾지 않는다는 사실입니다. ld 더러 라이브러리가 있는 장소를 알려주려면 다음과 같이 -L 옵션을 붙이십시요.

 $ gcc -o say_linux hello.c -lmylib -L.
                                    ^^^

-L. 은 현재 디렉토리에서 라이브러리를 찾으라는 말입니다. -L 옵션은 여러번 줄 수 있습니다.

성공적으로 컴파일되었을 겁니다.

 $ ./say_linux
 Hello, Linux guys!

지금까지 여러분은 gcc 옵션 중 두번째로 중요한 -I, -l, -L 옵션에 대하여 배우셨습니다. 그리고 또한 라이브러리 만들기에 대하여 맛보기를 하였습니다.

 

'Linux' 카테고리의 다른 글

명령어2  (0) 2008.07.25
명령어1  (0) 2008.07.25
gcc install  (0) 2008.07.25
chown  (0) 2008.07.25
linux java install  (0) 2008.06.04
Posted by 으랏차
,

gcc install

Linux 2008. 7. 25. 15:29
Operating System/Solaris 2007/07/14 16:14

1. Freeware For Solaris에 가세요.

2. 오른쪽 위에 Sparc/Solaris 8 또는 Intel/Solaris 8이라고 되어 있습니다. 자신의 기종에 맞는 것을 Click 합니다. (Intel/Solaris 8기준)

3. 다시 오른쪽 아래를 보시면 Package의 List가 보입니다. 여기서 gcc-2.95.3을 Click 합니다.

4. 가운데 화면이 바뀌었을 것입니다. 파란색으로 gcc-2.95.3-sol8-intel-local.gz 을 Click 한 후 Download 받습니다.

5. Download 받은 File을 Solaris Machine에 전송합니다. (FTP)

6. Directory로 가서 압축을 풉니다.

 

7. Package를 설치합니다.

 

* "/usr/local/ Directory를 생성 하시겠습니까?" 라는 질문엔 y를 치고 Enter를 칩니다

8. vi 편집기를 이용해 PATH와 LD_LIBRARY_PATH를 수정합니다. 아래의 내용을 가장 아래에 추가합니다.

 

9. 설치가 끝났습니다. Logoff 한 후 다시 Login 해서 필요한 Software를 설치하세요.

*주의사항:

1. LD_LIBRARY_PATH에서 Directory 경로의 순서를 바꾸시면 안됩니다! 역시 PATH에서 /usr/local/bin이 앞에 나와야 합니다.

*추가설명:

Solaris 9 (정확히 Solaris 2.9 또는 SUN 0S 5.9 라고도 부름)를 설치하고 COMPANION CD 설치 이전에는 gcc가 기본적으로 설치되어 있지는 않다. 자체적으로 /usr/lib등지에 Library 함수들은 있지만 gcc 자체는 없음으로 추가 설치가 필요하다. 설치는 ftp로 Download 받지 않고 copanion cd에 개발자 관련 Package만 설치하였으며 내가 가지고 있던 cd의 기본 설치 경로는 /opt/sfw에 설치가 되었다. 이러한 설치경로는 sunfreeware와 sun.com에서 나오는 Package에 따라 설치경로가 다르다고 하다 default로 설치 경로는 /usr/local 이라고 한다. 고타마 Server를 확인해도 그러하다.

*설치 후 Error 보정:

위와 같이 path 설정 후 다시 Login하면 /bin 에 있는 모든 응용 Program의 Path가 안 걸려 Console에서는 실행이 되지 않는다. 당황하지 말고..^^ CDE 환경에는 Mouse Click으로 가능하기 때문에 path는 다시 설정 가능하다. path에다가 /bin을 추가해주자. 그럼 Console에서 기본 응용Program (ls, cd, ,find)같은 명령어를 사용할 수 있을 것이다.

 

'Linux' 카테고리의 다른 글

명령어1  (0) 2008.07.25
gcc 사용  (0) 2008.07.25
chown  (0) 2008.07.25
linux java install  (0) 2008.06.04
lighthttpd install  (0) 2008.06.04
Posted by 으랏차
,

tomcat

dev 2008. 7. 25. 15:28
톰캣 다운로드

다운로드 URL : http://tomcat.apache.org/

위의 URL에서 톰캣을 다운받는다.

이 문서에서는 apache-tomcat-5.5.17.tar.gz 를 다운받았다.



톰캣 설치

다운 받은 apache-tomcat-5.5.17.tar.gz를 /usr/local/src 로 옮겼다.

#tar xvfz apache-tomcat-5.5.17.tar.gz [enter]

/usr/local/src/apache-tomcat-5.5.17 디렉토리가 생기고 그 안에 톰캣이 깔린다.

이 디렉토리를 /usr/local 로 옮겼다.

#mv apache-tomcat-5.5.17 /usr/local [enter]



톰캣 실행

# cd /usr/local/apache-tomcat-5.5.17/bin [enter]
# ./startup.sh [enter]



톰캣 실행 확인

브라우저에서 http://192.168.0.2:8080 를 넣어 고양이가 나오는지 확인




톰캣 관리화면 활성화 시키기

다음 파일을 편집한다.
# vi /usr/local/apache-tomcat-5.5.17/tomcat-users.xml [enter]

다음 내용을 추가시킨다.
<role rolename="manager"/>
<user username="admin" password="admin" roles="manager"/>

톰캣을 다시 재실행한다.

#/usr/local/apache-tomcat-5.5.17/bin/shutdown.sh [enter]
#/usr/local/apache-tomcat-5.5.17/bin/startup.sh [enter]


톰캣 관리화면을 열어본다.

브라우저에서 http://192.168.0.2:8080/manager/html
ID : admin
Password : admin



톰캣 클래스패스 설정하기

#vi /etc/profile [enter]

다음 내용을 넣는다.(주로 가장 마지막에...)
CATALINA_HOME="/usr/local/apache-tomcat-5.5.17"
export CATALINA_HOME
CLASSPATH=".:$CATALINA_HOME/lib/servlet.jar"
export CLASSPATH


* 위에서 CLASSPATH의 경우는 이미 CLASSPATH가 정해져 있다면
  처음에 $CLASSPATH를 넣어주거나
  기존의 CLASSPATH 정의부분의 뒤쪽에 이어서 입력해 준다.

저장하고 나온 후
#source /etc/profile [enter]

 

'dev' 카테고리의 다른 글

정규식  (0) 2008.07.25
검색 & 정규식  (0) 2008.07.25
jdk  (0) 2008.07.25
DOM property, method  (0) 2008.07.24
xml document handling  (0) 2008.07.24
Posted by 으랏차
,

jdk

dev 2008. 7. 25. 15:28
우선 JDK 최신 버전 다운로드.

http://java.sun.com/javase/downloads/index.jsp

위에 링크에서 리눅스 버전의 .bin파일을 다운 받습니다.
설치는 /usr/local 경로에 하겠습니다.

# chmod 700 jdk-6-linux-i586.bin
# ./jdk-6-linux-i586.bin

하시면 라이정책 관련된 내용이 출력되는데 반듯이 읽어보시고 ㅡㅅㅡ
yes 눌러 주시면 설치는 완료 됩니다.
이제 환경 설정을 해줘야 하는데요.

우선 /usr/local 디렉토리에 심볼릭 링크를 하나 만들어 줍니다.

# ln -s /usr/local/j2sdk1.6.0_4 /usr/local/java

그리고 기존에 JDK가 설치 되어 있다면 /usr/lib/java 를 삭제해 줍시다.

# rm -rf /usr/lib/java

마지막으로  PATH 설정

# vi /etc/profile

다음 내용을 파일 끝에 추가하고 저장.
JAVA_HOME=/usr/local/java
PATH=$PATH:$JAVA_HOME/bin

# source /etc/profile
# java -version
export JAVA_HOME

 

'dev' 카테고리의 다른 글

검색 & 정규식  (0) 2008.07.25
tomcat  (0) 2008.07.25
DOM property, method  (0) 2008.07.24
xml document handling  (0) 2008.07.24
동적 input 생성  (0) 2008.07.24
Posted by 으랏차
,

chown

Linux 2008. 7. 25. 15:27

chown (파일과 디렉토리의 소유주와 소유그룹 변경)

 

 


제공 : 리눅스 서버관리자 그룹  -수퍼유저코리아-





CHange OWNer의 약어로서 파일이나 디렉토리의 소유주와 소유그룹을 변경할 때에 사용하는 명령어이다.
파일과 디렉토리의 소유주와 소유그룹은 아래 예와 같이 각각 굵은글자로 표시된 부분이다.

 [root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    2 root     root         4096  9월 15 20:02 dir1
-rw-r--r--    1 root     root           41  9월 15 20:22 file1
-rw-r--r--    1 root     root           56  9월 15 20:22 file2
[root@host1 commmand]#

위의 예어서 dir1이라는 디렉토리와 file1, file2라는 파일은 소유주와 소유그룹이 모두 root로 되어 있다.

즉 파일이나 디렉토리 모두 3번째 필드에 해당하는 것이 소유주이며, 네번째 필드에 해당하는 것이 소유그룹이다.


사용형식
       chown [-Rcfv] [--recursive] [--changes] [--help] [--version] [--silent] [--quiet] [--verbose]
       [user][:.][group] file...


사용예 #1

위의 file1라는 소유주를 bible로 변경해 보겠다.

[root@host1 commmand]# chown bible file1
[root@host1 commmand]#
[root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    2 root     root         4096  9월 15 20:02 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 root     root           56  9월 15 20:22 file2
[root@host1 commmand]#

위에서 보다시피 file1 파일의 소유주가 bible로 변경이 되었다.
물론 이런 명령어가 허용이 되려면 파일에 대한 소유권이 있어야만 가능한 일이다.
아무나 파일또는 디렉토리의 퍼미션을 변경할 수 있는 것은 아니다.

자, 그럼 이번에는 소유주와 소유그룹을 한꺼번에 변경하려면 어떻게 할까?
다음의 예를 보자.


사용예 #2

다음과 같이 :(콜론)으로 구분하여 "소유주:소유그룹"을 지정하면 소유주와 소유그룹이 변경이 된다.

[root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    2 root     root         4096  9월 15 20:02 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 root     root           56  9월 15 20:22 file2
[root@host1 commmand]#
[root@host1 commmand]# chown bible:bible2 file2
[root@host1 commmand]#
[root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    2 root     root         4096  9월 15 20:02 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 bible    bible2         56  9월 15 20:22 file2
[root@host1 commmand]#

위의 예는 file2라는 파일의 소유주를 bible, 그리고 소유그룹을 bible2로 변경한 예이다.


사용예 #3

이번에는 디렉토리의 소유주와 소유그룹을 변경해 보자.
리눅스에서는 디렉토리도 파일로 취급하므로 소유주와 소유그룹을 변경하는 방법은 파일과 동일하다.

[root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    2 root     root         4096  9월 15 20:02 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 bible    bible2         56  9월 15 20:22 file2
[root@host1 commmand]#
[root@host1 commmand]# chown bible1:bible2 dir1
[root@host1 commmand]#
[root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    2 bible1   bible2       4096  9월 15 20:02 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 bible    bible2         56  9월 15 20:22 file2
[root@host1 commmand]#

위의 예는 dir1이라는 디렉토리의 소유주를 bible1으로 변경하고 소유그룹을 bible2로 변경한 예이다.

사용예 #4

서버작업을 하다보면 특정 디렉토리내의 모든 파일과 디렉토리들을 특정 소유주와 소유그룹으로 변경해야하는 경우가 흔히 발생한다.
예를 들어 웹에서 자료실등의 파일업로드 디렉토리의 소유주와 소유그룹을 nobody와 nobody로 해줘야 할때가 종종 있을 것이다.
즉, Apache에서 특정 디렉토리로 파일을 저장하려면 읽기, 쓰기 권한이 있어야하는데 디렉토리의 소유주와 소유그룹을 nobody로 설정해 버리면 간단히 해결할 수 있으므로 이런 작업이 필요하다.

그렇다면 특정 디렉토리내에 있는 모든 파일과 서브디렉토리의 소유주와 소유그룹을 한꺼번에 변경하려면 어떻게 할까?

이는 다음예와 같이 -R옵션을 사용하면 간단히 해결 할 수 있다.
아래의 예를 보자.

[root@host1 commmand]# ls -l             (현재 디렉토리의 상태)
합계 12
drwxr-xr-x    7 bible1   bible2       4096  9월 15 20:41 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 bible    bible2         56  9월 15 20:22 file2
[root@host1 commmand]#
[root@host1 commmand]#
[root@host1 commmand]# cd dir1           (dir1 디렉토리로 들어간다)
[root@host1 dir1]#
[root@host1 dir1]# ls -l                 (dir1의 파일들의 소유주와 소유그룹 확인)
합계 28
drwxr-xr-x    4 root     root         8192  9월 15 20:40 admin
drwxr-xr-x    4 root     root         4096  9월 15 20:40 board
drwxr-xr-x    2 root     root         4096  9월 15 20:40 phplib
drwxr-xr-x    3 root     root         4096  9월 15 20:41 shop
drwxr-xr-x    2 root     root         4096  9월 15 20:39 system_check
-rw-r--r--    1 root     root           17  7월 16  2002 test.php
[root@host1 dir1]#
[root@host1 dir1]# cd ..                 (다시 dir1에서 빠져나온다.)
[root@host1 commmand]#
[root@host1 commmand]# chown -R nobody:nobody dir1    (dir1과 그 안에 있는 파일과 디렉토리들의 소유주를 nobody로 소유그룹을 nobody로 변경한다.)
[root@host1 commmand]#
[root@host1 commmand]# ls -l             (dir1의 소유주와 소유그룹 변경확인)
합계 12
drwxr-xr-x    7 nobody   nobody       4096  9월 15 20:41 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 bible    bible2         56  9월 15 20:22 file2
[root@host1 commmand]#
[root@host1 commmand]# cd dir1           (dir1으로 들어간다)
[root@host1 dir1]#
[root@host1 dir1]# ls -l                 (dir1내에 있는 파일과 디렉토리들의 소유주와 소유그룹이 변경되었는가를 확인한다.)
합계 28
drwxr-xr-x    4 nobody   nobody       8192  9월 15 20:40 admin
drwxr-xr-x    4 nobody   nobody       4096  9월 15 20:40 board
drwxr-xr-x    2 nobody   nobody       4096  9월 15 20:40 phplib
drwxr-xr-x    3 nobody   nobody       4096  9월 15 20:41 shop
drwxr-xr-x    2 nobody   nobody       4096  9월 15 20:39 system_check
-rw-r--r--    1 nobody   nobody         17  7월 16  2002 test.php
[root@host1 dir1]#


위의 예는 dir1과 그 안에 있는 모든 파일과 디렉토리들의 소유주와 소유그룹을 nobody로 변경한 예이다.
dir1내에 또다른 서브디렉토리가 존재한다면 그 안에 있는 모든 파일과 디렉토리들의 소유주와 소유그룹도 nobody로 변경이 된다.

즉, 지정된 디렉토리와 그 하위의 모든 파일과 디렉토리들을 한꺼번에 특정 소유주와 소유그룹으로 변경하고자 할때에는 위의 예와 같이 -R옵션을 사용하면 된다.


사용예 #5

아래의 예와 같이 -c옵션을 사용하면 변경된 파일들에 대해서 자세한 메세지를 보여준다.
참고로 알아두기 바란다.

[root@host1 commmand]# ls -l
합계 12
drwxr-xr-x    7 nobody   nobody       4096  9월 15 20:41 dir1
-rw-r--r--    1 bible    root           41  9월 15 20:22 file1
-rw-r--r--    1 bible    bible2         56  9월 15 20:22 file2
[root@host1 commmand]#
[root@host1 commmand]# chown -c nobody:bible2 file1
changed ownership of `file1' to nobody:bible2
[root@host1 commmand]#


저작권 :  수퍼유저코리아 (www.superuser.co.kr),   무단 재배포및 복사를 금합니다.


 


출처 : http://www.superuser.co.kr/superuserboard/view.html?id=27&code=linuxcom&start=50&position=

 

'Linux' 카테고리의 다른 글

gcc 사용  (0) 2008.07.25
gcc install  (0) 2008.07.25
linux java install  (0) 2008.06.04
lighthttpd install  (0) 2008.06.04
설치  (0) 2008.06.04
Posted by 으랏차
,

DOM property, method

dev 2008. 7. 24. 18:19

<동적콘텐츠 생성시 유용한 dom 프로퍼티와 메소드>

1)document.createElement(tagName) : tageName을 이용하여 엘리먼트를 생성

2)document.createTextNode(text) : text를 포함하는 노드를 생성

3)<element>.appendChild(childNode) : 현재 엘리먼트의 자식 노드들에 대한 리스트에 명시된 노드를 추가

     예)select 엘리먼트의 자식노드 option엘리먼트를 추가할수있다.

4)<element>.getAttribute(name)

   <element>.setAttribute(name,value) : 엘리먼트의 name attribute에 대한 값을 읽어오거나 설정한다.

5)<element>.insertBefore(newNode, targetNode) : newNode를 targetNode앞에 삽입한다.(현재노드의 자신노드가 된다)

6)<element>.removeAttribute(name) : 엘리먼트로 부터 name attribute를 제거한다.

7)<element>.removeChild(childNode) : 엘리먼트로 부터 childNode엘리먼트를 제거한다.

8)<element>.replaceChild(newNode,oldNode) : oldNode를 newNode로 대체한다.

9)<element>.hasChildnodes() : 엘리먼트가 자식노드를 가지고 있는지 여부를 Boolean값으로 반환


///////////기존의 tr건을 모두삭제///////

function clearPreviousResults(){
     
      var tableBody = document.getElementById("OEL_slect_list");//OEL_slect_list를 찾아서 배열로리스트를 넘김
      while(tableBody.childNodes.length > 0){
       tableBody.removeChild(tableBody.childNodes[0]);
      }
}


///////////tr생성//////////////////////

var row = document.createElement("tr");  //tr 엘리먼트생성

var cell = createCellWithText(NUM);        //td엘리먼트생성
row.appendChild(cell);     


cell = createCellWithText(S_ACPT_NUMBER);
row.appendChild(cell);


//////////td생성//////////////////////

function createCellWithText(text){
      var cell = document.createElement("td");         //td엘리먼트생성
      var textNode = document.createTextNode(text);//textnode생성
      cell.appendChild(textNode);  //td에 textnode추가
      cell.setAttribute("class","td_tg cen");  //어트리뷰트값을 셋팅
      return cell;
 }

'dev' 카테고리의 다른 글

tomcat  (0) 2008.07.25
jdk  (0) 2008.07.25
xml document handling  (0) 2008.07.24
동적 input 생성  (0) 2008.07.24
[tomcat]web.xml  (0) 2008.07.24
Posted by 으랏차
,

xml document handling

dev 2008. 7. 24. 18:18
▒ Javascript로 XML 문서 핸들링 하기 I

IE에서는 Javascript를 이용해서 XML 문서를 핸들링 할 수 있는 방법을 제공하고 있습니다. XML문서를 동적으로 읽어들여 파싱한 후, 스크립트를 통해서 맘대로 핸들링 할 수 있는 거죠.
스타일 쉬트를 동적으로 적용해서 스타일을 변경한다든지, XML 내의 정보를 이용해서 HTML을 구성한다든지 또는 HTML상에서 데이터를 입력받아 XML 문서를 생성한다든지.. 등등 여러가지 작업을 할 수 있습니다.

이런 작업이 가능한것은 ActiveX Control 인 MSXML 파서를 로딩하여 사용할 수 있기 때문이죠. 이때 MSXML 파서는 ActiveX Control 이기 때문에 IE 뿐 아니라 VC++, 또는 Visula Basic에서도 읽어 들여 사용할 수 있답니다. 이렇게 사용되는 방법도 차차 알아보도록 하죠...

물론 이런것들을 수행하기 위해서는 IE 5.0 이상이어야 할겁니다.

1. Javascript에서 XML 문서 읽기

XML 문서를 하나 작성한 후 Javascript상에서 읽은 다음 한번 확인해보도록 하죠. XML 문서는 이전에 작성했었던 북마크 XML 문서를 이용하도록 하죠.

[ 북마크 XML 문서 보기 ]

viewXML() 이란 Javascrip 함수를 만들어 북마크 XML 문서를 읽어볼까요 ?
아래와 같이 ActiveObject란 함수를 통해 MSXML 파서를 로딩해서 DOM Object를 생성합니다.
DOM을 생성한 후 load() 란 메서드를 통해 XML을 읽어들이고 파싱을 하게됩니다. 이때, 문서에 오류가 있으면 에러가 나겠죠 ? 그 다음 생성된 DOM 객체인 xmlDoc에 대해 xml 프로퍼티를 이용하여 XML 원문을 확인할 수 있습니다.

::: Javascript를 이용해 원문을 확인하는 예제 :::
 <html>
  <head>
   <script>
    function viewXML() {
      // MSXML 파서를 이용해서 XML문서를 가져온다.
      var xmlDoc = new ActiveXObject("MSXML.DOMDocument");
      xmlDoc.async = false;
      xmlDoc.load("bookmark.xml");

      // DOM 객체로부터 원문을 읽어 Dialog Box로 표시한다.
      alert(xmlDoc.xml);
    }
   </script>
  </head>
  <body>
   ...
   <a href="javascript:viewXML()">[ 북마크 XML 문서읽기 ]</a>
   ...
  </body>
 </html>

[ Javascript를 통해 읽어들인 XML 원문 확인하기 ]

2. 읽어들인 XML문서에 동적으로 Style 적용하기

위와 같이 Javascript를 통해 XML 문서를 읽어들일 수 있듯이 스타일도 동적으로 적용할 수 있답니다.
이전 예제에서는 아래와 같이 XML 문서에 적용하고자 하는 스타일 파일을 지정하여 직접 HTML로 볼 수 있었죠 ?

::: XML 문서에 스타일을 지정하는 예제 :::
 <?xml version="1.0" encoding="EUC-KR"?>
 <?xml:stylesheet type="text/xsl" href="table.xsl"?>

 <bookmark>
  ...
 </bookmark>

그런데, 위와 같은 방법은 하나의 XML 문서에 하나의 스타일을 적용할때는 모르겠지만, 다양한 스타일을 적용하려면 매번 사용할 스타일을 변경해줘야 하는 번거로움이 있을 것입니다. 또는, 서로 다른 스타일이 적용된 XML을 여러개 만들다든지 해야하겠죠.

그럼, Javascript를 이용해서 동적으로 스타일을 변경시켜 보여주는 예제를 하나 만들어 보겠습니다. 예제는 이전에 사용했던 것들을 재사용하기로 하죠.

XML문서나 XSLT 문서를 읽어들여 DOM 객체를 생성하는 것은 위의 예와 같고, 스타일을 동적으로 지정할 수 있는 방법이 필요한데, 이것은 transformNode()라는 메서드를 이용하게 됩니다.
그래서, 아래와 같이 XML 문서를 미리 읽어두고, 요청에 따라 스타일 파일을 읽어와 transformNode()라는 메서드를 통해 스타일을 적용하게 되죠. transformNode() 메서드는 스트링을 리턴하게 되어 있는데, 사용되는 스타일 파일들이 모두 HTML 로 변환하기 때문에, html 소스를 결과를 얻어오게 됩니다.

그 다음은 변환된 결과를 다시 HTML에 적용하는 것인데, 이것은 DHTML을 이용하였습니다. innerHTML이란 것은 지정된 태그내에 HTML Source를 말하는 것으로 아래 코드는 <div> 태그내 내용을 변환된 스트링 값으로 대치하란 것입니다. 좀더 자세히 설명하면, content라는 ID를 가진 태그 즉, <div id="content"> 의 HTML Source를 변환된 결과로 replace 시키란 것이죠. <div> 태그를 사용한 이유는 화면 구성에 아무런 영향을 주지않기 때문 이랍니다.

::: Javascript를 이용해 스타일을 동적으로 적용하는 예제 :::
 <html>
  <head>
   <script>
    // 미리 bookmark.xml 문서를 읽어들인다.
    var xmlDoc = new ActiveXObject("MSXML.DOMDocument");
    xmlDoc.async = false;
    xmlDoc.load("bookmark.xml");

    function changeXSLT(style) {
     // 지정한 xslt 문서를 읽어들인다.
     var xslDoc = new ActiveXObject("MSXML.DOMDocument");
     xslDoc.async = false;
     xslDoc.load(style + ".xsl");

     // xml문서에 읽어들인 xslt 문서를 통해 스타일을 적용한다.
     html = xmlDoc.transformNode(xslDoc);
     // DHTML을 통해 HTML로 변환된 내용을 이 페이지에 반영한다.
     content.innerHTML = html;
    }
   </script>
  </head>
  <body>
   ...
   <a href="javascript:changeXSLT('table')">[ 테이블 형태로 보기 ]</a> |
   <a href="javascript:changeXSLT('list')">[ 리스트 형태로 보기 ]</a>>
   ...
   <div id="content"></div>
  </body>
 </html>

[ 동적으로 스타일을 적용하는 예제 보기 ]

참고로 XSLT 즉, 스타일을 처리할 수 있는것은 XSLT Processor가 필요하게 됩니다. XSLT Processor가 별도로 개발되기는 하지만 보통 파서내에 포함되어 있습니다. 위의 얘제와 같이 transformNode()라는 메서드는 MSXML 파서에서 지원하고 있는 기능입니다.
 

Made by Rapsodie, 2001.07.16

'dev' 카테고리의 다른 글

jdk  (0) 2008.07.25
DOM property, method  (0) 2008.07.24
동적 input 생성  (0) 2008.07.24
[tomcat]web.xml  (0) 2008.07.24
tomcat + mysql 한글깨짐  (0) 2008.07.10
Posted by 으랏차
,

동적 input 생성

dev 2008. 7. 24. 18:11

var el;

for (var i=0; i<test.length; i++) {

    el = document.createElement("input");

    el.type = "hidden";

    el.name = "test";

    el.value = test[i];

    document.form.appendChild(el);

}

'dev' 카테고리의 다른 글

DOM property, method  (0) 2008.07.24
xml document handling  (0) 2008.07.24
[tomcat]web.xml  (0) 2008.07.24
tomcat + mysql 한글깨짐  (0) 2008.07.10
DOM 객체  (0) 2008.05.28
Posted by 으랏차
,

[tomcat]web.xml

dev 2008. 7. 24. 17:00


(출저: http://polomin.tistory.com - 각종 뉴스, 동영상, 프로그래밍 싸이트)
 
web.xml파일의 구성

1. x파일은 다음과 같이 구성된다.

- xml정의와 스키마 선언부

- 웹 애플리케이션 전체 설정

- jsp, 서블릿 관련 설정

- tag library 관련 설정

- 기타설정

2. xml정의와 스키마 선언부 : xml정의와 스키마 선언부는 xml문서에서 공통으로 필요한 xml 버전 선언과 스키마를 정의하는 부분으로 다음과 같이 공통된 버전 정의와 스키마를 가진다.

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

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd">

3. 웹 애플리케이션 전체 설정

<web-app>

        <display-name>애플리케이션 이름</display-name>

        <description>애플리케이션에 대한 설명</description>

        <welcome-file-list>

               <welcome-file>처음 시작할 파일 이름</welcome-file>

               <welcome-file>두번재로 시작할 파일 이름</welcome-file>

        </welcome-file-list>

</web-app>

4. jsp, 서블릿 관련 설정

        <servlet>

               <servlet-name>서블릿이름</servlet-name>

               <jsp-page>jsp페이지 경로</jsp-page>

               <servlet-class>서블릿클래스 경로</servlet-class>

               <load-on-startup>1</load-on-startup>

               <init-param>

                       <description>인자설명</description>

                       <param-name>인자이름</param-name>

                       <param-value>인자값</param-value>

               </init-param>

        </servlet>

        <servlet-mapping>

               <servlet-name>매핑할 서블릿이름</servlet-name>

               <url-pattern>매핑 패턴</url-pattern> 

        </servlet-mapping>


<load-on-startup>1</load-on-startup> : 0보다 큰값이면 배포 또는 서버실행시에 초기화하게 된다.

개발자가 설정하지 않으면 최초요청시에 초기화하게 되므로 시간이 소요됨..

5. tag library 관련 설정

<web-app>

        <taglib>

               <taglib-uri>태그라이브러리 경로</taglib-uri>

               <taglib-location>TLD(Tag Library Descriptor)</taglib-location>

        </taglib>

</web-app>

6. 기타설정

<web-app>

        <context-param>

               <description>설명</description>

               <param-name>인자이름</param-name>

               <param-value>인자값</param-value>

        </context-param>

</web-app>




또하나의 예제

=====================================================================

[Tomcat] web.xml에 대한 예제..

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>


<!-- 웹 어플리케이션의 일반적 설명 -->

<display-name>My Web Application</display-name>
<description>
이것은 와일드하고 훌륭한 작업을 수행하는 servlet과 JSP
기반한 애플리케이션의 X.X 버전입니다. 이 문서는 개발자
Dave 가 작성했고, 더 자세한 정보를 원하시면
dave@mycompany.com 으로 연락할 수 있습니다.
</description>


<!-- Context 초기 파라메터: 어플리케이션에서 사용되는 공유
된 문자열 상수들을 선언합니다. 이것은 애플리케이션을
설치하는 시스템 관리자가 변경할 수 있습니다. 이들 파
라메터에 실질적으로 할당된 값들은 servlet 과 JSP page
에서 다음과 같이 불러올 수 있습니다:

String value =
getServletContext().getInitParameter("name");

여기서 "name" 은 <param-name> 이들 초기 파라메터 중에
하나의 엘리먼트와 같습니다.

컨텍스트 초기 파라메터의 갯수는 제한이 없고, 아무것도
없어도 됩니다.
-->

<context-param>
<param-name>webmaster</param-name>
<param-value>myaddress@mycompany.com</param-value>
<description>
The EMAIL address of the administrator to whom questions
and comments about this application should be addressed.
</description>
</context-param>


<!-- 초기 파라메터를 포함해, 웹 애플리케이션을 구성하는
servlet 에 대한 정의. Tomcat 에서, 브라우저에서 servlet
요청시 아래와 같이 함으로 web.xml 파일에 등록안된 것도
부를 수 있습니다:

http://localhost:8080/{context-path}/servlet/{classname}

그러나 이런 사용법은 유동성을 보장하지 못합니다. 또한
servlet이 이미지나 다른 자원에 접근하기 위해서는 상대 경로
를 지정해야 되는 등 servlet이 매우 복잡하게 됩니다. 그래서
모든 servlet 을 정의해 주는 것을 (그리고 servlet-매핑 요소
로 정의하는 것) 권장합니다.

Servlet 초기 파라메터는 servlet 과 JSP page 에서 다음과 같
이 불러올 수 있습니다:

String value =
getServletConfig().getInitParameter("name");

여기서 "name" 은 <param-name> 이들 초기 파라메터 중에
하나의 엘리먼트와 같습니다.

servlet 갯수는 제한이 없고, 아무것도 없어도 됩니다.
-->

<servlet>
<servlet-name>controller</servlet-name>
<description>
이 어플리케이션에 사용된 MVC 구조에서 이 servlet은 "controller"
역할을 합니다. 보통 <servlet-mapping> 엘리먼트와 함께 ".do" 파일
확장자로 매핑됩니다. 그리고 이 애플리케이션에서 사용되는 모든
form은 요청하는 주소가 "saveCustomer.do" 처럼 지정됩니다. 이
servlet에 매핑된 servlet입니다.

이 servlet에 대한 초기 파라메터 명은 (파일 확장자가 제거된 후에)
이 servlet 이 받는 "servlet path" 입니다. 상응하는 값은 이 요청을
처리하는 데 사용할 action class 의 이름입니다.
</description>
<servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class>
<init-param>
<param-name>listOrders</param-name>
<param-value>com.mycompany.myactions.ListOrdersAction</param-value>
</init-param>
<init-param>
<param-name>saveCustomer</param-name>
<param-value>com.mycompany.myactions.SaveCustomerAction</param-value>
</init-param>
<!-- 시동할 때 이 servlet을 서버에 로딩한다 -->
<load-on-startup>5</load-on-startup>
</servlet>

<servlet>
<servlet-name>graph</servlet-name>
<description>
이 servlet 은 동적으로 생성된 그래프 GIF 이미지를 생성합니다.
이 요청에 포함된 입력된 파라메터값을 갖고 생성합니다. 보통
"/graph" 라는 구별된 URI 요청에 매핑되어 있습니다.
</description>
</servlet>


<!-- 특정한 요청 URI (context-상대적인)를 특정한 servlet으로 해석
하는 servlet 컨테이너에 의해 사용되는 매핑을 선언하기.
아래 예제는 위에 있는 servlet 설명과 관계있습니다. 그러므로,
요청 URI 는 다음과 같습니다:

http://localhost:8080/{contextpath}/graph

주소는 "graph" servlet 에 매핑됩니다. 한편:

http://localhost:8080/{contextpath}/saveCustomer.do

은 "controller" servlet 에 매핑됩니다.

servlet 매핑의 갯수는 제한이 없고, 아무것도 없어도 됩니다.
원한다면 하나의 servlet 에 한 개 이상의 매핑을 해주어도 됩니다.
-->

<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>graph</servlet-name>
<url-pattern>/graph</url-pattern>
</servlet-mapping>


<!-- 어플리케이션의 기본 세션 타임아웃 시간을 분단위로 설정합
니다. servlet 이나 JSP page 에서, 동적으로 특정한 session
에 대해 시간을 조정할 수 있습니다.
HttpSession.getMaxInactiveInterval() 을 사용하면 됩니다.
-->

<session-config>
<session-timeout>30</session-timeout> <!-- 30 minutes -->
</session-config>


</web-app> 


<error-page>
<error-code>
500
</error-code>
<location>
/errorPage.jsp
</location>
</error-page>
<error-page>
<exception-type>
javax.servlet.ServletException
</exception-type>
<location>
/servlet/ErrorDisplay
</location>
</error-page>

(출저: http://polomin.tistory.com - 각종 뉴스, 동영상, 프로그래밍 싸이트)

'dev' 카테고리의 다른 글

xml document handling  (0) 2008.07.24
동적 input 생성  (0) 2008.07.24
tomcat + mysql 한글깨짐  (0) 2008.07.10
DOM 객체  (0) 2008.05.28
변환행렬...  (0) 2008.05.28
Posted by 으랏차
,

tomcat + mysql 한글깨짐

dev 2008. 7. 10. 17:42

1. server.xml 수정은 POST 방식만 지원되고 GET 은 지원안됨. -> 비추


2. 매번 페이지 상단에 정의 -> 추천


<%@ page contentType="text/html;charset=euc_kr" %>
<% request.setCharacterEncoding("euc-kr"); %>


3. 수동 인코딩 및 디코딩 -> 비추

String name = request.getParameter("name"); // 폼에서 가져오기

 

String name = new String(rs.getString("name").getBytes("8859_1"),"KSC5601"));

// DB에서 불러오기

 

4. JDBC 연결방법을 변경 -> 현재 사용중 가장 안정적인듯(?)


  기존에   conn = DriverManager.getConnection("jdbc:mysql://localhost/project","root","root");

  에서
  conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bbs?useUnicode=true&characterEncoding=UTF-8","root","root"); 변경해서 mysql 에 전송


5. (주의)mysql 에서 DB table 생성시


CREATE TABLE `bbs`.`freeboard` (
  `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL DEFAULT '',
  `password` VARCHAR(45),
  `email` VARCHAR(45),
  `subject` VARCHAR(50) NOT NULL DEFAULT '',
  `content` TEXT NOT NULL DEFAULT '',
  `inputdate` VARCHAR(20) NOT NULL DEFAULT '',
  `masterid` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  `readcound` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  `replynum` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  `step` INTEGER UNSIGNED NOT NULL DEFAULT 0,
  PRIMARY KEY(`id`)
)ENGINE=MyISAM DEFAULT CHARSET="euckr";

 

결론 : 2, 4, 5 번작업을 해주면 mysql 로의 입력도 mysql 에서 불러오는 것도

안정적으로 동작합니다.^_^;

 

'dev' 카테고리의 다른 글

xml document handling  (0) 2008.07.24
동적 input 생성  (0) 2008.07.24
[tomcat]web.xml  (0) 2008.07.24
DOM 객체  (0) 2008.05.28
변환행렬...  (0) 2008.05.28
Posted by 으랏차
,