세이박스

'웹프로그램'에 해당되는 글 286건

  1. 자바스크립트 팝업 이미지 클릭시 <a 사용하지 않고 띄우기
  2. favicon.ico 파비콘을 손쉽게 만들어 주는 사이트
  3. text-overflow 이용한 텍스트 길이 제한하기
  4. [PHP] 보안서버(ssl)에서 메일 발송 하기
  5. [style] 세이박스 메인 탑메뉴 처럼 메뉴 텍스트(text)에 그림자 효과 주기
  6. 자바스크립트 우클릭, 드래그, CTRL+C 막기
  7. IE 8.0에서 iframe 스크롤 생기는 문제 body style로 스크롤바 없애기
  8. [javascript] 지정된 영역만 자바스크립트로 출력 하기
  9. input 리스트가 배열로 반복될경우, 자바스크립트로 원하는 리스트 선택하기
  10. php DB 인젝션 공격 방어
  11. html 태그 책깔피 기능
  12. CSS style 테두리 부분 적으로 라인 표시 하기
  13. JDK 5.0, JDK Doc, Tomcat 5.5.9 다운로드
  14. 정규식 (Regular Expression) 특수문자 처리
  15. [자바스크립트] 강력한 소스 보호
  16. AJAX 금액을 입력할때 세자리마다 컴마찍기
  17. 초간단 AJAX 샘플
  18. IIS에서 JSP or Java Servlet 돌리는 방법
  19. JDK 다운로드 및 설치 방법
  20. 친절한 톰캣(Tomcat)의 기능 개요 및 설치 방법
  21. Java로 구현하는 간단한 Client & Server 프로그램
  22. JSP 페이지 이동 4가지 방법 및 특성
  23. JPG 저장된 DB 이미지 JSP로 보여주기
  24. JSP 폼메일 예제
  25. JSP include 집중해부
  26. JSP 오라클8i 글자수 무제한 게시판소스
  27. JSP 동적 이미지(실시간 그래프) 생성하기
  28. JSP UTF-8로 파일 저장하기
  29. JSP 파일 업로드
  30. JSP 세션을 이용한 카운터

자바스크립트 팝업 이미지 클릭시 <a 사용하지 않고 띄우기

웹프로그램
팝업을 띄울 때 하이퍼링크 <a></a> 테그를 사용하지 않고 이미지에 바로 적용하고 싶을 때 다음과 같이 처리 할 수 있습니다.

<img src="이미지.gif" style="border:0;cursor:pointer" onClick="window.open('popup.html','팝업','width=532,height=520,toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=no,left=150,top=100')">

각 항목 별로 설명 하겠습니다.

src : 이미지 경로 입니다.

style : 이미지에 대한 스타일 지정

- border : 이미지의 테두리 선을 보이지 않게 하기 위해서 두께를 0 (픽셀)을 줬습니다.

- cursor : 하이퍼 링크 테그가 적용되지 않아 이미지에 마우스를 올려 놓을 때 아무런 반응이 없으면 링크가 걸려 있는지 확인이 안되겠죠. 따라서, 이미지에 마우스가 올라 올때 손가락 모양으로 표시되도록 마우스 포인터 모양을 "pointer"로 적용 했습니다.

onClick : 이미지를 클릭시 발생하는 이벤트로 자바스크립트 바로 입력 가능합니다.

- window.open() : 자바스크립트의 팝업 함수 입니다. 윈도우 창을 열라는 뜻. () 안에 윈도우 창(팝업)에 대한 설정을 입력합니다. onClick="" 에서 이미 " " 쌍따옴표를 사용했으므로 window.open() 안에서는 ' ' 홀따옴표로 각 옵션을 구분합니다. (' 팝업주소','팝업명','팝업속성')

1. 첫번째 ' ' 홀따옴표 안에 팝업으로 띄울 웹페이지 URL을 넣습니다.

2. 두번째 ' ' 홀따옴표 안에 팝업 구분값을 넣습니다. 만약 팝업을 2개이상 띄울 때 같은 이름이면 기존 팝업안에서 팝업 내용이 나타나게 됩니다. 팝업이 하나라면 아무 이름을 사용해도 상관 없습니다.

3. 세번째 ' ' 홀따옴표 안에 팝업 속성값을 넣습니다.

- width : 팝업 창 폭 (픽셀)

- height : 팝업 창 높이 (픽셀)

- toolbar : 팝업 창 상단 툴바 표시 유무 (yes, no)

- location : 팝업 창 상단 주소줄 입력란 표시 유무 (yes, no)

- status : 팝업 창 하단 상태 표시 부분 표시 유무 (yes, no)

- menubar : 팝업 창 상단 메뉴 부분 표시 유무 (yes, no)

- scrollbars : 팝업 창 우측 스크롤 부분 표시 유무 (yes, no, auto)

- resizable : 팝업 창 크기 조절 가능 유무 (yes, no)

- left : 팝업 창 뜰 때 위치 모니터의 좌측 (0,0) 기준 오른쪽으로 이동 거리 (픽셀)

- top : 팝업 창 뜰 떄 위치 모니터의 좌측 (0,0) 기준 아래쪽으로 이동 거리 (픽셀)

* 위 팝업 속성 이외에도 더 있는걸로 아는데 기본적으로 사용하는 것만 적용 했습니다.

만약, window.open() 함수를 이용해서 팝업을 띄울 때 위 옵션들을 모두 yes 즉, 새창으로 띄우고 싶다면 다음과 같이 하시면 됩니다.

<img src="이미지.gif" style="border:0;cursor:pointer" onClick="window.open('popup.html','_blank')">

아주 간단하죠!

지금까지 이미지에 하이퍼링크를 이용하지 않고 띄우는 방법이었습니다.

감사합니다. ^.^

favicon.ico 파비콘을 손쉽게 만들어 주는 사이트

웹프로그램
사용자 삽입 이미지
favicon.ico 파일을 처음 접하시는 분이라면 어떻게 만들어야 할지 고민되시죠.

http://www.favicon.cc 라는 사이트에서 손쉽게 만들수 있도록 해줍니다.

그림판 처럼 dot 펜으로 콕콕 찍어서 그림을 그리시면 아래쪽에 미리보기가 나옵니다.

완성 되었으면 아래 다운로드를 클릭하시면 favicon.ico 파일로 저장이 됩니다.

다운 받은 favicon.ico 파일을 웹서버에 업로드 하신뒤 웹소스에 아래 한줄을 추가 해주시면됩니다.

<link rel="Shortcut Icon" href="http://www.saybox.co.kr/favicon.ico">

당근, href="자신의 파비콘 파일" 이부분은 자신의 파비콘 경로로 바꿔주셔야겠죠!

제대로 적용 되었다면 웹주소란 또는 즐겨찾기 추가시 해당 아이콘이 붙습니다.

근데, 왜 저의 브라우저에선 보이지 않을까요? 그런데, 글을 왜 올렸을까나 ㅋㅋ

매우 간단하죠! ^^

작성 : 세이박스 www.saybox.co.kr

text-overflow 이용한 텍스트 길이 제한하기

웹프로그램
게시판 리스트의 경우 제목이 길어지는 경우 특정 길이 이상은 자르고 "..." 붙이는거 많이 보셨을겁니다.
보통 php의 경우 substr() 함수를 이용하거나 left() 함수등 언어에 따라 다양하게 활용하는데
style로 간단하게 적용할 수 있습니다.
text-overflow 옵션을 활용하는 것입니다.

ellipsis
<nobr style="text-overflow:ellipsis;overflow:hidden;width:300px">내용</nobr>

ellipsis-word
<nobr style="text-overflow-mode:ellipsis-word ;overflow:hidden;white-space:nowrap;width:200px;">내용</nobr>

clip
<nobr style="text-overflow:clip;overflow:hidden;width:300px;">내용</nobr>

inherit
<nobr style="text-overflow:inherit;overflow:hidden;width:300px;">내용</nobr>

링크에적용1
<nobr style="text-overflow:ellipsis;overflow:hidden;width=300px;cursor:Hand">내용</nobr>

링크에적용2
<nobr class="nobr" style="width:120px;"><a href="javascript:goView(<%=BBS_SEQ%>);">내용</a></nobr>

테이블에 적용
<table width='200' border='0' cellpadding='0' cellspacing="0" style='table-layout:fixed;' cellspace='0'><tr>
<td><nobr style="text-overflow:ellipsis;width:200px;overflow:hidden;">내용</nobr></td>
</tr></table>

------------------------------------------------------------------------------------
#example1 {text-overflow-mode: clip; width: 200px; overflow:hidden;white-space : nowrap; }
#example2 {text-overflow-mode: ellipsis; width: 200px; overflow:hidden;white-space : nowrap; }
#example3 {text-overflow-mode: ellipsis-word; width: 200px; overflow:hidden;white-space : nowrap; }
------------------------------------------------------------------------------------


white-space :
요소 안에서의 띄어쓰기와 같은 빈 공간을 조절할 때 사용합니다.

white-space에 사용되는 값
normal : 줄 바꿈 디볼트 값을 유지합니다.
pre : 문서 소스에 서식을 할당해서 문서가 표시되게 합니다.
nowrap : 요소 내에서 줄바꿈이 되지 않습니다.

예제)
H1 {white-space: nowrap}
H1에서의 줄바꿈을 하지 않도록 설정합니다.
 

[PHP] 보안서버(ssl)에서 메일 발송 하기

웹프로그램
보안 서버로 ssl 적용 후 부터 php 메일 발송시 발송이 안되기 시작하였다.

원인을 확인 해보니 보안 smtp 로 발송해야 한다는 사실을 알게 되었다.

그래서, 이래저래 알아보니 메일 서버가 별도로 있는경우 보안 릴레이 방식으로 발송을 하면 된다는것을 알게되어 적용 하였다.

먼저, 메일서버의 릴레이 발송할 개정이 하나 있어야 한다.

다음 함수에 메일서버 ip 및 릴레이 개정 정보를 입력하시면 됩니다.

function sendmail($name, $from, $to, $subject, $body, $html, $charset ) {
 $smtp_server   = "아이피"; //stmp ip를 입력
 $smtp_user = "아이디"; //smtp id 입력
 $smtp_passwd = "비밀번호"; //smtp 비밀번호 입력

 if(!$smtp_sock = fsockopen("$smtp_server", 25)) {
  return false;
 }
 fputs($smtp_sock, "AUTH LOGIN\n");
 fputs($smtp_sock, base64_encode($smtp_user)."\n");
 fputs($smtp_sock, base64_encode($smtp_passwd)."\n");
 fputs($smtp_sock, "HELO $smtp_server\n");
 fputs($smtp_sock, "VRFY $stmp_user\n");
 fputs($smtp_sock, "MAIL FROM:$from\n");
 fputs($smtp_sock, "RCPT TO:$to\n");
 fputs($smtp_sock, "DATA\n");
 fputs($smtp_sock, "From: $name<$from>\n");
 fputs($smtp_sock, "X-Mailer: miplus\n");  
 if($html) fputs($smtp_sock, "Content-Type: text/html;");
 else fputs($smtp_sock, "Content-Type: text/plain;");  
 fputs($smtp_sock, "charset=$charser\n");
 fputs($smtp_sock, "MIME-Version: 1.0\n");
 fputs($smtp_sock, "Subject: $subject\n");
 fputs($smtp_sock, "To: $to\n");
 fputs($smtp_sock, "$body");
 fputs($smtp_sock, "\n.\nQUIT\n");
 fclose($smtp_sock);
 return true;
}

$text = "<html><body>test</body></html>"; //html 방식으로 발송 가능
$subject = "메일제목";
$from = "
custom@test.co.kr"; //발송자 이메일 주소
$from_name = "이름"; //발송자 이름
$to =
member@test.co.kr" //수신자 이메일 주소
$html = 1; //HTML 테그 1:사용, 0:사용안함
$charset = "UTF-8"; //언어 EUC-KR, UTF-8

if(sendmail($from_name,$from,$to,$subject,$text,$html,$charset)) {
   echo "발송완료";
} else {
   echo "발송실패";
}

빨간색으로 표시한 부분만 설정에 맞게 고쳐서 이용하시면 됩니다.

[style] 세이박스 메인 탑메뉴 처럼 메뉴 텍스트(text)에 그림자 효과 주기

웹프로그램
사용자 삽입 이미지
텍스트 메뉴에 그림자 스타일 효과 주기

filter:shadow() 를 이용하면 됩니다.

예) 흰색 메뉴 글자에 검정색 그림자 1px 효과 입니다.
<span style="color:#FFFFFF;filter:shadow(color=#000000,direction=135,strength=1);">메뉴1</span>

위 예제의 shadow 옵션 설명
color : 그림자 색상
direction : 그림자 각도
strength : 그림자 길이

세이박스 메인 탑메뉴에 그림자 효과를 주기위해 옵션을 여기 저기 찾아 보니 원하는 효과가 없었습니다.
1픽셀만큰 그림자 효과를 주고 싶었는데 알고보니 세이박스 게시글에 strength 옵션에 대해 제가 과거에 올려 놨었더군요.

http://www.saybox.co.kr/bbs/board.php?bo_table=board06&wr_id=21

먼곳에서 찾는다고 고생했다는 ㅋㅋ ^^;

자바스크립트 우클릭, 드래그, CTRL+C 막기

웹프로그램

웹사이트를 보호하기 위한 기능으로 마우스 우측 클릭 막기, 텍스트 블럭 지정 복사 막기, 드래그 막기등이 있습니다.
물론 맘만 먹으면 웹마 등을 이용하여 조금 번거롭게 가져갈 수는 있습니다.
이처럼, 가져가더라도 손쉽게 가져가지 못하도록 하는 방법으로 아래와 같이 아주 간단하게 삽입 할 수 있습니다.

<body oncontextmenu="return false" onselectstart="return false" ondragstart="return false">

마우스 우측 클릭 막기
oncontextmenu = "return false"

텍스트 블럭지정 복사 막기
onselectstart = "return false"

마우스 드래그 막기
ondragstart = "return false"

IE 8.0에서 iframe 스크롤 생기는 문제 body style로 스크롤바 없애기

웹프로그램

사용자 삽입 이미지

iframe으로 광고 페이지를 삽입할 때  스크롤바 없애기

<iframe id="xxx" src="zzz" width="100" height="200" scrolling="0" frameborder="0" vspace="0" hspace="0"></iframe>

IE 8.0 에서는 위처럼 하더라도 iframe src 페이지 내용이 100*200을 넘어 버리면 스크롤이 생겨버립니다.

해결 방법은 src 페이지의 body style을 변경 해야합니다.

<body style="overflow-x:hidden; overflow-y:hidden;">


[옵션 설명]

- hidden : 스크롤 없애기

- auto : 내용이 지정된 사이즈 이상일때 자동으로 스크롤 생성

- visible : 사이즈에 관계 없이 내용 모두 보여준다

- scroll : 시작부터 스크롤바 생김



위 글은 세이박스(http://www.saybox.co.kr) 에서 작성한 글입니다. 퍼가실땐 출처를 남겨 주세요!

[javascript] 지정된 영역만 자바스크립트로 출력 하기

웹프로그램

대부분 팝업을 띄워서 필요한 부분을 다시 읽어 들여서 출력을 많이 하는데 출력을 위해서 페이지를 추가로 만들어야 하는 번거로움이 생긴다.
이럴 경우 자바스크립트로 특정 부분을 지정하여 출력할 수 있다.

<script type="text/javascript">
function printIt(printThis)
{
    var win = null;
    win = window.open();
    self.focus();
    win.document.open();
    win.document.write("필요한내용을 추가로 이렇게 넣을수도 있습니다.<br>");
    win.document.write(document.getElementById('printarea').innerHTML);
    win.document.close();
    win.print();
    win.close();
}
</script>
<table>
  <tr>
    <td id="printarea">
       출력할 내용 테이블이 될수도 이미지가 될 수도 어떤 내용이든 출력 이영역 안에 내용만 출력
    </td>
  </tr>
</table>

위 소스처럼 굵게 입력한 id 값 이후 내용을 출력하게 됩니다.
따라서, div를 이용할 경우 <div id="test">내용</div> 처럼 적용하실 수도 있습니다.
출력할때만 추가적으로 내용을 넣고 싶다면 script에서 document.write를 추가하시면 됩니다.
응용해서 적용해 보시기 바랍니다. ^^

위 글은 세이박스에서 작성한 글이므로 가져 가실 때 출처 남겨 주세요! ㅋㅋ


input 리스트가 배열로 반복될경우, 자바스크립트로 원하는 리스트 선택하기

웹프로그램

input을 name 값을 배열로 반복해서 값을 담은뒤 자바스크립트에서 값을 불러 오기 위해서는 elements[] 를 이용하면 됩니다.

<input type="text" name="a[0]" value="111">
<input type="text" name="a[1]" value="222">

var b = document.list1.elements["a["+num+"]"].value;

num은 input 의 배열값입니다.
num = 0 => 111
num = 1 => 222
값이 되겠죠.

php DB 인젝션 공격 방어

웹프로그램
인젝션 방어를 위한 처리를 하기 위해선
get, post 로 넘어오는 모든 변수중에서 DB에 사용될 변수에 대해 검수를 거친뒤에 DB에서 사용하도록 해야하나 이미 구축된 사이트에 일일이 적용하기엔 힘들 경우 아예 get, post 데이터 전체를 검사하도록 다음과 같이 구현해 봤습니다.

//인젝션 공격 막기 넘어오는 변수들 모두 검사

//GET
while(list($fildn1,$fildv1) = each($_GET)) {
  if(eregi("--",$fildv1)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

//POST
while(list($fildn2,$fildv2) = each($_POST)) {
  if(eregi("--",$fildv2)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

일단 인젝션 공격에 대표적인 문구인 "--" 하나 넣어 봤는데 필요시 "--|;|\.js" 처럼 "|"로 구분해서 추가 하면 되겠죠!
물론, 정상적인 값들까지 차단 될 수 있다는 문제가 있긴 합니다.
따라서, 차단할 패턴은 잘 선택해서 입력하세요.
그리고, ".js" 앞에 "\" 표시 붙인 이유는 "." 점이 정규식 예약어라서 무시하도록 하기 위해 "\"원화 표시를 붙여 줍니다.
정규식 예약어는 세이박스에서 조회 해서 확인 하세요!

하지만, 효율성을 위해서 사이트 구축시 처음부터 인젝션 공격을 고려해서 코딩 하세요!
이게 정답이다 할만한건 없지만 자신의 사이트에 맞는 최적화 방법이 최고 입니다.

예로 들자면 $num 이라는 변수에는 단순 숫자만 넘어와야한다면
if(eregi("[^0-9]",$num)) echo "접속차단";

이런식으로 필요하지 않는 값을 원천적으로 차단 해주는게 가장 좋습니다.
이유인즉, 최근에는 Ascii 코드 값으로 문자를 만들어 공격 하기도 합니다.
이럴경우 제가 만든 소스로는 좀 힘들겠죠...

그럼, 여러분들이 만들어 두신 좋은 차단 방법 좀 있으면 올려주세요~
화이팅!!

html 태그 책깔피 기능

웹프로그램
책을 읽다가 특정 위치에 라벨지를 붙여서 언제든지 쉽게 찾을 수 있도록 하는 기능처럼
웹페이지 에서도 책깔피 기능이 있다.

/test.html 페이지를 접속후 페이지 내용중 특정 위치로 이동하고자 한다면

특정 위치에 <a name="책깔피1"></a> 이라고 삽입을 해두고

/test.html#책깔피1

처럼 # 표시 뒤에 책깔피 이름을 입력후 접속하면 해당 위치로 이동합니다.

예) 다음 주소로 이동해보세요 폰페이지 상세 정보로 이동

http://www.gooddaysports.co.kr/phone/?bset=list&flag=4#bookmark23

CSS style 테두리 부분 적으로 라인 표시 하기

웹프로그램
테이블을 만들때 라인 색을 특정 부위만 표시 하고자 할 때가 있죠 이럴때 다음과 같이 스타일시트 적용 하시면 됩니다.

1. 상단 라인
border-top:1 solid #DADADA;

2. 우측라인
border-right:1 solid #DADADA;

3. 하단 라인
border-bottom:1 solid #DADADA;

4. 좌측라인
border-left:1 solid #DADADA;

예) 테이블 좌,우측만 라인 표시하기
<table border="0">
  <tr>
    <td style="border-left:1 solid #DADADA;border-right:1 solid #DADADA;">내용</td>
  </tr>
</table>

JDK 5.0, JDK Doc, Tomcat 5.5.9 다운로드

웹프로그램


1.
 JDK(Java Development Kit) 다운로드

  JDK를 다운 받기 위해서 Sun사의 홈페이지에 접속한다.
다운로드 페이지(http://java.sun.com/j2se/downloads/index.html)에서 J2SE 5.0을 선택한다


  Download JDK 5.0 Update 4를 한다.


  다운로드 받기 위해서는 라이센스에 동의하라는 메시지가 나온다. Accept를 선택한다.



  사용하는 운영체제를 선택하여 파일을 다운로드 한다. 현재 예제에서는 운영체제를 윈도우로 선택한다. 파일 다운로드 창이 뜨면 저장을 누른다.


  원하는 위치에 파일을 저장한다.





 
2.  Help 파일 다운로드

  Help 파일을 다운 받기 위해서 Sun사의 홈페이지에 접속한다.
아래 링크로 접속하여 J2SE 5.0 Documentation을 다운받는다.
http://java.sun.com/j2se/1.5.0/download.jsp


  Accept를 선택한다.



 

  파일 다운로드 창이 뜨면 저장을 누른다.



 

  원하는 위치에 파일을 저장한다.




 

3.  Tomcat 다운로드

  Tomcat을 다운 받기 위해서 www.apache.org의 홈페이지에 접속한다.
다운로드 페이지(http://jakarta.apache.org/site/downloads/downloads_tomcat.html)에서 Tomcat 5를 선택한다.



  5.5.9 의 Binary 파일중에서 5.5.9.exe 파일을 선택하고 파일 다운로드 창이 뜨면 저장을 누른다.




  원하는 위치에 파일을 저장한다.







 


  웹브라우저에서 Tomcat을 설정할 수 있도록 Tomcat Admin을 다운받는다.
5.5.9 의 Binary 파일중에서 5.5.9 Admin zip을 선택하고 파일 다운로드 창이 뜨면 저장을
누른다
.




  원하는 위치에 저장한다.





 

정규식 (Regular Expression) 특수문자 처리

웹프로그램

(1) ^ (caret)
라인의 처음이나 문자열의 처음을 표시

예 : ^aa (문자열의 처음에 aa를 포함하면 참, 그렇지 않으면 거짓)

(2) $ (dollar)
라인의 끝이나 문자열의 끝을 표시

예 : aaa$ (문자열의 끝에 aaa를 포함하면 참, 그렇지 않으면 거짓)

(3) . (period)
임의의 한 문자를 표시

예 : ^a.c (문자열의 처음에 abc, adc, aZc 등은 참, aa 는 거짓)
예 : a..b$ (문자열의 끝에 aaab, abbb, azzb 등을 포함하면 참)

(4) [] (bracket)
문자의 집합이나 범위를 나타냄, 두 문자 사이의 범위는 "-" 사용.
[]내에서 "^"이 선행되면 not을 나타냄

예 : [abc] (a, b, c 중 어떤 문자, "[a-c]."과 동일)
예 : [Yy] (Y 또는 y)
예 : [A-Za-z0-9] (모든 알파벳과 숫자)
예 : [-A-Z]. ("-"(hyphen)과 모든 대문자)
예 : [^a-z] (소문자 이외의 문자)
예 : [^0-9] (숫자 이외의 문자)

(5) {} (brace)
{} 내의 숫자는 직전의 선행문자가 나타나는 횟수,범위를 나타냄

예 : a{3} ('a'의 3번 반복인 aaa만 해당됨)
예 : a{3,} ('a'가 3번 이상 반복인 aaa, aaaa,  ... 등을 나타냄)
예 : a{3,5} (aaa, aaaa, aaaaa 만 해당됨)
예 : ab{2,3} (abb와 abbb 만 해당됨)
예 : [0-9]{2} (두 자리 숫자)
예 : doc[7-9]{2} (doc77, doc87, doc97 등이 해당)
예 : [^Zz]{3} (Z와 z를 포함하지 않는 5개의 문자열, abc, ttt 등)
예 : .{3,4}er ('er'앞에 세 개 또는 네 개의 문자를 포함하는 문자열이므로 Peter, mother 등이 해당)

(6) * (asterisk)
"*" 직전의 선행문자가 0번 또는 여러번 나타나는 문자열

예 : ab*c ('b'를 0번 또는 여러번 포함하므로 ac, abc, abbbc 등)
예 : * (선행문자가 없는 경우이므로 임의의 문자열 및 공백 문자열)
예 : .* (선행문자가 "."이므로 하나이상의 문자를 포함하는 문자열)
예 : ab* ('b'를 0번 또는 여러번 포함하므로 a, accc, abb 등)
예 : a* ('a'를 0번 또는 여러번 포함하므로 k, kd, a, aa, abb 등)
예 : doc[7-9]* (doc7, doc777, doc778989, doc 등이 해당)
예 : [A-Z].* (대문자로만 이루어진 문자열)
예 : like.* (직전의 선행문자가 '.'이므로 like에 0 또는 하나 이상의 문자가 추가된 문자열이 됨, like, likely, liker, likelihood 등)

(7) + (Plus Sign)
"+" 직전의 선행문자가 1번 이상 나타나는 문자열

예 : ab+c ('b'를 1번 또는 여러번 포함하므로 abc, abcd, abbc 등)
예 : ab+ ('b'를 1번 또는 여러번 포함하므로 ab, abcc, abb 등)
예 : [A-Z]+ (대문자로만 이루어진 문자열)
예 : like.+ (직전의 선행문자가 '.'이므로 like에 하나 이상의 문자가 추가된 문자열이 됨, likely, liker, likelihood 등, 그러나 like는 해당안됨)

(8) ? (question mark)
"?" 직전의 선행문자가 0번 또는 1번 나타나는 문자열

예 : ab?c ('b'를 0번 또는 1번 포함하므로 abc, abcd 만 해당됨)

(9) () (parenthesis)
()는 정규식내에서 패턴을 그룹화 할 때 사용

(10) | (bar)
or를 나타냄

예 : a|b|c (a, b, c 중 하나, 즉 [a-c]와 동일함)
예 : yes|Yes (yes나 Yes 중 하나, [yY]es와 동일함)
예 : korea|japan|chinese (korea, japan, chinese 중 하나)

(11) \ (backslash)
위에서 사용된 특수 문자들을 정규식내에서 문자로 취급하고 싶을 때 '\'를 선행시켜서 사용하면됨

예 : filename\.ext ("filename.ext"를 나타냄)
예 : [\?\[\\\]] ('?', '[', '\', ']' 중 하나) 

[자바스크립트] 강력한 소스 보호

웹프로그램

소스 못 퍼가게 하는 전형적인 예입니다.

body tag에 다음을 선언합니다.

<body oncontextmenu="return false" ondragstart="return false" onkeydown="return false" onselectstart="return false">

.
.
.

</body>

oncontextmenu="return false" - 마우스 오른쪽 버튼을 눌렀을 때 나오는 메뉴창(contextmenu)을 안나오게 합니다.
ondragstart="return false" - 문서내에서 드래그하여 하여 끌어내는 것 막기
xxonkeydown="return false" - Ctrl + C(복사) 와 같은 단축키 막기, 사용시 모든 키는 먹통이 됩니다.
xxonselectstart="return false" - 문서의 내용을 마우스로 선택하는 것 막기

return false의 의미는 '돌아오는 값을 무시 한다'라 정도로 이해 하시면 됩니다.

만약 마우스로 어떤 부분을 선택하려 할 때 return false로 인해 그게 무시 되는거죠.. ^^;
참고로 return true는 위와 반대의 의미 입니다.

AJAX 금액을 입력할때 세자리마다 컴마찍기

웹프로그램

<html>
<head>
<title>컴마찍기</title>
<script Language='Javascript'>
<!--
function comma(comma_rstr) {                
    var nocomma = comma_rstr.value.replace(/,/gi,''); // 불러온 값중에서 컴마를 제거
    var b = ''; // 값을 넣기위해서 미리 선언
    var i = 0; // 뒤에서 부터 몇번째인지를 체크하기 위한 변수 선언
    for (var k=(nocomma.length-1); k>=0; k--) { // 숫자를 뒤에서 부터 루프를 이용하여 불러오기
        var a = nocomma.charAt(k);
        if (k == 0 && a == 0) {  // 첫자리의 숫자가 0인경우 입력값을 취소 시킴
            comma_rstr.value = '';
            return;
        }
        else {
            if (i != 0 && i % 3 == 0) { // 뒤에서 3으로 나누었을때 나머지가 0인경우에 컴마 찍기 i가 0인 경우는 제일 뒤에 있다는 것이므로 컴마를 찍으면 안됨
                b = a + "," + b ;
            }
            else { // 나머지가 0인 아닌경우 컴마없이 숫자 붙이기
                b = a + b;
            }
            i++;
        }
    }
    comma_rstr.value = b; // 최종값을 input값에 입력하기
    return;
}
//-->
</script>

</head>

<body>
<form name=commatest>
<input type=text name=commatestinput onKeyup=comma(document.commatest.commatestinput)>
</form>
</body>
</html>

초간단 AJAX 샘플

웹프로그램

간단하게 테스트 할 수 있는 샘플이다.

<html>
<head>
<title>Simple Ajax Example</title>
<script language="Javascript">
function xmlhttpPost(strURL) {
    var xmlHttpReq = false;
    var self = this;
    // Mozilla/Safari
    if (window.XMLHttpRequest) {
        self.xmlHttpReq = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    self.xmlHttpReq.open('POST', strURL, true);
    self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    self.xmlHttpReq.onreadystatechange = function() {
        if (self.xmlHttpReq.readyState == 4) {
            updatepage(self.xmlHttpReq.responseText);
        }
    }
    self.xmlHttpReq.send(getquerystring());
}

function getquerystring() {
    var form     = document.forms['f1'];
    var word = form.word.value;
    qstr = 'w=' + escape(word);  // NOTE: no '?' before querystring
    return qstr;
}

function updatepage(str){
    document.getElementById("result").innerHTML = str;
}
</script>
</head>

<form name="f1">
  <p>word: <input name="word" type="text"> 
  <input value="Go" type="button" onclick='Javascript:xmlhttpPost("/cgi-bin/simple-ajax-example.cgi")'></p>
  <div id="result"></div>
</form>
</body>
</html>

IIS에서 JSP or Java Servlet 돌리는 방법

웹프로그램
IIS에서 JSP 또는 Java Servlet 등을 사용하려면 ISAPI Redirector를 설치하여야 한다.

Google에서 이를 간편하게 설치 할 수 있는 MSI 파일을 발견하였다.

Tomcat Isapi Redirector 1.2.27라는 것이 바로 그것인데, 다음의 URL에서 다운 받을 수 있다.

http://code.google.com/p/tomcatisapiinstaller/downloads/detail?name=IsapiRedirect-1.2.27.msi&can=2&q=

혹시 링크가 사라지면 아래의 링크를 클릭해서 다운 받기 바란다.

IsapiRedirect-1.2.27.msi

참 친절하게 세팅까지 다 해준다.

JDK 다운로드 및 설치 방법

웹프로그램
[1] 먼저 SUN 홈페이지에 접속한다.

http://java.sun.com


[2] 상단 메뉴 중 Download를 선택한다.


[3] 다음 페이지에서  Java SE를 선택한다.
참고로 2008년 12월 현재 최신버젼은 Java SE Development Kit (JDK) 6 Update 10이 최선버젼임.


[4] 설치 후 환경변수 등록

 . 내컴퓨터 -> 마우스 오른쪽 클릭 -> 속성 ->고급 -> 환경변수 클릭
 . 여기서 Path에 JDK가 설치된 폴더의 bin 폴더까지 주소를 추가한다.
   ex) c:\java\jre 1.6.0_06\bin;

 . 제대로 설치되었으면 cmd 모드에서 javac 실행시 도움말이 친절하게 나오고
   제대로 설치 안되었으면 에러가 난다.


[5] 마이크로소프트처럼 잘 된 문서는 아니지만, 도움말이나 예제가 필요한 경우 Java SE 6 Documentation을 받아 저장하는 것도 좋다. Reference가 별로 많치 않아서 이거라도 도움이 될 가능성이 많다.

친절한 톰캣(Tomcat)의 기능 개요 및 설치 방법

웹프로그램
톰캣(Tomcat)은 참 친절한 소프트웨어죠. Windows XP, Vista에서도 Java Servlet, JSP, Beans 같은 자바 코드를 돌릴 수 있으니까 말이죠. 그것도 무료로...

톰캣(Tomcat)은 기술적으로는 아파치 소프트웨어 파운데이션(Apache Software Foundation)에서 서버인 자바(Java)를 움직이게 하기 위해 개발한 AP서버 입니다. 즉 서블릿(servlet), JSP, 빈즈와 같은 자바 코드를 이해하기 위해서는 톰캣 같은 자바를 이해하는 엔진이 있어야 합니다.

톰캣이 수행하는 일은 자바 파일만을 해석하는 것입니다. 보통 JSP 파일에서 HTML과 자바가 혼용되는데 여기서 자바 파일만 해석할 수 있다는 것입니다. 따라서 JSP 페이지는 서블릿 형태로 변형되어 완벽한 자바 파일이 됩니다. 그 뒤에 컴파일 되는 것입니다.

소프트웨어를 다운받기 위해서는 다음의 사이트에 접속하여 다운받으면 됩니다.

http://tomcat.apache.org/

설치 방법은 무조건 OK -> OK -> ... 나중에 포트번호만 8080이냐 80이냐 선택을 하시면되겠습니다.

혹시 이거 깔아서 동작 안하시는 분이 있으면 서버에 JDK가 설치되어져 있지 않으신겁니다.
이 경우 JDK 1.5 이상을 구하셔서 설치하시면 됩니다.

Java로 구현하는 간단한 Client & Server 프로그램

웹프로그램
자바에서 제공하는 소켓 클래스를 이용하면 다음과 같이 간단하게 Client/Server를 구현 할 수 있다.

// Client
Socket socket = new Socket("www.foo.com", 9000);
OutputStream out = socket.getOutputStream();
out.write("Hello world".getBytes());
out.flush();
out.close(); // only if you want one request-response
byte[] buffer = new byte[2048]; // just a sample size
in = socket.getInputStream();
int bytesRead = in.read(buffer);
in.close(); // only if you want one request-response
System.out.println(new String(buffer, 0, bytesRead));

// Server (www.foo.com)
ServerSocket server = new ServerSocket(9000);
Socket socket = server.accept(); // Normally, the accept() is in a threading loop to keep processing
InputStream in = socket.getInputStream();
byte[] buffer = new byte[2048]; // just a a sample size
int bytesRead = in.read(buffer);
in.close(); // only if you want one request-response
OutputStream out = socket.getOutputStream();
out.write("I received the following from you: ".getBytes());
out.write(value, 0, bytesRead);
out.flush();
out.close(); // only if you want one request-response

JSP 페이지 이동 4가지 방법 및 특성

웹프로그램
<!-- 내용 -->

먼저 다음 페이지 이동 특성들을 미리 알아볼 필요가 있습니다
JSP에서는 페이지 이동시 다음 4가지 정도의 방법이 있습니다

Javascript를 이용
window.open, location.href, location.replace 등을 이용할수 있습니다

login_process.jsp
<% if (a == null) { %>
      <script>location.href = "admin.jsp"; </script>
<% } else { %>
      <script>alert('권한이 없어요!'); window.history.back(); </script>
<% } %>
         
특징적인부분은 브라우져의 주소창이 변경되며
(이말은 즉슨 클라이언트가 다시 admin.jsp를 서버에 요청한다는 말입니다)
login_process.jsp 에서 jsp가 다 실행되고 브라우져에 out put된 html 및
javascript들만으로
실행된 코드들이라는 것입니다

response.sendRedirect를 이용
login_process.jsp
<% if (a == null) {
          response.sendRedirect("admin.jsp");
     } else {
          response.sendRedirect("login.jsp");
     }

     a = "test 입니다";
     System.out.println(a);
%>

이 코드에서 a가 출력될까요 안될까요?
출력 됩니다.
sendRedirect가 되더라도 밑에 jsp 코드들은 모두 실행 된다는 말입니다
response.sendRedirect는 기본적으로 모든 로직들을 다 처리한 후 코드
맨 마지막 부분에사용하는 것이 올바른 방법입니다
만약 그렇지 못한 경우는 response.sendRedirect 다음 바로 return;
이라는 코드를 집어 넣어야 합니다

response.sendRedirect은 HTTP 헤더정보를 변경하여 redirect시키기
때문에 역시 브라우져의 주소창이 변경되며 sendRedirect가 실행되기전
html이나 javascript로 out put되는 코드들은 모두 실행되지 않습니다.

forward 이용
jsp 태그의 <jsp:forward> 나 servlet의 RequestDispatcher.forward 를
이용할수 있습니다

login_process.jsp
<% if (a == null) { %>
          <jsp:forward page="admin.jsp"/>
<% } else { %>
          <jsp:forward page="login.jsp"/>
<% }

     a = "test 입니다";
     System.out.println(a);
%>

그럼 위의 코드의 경우 a가 출력 될까요 안될까요?
정답은 출력 안됩니다. 바로 forward 되어 버립니다.
클라이언트로 응답주지 않고 바로 서버측에서 admin.jsp로 이동하기 때문에
주소창이 바뀌지 않고 그로인해 브라우져에 출력되는 응답속도 또한 사용자가
보기에는응답이 빠른 장점이 있습니다

하지만 forward 이후 JSP 코드들이 실행되지 않는것 사실이지만 만약 finally절이
있는경우finally절은 실행 됨으로 확실히 알아둡시다.

meta 태그 이용
마지막으로 meta 태그를 이용할 수도 있습니다.

<META http-equiv=refresh content="0;url=admin.jsp">


즉 요약하자면..
페이지 이동 방법이 여러가지가 있습니다.
그 특성들을 잘 알고 올바르게 사용하여야 합니다.

출처: http://jakartaproject.com/article/jsptip/1114929726078 

JPG 저장된 DB 이미지 JSP로 보여주기

웹프로그램

Blob Type으로 저장된 DB 이미지를 JSP로 보여주는 비기를 공개한다.

<%@ page language="java" contentType="image/jpeg" %>
<%@ page import="java.util.*, java.sql.*, java.io.*" %>
<%
  String sql = "";
  Connection con = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;

  OutputStream output = response.getOutputStream();
  InputStream input = null;

  try {
    con = DriverManager.getConnection("Jdbc:oracle:thin:@서버주소:PORT:SID","USER","PASSWORD");
    sql =" select imagedata from imageTable where id = '00000' ";
    pstmt = con.prepareStatement(sql);
    rs = pstmt.executeQuery();
    if (rs.next()) {
      input = rs.getBinaryStream("imagedata");
      int byteRead;
      while((byteRead = input.read()) != -1) {
        output.write(byteRead);
      }
      input.close();
    }
  } catch(Exception e) {
    out.print(e);
  } finally {
    try {if (rs != null) rs.close();} catch (Exception ex) {}
    try {if (pstmt != null) pstmt.close();} catch (Exception ex) {}
    try {if (con != null) con.close();} catch (Exception ex) {}
  }
  input.close();
  output.flush();
  output.close();
%>

JSP 폼메일 예제

웹프로그램
JavaMail 에는 여러 기능이 있다고 생각됩니다. *.jar 파일 보면 imap도 있고, smtp도 있고, pop3도 있는데, 5개의 javamail class 중에서 오직 mail.jar 만 사용한 거 아니겠습니까. 왜냐구요? 이유는 하나, 초보니까. 퍽! 윽. 그래도 초보는 초보다........ 그래도 열심히 해야죠. 그래서인가?
javamail 에 대해서 더 깊이 들어가진 않겠습니다. 아주 단순한 폼메일 하나 구현하고 javamail은 일단락 짓고 싶네요. 갈길이 멀어서요. 물론 javamail의 고수가 되서 저의 무공을 자랑하고 싶은 황당한 생각도 있지만 강호에 있는 자바 비급들이 무수히 많고, 지금도 새로운 기술들이 퍼붓듯 쏟아지고 있기 때문에, 겸허한 자세로 내공을 높이는 것이 초보의 나아갈 길입니다.
이쯤에서 잠깐 천기누설을 하죠. 모냐구요? jsp를 아주 잘하는 법이죠. 그것도 빨리...
궁금하시죠... 헤헤~ 폭로하겠습니다. JAVA 를 잘 하시면 됩니다. #쿵야~ 퍽! 으악~ 내 다리~
당연한 말을 하냐구요? JAVA 에 대한 기초문법이 튼튼하고 객체에 대해서 잘 이해하고 계신다면, JSP 는 축지법을 쓰는 사람처럼 빨리 사용할 수 있습니다. 특히 ASP를 다룬 저같은 경우는 JSP에서 현재 시간 표현하는 것도 버벅거리고, 문자열 가운데 single quotation (') 을 두 개 연속 single quotations('')으로 대치하는 것도 몰라서 한참을 헤매는 일이 다반사였습니다.
솔직히 저도 SCJP 자격증을 따고, 취직하는 데는 요긴하게 썼지만 취직한 후에 컴퓨터나 수리하고, 회사에서 상사나 분위기나 살피고, 서버나 관리하고 하면서 1년반이라는 시간을 JAVA를 쓰지 않다보니 많은 부분을 다시 복습하고 있는 실정입니다. 애구~ 말이 길어졌네.... 죄송함다.... 그냥 넋두리였슴다.
예제는 파일이 2개입니다. 하나는 입력받는 페이지, 두번째는 처리하는 페이지. 간단하죠? 예쁘게 꾸미는 것은 직접해 보세요.
그럼 첫번째 소스. javamail.htm 와 javamailsend.jsp 입니다. [소스받기]
javamail.htm
<table width=300 border=1 cellspacing=0 style="font-size:9pt">
<form name="f" method="post" action="javamailsend.jsp">
<tr><td width=120 align="right">보내는분골뱅이 <td width=180>
<input type="text" name="from">
<tr><td align="right">받는 분 골뱅이 <td>
<input type="text" name="to" value="heogn@popsmail.com">
<tr><td align="right">이메일 제목 <td>
<input type="text" name="title"">
<tr align="center"><td colspan=2><TextArea name="content" cols="35" rows="10"></textarea>
<tr align="center"><td colspan=2><input type="submit" value="메일전송"></td></tr>
</form>
</table>
전달하는 변수 name 은 대소문자 구분합니다. 주의하세요.
javamailsend.jsp
<%@ page contentType="text/html;charset=euc-kr"
import="java.util.*, javax.mail.*, javax.mail.internet.*"
%> <%! // 함수 선언할 때는 ! 붙여줍니다.
public String kr(String s) {
try {
s = (s == null) ? "" : new String(s.getBytes("8859_1"),"KSC5601");
} catch (java.io.UnsupportedEncodingException uee) {}
return s;
}
%>
<html><head><title>메일전송결과</title>
<%
// 사용자가 입력한 메일 전송 자료를 저장
String mailFrom = null;
String mailTo = null;
String title = null;
String contents = null;
String htmltag = null;
// Resin 일 경우 kr을 뺍니다. 한글변환을 하지 않습니다.
// 톰캣일 경우 소스 그대로 사용합니다. 한글변환 필요합니다.
mailFrom = kr(request.getParameter("from"));
mailTo = kr(request.getParameter("to"));
title = kr(request.getParameter("title"));
contents = kr(request.getParameter("content"));
htmltag = "<font color=BLUE size=2>";
contents = htmltag + contents;
// Session을 생성하기 위해 java.util.Properties 클래스를
// 생성하고 자신이 해당하는 SMTP 호스트 주소를 할당합니다.
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.thrunet.com");

// 기본 Session을 생성하고 할당합니다.
Session msgSession = Session.getDefaultInstance(props, null);
%>
</head>
<body bgcolor="#D0E0FF">
<center>
<%
try {
// Message 클래스의 객체를 Session을 이용해 생성합니다.
MimeMessage msg = new MimeMessage(msgSession);
InternetAddress from = new InternetAddress(mailFrom);
msg.setFrom(from);

InternetAddress to = new InternetAddress(mailTo);
msg.setRecipient(Message.RecipientType.TO, to);

msg.setSubject(title);
msg.setContent(contents, "text/html; charset=EUC-KR");
Transport.send(msg);
%>
축하합니다. 요청하신 메일 전송이 완료되었습니다.<br>
좋은 하루 되세요.<br>
<a href="http://jspstudy.zoa.to">to jspstudy.zoa.to</a>
<%
}
catch (MessagingException e) {
out.println(e.getMessage());
%>
<center>죄송합니다. 메일 전송이 실패하였습니다.<br>
관리자에게 문의하세요.<br>
<a href="#" onClick="history.back()">돌아가기</a>
<% } %>
</center></body></html>

길게 설명하지 않아도 될 것 같습니다. 소스가 아주 평이하거든요. 중간중간에 있는 프로그램들의 기능을 잘 보시기 바랍니다. 이해고 뭐고 평이한 소스라...
애구 졸려... 오늘은 이만하겠습니다. 다음은 jdbc 강좌를 준비하겠습니다. 수고하셨습니다. 눈꺼풀 거~ 되게 무겁넹!
 
참고 : http://www.jspschool.com

JSP include 집중해부

웹프로그램
include 에는 크게 2가지가 있습니다. 잘 아시는 <%@ include file="" %> 과 조금은 낯선 <jsp:include page="" flush="true"/> 입니다. 일단 3개의 파일을 먼저 보겠습니다.

ok.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String ab="파일 ok.jsp 입니다.";
%><%=ab%>
<br>
<%@ include file="okD.jsp" %>
<br>
<jsp:include page="okA.jsp" flush="true"/>


unix 계열에서 돌아갈 경우 소스입니다. 한글 때문에 한번더 꽈줍니다.
okD.jsp
<%
String abc="파일 okD.jsp 입니다.";
%><%=new String(abc.getBytes("8859_1"),"euc-kr")%>
<br><%=new String("HTML 텍스트입니다.".getBytes("8859_1"),"euc-kr")%>
<br>


환경(jsp엔진)에 따라 아래처럼 인코딩을 없애줘도 됩니다. 재수가 좋은 경우죠
(okD.jsp)
<%
String abc="파일 okD.jsp 입니다.";
%><%=abc%>
<br>HTML 텍스트입니다.
<br>


page Directive로 charset을 정해주어야 한글이 깨지지 않습니다.
okA.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String abc="파일 okA.jsp 입니다.";
%><%=abc%>
<br>
<br>


파일 3개를 저장하시고, 브라우저에서 http://localhost:8080/ok.jsp 로 실행해보십시오. 물론 기본디렉토리에 위치시켜야죠. 이거 질문하는 분들 장난아니게 많습니다. tomcat 의 경우 server.xml 을 변경하지 않고 bin/startup.bat (startup.sh) 를 실행하셨다면 webapps/ROOT/ 가 기본디렉토리입니다. resin 의 경우는 doc 디렉토리가 기본 디렉토리겠죠. apache 랑 연동했을 경우 apache의 DocumentRoot 를 톰캣의 c:/jakarta-tomcat/webapps/ROOT 로 맞춰주시는 것이 헷갈리지 않을 겁니다.

include Directive 는 <%@ ... %> 로 싸여있습니다. @은 Directive 라는 의미죠. 포함하는 문서에 정적으로 컴파일 됩니다. 포함하는 파일(ok.jsp)에서 사용한 변수를 따로 선언하지 않고 바로 사용할 수 있습니다. 물론 여기(okD.jsp)에서 선언된 변수도 포함하는 파일(ok.jsp)에서 따로 선언하지 않고 사용할 수 있습니다. 대신 이 파일(okD.jsp)을 변경할 경우 포함하는 파일(ok.jsp)의 시스템 날짜를 변경해서 재컴파일을 유도해야 이 파일(okD.jsp)의 변경사항이 적용되는 것을 볼 수 있습니다.

include Action은 xml 형식으로 <jsp:include page=... flush="true" /> 를 사용합니다. flush="true" 는 그냥 쓰십시오 false로 바꾼다거나 빼먹거나 하면 안됩니다. 묻지 마십시오. 다칩니다. (==O%TT; 퍽!)

include Action은 동적이라고 합니다. 처음엔 저도 이해가 안 갔습니다. 하지만 쓰면서 이 넘이 얼마나 독립적인지 아주 잘 알게 되었고, 왠만한 경우 저는 directive 보다는 action 을 사용합니다. 이 넘은 포함하는 파일과 상관없이 실행이 됩니다. directive 의 경우 ok.jsp와 okD.jsp 의 소스가 합져져서 하나로 컴파일되어 동작하는 것과 같지만 action 의 경우 ok.jsp 컴파일하고 okA.jsp 따로 컴파일되어서 ok.jsp가 okA.jsp를 호출해서 사용하고 다시 ok.jsp가 동작하는 구조라고 생각하시면 될 것입니다. (죄송합니다만 제가 경험상 체득한 것이라 검증이 필요한 부분입니다.)

include Action 에는 page directive가 있습니다. include directive 에는 Page directive 가 없습니다. 만일 okD.jsp 에 <%@ page contentType="text/html;charset=euc-kr"%> 를 넣는다면 contentType="text/html;charset=euc-kr" 가 두개가 되기 때문에 Page directive: can't have multiple occurrences of contentType 라고 Exception 메시지를 보실 수 있습니다. import 속성이 틀리다면 contentType="text/html;charset=euc-kr" 만 삭제해주시면 될 것입니다. (이것도 자주 질문 하시는 것 중의 하나입니다.)

파일을 변경해보겠습니다. (ok.jsp) 는
ok.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String ab="파일 ok.jsp 입니다.";
%><%=ab%>
<br>HTML 텍스트입니다.
<br>
<br>
<%@ include file="okD.jsp" %>
<br>
<jsp:include page="okA.jsp" flush="true">
<jsp:param name="ab" value="<%=ab%>"/>
</jsp:include>


okD.jsp
<%
String abc="파일 okD.jsp 입니다."+"###"+ab;
%><%=new String(abc.getBytes("8859_1"),"euc-kr")%>
<br><%=new String("HTML 텍스트입니다.".getBytes("8859_1"),"euc-kr")%>
<br>


okA.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%
String ab =request.getParameter("ab");
String abc="파일 okA.jsp 입니다."+"###"+ab;
%><%=abc%>
<br>
<br>


이해가 가실라나요? 변수전달방법입니다. Action 에 대해서 좀더 살펴봐야 할 것이 있습니다. 잠시 커피좀...

관련 사이트
■http://aboutjsp.com/lec/include.htm
hsboy님의 include 강좌

JSP 오라클8i 글자수 무제한 게시판소스

웹프로그램
intermedia text 를 사용하지 않고 4000byte 가 넘는 텍스트를 like 검색
(경계에 걸리는 단어는 검색불가능합니다만 그외의 단어는 검색가능합니다.
SQL을 잘 안다면 잘라진 텍스트를 붙여서 검색하는 쿼리도 생각해 볼 수 있겠죠.
^^; 불가능 할 수도 있을 거구요.)
가능하도록 쪼개서 넣는 로직으로 구현했습니다.
한글이 맨 마지막에 들어갈 경우 4001 바이트가 되므로 한 덩어리 크기는
3999 bytes로 잘랐습니다.

소스를 보시고 더 좋은 의견이 있으신 분은 답글 달아주시면 감사하겠습니다.
index는 달지 않았습니다. 습작이기 때문이기도 하고, 제가 db를 잘 모르는
이유도 있습니다.

board_insert2.jsp 파일에 텍스트를 자르는 루틴이 들어있습니다.
db schema는 답변형 게시판으로 잡았지만 아직 구현되지는 않았습니다.
readme.txt 파일에 설치및 기능 설명을 해 놓았습니다.

읽어주셔서 감사합니다. 좋은 하루 되십시오.
/*
   okboard 0.61
   작성자 : kenu@okjsp.pe.kr
   배포처 : http://www.okjsp.pe.kr
   작성일 : 2001-05-23 6:33오전
   테스트 : http://210.219.132.222/okboard/board.jsp (no guarantee)
*/
Oracle8i, jspSmartUpload 를 이용한 자료게시판입니다.

개발환경
apache 1.3.19,
tomcat 3.2.1, Resin 1.2.5,
Oracle 8.1.5, 8.1.6, 8.1.7

설치법
root(예: c:/jsphome)
c:/jsphome/index.html
c:/jsphome/okboard/board_create.jsp  <-- 게시판 생성 한번실행 후 파일명 바꾸시거나 삭제하세요.
c:/jsphome/okboard/board_delete.jsp  <-- 게시판 drop 시킵니다 파일명 바꾸시거나 삭제하세요.
c:/jsphome/okboard/board.jsp         <-- 게시물리스트
c:/jsphome/okboard/board_insert.jsp  <-- 자료 입력폼
c:/jsphome/okboard/board_insert2.jsp <-- 자료 입력처리
c:/jsphome/okboard/board_reply.jsp   <-- 답변 입력폼
c:/jsphome/okboard/board_reply2.jsp  <-- 답변 입력처리
c:/jsphome/okboard/passchk.jsp       <-- 수정권한 암호 입력
c:/jsphome/okboard/board_modify.jsp  <-- 수정폼
c:/jsphome/okboard/board_modify2.jsp <-- 수정처리
c:/jsphome/okboard/db.jsp            <-- jdbc 정보파일
c:/jsphome/okboard/go.jsp            <-- back 방지용 중계처리
c:/jsphome/okboard/delete.jsp        <-- 삭제권한 암호 입력
c:/jsphome/okboard/delete2.jsp       <-- 삭제처리
c:/jsphome/okboard/path.jsp          <-- jvm의 classpath 확인
c:/jsphome/okboard/download.jsp      <-- 다운로드 처리
c:/jsphome/okboard/okboard.css       <-- 페이지 CSS
c:/jsphome/okboard/okboard.js        <-- javascript

c:/jsphome/okboard/images/           <-- 그림파일 디렉토리
c:/jsphome/WEB-INF/classes/com/      <-- JspSmartUpload 컴포넌트 디렉토리
c:/jsphome/upload/                   <-- 파일이 업로드되는 디렉토리

※ D:\oracle\ora81\jdbc\lib\classes12.zip 이 jvm 의 classpath 에 인식이 되어야 합니다.
   그렇지 않을 경우 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver 메세지가 뜹니다.
   Oracle 8.0 이하는 쿼리가 제대로 동작하지 않을 수 있습니다.


실행법
설치 완료 후 tomcat을 구동시킨 후
브라우저에서 http://localhost/okboard/board_create.jsp 를 요청합니다.
kboard 라는 table 이 만들어 지면 됩니다.
board_create.jsp 파일 이름을 바꿔주세요.
board_delete.jsp 파일 이름을 바꿔주세요. 테이블리셋 시에 바꾼이름을 브라우저에서 요청하면 됩니다.

보안
oracle의 데이터베이스의 기본 접근권한으로 되어있습니다. (scott, tiger)
변경을 원하시면 db.jsp 파일만 수정하시면 됩니다.

table 구성 (kboard, kboard_cnts)
CREATE TABLE KBOARD (
 BBSID VARCHAR2 (10) NOT NULL,
 REF NUMBER NOT NULL,
 STEP NUMBER DEFAULT 0 NOT NULL,
 LEV NUMBER DEFAULT 0 NOT NULL,
 WRITER VARCHAR2 (50) NOT NULL,
 SUBJECT VARCHAR2 (500) NOT NULL,
 PASSWORD VARCHAR2 (8),
 EMAIL VARCHAR2 (50),
 READ NUMBER DEFAULT 0 NOT NULL,
 FILENAME VARCHAR2 (200),
 MASKNAME VARCHAR2 (20),
 FILESIZE NUMBER DEFAULT 0,
 DOWNLOAD NUMBER DEFAULT 0,
 WHEN DATE,
 IP VARCHAR2 (24)) ;

CREATE TABLE KBOARD_CNTS (
 BBSID VARCHAR2 (10) NOT NULL,
 REF NUMBER NOT NULL,
 STEP NUMBER NOT NULL,
 LEV NUMBER NOT NULL,
 CONTENT VARCHAR2 (4000),
 CID NUMBER DEFAULT 0 NOT NULL) ;

0.61 -  2001-05-23 6:33오전
리스트 버그 수정

0.6 -  2001-05-21 1:58오전
게시판 제목, 이름, 내용 검색 추가
select 항목 지정하는 javascript 추가

0.5 -  2001-05-20 1:11오전
수정기능 추가
Cookie로 입력신상 저장

0.4 -  2001-05-18 10:56오전
답변기능 추가
Fn.java 버그 수정

0.3 -  2001-05-17 5:57오후
오라클의 4000바이트 제한을 풀었습니다.
다운로드 방식을 바꾸었습니다.
한글제목파일, 이미지 다운로드시 이상없습니다.
게시물 작성 후 refresh 되도록 했습니다.
email 링크로 변경했습니다.
doc, xls, ppt, gif, img 모두 다운로드 창 뜹니다.
jsp 코드 올려도 실행되지 않습니다.

전신
kboard 를 오라클용으로 전환합니다.

JSP 동적 이미지(실시간 그래프) 생성하기

웹프로그램

http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.html
에서 다운받은 Acme.tar.gz을 알집이나 윈집을 이용해서 압축을 풉니다.
필요한 파일이, Acme 라는 디렉토리 안에 JPM 디렉토리가 있고
그 안에는 Encoders 라는 디렉토리가 있고 그 안에는 class 파일이 두개 있습니다.
Acme 디렉토리를 WEB-INF\classes 아래로 이동합니다.
어딘지 아시죠? 아니면 제가 첨부한
Acme.jar 파일을 c:\jdk1.3\jre\lib\ext 에 복사시켜 놓아도 됩니다.
 

이제 설치는 끝났습니다. 소스를 보죠.
imageCall.html
<html>
<body bgcolor="#000000">
<img src="HelloGraphics.jsp">
</body>
</html>

HelloGraphics.jsp
<%@ page import="java.io.*, java.awt.*, Acme.JPM.Encoders.GifEncoder"
%><%

 &nbsr;  Frame frame = null;
    Graphics g = null;

    try {
      // Create an unshown frame
      frame = new Frame();
      frame.addNotify();

      // Get a graphics region, using the Frame
      Image image = frame.createImage(200, 300); // image size width 200, height 300
      g = image.getGraphics();

g.setFont(new Font("Serif", Font.ITALIC, 50));
g.drawString("JSP", 10, 50);
g.drawString("Image!", 10, 80);
g.setColor(new Color(0x0080AA));
g.setFont(new Font("Garamond", Font.PLAIN, 18));
g.drawString("www.okjsp.pe.kr", 60, 280);

      // Encode the off screen image into a GIF and send it to the client
      response.setContentType("image/gif");
      GifEncoder encoder = new GifEncoder(image, response.getOutputStream());
      encoder.encode();
    }
    finally {
      // Clean up resources
      if (g != null) g.dispose();
      if (frame != null) frame.removeNotify();
    }
%>


 

HelloGraphics.jsp 파일은 text/html 을 생성해 내는 것이 아니라,
image/gif 형식의 파일을 생성해 냅니다.
그래서 img src="HelloGraphics.jsp" 처럼 호출할 수 있는 것이죠.
 
여기에 관해서 관련자료들을 더 찾아보시기 바랍니다.
jpeg 생성하는 라이브러리도 있고, 다양하게 응용할 수 있겠죠.
요즘 유행하는 avatar 도 만들 수 있겠죠.
 

마지막으로 막대그래프 하나 그리고 끝내도록 하겠습니다. 원리는 이렇습니다.
숫자들을 배열에 놓고 맥시멈 값을 구합니다.
이미지 크기에 맞춰서 비율을 결정합니다.
배열의 length 로 이미지 폭을 나눕니다. 그리고 그려주면 됩니다.
난수를 10 개 만들어서 동적으로 이미지를 생성해보도록 하겠습니다.
 


HelloGraphics.jsp
<%@ page import="java.util.*, java.io.*, java.awt.*, Acme.JPM.Encoders.GifEncoder"
%><%

// 계산
// 난수 발생
 double [] num = new double[10];
 for(int i=0;i<num.length; i++) {
  num[i] = Math.random() * 100;
 }
// 최대값
 double max=num[0] ;
 for(int i=1;i<num.length;i++) {
  if(max<num[i])
   max=num[i];
 }
 
 int margin = 10;
 float x_pace = (300-margin*2) / (float)10;
 float y_height = (float)(200-margin*2);
 double ratio = y_height / max;


    Frame frame = null;
    Graphics g = null;

    try {
      // Create an unshown frame
      frame = new Frame();
      frame.addNotify();

      // Get a graphics region, using the Frame
      Image image = frame.createImage(300, 200); // image size width 300, height 200
      g = image.getGraphics();

g.setColor(new Color(0x0040FF));
g.setFont(new Font("System", Font.PLAIN, 11));
g.drawString("www.okjsp.pe.kr", 210, 198);
g.drawString("Max:"+max, 10, 198);

// draw Bars
int xx = 0;
int yy = 0;

g.setColor(new Color(0x000000));
g.drawRect(0,0,299,199);
for (int i=0; i<num.length; i++) {
 xx = (int)(i * x_pace) + margin;
 yy = (int)(num[i] * ratio);
 yy = 200 - (yy + margin);
 
 g.drawRect(xx, yy, (int)x_pace-3, 188 - yy);
 g.drawString(""+(int)num[i], xx+9, yy);
}

      // Encode the off screen image into a GIF and send it to the client
      response.setContentType("image/gif");
      GifEncoder encoder = new GifEncoder(image, response.getOutputStream());
      encoder.encode();
    }
    finally {
      // Clean up resources
      if (g != null) g.dispose();
      if (frame != null) frame.removeNotify();
    }
%>


서블릿으로 개발하는 것과 크게 차이는 없습니다만 서블릿 소스보다는 부담이 덜 가네요.
아직 내공이 얕기 때문이겠죠.
읽어주셔서 감사합니다. 좋은 하루 되십시오.

---------------------------------
http://okjsp.pe.kr

JSP UTF-8로 파일 저장하기

웹프로그램

요즘은 유니코드를 많이 쓰니까 UTF-8으로 저장하는 요구가 왕왕 들어온다.

이럴때는 다음과 같이 구현하면 된다.


File output = new File("D:\\TopInfo.inc");

output.createNewFile();

FileOutputStream file1 = new FileOutputStream(output.getPath());

OutputStreamWriter writer = new OutputStreamWriter(file1, "utf-8");

writer.write("요로코롬 저러코롬~ 땡큐합니다. ^^");

writer.close();

JSP 파일 업로드

웹프로그램

파일 업로드를 위해서는 enctype이 multipart/form-data로 선언이 되어져야 한다.
다음이 바로 그 예제이다.

form.html ==================================================
<form action="multipart.jsp" method="POST"
      enctype="multipart/form-data">

<input type="file" name="file"><br>

<input type="submit">
</form>
end of form.html ===========================================

받은 파일은 FileInputStream을 통해 다운되어질 수 있으며
다음과 같은 형식으로 저장 할 수 있다.


multipart.jsp ==============================================

<%
String fileName = request.getParameter("file");
FileInputStream is = new FileInputStream(fileName);

int ch;
while ((ch = is.read()) >= 0)
  out.print((char) ch);

is.close();
%>
end of multipart.jsp =======================================

JSP 세션을 이용한 카운터

웹프로그램

// session을 이용한 카운터
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SessionCounter extends HttpServlet
{
 static final String Counter_key ="Counter.count";

 public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException,IOException
 {
  // 클라이언트로 부터 세션을 가지고 오는데.
  // true 일때만 세션의 객체를 반환합니다.
  HttpSession session = req.getSession(true);
 
  res.setContentType("text/html");
 
  PrintWriter pout = new PrintWriter(
   new OutputStreamWriter(
    res.getOutputStream(),"KSC5601"
   )
  );
 
  int count =1;
  Integer i =(Integer) session.getAttribute(Counter_key);
 
  //만약 그 전에 카운터가 있다면 그 값을 더해줍니다.
  if( i != null)
  {
   count=i.intValue()+1;
  }//if 문 닫기
 
  // 쿠키관련 시작!!
  // 사용자에게 저장된 쿠키를 몽창 가져온다. 그리고 저장된 시간도 가져온당..
  Cookie cookies[] = req.getCookies();
  Cookie cookie = null;
  long cookieDate = 0L;
  if(cookies != null)
  {
   cookie = cookies[0];
   cookieDate = Long.parseLong(cookie.getValue());
  }
  else
  {
   Cookie coo = new Cookie("TodayCheck", new String(""+System.currentTimeMillis()));
   coo.setMaxAge(60*60*24);
   res.addCookie(coo);
  }
 
  long nowTime = System.currentTimeMillis() - cookieDate;
  if(nowTime > 60*60*24*1000)
  {
   // 여기 조금 이상함.. MilliSecond 를 준다고 해서
   // 1000을 곱해주기는 했는데 정확한지는 모르겠음.
   // API 보고 수정요망..
   System.out.println("하루가 지났습니다. 카운트를 증가합니다.");
   //새션안에 반환된 카운터의 값을 추가합니다.
   session.setAttribute(Counter_key, new Integer(count));
  }
  else
  {
   System.out.println("하루가 안지났습니다. 당신을 증가대상에서 제외합니다~~(개그콘서트버젼)");
  }
  // Cookie 클래스 관련 끝... 실행하시고 쿠키가 생성되었는지 Cookie 디렉토리에서 확인요망..
 
  pout.println("<html>");
  pout.println("<head>");
  pout.println("<title> 세션으로 만든 카운터</title>");
  pout.println("</head>");
  pout.println("<body>");
  pout.println("당신의 세션아이디는 <b>"+session.getId()+"</b>");
  pout.println("이며 당신의 방문횟수는 <b>"+count+" 째 입니다.</b>");
  pout.println("<form method=GET action=""+req.getRequestURI()+"">");
  pout.println("<input type=submit value="다시보기">");
  pout.println("</form>");
  pout.println("</body></html>");
  pout.flush();
 
 }// doGet() 닫기

}// SessionCounter닫기