기념일계산,날짜계산해서….^^; 앤에게 사랑받으시길…..

<script language=”JavaScript”>
<!–
function cucu()
{
    var myform = document.aaa;
 var y = myform.year.value;
 var m = myform.mon.value;
 var d = myform.date.value;

 //1970.01.01 날짜 계산이 시작되는 기준일
 //기준일
 var basic = new Date(0);

 //오늘
 var now = new Date(y,m-1,d);

 //오늘부터 몇일후
 var count;

 if(myform.cnt.value == null || myform.cnt.value == “”)
 {
     alert(“숫자로 넣어라”);
  return;
 }

 count = Number(myform.cnt.value);

 //오늘부터 몇일후의 날짜를 알 수 있다
 //1000*60*60*24 는 하루를 나타냄
 //(now – basic) / (1000*60*60*24) 오늘부터 기준일까지의 날짜수
    //즉 기준일로부터 몇일까지의 날짜수를 Long형태로 만들어 날짜를 만들어낸다.
 myform.nowdate.value = new Date();

 var day = new Date((1000*60*60*24*(count+((now-basic)/(1000*60*60*24)))));
 myform.result.value = day;
 alert(day.getDate());


}
//–>
</script>
</HEAD>

<BODY BGCOLOR=”#FFFFFF”>
<form name=”aaa”>
시작일 : <input type=”text” name=”year” value=”” size=”4″>
        <input type=”text” name=”mon” value=”” size=”2″ maxlength=”2″>
  <input type=”text” name=”date” value=”” size=”2″ maxlength=”2″><br>
이후로 : <input type=”text” name=”cnt” value=”” size=”5″>일 후의 날짜?<br>
참고로 오늘은 : <input type=”text” name=”nowdate” value=”” size=”50″ readOnly><br>
알고싶은 날<기념일> : <input type=”text” name=”result” value=”” size=”50″><br>
<a href=”JavaScript:cucu()”>자 나를 눌러봐^^</a>
</form>

현재달의 첫째날 , 마지막날 (날짜,일자) 구하기

별로 필요 없을것 같은데, 가끔 필요한 비기

<SCRIPT LANGUAGE=”JavaScript”>
<!–
//현재달의 첫째날(일자) 구하기
function firstDay(kind){
   var d,d2, s = “”;          
   d = new Date();            
   d2 = new Date(d.getYear(),d.getMonth());                     
   s += d2.getYear()+ kind;                      
   s += (d2.getMonth()+1) + kind;    //여기에 꼭 +1이 있어야됨 생략하고 위에다가 +1하면 1월이 0으로 나옴       
   s += d2.getDate();                  
   return(s);                            
}

//현재달의 마지막날(일자) 구하기
function lastDay(kind){
   var d,d2, s = “”;          
   d = new Date();            
   d2 = new Date(d.getYear(),d.getMonth()+1,””);                     
   s += d2.getYear()+ kind;                      
   s += (d2.getMonth()+1) + kind;  //여기에 꼭 +1이 있어야됨 생략하고 위에다가 +1하면 1월이 0으로 나옴                 
   s += d2.getDate();                  
   return(s);                            
}
document.write(“현재달의 첫째날:”+firstDay(“.”));
document.write(“<br>”);
document.write(“현재달의 마지막날:”+lastDay(“.”));
//–>
</SCRIPT>

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();
%>

스크립트 디버거

자바스크립트는 디버깅하기 정말 고통스럽죠?

alert 남발하기 싫으신 분들만 쓰세욤… ㅡ.ㅡa

 

/*** <script src="logger.js"></script>* <script>* //...* log("...&#64;#&#64;$&*^#$...");* //...* </script>*/var oLogWin, oLogger;var lPreTime;function makeLogger(oLogWin, sID) {var oLogDoc = oLogWin.document;var oTextArea = oLogDoc.getElementById(sID);if (!oTextArea) {oTextArea = oLogDoc.createElement(&#8220;TEXTAREA&#8221;);oLogDoc.body.insertBefore(oTextArea,null);oTextArea.id = sID;oTextArea.style.height = oLogDoc.body.clientHeight &#8211; 20;oTextArea.style.width = oLogDoc.body.clientWidth;oTextArea.style.font = &#8220;9pt Arial&#8221;;}return oTextArea;}function log(str, bTime) {if (!oLogWin || oLogWin.closed) {oLogWin = window.open(&#8220;&#8221;,&#8221;LogWin&#8221;,&#8221;top=5,left=5,width=350,height=400,resizable&#8221;);oLogDoc = oLogWin.document;var sScript = &#8220;</p> <table width=100% cellpadding=0 cellspacing=0 border=0 align=center style='font-size:9pt'> <tr>&#8220;+ &#8220;</p> <td align=left style='padding-left:10;height:20;font-weight:700'>Script Loggger</td> <p>&#8220;+ &#8220;</p> <td align=right style='padding-right:10'>&#8220;+ &#8220;<span style='cursor:hand;width:40;height:18;padding:0,3,0,3;text-align:center;border:1 solid gray;background-color:#eaeaea'"+ " onclick='document.getElementById("LogArea").value=""'>clear</span>&#8220;+ &#8220;</td> </tr> </table> <p>&#8220;;oLogDoc.write(sScript);oLogDoc.body.style.margin = &#8220;0,0,0,0&#8221;;oLogger = makeLogger(oLogWin, &#8220;LogArea&#8221;);lPreTime = new Date().getTime();}var sTime = new Date().getTime() &#8211; lPreTime;if (bTime) {lPreTime = new Date().getTime();}oLogger.value += &#8220;time : &#8221; + sTime + &#8221; > &#8221; + str + &#8221;<br /> &#8220;;oLogger.scrollTop = oLogger.scrollHeight &#8211; oLogger.clientHeight;}

수많은 체크박스 중 몇개 체크했는지 확인

보통 체크박스가 여러개 있을 경우 몇개를 체크했는지 확인하려면

갯수만큼 for 문을 돌려야 하는데 말이죠. 10원짜리 팁에선

onClick 에 이벤트 넣어놓고 그 값으로 count 를 조절하여

확인시 해당 count 를 보여줍니다.

이해 안되시면 예제를 보세요~



<HTML>
<BODY>
<HEAD>
<SCRIPT>
 var checkCount = 0;

 function showCheckCount()
 {
  alert( checkCount );
 }

 function checkState( checkbox )
 {
  if( checkbox.checked == true )
   checkCount++;
  else
   checkCount–;
 }
</SCRIPT>
</HEAD>
<FORM name = “form”>
<%
 for( int i = 0; i < 1000; i++ )
 {
%>
<INPUT type = “checkbox” onClick = “checkState(this)” name = “id” value = “<%= i %>”>
<%
 }
%>
</FORM>
<BR>
<A href = “#” onClick = “showCheckCount()”>체크 갯수 보기</A>
</BODY>
</HTML>

가상디스크 만들기

1. 가상디스크 만들기
subst
==> 현재 생성된 가상디스크 현황보기

subst D: C:Temp
==> C:Temp 폴더를 D: 드라이브라는 가상디스크로 만든다. (이미 D드라이브가 있으면 에러)

subst D: /D
==> 가상드라이브 D: 드라이브를 삭제한다.


2. 드라이브문자 바꾸기
diskpart
==> diskpart라는 윈도 유틸실행 실행하면’DISKPART>’ 라는 별도의 프롬프트 실행됨

DISKPART> list volume
==> 현재 컴퓨터의 볼륨(파티션) 현황을 보여준다.
ex>  
  볼륨 ###  Ltr  레이블      Fs    형식       크기     상태          정보
  ——–  —  ———-  —– ———- ——-  ——-       ——–
  볼륨 0     E                     CD-ROM         0 B
  볼륨 1     C   Cdrive      NTFS  파티션          28 GB 정상        시스템

DISKPART> list disk
==> 현재 컴퓨터의 디스크(물리적) 현황을 보여준다.
ex>  
  디스크 ###  상태           크기         사용 가능  Dyn  Gpt
  ———-  ——         ——–     ———  —  —
  디스크 0    온라인           28 GB      0 B

DISKPART> select volume 0
==> list volume에서 나온 리스트에서 0번 볼륨을 선택한다.
    볼륨명이 아닌 select volume E 등과 같이 문자열로도 선택가능해진다.
    명령어 실행 후 list volume을 해보면 select한 볼륨앞에 ‘*’라는 문자열이 붙는다.
ex>
  볼륨 ###  Ltr  레이블      Fs    형식       크기     상태          정보
  ——–  —  ———-  —– ———- ——-  ——-       ——–
* 볼륨 0     E                     CD-ROM         0 B
  볼륨 1     C   Cdrive      NTFS  파티션          28 GB 정상        시스템

DISKPART> assign letter=K
==> 위에서 select한 볼륨에 ‘K’라는 문자열을 할당한다.
    성공시 ‘DiskPart에서 성공적으로 드라이브 문자 또는 탑재 지점을 할당했습니다.’라고 나옴.
    list volume으로 확인하면…
  볼륨 ###  Ltr  레이블      Fs    형식       크기     상태          정보
  ——–  —  ———-  —– ———- ——-  ——-       ——–
* 볼륨 0     K                     CD-ROM         0 B
  볼륨 1     C   Cdrive      NTFS  파티션          28 GB 정상        시스템

  cd롬 드라이브면이 K:로 바뀌었다.

DISKPART> help
==> 기타 여러가지 도움말을 볼수있다.

DISKPART> exit
==> diskpart종료

3. diskpart 스크립트 파일로 실행

diskpart내에서 사용하는 명령어를 파일로 저장하고
cmd프롬프트 상에서 ‘diskpart /s [스크립트파일명]’ 으로 실행하면 프롬프트변경없이 바로 적용

2, 3번의 경우는 ‘제어판’에서 쉽게 가능하지만, bat파일의 명령어를 통해서 한꺼번에 해줘야했기때문에 도스창에서 해결가능한 명령어를 필요로 했었습니다. 대부분 사이트에서는 제이판에서 바꾸는 방법만 나온지라 혹시라도 도움이 될까해서 올립니다.

RSS 수집당하는 법

<LINK> 태그에 rel=”alternate” 속성을 줄 수 있다.

검색엔진을 위한 정보인데, 여기에 rss feed 주소를 주면, 자동으로 feed가 수집된다.

IE7 beta2 에서도 감지가 되고,
구글 테스크탑3의 웹클립에서도 rss를 추가하지 않아도 자동으로 감지되고 추가된다.

firefox에서도 라이브북마크라는 이름으로 동작을 한다. ㅎㅎ

뭔가 하나 발견하니 좋아요. 좋아. ㅎㅎ

 <link rel=”alternate” type=”application/rss+xml” title=”웹마스터::KURAPA.COM” href=”http://m.kurapa.com/xml.php?sid=979″>

프린팅 하기(IE 전용)

무지 허접한 IE 전용 프린팅입니다. 모두 예를 눌러야 작동합니다..

<html>
<script language=”JScript”>
function ieExecWB(intOleCmd, intOleParam) {
 var WebBrowser = new ActiveXObject(“InternetExplorer.Application”);
 // 만약 intOleParam이 정의되어 있지 않으면 기본값 설정
 if((!intOleParam) || (intOleParam < -1) || (intOleParam > 1)) {
  intOleParam = 1;
  WebBrowser.Visible = false;
  WebBrowser.Navigate(window.location);
  WebBrowser.ExecWB(intOleCmd, intOleParam);
  WebBrowser = null;
 }
}
</script>
<body>
임은천 순천대학교 컴퓨터 과학과 4학년
<input type=”button” value=”인쇄 미리 보기” onclick=”window.ieExecWB(7);”>
<input type=”button” value=”페이지 설정” onclick=”ieExecWB(8);”>
<input type=”button” value=”인쇄하기(대화상자 표시)” onclick=”ieExecWB(6);”>
<input type=”button” value=”인쇄 바로 하기” onclick=”ieExecWB(6, -1);”>
</body>
</html>

textbox의 입력문자 제어하기(영문/한글)

가끔 필요한 코든데 아스키코드로 만들려면 좀 귀찮아져서 “

 

 

1. 영문만 입력가능  : style=”ime-mode:disabled”
2. 한/영중 선택가능 : style=”ime-mode:auto”
3. 디폴트 한글        : style=”ime-mode:active”
4. 디폴트 영문        : style=”ime-mode:inactive”

ex)  디폴트로 한글 입력이 되는 입력폼
      <input type=”text” name=”user_name” style=”ime-mode:active” />

 

event.keyCode 읽어오고,

아스키코드 비교하교.. 등등의 번거로움 없이

한/영 제어가 가능한 스크립트입니다.

폼메일 예제

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

include 집중해부

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

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"/>

include 집중해부

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>

include 집중해부

환경(jsp엔진)에 따라 아래처럼 인코딩을 없애줘도 됩니다. 재수가 좋은 경우죠

(okD.jsp)
<%String abc="파일 okD.jsp 입니다.";%><%=abc%><br>HTML 텍스트입니다.<br>

include 집중해부

page Directive로 charset을 정해주어야 한글이 깨지지 않습니다.

okA.jsp
<%@ page contentType="text/html;charset=euc-kr"%><%String abc="파일 okA.jsp 입니다.";%><%=abc%><br><br>

include 집중해부

파일 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 집중해부
include Directive 는 <%@ … %> 로 싸여있습니다. @은 Directive 라는 의미죠. 포함하는 문서에 정적으로 컴파일 됩니다. 포함하는 파일(ok.jsp)에서 사용한 변수를 따로 선언하지 않고 바로 사용할 수 있습니다. 물론 여기(okD.jsp)에서 선언된 변수도 포함하는 파일(ok.jsp)에서 따로 선언하지 않고 사용할 수 있습니다. 대신 이 파일(okD.jsp)을 변경할 경우 포함하는 파일(ok.jsp)의 시스템 날짜를 변경해서 재컴파일을 유도해야 이 파일(okD.jsp)의 변경사항이 적용되는 것을 볼 수 있습니다.
include 집중해부
include Action은 xml 형식으로 <jsp:include page=… flush=”true” /> 를 사용합니다. flush=”true” 는 그냥 쓰십시오 false로 바꾼다거나 빼먹거나 하면 안됩니다. 묻지 마십시오. 다칩니다. (==O%TT; 퍽!)
include 집중해부
include Action은 동적이라고 합니다. 처음엔 저도 이해가 안 갔습니다. 하지만 쓰면서 이 넘이 얼마나 독립적인지 아주 잘 알게 되었고, 왠만한 경우 저는 directive 보다는 action 을 사용합니다. 이 넘은 포함하는 파일과 상관없이 실행이 됩니다. directive 의 경우 ok.jsp와 okD.jsp 의 소스가 합져져서 하나로 컴파일되어 동작하는 것과 같지만 action 의 경우 ok.jsp 컴파일하고 okA.jsp 따로 컴파일되어서 ok.jsp가 okA.jsp를 호출해서 사용하고 다시 ok.jsp가 동작하는 구조라고 생각하시면 될 것입니다. (죄송합니다만 제가 경험상 체득한 것이라 검증이 필요한 부분입니다.)
include 집중해부
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” 만 삭제해주시면 될 것입니다. (이것도 자주 질문 하시는 것 중의 하나입니다.)
include 집중해부
파일을 변경해보겠습니다. (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>

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>

include 집중해부

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

include 집중해부

이해가 가실라나요? 변수전달방법입니다. Action 에 대해서 좀더 살펴봐야 할 것이 있습니다. 잠시 커피좀…
include 집중해부
관련 사이트
http://aboutjsp.com/lec/include.htm
hsboy님의 include 강좌

한글 처리

JSP로 사이트를 개발하면서 ASP보다 어렵다는 생각을 많이 했습니다. 일단 JAVA가 가물가물했고, ASP 에서 지원했던 함수들이 다른 형태로 사용되기 때문에 혼동도 되었습니다. WEB 이라는 바닥이기 때문에 유사한 점이 훨씬 많았지만 java의 자존심이 ASP랑 같은 수준으로 취급받는 것을 못 견뎌하는 듯한 인상을 받았습니다.

개발과정 중에 부딪혔던 문제 중의 하나가 한글 처리 문제였습니다. 정확한 설명은 아니겠지만 *.jsp 파일에서 *.java로 변환되고 이것이 또 .class로 컴파일 되는 과정에서 특별히 지정을 해주지 않게되면 한글이 다 뭉그러지는 것 같았습니다.

그리하야 페이지 상단에 페이지 선언을 해줍니다. 이렇게

<%@ page contentType = “text/html; charset=euc-kr” %>

이렇게 해주면 일단 왠만한 걱정은 싸 잡으셔도 될겁니다. 두번째 방법은 문자열(String)을 직접 코드 변환해주는 방법입니다. 함수로 만들어 사용해도 좋습니다.

out.println(new String((“자바속의 한글”).getBytes(“8859_1”), “EUC-KR”));

<%!
//한글 처리
public String ko(String str) {

try{
str = new String(str.getBytes(“8859_1”), “EUC-KR”);
} catch(UnsupportedEncodingException e) {
}
return str;
}
%>

<%
out.println(ko(“자바속의 한글”));
%>

이런 형태로 처리를 해주면 한글 문제, 일단 바지가랑이는 잡은 것입니다.
오늘은 요기까지 쓰겠습니다. ^^; 졸려서요.

브라우져 캐시(cache) 안먹게 하는 비기

여러 방법이 있겠지만 JSP에서는 다음과 같은 방법이 있다.

—————————————————————
  <meta http-equiv=”Expires” content=”0″>
  <meta http-equiv=”Pragma” content=”No-cache”>
  <meta http-equiv=”Cache-Control” content=”private”>

  위의 것은 브라우져의 meta tag를 이용한 것입니다.
  이것 보다는 JSP의 아래와 같은 Tag를 사용하는 것이 더 바람직합니다.
  HTTP 프로토콜의 Header에 내용을 실어 보내게 되므로, HTTP Meta Tag를 사용할 때
  처럼 화면이 퍽퍽거리는 현상이 없습니다.
  
  <%
    response.setHeader(“Pragma”, “No-cache”);
    response.setDateHeader(“Expires”, 0);
    response.setHeader(“Cache-Control”, “no-cache”);
  %>

csv 파일을 이용한 메일링 리스트 구현

db에 있는 목록을 이용해서 메일링리스트를 구현한다면, 번거로운 것이 너무 많습니다.
db도 설치해야지, 세팅해야지, jdbc 설정해줘야 되죠, 거기다가 메일링 전송하는 동안
db를 꽉 붙잡고 있어서 부하도 줄 수 있습니다.

csv 파일을 이용하면 일단 목록만 text로 저장해 놓으면 됩니다. 아웃룩 express 의
주소록에 있는 사람들도 파일>내보내기 를 이용하면 csv 형식으로 파일을 생성할 수
있도록 되어있습니다.

2개의 파일입니다. 입력부와 처리부입니다. 세련된 코드는 아니지만, 쉽게 이해하실 수
있도록 간략한 주석을 넣었습니다.

제가 필요해서 만든 것인데, 혹시 필요한 분들이 있을까해서 올립니다.

간단한 소스 설명
http://my.dreamwiz.com/heogn/lecture/lec02/javamail04.htm
———————————
http://jspstudy.zoa.to

오라클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:oracleora81jdbclibclasses12.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 를 오라클용으로 전환합니다.

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

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

이제 설치는 끝났습니다. 소스를 보죠.
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

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();

포천 ‘허브 아일랜드’

허브 아일랜드는 1만여평의 넓은 부지위에 허브향이 그윽한 곳이다.

포천 '허브 아일랜드'

인기가 좋은 식물 6종은 개별하우스에서 재배 전시되며
200여종의 식물을 한데 모아둔 실내정원,
새와 토끼를 함께 둔 미니동물원,
자체 개발한 100여종의 허브 상품을 판매하는 점포,
허브식물로 만든 음식을 선보이는 레스토랑,
산책로, 허수아비 전시대, 숙박시설 등
다채로운 향기와 분위기가 있는 곳이다. 

포천 '허브 아일랜드' 

레스토랑에는 허브 비빔밥, 허브 정식, 허브 동동주 등 다양한 메뉴가 준비돼 있으며,
공방에서는 허브로 비누와 양초만들기에서부터
벽걸이 장식 등 공예품을 만들어 볼 수 있다.

또한 여름에는 야외 정원이 조성되고 야외 카페도 문을 열어 연인이나 가족단위 방문에 좋은 곳이다.

포천 '허브 아일랜드'

모세의 기적 – 신비의 섬 진도

1984년 10월 진도대교가 개통함과 동시에 신비로운 섬 진도는 육지와 연결되었다.

모세의 기적 - 신비의 섬 진도

해남군 문내면 학동리와 진도군 군내면 녹진리 사이에 길이 484m의 사장교인 진도대교가 바로 그것이다.

경부고속도로 회덕분기점에서 호남고속도로에 올라 남쪽으로 내려오면 광산인터체인지가 있다.  여기서 고속도로를 벗어나서 13번 국도를 타고 약 90Km 정도 내려가면 나주-영암-성전-옥천을 지나 해남읍에 도착한다.


거기서 18번 국도로 약 34Km 정도 가면 눈앞에 바로 아름다운 진도대교가 펼쳐진다.

모세의 기적 - 신비의 섬 진도

이 진도대교를 건너 18번 국도로 약 11Km 정도 가면 석현리 사거리가 나온다. 여기서 왼쪽 801번 지방도로를 따라 가면 모세의 기적으로 유명한 회동에 다다른다.

이곳은 신비한 바닷길로 이미 유명하다. 이곳에서 바닷길이 열리는 시기는 대략 음력 2월 말에서 4월초까지이다.

모세의 기적 - 신비의 섬 진도  모세의 기적 - 신비의 섬 진도

석현리에서 18번 국도를 타고 가다 5.5Km 정도 이르면 여기가 바로 진도읍이다.

진도는 서울을 기점으로 했을 경우, 진도의 명물, 명소를 둘러 보고 다시 돌아올때까지 소요되는 거리는 약 1,000Km 정
도이며 시간은 15시간 정도이다.



현지 숙박시설로는 진도스타호텔 543-0043 / 태평모텔 543-9988 / 대동모텔 543-5188 / 대광장 544-2846 / 대원장 543-0505 /미도장 544-2653 / 신라장 544-2284 / 일월장 542-6811 / 진일장 542-1414 / 혜성장 543-9600 등이 있다.