find 명령어
find는 글자 그대로 사용자 원하는 파일을 찾아주는 역활을 한다.
단순히파일 이름만을 가지고 찾는 것은 물론, 파일 모드, 파일 타입, 크기, 마지막으로 접근한 시간등 여러가지 다양한 조건으로 파일을 찾아준다.
형식 : find <경로> <연산자>
경로 : find가 파일을 찾을 처음 위치를 지정한다. 예을 들어 '/'는 /(root)부터 찾고, '.'은 현재 디렉토리 부터 찾는다.

-name : 확장자가 txt 인 화일을 찾는다.
find / -name '*.txt'

-perm : 퍼미션이 666(-rw-rw-rw-)인 화일을 찾는다.
find . -perm 666

-type : 파일의 타입을 지정하여, 찾고자하는 파일을 찾는다.
타입의 종류는 다음과 같다.
b : 블록 특수 파일(block device)
c : 캐릭터 특수 파일 (character deice)
d : 디렉토리(directory)
f : 일반파일(file)
l : 심볼릭 링크(link)
p : 파이프 (pipe)
s : 소켓 (socket)

현재 디렉토리 아래에 있는 서브디렉토리를 모두 찾는다.
find . -type d

-atime ?n/n : 최근 n일 이전에 액세스된 파일을 찾아준다.(accessed time)
+n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 액세스되었음을 의미한다.

시스템 전체에서 한 달 또는 그 이상의 기간동안 한번도 액세스하지 않은 디렉토리
find / -atime +30 -type d

ctime ?n/n : ctime은 파일의 퍼미션을 마지막으로 변경시킨 날짜를 의미한다. (changed time)
+n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 수정되었음을 의미한다.

현재 디렉토리 아래에서 최근 일주일 동안 고친 파일
find . -ctime -7

-mtime ?n/n : mtime은 파일내의 data를 마지막으로 변경한 날짜를 의미한다.(modified time)
+n은 n일 또는 그보다 더 오래 전의 파일
-n은 오늘 부터 n일 전까지의 파일
n은 정확히 n일 전에 수정되었음을 의미한다.
-cnewer 파일명 : '파일명' 부분에 적어준 파일보다 더 최근에 수정된 파일들을 찾아준다.

test.txt 화일이 생성된 이후의 화일을 찾는다.
find . -cnewer test.txt -print

-user 유저네임 : '유저네임' 부분에 지정한 유저 소유의 파일을 찾아준다.

nalabi 라는 계정의 화일을 찾아준다.
find / -user nalabi

그외 자주 쓰이지 않지만 추가 옵션으로는 아래와 같다.

-maxdepth n
0이 아닌 정수값으로 경로 깊이를 지정하여 검색을 할 경우에 사용한다. 예를들어, '-maxdepth 1'은 시작위치로 지정한 디렉토리만 검색하고 하위 디렉토리는 찾지 않는다. -mindepth 옵션은 반대로 동작한다. 즉, 지정한 숫자만큼의 깊이부터 그 하위 디렉토리를 검색한다. (GNU find 버전)

-follow
심볼릭 링크된 디렉토리도 검색을 할 경우에 사용한다.

-mount
현재의 파일 시스템과 동일한 타입의 파일 시스템에서만 검색을 할 경우에 사용한다.
test에는 다음과 같은 방법들이 있으며, test에 사용하는 인수에는 보다 큰 수를 의미하는 `'나, 보다 작은 수를 의미하는 `'를 함께 사용할 수 있다. 인수에 아무 연산자가 없을 경우에는 정확히 그 인수 값을 의미한다.

-group
특정 그룹 소유의 파일들을 찾을 경우에 사용한다.

-nouser
소유자가 없는 파일을 찾을 경우에 사용한다. 즉, /etc/passwd 파일에 없는 소유자의 파일을 찾을 경우에 사용한다.

-nogroup
올바른 그룹의 소유가 아닌 파일을 찾을 경우에 사용한다. 즉, /etc/groups 파일에 없는 그룹의 소유인 파일을 찾을 경우에 사용한다.

newer file1 file2
`file1' 보다는 이후에 `file2' 보다는 이전에 생성되거나 변형된 파일들을 찾을 경우에 사용한다.

-size n[bckw]
크기가 n 유닛(unit)인 파일을 찾을 경우에 사용한다. 유닛은 기본 설정(`b''와 함께 사용한 경우와 동일)인 512 바이트의 블럭, `c'를 사용할 경우에는 1 바이트, `k'를 사용할 경우에는 킬로바이트, `w'를 사용할 경우에는 2 바이트의 워드 크기를 나타낸다.

-empty
비어있는 파일이나 디렉토리를 찾을 경우에 사용한다. (GNU find 버전)

-regex
정규표현식(regular expression)을 이용하여 파일들을 찾을 경우에 사용한다. `-iregex'는 대소문자를 구별하지 않을 경우에 사용한다. (GNU find 버전)
action은 test에서의 조건과 일치하는 파일들에 대해 수행할 작업을 명시하는 것으로 다음과 같은 방법들이 있다.

-print
찾은 파일들을 표준출력(stdout)으로 출력한다. 기본으로 설정되어 있다.

-fprint file
찾은 파일들을 `file'로 출력한다. `file'이 존재 하지 않을 경우에는 새로 생성되고, 존재할 경우에는 기존의 파일은 없어진다. (GNU find 버전)

-exec
파일을 찾았을 경우, 찾은 파일들에 대해 특정 명령을 수행 할 때 사용한다. 일반적으로 `-exec command {} ;'의 형식을 취한다.

-ok
-exec와 동일한 작업을 한다. 다른 점은, 명령을 실행할 때마다 실행 의사를 물어본다.

-ls
`ls -dils' 형식으로 찾은 파일들의 정보를 출력할때 사용한다.

-fls file
`ls'와 동일하게 동작하며 결과를 `file'로 출력한다.
operator는 test에서 사용한 옵션들을 조합하여 조건식을 만들고자 할때 사용는 것으로 다음과 같은 방법들이 있다. (설명 순서는 우선순위(precedence)에 따른다.)

[예제]
자신의 홈 디렉토리에서 확장자가 '.txt'인 파일을 찾을 경우
$ find -name "*.txt'' -print

현재 디렉토리 밑에서 첫글자가 영어 대문자인 모든 파일을 찾을 경우
$ find . -name "[A-Z]*'' -print

'/usr/local'에서 첫 두글자는 영어 소문자이고 세번째 한자리는 숫자로 시작하는 이름을 가진 파일을 찾을 경우
$ find /usr/local -name "[a-z][a-z][0-9]*'' -print

확장자가 .txt 인 파일을 찾으면서 현재 디렉토리와 한 단계 밑의 디렉토리에서만 파일을 찾을 경우
$ find -maxdepth 2 -name "*.txt'' -print

현재 디렉토리 밑에서 `zzang'이라는 이름을 가진 사용자 소유의 파일을 찾을 경우
$ find . -user zzang -print

시스템에서 소유자나 그룹이 없는 파일을 찾을 경우 (크래커가 만들어 놓은 파일일 경우도 있음)
$ find / -nouser -o -nogroup -print

자신의 홈 디렉토리에서 최근 3일 동안 변경된 파일들을 찾을 경우
$ find . -mtime -3 -print

'/tmp'에서 최근 5일 동안 변경되지 않은 파일들을 찾아서 삭제할 경우 (파일을 삭제할 때마다 삭제할 것인가를 물어보도록)
$ find . -mtime +5 -print -ok rm {} ;

현재 디렉토리 밑에 있는 모든 포스트 스크립트 파일(.ps)을 찾아서 gzip으로 압축을 하고 그 목록을 result.txt라는 파일에 저정할 경우
$ find . -name "*.ps" -fprint result.txt -exec gzip {} ;

크랙커의 침입이 의심스러워 자신의 시스템에서 suid와 guid가 설정된 일반 파일들을 찾아서 권한을 확인할 경우
$ find / -type f -perm +6000 -print -ls

시스템 관리의 실수로 일반 사용자가 쓰기 권한을 갖도록 설정되어 있는 파일을 찾아서 실행 권한을 없애는 경우 (단, 링크 파일은 제외함)
$ find / -perm +2 ! -type l -print -exec chmod o-w {} ;

이밖에 예들..

옵션들을 차례로 기술하여 파일을 찾을 경우 AND 연산이 적용된다.
하지만 -o 옵션을 이용하여 OR 을 적용할수도 있고 ( ) 를 이용하여 그룹을 지어 적용할수도 있다. 이밖에 NOT 연산도 가능한데 옵션 앞에 !부호를 달아 주면 된다. 밑의 몇가지 예를 살펴 보자.

# find ./ -atime 60 -mtime 120
( AND 논리연산으로 접근한지 60일 지난 파일중 수정한지 120 일 지난 파일 )

# find ./ \( -user design -o -group design \)
(OR 논리연산으로 소유자나 그룹이 design 인경우 )

# find ./ \( ! -user design -o ! -group design \)
(NOT 논리연산으로 소유자나 그룹이 design 이 아닌 경우 )

-perm 옵션은 숫자형태의 특정 접근 모드를 이용하여 파일을 검색하는 옵션이다.
옵션별 사용예를 들어 보자.
-perm 75 : permission = 755
-perm -002 : 모든 사람들이 기록할수 있는 파일
-perm -4000 : SUID 액세스 설정
-perm -2000 : SGID 액세스 설정

-print 옵션은 근래는 기본으로 들어간다. 굳이 붙일 필요는 없고, -exec, -ok옵션 사용시에는 반드시 마지막에 \; 으로 구문을 마감해야 한다.

예를 들어서 find 로 검색한 파일을 지우기 위해서는 다음과 같이 한다.
# find ./ -name *.* -exec rm -f {} \;

파일 크기가10M 이상이며 한달 이상동안 수정되지 않은 파일을 찾는다.
# find / -type f -size 20480 -mtime 30 -ls
# find / -type f -size 20480 -mtime 30 -exec rm -f {} \;
(대응되는 파일삭제)

보안에 관련된 팁이다. 모든 setuid, setgid 를 검색한다.
# find / -type f \( -perm -4000 -o -perm -2000 \)
# find / -type f \( -perm -4000 -o -perm -2000 \) | diff - setuidlist
(찾아된 setuid,setgid를 기존에 작성한 목록과 비교하여 새로 추가 된것이 있는지를 확인한다.)

침입을 당한 시스템에 있는 setuid 와 setgid 파일을 모두 찾아 본다(특히, setuid root 파일). 일반적으로 나중에 재침입을 위해 침입자들은 이러한 setuid 설정이 된 /bin/sh 이나 /bin/time 등과 같은 복사본을 만들어 놓는 경우가 많다.
이러한 파일은 찾아서 삭제해야만 한다. 유닉스의 find(1) 프로그램을 시용하여 이러한 setuid 나 setgid 파일을 찾아낼 수가 있다.
예를 들면, 아래 명령을 이용하여 setuid root 파일과 setgid kmem 파일을 전체 파일 시스팀에서 찾을 수 있다.
# find / -user root -perm -4000 -print find / -group kmem -perm -2000 -print

주의할 점은 위 명령은 NFS/AFS로 마운트된 파일 시스템까지 몽땅 찾으므로 이러한 파일 시스템을 찾는 대상에서 제외하고자 하는 경우, “-xdev” 옵션을 사용한다(단, 이 옵션은 지원하지 않는 find 도 있음).
# find / -user root -perm -4000 -print -xdev

필요한 명령어 두개 섞어서 써도 가능함!!

내가 필요했던 명령문

# find ./ -name "*.txt" -mtime +7 -exec gzip {};

(일주일 지난 .txt 로 끝나는 파일을 찾아서 gzip로 압축한다)

- JSP/Servlet 기술에서 사용되는 네 종류의 애트리뷰트

① Page

② request

③ session

④ application

 

- EL 식 안에 있는 데이터 이름이 해석되는 순서

Page -> Request -> Session -> Application

 

- 같은 이름의 애트리뷰트 존재시 콕 짚어서 특정 애트리뷰트를 출력하고 싶을 때 사용법

  데이타 영역의 스코프와 함께 표시한다.

${pageScope.SUM}    ${requestScope.RESULT}    ${sessionScope.CART}    ${application.DB_NAME}

이렇게? 이런 일이 있을까?

 

 

<web-app>

<context-param>

<param-name>MY_NAME</param-name>

<param-value>DANIEL</param-value>

</context-param>

</web-app>

 

- 웹 어플리케이션 안에서 초기화 파라미터 값을 어디에서든 읽어 올수 있다.

EX) <%= application.getInitParameter("MY_NAME") %>

<web-app>

<servlet>

-- JSP 페이지의 본래의 URL 경로명이 들어갈 부분 ---

<servlet-name>winners-jsp</servlet-name>

<jsp-file>/Winners.jsp</jsp-file>   -> JSP 페이지의 본래의 URL경로명

<init-param>

<param-name>FILE_NAME</param-name>

<param-value>winner-list.txt</param-value>

-- 해당 JSP 페이지에서 getInitParameter 메서드를 호출해서 가져올수 있다 --

</init-param>

</servlet>

<servlet-mapping>

-- JSP 페이지를 호출할 때 사용할 URL 경로명이 들어갈 부분 --

<servlet-name>winners-jsp</servlet-name>

<url-pattern>/winners</url-pattern> -> JSP페이지의 새로운 URL 경로명(별칭)

</servlet-mapping>

</web-app>

 

EX) String filename = getInitParameter("FILE_NAME");

<jsp-file></jsp-file>경로로 jsp를 호출 할때만 getInitParameter(); 가 정상 호출 된다.

 

log4j.properties

log4j.properties- DB Query 도 찍히게 되어있다

log4j-1.2.16.jar

- log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.

log4j.properties 기본 경로 : /WEB-INF/classes/

web-application classes 경로도 : /WEB-INF/classes/ 로 해야 Logger.getLogger(getClass()); 가능한 것 같다.

로그찍을 클래스에서 
private final Logger logger = Logger.getLogger(getClass());

 

1. LOG4J 구조

① Logger(Category) : 로깅 메세지를 Appender에 전달합니다.

② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지

아니면 DB에 저장할 것인지 매개체 역활을 합니다.

③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지

출력 layout을 결졍합니다.

 

2. LOG4J 로깅 레벨

① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.

② ERROR : 일반 에러가 일어 났을 때 사용합니다.

③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.

④ INFO : 일반 정보를 나타낼 때 사용합니다.

⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.

※   만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다.

즉 WARN, ERROR, FATAL 의 로깅이 됩니다.

 

3.  property 파일에 설정
    log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요

log4j.rootLogger=INFO, stdout, rolling

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

log4j.appender.rolling.File=output.log

log4j.appender.rolling.Append=true

log4j.appender.rolling.MaxFileSize=500KB

log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

--  설명 --

#최상위 카테고리에 INFO로 레벨 설정 및 appender로 stdout, rolling을 정의
log4j.rootLogger=INFO, stdout, rolling

#stdout 어펜더는 콘솔에 뿌리겠다는 정의
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#stdout 어펜더는 patternlayout을 사용하겠다는 정의

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#페턴은 다음과 같이 포맷팅 하겠다는 것을 정의

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

#역시나 rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

#로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log

#true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.
log4j.appender.rolling.Append=true

#파일 최대 사이즈는 500KB로 설정
log4j.appender.rolling.MaxFileSize=500KB

#파일 포맷은 output.log.2005-03-10 으로 관리하겠다고 정의
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

#역시나 rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

#rolling 어펜더는 패턴 레이아웃 포맷
log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

 

 

4. 설정포멧

로그파일명 포맷 (DatePattern)
로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.

형식 설명
'.'yyyy-MM 매달 첫번째날에 로그파일을 변경합니다
'.'yyyy-ww 매주의 시작시 로그파일을 변경합니다.
'.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
'.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.



PatternLayout 포맷
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.

형식 설명
%p debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m 로그내용이 출력됩니다
%d 로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%% % 표시를 출력하기 위해 사용한다.
%n 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c 카테고리를 표시합니다
예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C 클래스명을 포시합니다.
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l 로깅이 발생한 caller의 정보를 나타냅니다
%L 로깅이 발생한 caller의 라인수를 나타냅니다
%M 로깅이 발생한 method 이름을 나타냅니다.
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.

1. Tomcat - web,xml 파일은 웹 어플리케이션 디렉터리마다 딱 하나씩 만들 수 있습니다.

web.xml 파일의 루트 엘리먼트

<web-app>

</web-app>

 

2. 웹 서버가 웹 브라우저로 부터 URL을 받았을 때 서블릿 클래스를 찾아서 호출하기 위해 필요한 정보를 입력해야 한다.

   URL 과 서블릿클래스의 이름이 필요하다.

   <servlet> 과 <servlet-mapping> 이라는 엘리먼트를 만들고 그 안에 각각 써 넣어야 한다.

<web-app>

<servlet>

<servlet-name></servlet-name> // 3. 서블릿 클래스의 서블릿 이름

<servlet-class></servlet-class> // 4. 서블릿 클래스명

-- 서블릿 클래스의 이름이 들어갈 부분 --

</servlet>

<servlet-mapping>

<servlet-name></servlet-name> // 2. 불러올 서블릿 이름

<url-pattern></url-pattern> // 1. 웹 브라우저에서 호출할 URL

-- 서블릿 클래스를 호출할 떄 사용할 URL이 들어갈 부분 --

※전체URL이 아니라, 웹 서버의 도메인 이름, 포트번호, 웹 어플리케이션 디렉터리의 이름까지를 제외 나머지 부분※

</servlet-mapping>

</web-app>

 

※부연설명

1. 톰캣 실행 후, 웹 브라우저 에서 <url-pattern> 을 호출을 하면,

2. <servlet-mapping> -> <servlet-name> 을 호출

3. 2.<servlet-name>과 일치하는 <servlet> -> <servlet-name> 호출

4. 3.<servlet> - > <servlet-name> 에 등록 된 <servlet> -> <servlet-class> 호출 끝!

'공부 > SERVLET' 카테고리의 다른 글

SERVLET_[XML 문법의 기초]  (0) 2012.09.08
SERVLET_[서블릿의 기초]  (0) 2012.09.07

 - XML 은 HTML 과 마찬가지로 텍스트 내용에 태그(태그 & 마크업)를 첨가하기 위해 사용되는 문법입니다.

이 언어는 언뜻 보기에 HTML과 비슷해 보인다.

 

1. XML 문서의 제일 앞에는 XML 선언이 올수 있다.

         XML 선언은 XML 문서작성에 사용된 XML 규격서의 버전과 XML 문서를 저장하는 데 사용된 문자 코드의 인코딩

   방식을 표시하는 역할을 합니다.

<?xml versio="1.0" encoding="ISO-8859-1"?>

  XML 문서에서 XML 선언이 생략될 수 있는 경우 : XML 문서의 내용이 ASCII 문자로면 구성되었을 경우 XML 선언생략

 

2. HTML에서는 엘리먼트 이름과 애트리뷰트 이름에 이는 대소문자를 구분하지 않지만, XML은 엄격하게 구분한다.

 

3. HTML에서는 단독으로 사용되는 태그가 < >로 끝나야 하지만, XML에서는 < />로 끝나야 한다.

 

4. HTML에서는 애트리뷰트 갓을 따옴표로 묶지 않고 쓸 수 도 있지만, XML엣는 반드시 따옴표를 묶어서 써야한다.

   EX) HTML : <IMG src=/img/car.jps>                           XML : <role rolename="admin">

 

5. HTML에서는 다소 문법에 맞지 않는 부분이 있으면 웹 브라우저가 이를 보정해서 처리하지만, XML 에서는

   문법에 조금이라도 맞지 않는 부분이 있으면 XML 문서가 올바르게 처리되지 않는다. 

'공부 > SERVLET' 카테고리의 다른 글

SERVLET_[톰캣의 서블릿 클래스 등록]  (0) 2012.09.08
SERVLET_[서블릿의 기초]  (0) 2012.09.07

import javax.servlet.*;

inport javax.servlet.http.*;

import java,io.*;


/* HttpServlet 클래스를 상속받아야 한다. */

public class ServletTest extends HttpServlet {


/* doGet 이나 doPost 라는 메소드를 선언하고, 그 안에 서블릿 클래스가 호출되었을 때 해야 할 일을 써 넣어야 한다. */

public void goDet(HttpServletRequest request, HttpServletResponse response) throws ServletException. IOException {

PrintWriter out = response.getWriter();

out.println("<HTML>");

out.println("<HEAD><TITLE>Sum of 1 to 100</TITLE></HEAD>");

out.println("<BODY>");

int total = 0;

for ( int cnt = 1; cnt <= 100; cnt++ ) {

total += cnt;

out.println("1 + 2 + 3 + 4 + ... + 100 = " + total );

out.println("</BODY>");

out.println("</HTML>");

}

}

}



- 서블릿의 장점

1. 자바기반

2. 자바의 플랫폼 독립성은 서블릿 클래스의 실행 코드를 다양한 컴퓨터와 운영체제에 옮겨서 그대로 사용할 수 있게 한다.

3. 예) UNIX 운영체제에서 개발한 서블릿 클래스를 윈도우즈 운영체제에 설치해서 사용할 수 있고, 테스크탑 컴퓨터에서 개발한

   서블릿 클래스를 그외 다른 기종의 서버급 컴퓨터에서 설치해서 사용할 수 있다.

4. 네트워크 환경에서 보안이 용이하고, 프로그래밍 언어수준에서 멀티 스레드 기능이 지원된다.

   (때문에, 불특정 다수의 사용자들이 웹 서버에 접속했을 때에도 컴퓨터가 다운되지 않고 안정적으로 작동 한다.)

5. 자바가 제공하는 풍부한 라이브러리는 프로그래머로 하여금 적은 노력으로 양질의 웹 에플리케이션을 작성할 수 있게 한다.


- 서블릿의 단점

1. HTML 코드가 자바 코드 안으로 들어가는 구조로 HTML 문서의 구조를 이해하기 어렵게 만들고, 웹 페이지의 디자인

   작업을 위해서도 소스 코드에 손을 대게 만드는 비효율성을 낳는다.


위의 서블릿의 단점 때문에 자바의 유용한 장점을 살리면서 서블릿 기술의 단점을 보완하는 새로운 기술인 JSP 가 개발되었다.

※ JSP 페이지는 서블릿 클래스와 반대로 HTML 문서에 자바코드가 삽입되는 구조를 갖는다.

'공부 > SERVLET' 카테고리의 다른 글

SERVLET_[톰캣의 서블릿 클래스 등록]  (0) 2012.09.08
SERVLET_[XML 문법의 기초]  (0) 2012.09.08
●벡터(Vector)

   1. 대용량의 데이터를 효과적으로 다룰 수 있는 클래스

   2. 용량의 변경이 용의

   3. 벡터에 저장하는 모든 데이터는 Object타입

   4. 어떤 종류의 객체도 함께 담을 수 있다.

   +++ 배열의 크기를 한번 정해지면 변경 불가하고 같은 종류의 데이터만

        사용할 수 있다는 단점 보안

 

벡터 생성자

   1. Vector :  초기용량이 10, 용량 초과시 크기를 두배 씩 증가

   2. Vector(int aaa) : 지정한 크기의 용량으로 초기화된 Vector 객체를 생성한다.

   3. Vector(int aaa, int bbb) : 지정한 크기의 용량으로 초기화된 벡터객체를 생성하고

                                          용량 초과시 bbb만큼 증가 시킨다.

※ 일반적으로 용량의 문제가 거의 발생하지 않기 때문에 보통 인자가 없는

    생성자를 사용하여 벡터 객체를 생성한다.      Vector v = new Vector();

 

●벡터에 객체 저장

  메소드

   1. void add(int index, Object object) - 지정한 인덱스의 위치에 객체를 추가함

   2. void addElement(Object objec) - 벡터의 끝에 객체를 추가한다

        Vector v = new Vector();

        v.add(1, "객체명");             //지정한 위치에 객체 추가

        v.addElement("객체명");     //마지막에 객체 추가

        v.addElement("객체명");     //마지막에 객체 추가

 

●벡터로 부터 객체 삭제

  메소드

1.       Object remove(int index) ? 지정한 위치의 객제를 벡터에서 제거

2.       boolean remove(Object object) ? 지정한 객체를 벡터에서 제거

3.       void clear() ? 벡터의 모든 요소를 제거

예) Vector v = Vector();            //벡터 생성

   v.remove(int index);                        //지정한 위치의 객체 제거

   v.remove(“객체명”);            //지정한 객체 제거

   v.clear();                        //벡터의 모든 요소를 제거

 

●벡터로 부터 객체 검색

  메소드

1.       Object elementAt(int index) ? 지정한 위치의 객체를 리턴

2.       Object get(int index) ? 지정한 위치의 객체를 리턴

※ 벡터에 요소를 추가할 때는 String형을 그대로 사용할 수 있지만 검색한 결과는 Object형이므로 사용하기 위해서는 원래 데이터형으로 캐스팅해야 한다.

예) Vector v = Vector();                        //벡터 생성

   String s = (String)v.elementAt(0);            //지정한 위치의 객체를 리턴

   String s2 = (String)v.get(1);                   //지정한 위치의 객체를 리턴

   Enumeration e = v.elements();            //Vector의 요소의 리스트를 리턴

    Iterator과 비슷한 역할(저장 객체 추출)

 

 

●벡터의 기타 메소드

1.      int capcity() ? 벡터의 현재 용량의 리턴

2.      boolean contains(Object object) ? 주어진 요소가 벡터에 있는지 알아낸다.

3.      int indexof(Object object) ? 주어진 요소의 위치를 리턴(없으면 -1)

4.      int size() ? 벡터에 포함되어 있는 요소의 수를 리턴

5.      void trimToSize() ? 벡터의 용량을 현재 벡터의 크기에 맞게 수정

 

●Enumeration

벡터에 저장된 객체를 열거형으로 리턴

  Enumeration e = v.elements();               //Vector의 요소의 리스트를 리턴

     While(e.hasMoreElements()) {

    System.out.println(e.nextElement());

}

 

●Iterator

Collection에 저장된 객체를 나열 또는 열거하기 위한 인터페이스

  Iterator ie = v.iterator();         //Vector의 요소의 리스트를 리턴

  While(ie.hasNext()){

    System.out.println(ie.next());

}

 

● Stack

1.      Object를 저장하는 하나의 방법

2.       가장 나중에 들어간 데이터가 가장 먼저 밖으로 나오는 형태

LIFO(Last In First Out)

예) import java.util.*;

public class StackTest{

public static void main(String[] args){

      Stack s = new Stack();

      System.out.println(s.empty());           //스택이 비어있는지 확인 true

      s.push(“데이타1”);           //데이터 넣기

      s.push(“데이타2”);

      System.out.println(s.empty());           //false

      System.out.println(s.peek());   //가장 먼저 나올 데이타(데이타1)

      System.out.println(s.pop());           //스택에 저장 되어 있는 차례로 출력

      System.out.println(s.pop());

      System.out.println(s.empty());            //스택이 비어있는지 확인 true

}

}

 

●LinkedList

1.      List 인터페이스의 링크 리스트의 구현

2.      void add(int index, Object element) ? 지정된 위치에 지정된 요소 삽입

void addLast(Object element) ? 리스트의 마지막에 지정된 요소 추가

Object get(int index) ? 지정된 위치에 있는 요소 리턴

Object getLast() ? 리스트내의 마지막 요소 리턴

Object remove(int index, Object element) ? 지정된 위치에 있는 요소 삭제

3.      데이터의 첨가, 삭제가 편리하고 속도가 빠르다.

 

● Map & hashing

키와 값의 쌍으로 이루어진 요소를 저장하는 자료구조

해싱이란 키객체를 처리하여 hash code(정수값)를 만들어 내는 방법이다.

 

●HashMap

Null허용, Map interface를 implements한 클래스

 

●Hashtable

Null 허용하지 않음, Map interface를 implements한 클래스

 

'공부 > JAVA' 카테고리의 다른 글

JAVA_[ Int & Integer 차이 ]  (0) 2013.03.22
JAVA_[날짜 형식 변경(SimpleDateFormat)]  (0) 2012.11.12
JAVA_[Thread]  (0) 2012.06.23
JAVA_[객체_직렬화]  (0) 2012.06.23
JAVA_[Adapter_패턴 (일명 : Wrapper 패턴)]  (0) 2012.06.23

package util;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

public class CookieBox {

    private Map<String, Cookie> cookieMap = new java.util.HashMap<String, Cookie>();
   
    public CookieBox(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
            if ( cookies != null ) {
                for ( int i = 0; cookies.length > i; i++ ) {
                    cookieMap.put(cookies[i].getName(), cookies[i]);
                }
            }
    }
   
    public static Cookie createCookie(String name, String value) throws IOException {
        return new Cookie(name, URLEncoder.encode(value, "euc-kr") );
    }
   
    public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException {
       
        Cookie cookie = new Cookie(name, URLEncoder.encode(value, "euc-kr") );
        cookie.setPath(path);
        cookie.setMaxAge(maxAge);
        return cookie;
    }
   
    public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException {
       
        Cookie cookie= new Cookie(name, URLEncoder.encode(value, "euc-kr") );
        cookie.setDomain(domain);
        cookie.setPath(path);
        cookie.setMaxAge(maxAge);
        return cookie;
    }
   
    public Cookie getCookie(String name) {
       
        return cookieMap.get(name);
    }
   
    public String getValue(String name) throws IOException {
       
        return URLDecoder.decode(cookieMap.get(name).getValue(), "euc-kr");
    }
   
    public boolean exists(String name) {
       
        return cookieMap.get(name) != null;
    }
}

'공부 > JAVA_UTILL_CLASS' 카테고리의 다른 글

UTILL_[파일업로드]  (0) 2012.11.19

+ Recent posts