[JSP] JSP 요약

Posted at 2010/07/07 23:55 // in Programming // by 엔신
Tomcat 5.5 설치

다운로드 받아서 C드라이브에 압축을 푼다.

시스템 환경변수 등록을 한다.

변수이름 : CATALINA_HOME
변수 값 : C:\apache-tomcat

변수이름 : JAVA_HOME
변수 값 : C:\Java\jdk1.6.0_13



환경변수 추가
변수이름 : CLASSPATH
변수 값 : C:\Java\jdk1.6.0_13\lib\servlet-api.jar

톰캣 포트 변경
C:\apache-tomcat\conf\server.xml
    <Connector port="8080" maxHttpHeaderSize="8192"
port 8080으로 된 것을 8090으로 변경

C:\apache-tomcat\webapps\jsp-examples\WEB-INF에서
classes - 폴더
lib - 폴더
web.xml
를 복사하여
C:\apache-tomcat\webapps\test007\WEB-INF
경로에다가 붙여넣기 한다
그리고 web.xml 파일을 수정한다
///////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

</web-app>

///////////////////////////////////////////////////////////////////
내용만 남겨놓으면 된다.
그리고
톰캣 다운시켰다가 startup시킨다.

test007/ 경로에 index.html 파일을 만들고
웹브라우저로
http://127.1.1.1:8090/test007/index.html
경로로 접속하여 본다.(정상접속 ok)

C:\apache-tomcat\conf\web.xml
파일에서 아래 두 내용(invoker)이 주석되어 있는데 그 주석을 제거한다
///////////////////////////////////////////////////////////////////
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
///////////////////////////////////////////////////////////////////
    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>
///////////////////////////////////////////////////////////////////
invoket를 해제하는 이유는 외부 경로를 설정하기 위해서임
그리고 나서
C:\apache-tomcat\conf\Catalina\localhost\test008.xml
파일을 생성하고 내용을 넣는다
///////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:\test008"
         privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
///////////////////////////////////////////////////////////////////
위와 같이하고 xml 설정 파일을 reload하기 위해 톰캣을 재시작한다.
이렇게 하면 이제 웹에서는
http://127.1.1.1:8090/test008/index.html
와 같은 경로로 하위 폴더 접근이 가능해진다.

///////////////////////////////////////////////////////////////////
JSP에서 캐릭터셋 설정

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

/////////////////////////////////////////////////////////////////////////
JSP 실행 3단계
JSP 컨테이너에서 실행되기 위해 3단계를 반드시 거친다.
- 변환 단계(Translation Step) : jsp가 java로 변환된다.
    hellojsp.jsp가 hellojsp_jsp.java로 변환된다.
- 컴파일 단계(Compile Step) : 변환된 java파일을 컴파일 한다. hellojsp_jsp.java를 컴파일하여 class를 생성한다.
- 실행 단계(Interprete Step) : 생성된 class를 실행하여 실행된 결과를 응답처리

변환파일 저장 위치
C:\apache-tomcat\work\Catalina\localhost\test008\org\apache\jsp

/////////////////////////////////////////////////////////////////////////
JSP 일반 태그 종류
Comments : <%-- 주석 --%> : JSP 주석
Directive tag : <%@ directive %> : JSP에게 정보전달 목적으로 사용
Declaration tag : <%! 선언 %> : 변수 및 메소드 선언
Scriptlet tag : <% 코드 %> : 서비스 코드 구현
Expression tag : <%= 출력값 %> : 결과값 출력

/////////////////////////////////////////////////////////////////////////
Directive tag
-정의
    JSP가 서블릿으로 변환될 때 전반적으로 영향을 줄 수 있는 정보를 제공한다.
-종류
    page Directive tag : 컨테이너에서 현재 JSP페이지를 어떻게 처리할 것인가에 대한 정보를 제공하는데 사용된다. 여러가지 속성을 이용.
    include Directive tag : 여러 JSP페이지에서 공통적인 내용이 있을 때 매번 공통적인 내용을 작성하지 않고 파일로 저장한 후 필요할 때 JSP페이지에서 파일을 삽입하여 사용할 수 있다.
    taglib Directive tag : 사용자에 의해서 만든 tag를 이용할 때 사용된다.
    
/////////////////////////////////////////////////////////////////////////
page Directive tag

속성 : 기본값 - 설명
info : 없음                                     - 페이지를 설명해주는 문자열 지정
language : "java"                         - JSP페이지에서 사용할 언어 지정
contentType : "text/html"             - 내용이 어떤 형태로 출력할 것인지 지정
extends : 없음                             - 서블릿으로 변할 때 상속받을 클래스 지정
import : 없음                                 - 다른 packgage의 클래스를 import
session : " true"                         - HTTPSession 객체 사용 여부
buffer : "8kb"                             - 출력크기를 지정
autoFlush : "true"                         - 내용들이 출력되기 전 버퍼가 다 찰 경우 동작을 지정
isThreadSafe : "true"                    - 멀티 스레드 동작 여부
errorPage : 없음                         - 예외발생시 예외처리 담당 페이지 지정
isErrorPage : "false"                     - 예외 담당 페이지의 설정 여부
pageEncoding : "ISO-8859-1"         - 사용하는 문자 인코딩 지정
isELIgnored : JSP 버전에 따라 다르다. - JSP2.0에 추가된 속성으로 EL 사용 유무.

<%@ page contentType="text/html;charset=utf-8" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.sql.*" %>
<%@ page language="java" %>
<%@ page session="true" %>
<%@ page buffer="8kb" %>
<%@ page autoFlush="true" %>
<%@ page isThreadSafe="true" %>
<%@ page info="JSP 페이지" %>
<%@ page isErrorPage="false" %>
<%@ page errorPage="hello.jsp" %>

/////////////////////////////////////////////////////////////////////////
include Directive tag

특징
    재사용할 수 있다.
    유지 보수가 쉽다.
    
<%@ include file ="hello.jsp"%>
hello.jsp에는 include하는 파일의 인코딩과 같게 설정해주어야 한다.

인클루드 디렉티브 태그(include driective tag)
<%@ include file ="hello.jsp"%>
정적인 페이지를 include할 때 사용하고(변수의 선언 모음)
원 페이지에 include 페이지까지 합쳐서 하나의 페이지로 만들고 나서 컴파일되어 하나의 파일만 생성되게 된다.

인클루드 액션 태그(include action tag)
<jsp:include page ="hello.jsp"/>
동적인 페이지를 include할 때 사용한다.(include한 페이지가 바뀐다거나, 다른 프레임을 변경시키는 작업을 하여야 하는 경우)
원 페이지와 include 페이지가 각각 컴파일되어서 두개의 파일이 생성된다.

/////////////////////////////////////////////////////////////////////////
taglib directive tag

Cannot fine the tag library descriptor for "http://java.sun.com/jsp/jstl/core"

/////////////////////////////////////////////////////////////////////////
param Action tag

test.jsp 파일
<jsp:include page="incl.jsp" flush="true">
    <jsp:param name="key" value="Duke"/>
</jsp:include>

incl.jsp 파일
<%
    request.setCharacterEncoding("utf-8");
    String name =request.getParameter("key");
%>
안녕하세요 <%= name%>입니다. ^^

setCharacterEncoding은 매개변수로 전달받은 파라미터에 대하여 인코딩 설정하여 글자깨짐을 방지한다.

/////////////////////////////////////////////////////////////////////////
GET 방식 매개변수 전달

out.print("<a href=\"view.jsp?num="+ num +"\">" + num +"</a>");

형식으로 get 방식으로 값을 넘겨도 받을때엔
request.setCharacterEncoding("utf-8");
String num =request.getParameter("num");
으로 받으면 된다.(무조건 String 형으로 전달된다)
@주의 : get 방식은 setCharacterEncoding 설정하여도 한글은 깨지므로 POST 사용하라.
또는 환경설정을 하여야 한다.


/////////////////////////////////////////////////////////////////////////
POST 방식 매개변수 전달

out.print("<form method=\"post\" action=\"modify.jsp\">");
out.print("번호 : ");
out.println("<INPUT TYPE=\"text\" NAME=\"num\" value=" + num +" disabled><br>");
out.print("이름 : ");
out.println("<INPUT TYPE=\"text\" NAME=\"name\"num value=" + name +"><br>");
out.print("폰번호 : ");
out.println("<INPUT TYPE=\"text\" NAME=\"tel\" value=" + tel +"><br>");
out.print("주소 : ");
out.println("<INPUT TYPE=\"text\" NAME=\"addr\" value=" + addr +"><br>");
out.print("메모 : ");
out.println("<INPUT TYPE=\"text\" NAME=\"memo\" value=" + memo +"><br>");
out.print("<input type=\"submit\" value=\"진짜로수정하기\"></form>");

받을땐
request.setCharacterEncoding("utf-8");
String num =request.getParameter("num");

/////////////////////////////////////////////////////////////////////////
웹표준? 어긋남?

 <input type="button" value="목록보기"onclick="location.href='./list.jsp'">

/////////////////////////////////////////////////////////////////////////
INPUT 태그에서 disabled

disabled해놓으면 버튼이나 텍스트상자에 비활성화만 되는게 아니라
값의 전달도 되지 않는다.

/////////////////////////////////////////////////////////////////////////
페이지 리다이렉트(Redirect)

<%
    if(cnt == 1){
        response.sendRedirect("list.jsp");
    }else{
        response.sendRedirect("back.jsp");
    }
%>
cnt가 1인 경우 list.jsp로 리다이렉트되고, 그 외의 경우엔 back.jsp로 리다이렉트 된다.

/////////////////////////////////////////////////////////////////////////
스크립트 요소의 이해

선언문
멤버변수의 의미
    변수형 선언문
    <% String str = "선언문"; %>
    메소드형 선언문
    <%
        public String asdfasf(){
        return str;
        }
    %>

스크립트릿
지역변수의 의미. 되도록 스크립트릿에서 변수를 사용하자.
<% String scriptlet = "스크립트릿 연습"; %>
<%=scriptlet%>

표현식
<%=코드%>
표현식에서는 ;를 생략한다.

/////////////////////////////////////////////////////////////////////////
HTTP 메소드

1. GET
    HTTP header에 정보를 실어 보냄
    URL 뒤에 매개변수 전달
    256Byte가 한계
    전달 속도가 빠름
    적은 양의 데이터 전송시 좋음
2. POST
    HTTP body에 정보를 실어 보냄
    데이터 사이즈에 제한이 없음
    보안에 좋다(안보이므로)
3. Head
    Header의 정보만 온다.
4. Put
    Resource를 저장할 때 사용
5. Delete
    Resource를 제거할 때 사용
    Put과 Delete를 허용하면 서버의 보안 측면상 좋지 못함
6. Trace
    클라이언트에서 서버까지 가는 경로 추적
7. Option
    서버의 성능 등

/////////////////////////////////////////////////////////////////////////
인덱스 페이지 설정(welcome file 지정)

C:\apache-tomcat\conf\web.xml
페이지에서 최하단에
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
라는 부분이 존재함.
welcom-file 부분에 설정하여 두면, 인덱스 페이지로 활용 가능함
이는 톰캣 서버에 전역적인 설정이고,

C:\test008\WEB-INF\web.xml
에 삽입하게 되면 서브디렉토리 내에서 사용 가능함

/////////////////////////////////////////////////////////////////////////
액션 태그의 개요

JSP에서 스크립트, 주석, 디렉티브와 함께 JSP 페이지를 이루고 있는 요소
액션 태그 : 페이지와 페이지 사이의 제어를 이동시킬수 있고, 다른 페이지의 실행 결과를 현재 페이지에 포함시킬 수 있으며, 자바빈도 JSP페이지에서 사용할 수 있는 기능을 제공한다. 또한 웹브라우저에서 자바 애플릿을 실행시킬 수 있도록 지원.

/////////////////////////////////////////////////////////////////////////
액션 태그의 종류

include - 페이지를 모듈화 할 때 <jsp:include> 액션 태그 사용
forward - 페이지의 흐름을 제어할 때 <jsp:forward>액션 태그 사용
plug-in - <jsp:plug-in>액션 태그는 애플릿을 사용할 때
useBean - 자바빈을 사용할 때(자바빈 객체 생성시) <jsp:useBean>
setProperty - 자바빈의 속성 값을 저장할 때
getProperty - 자바빈의 속성값을 읽어올 때

/////////////////////////////////////////////////////////////////////////
forward action tag(포워드 액션 태그)

<jsp:forward page="이동할 페이지명"/>
URL은 변경되지 않지만, 해당 페이지의 내용은 "이동할 페이지명"으로 바뀌게 된다.

파라미터 전달 방법
<jsp:forward page="이동할 페이지명">
    <jsp:param name="paramName1"> values="var1"/>
    <jsp:param name="paramName2"> values="var2"/>
</jsp:forward>

포워드 액션 태그는 버퍼를 비운다.

/////////////////////////////////////////////////////////////////////////
useBean Action tag

<jsp:useBean id="빈참조변수" class="패키지를 포함한자바빈" scope="4가지"/>
spoce는 page, request, session, appication

<jsp:useBean id="m" class="test.web.MemberBean"/>
<jsp:setProperty name="m" property="name" value="<%=request.getParameter("name")%>"/>

<jsp:setProperty name="m" property="name" param="name"/>
위의 getParameter 역할을 param이 대신한다.(같은 역할)

<jsp:setProperty name="m" property="name"/>
파람이 같은 경우 생략도 가능하다
<jsp:setProperty name="m" property="*"/>
하게 되면 모든걸 한방에 넣을 수 있다.

/////////////////////////////////////////////////////////////////////////
[ERROR] ... quoted with " which must be escaped when used within the value ...
< JSP 웹어플리케이션 구동시 따옴표사용에러 해결방법 >

1.유닉스 또는 리눅스
    startup.sh 중에 "export CATALINA_OPTS"부분
    -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
    를 추가한다.

2. 이클립스
    Run - RunConfiguration (또는 DebugConfiguration) - tomcat VM Argument
    -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false
    를 추가한다.

useBean Action tag 사용시 param이 아닌 value를 사용하여 매개변수를 받을 때, 데이터의 type이 다를 경우 발생한다.(ParseInt나 valueOf를 사용하여 변환을 해줘도 안먹힘)

/////////////////////////////////////////////////////////////////////////
Expression tag(표현식)

request : 웹브라우저에서 JSP페이지로 전달되는 정보의 모임. HTTP헤더와 HTTP 바디로 구성
response : 웹 브라우저로 응답할 응답 정보를 가지고 있음
out : JSP 페이지가 생성한 결과를 웹브라우저에 전송해주는 출력 스트림
pageContext : JSP 페이지의 컨텍스트를 나타내며, 주로 다른 내장객체를 구하거나, 페이지 흐름제어 그리고 에러 데이터를 얻어낼 때 사용
session : 요청한 웹브라우저에 관한 정보를 저장하고 관리
application : 서버의 설정 정보 및 자원에 대한 정보를 얻어내거나 어플리케이션이 실행되고 있는 동안에 발생할 수 있는 이벤트 로그 정보와 관련된 기능들을 제공
config : 서블릿이 초기화되는 동안 참조해야 할 정보를 전달해주는 역할
page : JSP 페이지 그 자체를 나타내는 객체(this로 자기 자신을 참조할 수 있음)
exception : JSP 페이지에서 예외가 발생하였을 경우, 예외를 처리할 페이지를 지정하였을 때 예외 페이지에 전달되는 객체

/////////////////////////////////////////////////////////////////////////
EL(Expression Language) 표현 언어

기본 문법
${}
${num + 1}
${article.num + 1}
${article['num']+1} 또는 ${article["num"]+1} ''와 "" 모두 유효함(.(dot) 대신 [](브라켓(bracket) 연산자를 사용 가능)

<%@ page isELIgnored="false" %>
옵션이 주어져 있어야 한다.(생략도 가능하지만 true일 경우에는 안됨)
<%=%> 인 expression tag를 대신하는 효과를 가질 수 있다.

<jsp:setProperty name="id" value="${aName}" />
aName 변수의 값을 value로 넣어주고 있다.

EL은 null값을 가지는 변수에 대해 좀 더 관대하고, 데이터 형 변환을 조금 더 자동적으로 해준다.

EL 표현식은 다음과 같은 기능을 가진다.
 - 변수와 연산자를 포함한다.
 - JSP 영역(page, request, session, application)에 저장된 어떤 속성 및 자바빈이라도 EL의 변수로 사용 가능
 - 내장 객체 지원

EL의 내장 객체
pageScope : 모든 page 영역 객체들에 대한 컬렉션
requestScope : 모든 equest 영역 객체에 대한 컬렉션
sessionScope : 모든 session 영역 객체들에 대한 컬렉션
applicationScope : 모든 application 영역 객체에 대한 컬렉션
param : 모든 request 파라미터들을 문자열로 가진 컬렉션
paramValues : 모든 request 파라미터들을 파라미터당 문자열 배열로 가진 컬렉션
header : HTTP 요청 헤더를 문자열로 가진 컬렉션
headerValues : HTTP 요청 헤더들을 헤더당 문자열 배열로 가진 컬렉션
cookie : 모든 쿠키의 컬렉션
initParam : 모든 어플리케이션의 초기화 파라미터의 이름 컬렉션
pageContext : 현재 페이지를 위한 javax.servlet.jsp.PageContext

/////////////////////////////////////////////////////////////////////////
Cannot find the tag library descriptor for http://java.sun.com/jsp/jstl/core

<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
를 하였을때 위와 같은 에러가 나온다면 톰캣 lib에서 default로 jstl.jar와 standard.jar 파일이 로드되지 않기 때문에 복사하여 lib 경로에 넣어줘야 한다.

C:\apache-tomcat\webapps\jsp-examples\WEB-INF\lib
경로에 존재하는 standard.jar, jstl.jar 파일을
C:\apache-tomcat\common\lib 경로에 복사하여 붙여넣기하고
톰캣을 restart 시키면 된다.

/////////////////////////////////////////////////////////////////////////
EL 변수 선언과 사용

<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>
를 선언하고
<c:set var="kkk" value="999" />
${kkk} = ${kkk+1}
하여 사용할 수 있다 kkk 라는 변수를 만들고 출력하면 999 = 1000이 나온다.

/////////////////////////////////////////////////////////////////////////
자바 스크립트(Java Script)

<script language="javascript">
<!--
    //함수의 선언
    function test(){
        document.write("test");
    }
    function test1(num){
        document.write("<br>" +num + "을 출력합니다.<br>");
    }
    function test2(num){
        return num + "을 출력합니다.<br>";
    }
-->
</script>
와 같은 형태로 자바스크립트 내에서 함수를 선언하여 사용할 수 있다.
for문은 java 문법과 동일하다.
변수는 var 변수명= ""; 형태로 선언이 가능하고, ""로 문자열과 숫자를 구분한다.


alert("경고"); // 경고창을 띄운다(확인 버튼만 가능)
comfirm("확인/취소를 선택해"); // 확인 취소 버튼 선택이 가능
document.write("html 에 적용될 문자열"); // 자바스크립트문법 내에서 html 페이지 내에 사용될 문자열 또는 태그를 적용시킬 수 있다.
prompt("값을 입력해줘", "3"); // 입력받을 수 있는 창을 띄운다.
eval("3+2"); // 문자열이지만 수치형으로 계산하여 5라는 값을 return 하여 준다.
isNaN("111"); // 문자열인지 숫자인지 구분하여 true,false로 리턴
isFinite(11); 숫자가 유한의 숫자이면 true, 아니면 false

배열 사용법
arr = new Array(3);
arr[0] = "장나라";
arr[1] = "최홍만";
arr[2] = "최민수";

/////////////////////////////////////////////////////////////////////////

response.sendRedirect는 페이지 url이 변경된다.

import javax.servlet.http.HttpServlet;

RequestDispatcher dispatcher = request.getRequestDispatcher("list.jsp");
dispatcher.forward(request, response);
는 페이지 url이 변경되지 않는다.

sendRedirect는 dispatcher보다 성능이 떨어진다.
요청시 바인딩된 데이터가 지속되지 못한다.

/////////////////////////////////////////////////////////////////////////
import java.io.PrintWriter;
PrintWriter out = response.getWriter();

/////////////////////////////////////////////////////////////////////////
바인딩(Binding)
정의
실행시 필요한 자원을 컨테이너가 인식할 수 있도록 등록하는 작업을 의미
등록된 자원은 서블릿이나 JSP에서 사용 가능

용도
모듈화된 컴포넌트간의 자원공유가 필요로 할 때 사용
MVC 모델 Model과 View 컴포넌트 간의 자원 공유시 사용

방법
setAttribute(String name, Object obj) 메소드로 바인딩
getAttribute(String name) 메소드로 자원 사용
removeAttribute(String name) 메소드로 자원 삭제

/////////////////////////////////////////////////////////////////////////
============== 서블릿 ==================

** 서블릿 만들기

1. 다이나믹웹프로젝트에서 패키지생성

2. 패키지안에 서블릿 파일 생성

 - WebContent>Web-Inf안에 web.xml안에 servlet을 설정해줌

   (이클립스는 자동으로 생성하므로, 다른 프로그램일때는 이를 직접 써 넣어야 함)

3. servlet파일의 doGet()/ doPost()에 전달받은 값을 넣음

 - doGet()/doPost() 둘 중 어느 것으로 받아도 전달 받을 수 있도록 doProcess()메소드를 만들어 doGet()/doPost()에서

   doProcess(request, responce)로 메소드를 불러 사용

4. 사용순서

 1) setAttribute로 값을 넣는다.

 2) dispatch로 페이지와 값을 넘겨준다.

 3) getAttribute로 값을 받아 온다. (꼭 캐스팅 해주어야 함)



** 클라이언트에서 서버로 데이터가 전달되는 방식

1. GET방식

 - 데이터 수에 제한

 - 보안이 취약(id, password가 다 보임)

 - form 에서 default로 method가 get방식으로 되어있음



2. POST방식

 - 보안 문제발생이 적음



=>get/post 중 하나로 보내면 servlet에서 doget()이나 dopost()로 받아야 함





** 서블릿의 binding

1. setAttribute

 - 구현

   : request.setAttribute(String name, Object obj);    : request.setAttribute("name", "홍길동");

2. getAttribute : 넘어오는 값은 꼭 캐스팅 해주어야 함(ex> String)

3. removeAttribute

=> 값을 넘겨주기 위해서는 redirect로 넘기지 말고 dispatche로 넘겨주어야 한다.!!!



** 서블릿의 forward

1. redirect

 - 구현

   : response.sendRedirect("aaa.jsp")

     파라미터를 넘길 수 없고 페이지만 호출한다.

2. dispatche

 - 구현(객체 생성 후 사용)

   : RequestDispatcher dispatcher = request.getRequestDispatcher("aaa");   : aaa라는 servlet호출

     dispatcher.forward(request, response);

     => aaa라는 servlet이 있고, web.xml에 mapping되어 있을 때 사용



** servletcontext

1. 서블릿과 컨테이너간에 통신하기 위해 사용

2. context마다 하나의 serveltcontext가 생성(공유가능)
    ServletContext 객체는 컨테이너와 동일한 LifeCycle를 갖는다.

3. 구현

 - 여러 servlet에서 가져와 사용할 수 있다.

  1) web.xml에서 지정되지 않은 servlet 안에

    <context-param>

        <param-name></param-name>

        <param-value></param-valude>

    </context-param>

  2) servlet 파일에 객체를 생성한 후 변수에 값을 넣어 출력

         ServletContext context = getServletContext();

        String driver = context.getInitParameter("driver");

용도
서블릿에서 파일접근시 사용된다.
자원을 바인딩 할 때 사용된다.
로그파일 작성시 사용된다.
context 파라미터를 이용 할 때 사용된다.

////////////////////////////////////////////////////////////////////////
예제)
web.xml 에 아래 내용 추가
<context-param>
    <param-name>driver</param-name>
    <param-value>oracle.jdbc.driver.OracleDriver</param-value>
</context-param>
<context-param>
    <param-name>url</param-name>
    <param-value>oracle:thin:@localhost:1521:darkhi</param-value>
</context-param>
<context-param>
    <param-name>user</param-name>
    <param-value>scott</param-value>
</context-param>
<context-param>
    <param-name>pass</param-name>
    <param-value>tiger</param-value>
</context-param>

java 서블릿 파일에서 아래와 같이 사용.
import java.io.PrintWriter;
import javax.servlet.ServletContext;

response.setContentType("text/html;charset=euc-kr");
        PrintWriter out = response.getWriter();
        String driver = getInitParameter("driver");
        String url = getInitParameter("url");
        String user = getInitParameter("user");
        String pass = getInitParameter("pass");
        
        out.print("driver : "+driver +"<br>");
        out.print("url : "+url +"<br>");
        out.print("user : "+user +"<br>");
        out.print("pass : "+pass +"<br>");
        
////////////////////////////////////////////////////////////////////////

 - 파일에서 가져올 때(.txt)

  1) web-inf안에 txt로 파일을 만듦

  2) servlet파일에 객체 생성 후 txt파일로 저장된 경로를 가져와 뿌려준다.

    ServletContext context = getServletContext();

    InputStream is = context.getResourceAsStream("/WEB-INF/servletTest.txt");

    BufferedReader br = new BufferedReader(new InputStreamReader(is));

  3) 읽어온 자료를 구분자로 잘라 뽑아 낸다.

    while((s=br.readLine()) !=null ){

    StringTokenizer tk = new StringTokenizer(s, "&");    : token 대신 split("&")사용해도 됨

    driver = tk.nextToken();    }
    

////////////////////////////////////////////////////////////////////////
파일로 저장된 변수를 가지고 오기.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;


protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    response.setContentType("text/html;charset=euc-kr");
    PrintWriter out = response.getWriter();
    ServletContext context = getServletContext();
    InputStream is = context.getResourceAsStream("/WEB-INF/servletTest.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    
    String s = null;
    String driver = null;
    String url = null;
    String user = null;
    String pass = null;

    while((s = br.readLine()) != null){
        StringTokenizer tk = new StringTokenizer(s, "&");
        driver = tk.nextToken();
        url = tk.nextToken();
        user = tk.nextToken();
        pass = tk.nextToken();    
    }
    out.print("driver : " + driver + "<br>");
    out.print("url : " + url + "<br>");
    out.print("user : " + user + "<br>");
    out.print("pass : " + pass + "<br>");
}

/WEB-INF/servletTest.txt 경로에 아래 내용의 servletText.txt 파일을 생성
oracle.jdbc.driver.OracleDriver&jdbc:oracle:thin:@localhost:1521:darkhi&java&java

&를 구분자로 하여 파일의 내용을 리드 받는다.
////////////////////////////////////////////////////////////////////////



** servletconfig

1. 서블릿 초기화시 필요한 정보를 컨테이너에서 제공받음

2. 서블릿마다 하나의 servletconfig가 생성

3. 구현 : initparameter(초기 파라미터)-한 servlet에서만 사용가능

  1) web.xml에서 지정된 servlet안에

    <init-param>

        <param-name>aaaa</param-name>

        <param-value>bbb</param-value>

    </init-param>으로 설정

  2) servlet 파일에서 값을 변수에 넣어 출력한다.





=>>컨테이너 안에 여러개의 context가 있고 그 안에 또 여러개의 servlet이 있음



4. 구현2 : context - 여러 servlet에서 가져와 사용할 수 있다.

  1) web.xml에서 지정되지 않은 servlet 안에

    <context-param>

        <param-name></param-name>

        <param-value></param-valude>

    </context-param>

  2) servlet 파일에 객체를 생성한 후 변수에 값을 넣어 출력

         ServletContext context = getServletContext();

        String driver = context.getInitParameter("driver");

5. 구현3 : 파일에서 가져올 때

  1) web-inf안에 txt로 파일을 만듦

  2) servlet파일에 객체 생성 후 txt파일로 저장된 경로를 가져와 뿌려준다.

    ServletContext context = getServletContext();

    InputStream is = context.getResourceAsStream("/WEB-INF/servletTest.txt");

    BufferedReader br = new BufferedReader(new InputStreamReader(is));

  3) 읽어온 자료를 구분자로 잘라 뽑아 낸다.

    while((s=br.readLine()) !=null ){

    StringTokenizer tk = new StringTokenizer(s, "&");    : token 대신 split("&")사용해도 됨

    driver = tk.nextToken();    }

6. 구현4 : set/getAttribute로 servlet시킴

  1) 첫번째 servlet파일 안에

    ServletContext context = getServletContext();

    context.setAttribute("name", "홍길동");

  2) 두번째 servlet파일에

    ServletContext context = getServletContext();

    String name = (String)context.getAttribute("name");

 <배열로 구현>

  - Attribute servlet파일

    ArrayList list = new ArrayList();

    list.add("이순신");

    list.add(new Integer(500));  // 숫자 넣는 것!!

    context.setAttribute("data", list);

  - Attribute1 serblet파일

    ServletContext context = getServletContext();

    ArrayList list = (ArrayList)context.getAttribute("data");

    String name = (String)list.get(0);

    int age = (Integer)list.get(1);

    context.log("context에서 [이름 = " + name + " ] , [나이 = " + age + "]");

////////////////////////////////////////////////////////////////////////
context가 아닌 config별로 적용하기

web.xml 파일에 아래 내용 삽입
<servlet>
    <description>
    </description>
    <display-name>
    InitParamServlet</display-name>
    <servlet-name>InitParamServlet</servlet-name>    
    <servlet-class>
    servletTest.InitParamServlet</servlet-class>
    <init-param>
        <param-name>driver</param-name>
        <param-value>oracle.jdbc.driver.OracleDriver</param-value>
    </init-param>
    <init-param>
        <param-name>url</param-name>
        <param-value>oracle:thin:@localhost:1521:darkhi</param-value>
    </init-param>
    <init-param>
        <param-name>user</param-name>
        <param-value>scott</param-value>
    </init-param>
    <init-param>
        <param-name>pass</param-name>
        <param-value>tiger</param-value>
    </init-param>
</servlet>

로 사용
import java.io.PrintWriter;
        response.setContentType("text/html;charset=euc-kr");
        PrintWriter out = response.getWriter();
        String driver = getInitParameter("driver");
        String url = getInitParameter("url");
        String user = getInitParameter("user");
        String pass = getInitParameter("pass");
        
        out.print("driver : "+driver +"<br>");
        out.print("url : "+url +"<br>");
        out.print("user : "+user +"<br>");
        out.print("pass : "+pass +"<br>");
        
////////////////////////////////////////////////////////////////////////
모델 1(Model 1) vs 모델 2(Model 2)다

모델 1 : 웹브라우저의 요청을 받아들이고, 웹브라우저에 응답해주는 처리에 대해 JSP 페이지 단독으로 처리하는 구조.
View(JSP page)와 Controller가 결합되어 있고(응답요청 처리), Model(JavaBean)만 분리되어 있는 구조
장점 :
- 단순한 페이지 흐름으로 인해 개발 기간 단축
- MVC 구조에 대한 추가적인 교육이 필요 없고 개발팀의 팀원의 수준이 높지 않아도 됨
- 중소형 프로젝트에 적합
단점 :
- 웹 어플리케이션이 복잡해질수록 유지보수가 어렵다
- 디자이너와 개발자 간의 원활한 의사소통이 필요.(JSP 페이지 안의 디자인(그림, 플래시 링크 등)과 로직에 대하여 모두 감안)

모델 2 :
요청은 Controller(Servlet)가 받고 모델(JavaBean)과 데이터를 주고받으며, 응답은 Controller에서 View(JSP page)로 전달이 되어 웹브라우저로 처리된다.
장점 :
- business logic과 View의 분리로 어플리케이션이 명료해지며 유지 보수와 확장이 용이.
- 개발자와 디자이너의 작업이 분리되어져 역할과 책임 구분이 여확.
단점 :
- 개발 초기에 구조 설계를 위한 시간이 많이 소요(개발기간의 증가)
- MVC 구조에 대한 개발자들의 이해가 필요해서 개발팀의 팀원의 높은 수준을 요구

/////////////////////////////////////////////////////////////////////////
MVC 패턴

View - JSP 페이지 또는 서블릿(Servlet)
Model - 자바빈, 자바 객체 또는 EJB(Enterprise JAva Bean)의 entityBean
Controller - Servlet, JSP 페이지 또는 EJB의 sessionBean

(1) Controller : Servlet
01) 웹브라우저의 요청을 받음
    doGet(), doPost() 메소드로 요청을 받음
02) 웹브라우저(클라이언트)가 요구하느 작업을 분석
    String type = request.getParameter("type");
03) 요청한 작업을 처리하기 위해 비지니스 로직을 처리하는 모델(JavaBean) 사용
    Object result = null;
    if (type.equals("a"){
        // a 요청 처리
    }
    else if (type.equals("b"){
        // b 요청 처리
    }
04) 처리 결과를 request 또는 session의 속성에 저장
    request.setAttribute("result", result);
05) 적당한 뷰(JSP page)를 선택 후 해당 뷰로 포워딩
    import javax.servlet.*;
    RequestDispatcher dispatcher = request.getRequestDispatcher("a.jsp");
    dispatcher.forward(request, response);

(2) 뷰(View) : JSP 페이지
비지니스 로직을 가지고 있지 않은 점을 제외하고는 일반적인 JSP 페이지.
dispacher.forward()로 request, response 객체를 공유한 후, request.getAttribute("result");를 사용하여 객체를 가지고 와 화면에 보여준다.

(3) 모델(Model) : 자바빈(JavaBean)
비지니스 로직(DAO, TO)의 처리를 요청받아서 DB와 연동된다.
01) 컨트롤러(Controller)의 요청을 받는다.
02) 비지니스 로직을 처리한다.
03) 처리한 비지니스 로직의 결과를 컨트롤러(Controller)로 반환한다.

/////////////////////////////////////////////////////////////////////////
쿠키(Cookie)

HTTP 프로토콜은 웹브라우저(클라이언트)의 요청에 대한 응답을 하고 나면 연결을 지속하지 않음(Connectionless)

import javax.servlet.http.*;

(1) 쿠키 생성 및 사용
// 쿠키 생성
Cookie cookie = new Cookie(String name, String value);
// response객체에 add 시켜야함
response.addCookie(name);
// 쿠키 이름에 대응하는 값을 새롭게 지정
cookie.setValue(newValue);
// 클라이언트의 요청과 함께 전달되어져 온 쿠키를 읽어 올 때는 request 객체의 etCookies() 메소드를 사용한다. 웹브라우저에 저장된 쿠키를 모두 읽어오기 때문에 리턴 타입이 Cookie[]이다.
Cookie[] Cookies = request.getCookies();
// 쿠키의 지속시간을 설정한다.
cookie.setMaxAge(int second);

/////////////////////////////////////////////////////////////////////////
세션

session.메소드

리턴타입 : 메소드 이름 : 설명
java.lang.Object : getAttribute(String name) : name이란 해당 값의 속성을 가지고 옴
java.util.Enumeration : getAttributeNames() : 속성의 이름들을 Enumeration 객체 타입으로 리턴
long : getCreationTime() : 1970년 1월 1일 자정을 기준으로 하여 현재 세션이 생성된 시간까지의 지난 시간을 계산하여 1/1000초로 리턴
String : getId() : 세션에 할당된 고유ID를 String 타입으로 리턴
int : getMaxInactioveInterval() : 현재 생성된 세션을 유지하기 위해 설정된 최대 시간을 정수형으로 리턴
void : invalidate() : 현재 생성된 세션을 무효화
void : removeAttribute(String name) : name으로 지정한 속성의 값을 제거
void : setAttribute(String name, Object value) : name으로 지정한 속성에 value를 저장
void : setMaxInactiveInterval(Int interval) : 세션의 최대 유지시간을 초 단위로 설정

기본 사용 예제
session.setAttribute("id", "asdfasdf");
String id = (String) session.getAttribute("id");
session.removeAttribute("id");
session.invalidate();


web.xml 파일에 아래와 같이 추가해 주면 분 단위로 전체설정 할수 있으며 페이지에 또는 web.xml 에 추가하지 않았을 경우에는 기본 30분 (1800초)이다.
<session-config>
        <session-timeout>10</session-timeout>
</session-config>

/////////////////////////////////////////////////////////////////////////
Zakarta DBCP API를 이용한 Connection Pool 사용

데이터베이스를 연결하기 위한 Connection은 객체이다. 이 객체는 새롭게 만들어질 때 많은 시스템 자원이 요구된다.

커넥션 객체를 생성하고 관리하는 방법
(1) service method(doGet,doPost)에서 커넥션 객체를 생성
    작성은 쉬우나, 많은 문제점이 존재.
    이 경우 (요청)Request 당 한 개의 커넥션 객체를 생성하므로 시스템으 부하가 커지고 메모리가 낭비 된다.(Local variable)
(2) init method에서 커넥션 객체 생성
    이 방법은 서비스 될 때 단 한번만 사용하는 init method에서 커넥션 객체를 생성한다.
    connection 시간이 안 걸리나 하나의 커넥션을 사용하면 커넥션에 쿼리가 쌓이게 되어 응답 시간이 증가한다.(Member variable)
(3) 커넥션 풀에서 커넥션 객체 생성 및 관리하기
    자원을 쓰고 회수하는 방법.
    한번 만들어져서 사용된 커넥션 객체는 다시 커넥션 풀로 회수.
    커넥션 생성의 개수를 결정할 수 있다.

설치 세팅

(1) 필요 파일 다운로드
commons.apache.org사이트에서 collections, dbcp, pool 다운로드
    commons-collections-3.2.1.jar
    commons-dbcp-1.2.2.jar
    commons-pool-1.4.jar
파일을 C:\apache-tomcat\common\lib에 붙여넣기

(2)
WebContent\META-INF\context.xml 파일 생성 아래 내용 삽입
<Context>
    <Resource name="jdbc/darkhi"
                    auth="Container"
                    driverClassName="oracle.jdbc.driver.OracleDriver"
                    type="javax.sql.DataSource"
                    
                    loginTimeout="10"
                    maxWait="5000"
                    maxIdle="10"
                    username="java"
                    password="java"
                    maxActive="20"
                    url="jdbc:oracle:thin:@localhost:1521/darkhi"
    />
</Context>

WebContent\WEB-INF\web.xml 파일에 아래 내용 추가
    <resource-ref>
        <description>Connection</description>
        <res-ref-name>jdbc/darkhi</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

사용 방법
<%@ page import="java.sql.*" %>
<%@ page import="javax.sql.*" %>
<%@ page import="javax.naming.*" %>
<%
    DataSource ds = null;
    Connection conn = null;            
    try{        
        Context init = new InitialContext();
        //Context jce = (Context)init.lookup("java:comp/env");
        //ds = (DataSource)jce.lookup("jdbc/orcl");
        ds = (DataSource)init.lookup("java:comp/env/jdbc/darkhi");
        conn = ds.getConnection();

/////////////////////////////////////////////////////////////////////////
파일 업로드

1. 입력 폼 만들기
<form action="이동페이지" method="post" enctype="multipart/form-data">
<input type="file" name="file1">
</form>

2. 매개변수 받기
// 서버 root에 해당하는 절대 경로를 구하여 ""된 주소를 덧여 스트링 형태로 리턴한다.
String filePath = request.getSession().getServletContext().getRealPath("/data/");
// 5메가 짜리 파일 용량 제한
int fileSize = 1024 * 1024 * 5;
String encoding = "utf-8";
// DefaultRenamePolicy()는 업로드하는 경로에 파일명이 존재할 시 업로드되는 파일 이름 뒤에 1,2,3과 같은 형식으로 rename 하는 형식

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

MultipartRequest multi = new MultipartRequest(
        request, filePath, fileSize, encoding, new DefaultFileRenamePolicy());

/////////////////////////////////////////////////////////////////////////
썸네일

1. JAI API 설치
http://java.sun.com/products/java-media/jai/downloads/download-1_1_2.html
또는 구글에서 Java Advanced Imaging 검색해서 Download 찾아서 JDK용으로 받는다.
설치 경로는 C:\Java\jre6\lib\ext에 설치가 되도록 한다.
jai_codec.jar와 jai_core.jar가 lib\ext에 설치가 되어 있는지 확인한다.

2. 썸네일 이미지 생성하기
import javax.media.jai.JAI;
RenderedOp im = JAI.create("fileolad", param);

/////////////////////////////////////////////////////////////////////////
JavaMail API 사용하기

http://java.sun.com/products/javamail/downloads/index.html
에서 다운로드 받는다
압축을 풀고 mail.jar 파일을 C:\Java\jre6\lib\ext에 붙여넣기 한다.

/////////////////////////////////////////////////////////////////////////
답글 구현(댓글 아님)

글13 asdf
    글14 re : asf
        글15 re : re
글12
글11

위와 같은 형식으로 만들기 위한 컬럼
reply_secret(답글의 작성 가능 여부)
ref(답글임을 표시하기 위한 컬럼)
ref_level(단계)
ref_step(답글의 순서)

reply.jsp
reply_ok.jsp를 생성하여
view에서 답글 쓰기 구현
리플 작성시에 ref_step(리플의 리플 작성시 대상 리플 step의 step+1하여 리플을 작성하여야 하므로
원래의 대상 리플의 다음에 모든 리플의 step은 +1씩 증가시키고, 리플 다음번에 삽입하는 형식을 취한다.


/////////////////////////////////////////////////////////////////////////
전체의 시간 정보를 간략하게 줄여서 출력

Java.util.Date date = null;
java.text.SimpleDateFormat sdate = new SimpleDateFormet("yyyy-MM-DD");
date = new Date(b.getReg_Date().getTime());
String strdate = sdate.format(date);

/////////////////////////////////////////////////////////////////////////
오라클 rownum 사용법

select rownum, num, id form TABLE;

부분 뽑기
select rownum, num, id
from(select rownum aa, num, id from boardreply)
where aa >= 3 and aa <=5;
반드시 서브쿼리안에서 별칭을 지정해주어야 그 밖의 where 절에서 인식이 가능하다.


/////////////////////////////////////////////////////////////////////////
zipcode 추가하는 방법 2

create table zipcode(
    ZIPCODE varchar2(7),
    SIDO varchar(4),
    GUGUN varchar2(15),
    DONG varchar2(26),
    RI varchar2(45),
    ST_BUNJI varchar(11),
    ED_BUNJI varchar(9),
    SEQ number
);

sqlplus java/java 접속
@c:\zipcode.sql
하게 되면 데이터가 한 라인씩 insert된다.
zipcode.sql에는
insert into zipcode values(머머머, 머머머, 머머머);
라는 라인이 몇만건이 존재한다.


/////////////////////////////////////////////////////////////////////////
struts 프레임워크 환경설정

struts.apache.org에서 struts 1.3.10을 다운로드 받음.
압축 풀어서 struts-blank-1.3.10.war, struts-examples-1.3.10.war 파일을 복사해서 C:\Tomcat_5.5\webapps 에 붙여넣기 하고 톰캣을 재시작하면 파일명과 동일한 폴더가 생성이 된다.

예제 페이지 접속하기
http://localhost:8090/struts-examples-1.3.10/으로 접속하면 example 페이지에 접속이 가능해진다.

이클립스에서 새로운 프로젝트를 생성하고 WEB-INF에서 web.xml 파일을 삭제하고 생성된 struts-blank-1.3.10 폴더안에서 web.xml과 struts-config.xml 파일을 import시킨다.

C:\Tomcat_5.5\webapps\struts-blank-1.3.10\WEB-INF\lib 안에 있는 라이브러리 파일들을 C:\Tomcat_5.5\common\lib에 붙여넣기하거나, 이클립스의 WEB-INF\lib에 import시킨다.


이올린에 북마크하기
2010/07/07 23:55 2010/07/07 23:55

[JSP] JDBC를 이용한 데이터베이스 활용법

Posted at 2010/07/07 23:45 // in Programming // by 엔신
JDBC를 이용한 데이터베이스 활용법

// 1. 대표 클래스를 로딩한다.
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
System.err.println("클래스 로딩 성공");
}
catch(ClassNotFoundException e){
System.err.println("클래스 로딩 오류 : " + e);
}

// 2. Contection 객체를 얻는다.
try{
con = DriverManager.getConnection(jdbcurl, id, pw);
System.out.println("정상접속");

// 3. Statment 객체를 얻는다.
stmt = con.createStatement();

// 4. SQL 구문을 실행한다.
sql = "create table jdbca(a number, b varchar(20))";
result = stmt.execute(sql);

또는 prepareStatement 인터페이스를 사용할 수 있음
sql = "update friend set name = ?, tel = ?, addr = ?, memo = ? where num = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, inputName);
pstmt.setString(2, inputTel);
pstmt.setString(3, inputAddr);
pstmt.setString(4, inputMemo);
pstmt.setInt(5, inputNum);
pstmt.executeUpdate();

/////////////////////////////////////////////////////////////////////////
DML(insert,update,delete) - execute(String sql);
DDL(create,alter,drop) - executeUpdate(String sql);
DCL(grant,revoke) - execute(String sql)
select - executeQuery(String sql);
-- 자바에서 사용 할 때에는 쿼리문 끝에 세미콜론을 사용하지 않는다.

INSERT INTO table_name (컬럼명, 컬럼명) VALUES (값, 값);
INSERT INTO table_name (컬럼명, 컬럼명) VALUES (값, 값) subquery; // 다중 삽입
UPDATE table_name SET column1 = value, column2 = value WHERE condition;
UPDATE table_name SET column1, column2 = (SELECT column1, column2 FROM table_name WHERE condition) value WHERE condition;
DELETE 테이블명 WHERE 컬럼명 > 3000;
DELETE 테이블명 WHERE 1 = 1;
create table it(
a number primary key,
b varchar2(10)
);
DROP TABLE table_name CASCADE CONSTRAINT
GRANT connect, resource TO test;

/////////////////////////////////////////////////////////////////////////
일반적으로 close 해줘야 하는 것들
if(rst != null) rst.close();
if(stmt != null) stmt.close();
if(con != null) con.close();


JDBC

JDBC 파일 복사하여 놓기)
C:\oracle\product\10.2.0\db_1\jdbc\lib\ojdbc14.jar
파일을 아래 디렉토리 경로에 복사하여 붙여놓는다
C:\Java\jdk6\lib\ext
이유는 위 경로가 자바의 기본 경로이기 때문에 해당 경로에 넣어두게 되면 자바 어디에서든지 사용할 수 있게 된다.

JDBC 버전과 JDK 버전 매치
JDBC 1.0 -<---> JDK 1.2 -- JDBC - ODBC 브릿지
JDBC 2.0 -<---> JDK 1.3 -- Native Code Type X
-- 2.0으로 오면서 'Cursor 관리'가 가능해지면서, 커서의 이동이 next 뿐만 아니라 previous가 가능해졌다.
JDBC 3.0 -<---> JDK 1.4 -- 미들웨어 버전
JDBC 4.0 -<---> JDK 5.0 -- 상용화 버전

///////////////////////////////////////////////////////////////////
Class 정적 로딩과 동적 로딩

Sam s; // 정적 로딩
Class.forName("Sam"); // 동적 로딩

Sam s는 Sam이라는 클래스가 없을 경우 컴파일 시 에러가 나게 되지만, Class.forName()을 사용하게 되면 컴파일 시에는 에러가 나지 않지만 Runtime시 에러가 발생하게 된다.

///////////////////////////////////////////////////////////////////
java.sql 패키지의 DriverManager 클래스
일련의 JDBC 드라이버를 관리하기 위한 기본적인 서비스

기본 연결 예제)
import java.sql.*;
public class JDBCTest{
public JDBCTest(){
// 1. 대표 클래스를 로딩한다.
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException e){
System.err.println("클래스 로딩 오류 : " + e);
}
// 2. Contection 객체를 얻는다.
// jdbcurl : jdbc:oracle:thin:@IP:Port:ListenerName
// jdbcurl : jdbc:oracle:thin:ID/PASS@IP;Port:ListenerName
String jdbcurl = "jdbc:oracle:thin:@192.168.0.33:1521:darkhi";
String id = "scott";
String pw = "tiger";
// 아래처럼 url,id,pw를 결합형으로 사용할 수도 있다.
//String jdbcurl = "jdbc:oracle:thin:scott/tiger@192.168.0.33:1521:darkhi";

try{
Connection con = DriverManager.getConnection(jdbcurl, id, pw);
System.out.println("정상접속");
}
catch(SQLException sqle){
System.out.println("접속오류");
}
}

public static void main(String[] args)
{
new JDBCTest();
}
}

///////////////////////////////////////////////////////////////////

이올린에 북마크하기
2010/07/07 23:45 2010/07/07 23:45

perl http post

Posted at 2010/06/07 00:53 // in Programming // by 엔신
use strict;
use warnings;
use LWP 5.64;
my $browser = LWP::UserAgent->new;
my $url = 'http://rain9.com/api/save_replays.php';

for(my $i=1;$i<=300;$i++)
{
    my $response = $browser->post($url,['winner' => '0', 'losses0' => '33', 'point0' => '9999', 'losses1' => '74', 'point1' => '4', 'id0' => '2666379', 'id1' => '1564987', 'seed' => '0415000000000000', 'wins0' => '18', 'wins1' => 42]);

die "$url error: ", $response->status_line
   unless $response->is_success;
  die "Weird content type at $url -- ", $response->content_type
   unless $response->content_type eq 'text/html';

# failed라는 단어가 있으면 failed 출력
  if( $response->content =~ m{failed} ) {
    print "failed!!!\n";
  } else {
    print "secess!!\n";
  }
}
http://www.perl.com/pub/a/2002/08/20/perlandlwp.html?page=2

음.... 급하게 http post 데이터 날릴일이 있어서 검색해서 급조....
그런데 서버가 해외 서버라 그런지 응답 속도가 너무 느려서 300번 도는데 하루종일 걸리길래
perl test.pl & 로 백그라운드로 10개 동시에 돌려버렸음.......
쉽게쉽게 쓰기 좋다.....

이올린에 북마크하기
2010/06/07 00:53 2010/06/07 00:53

[MFC] HTTP 연결(Connection) 기본 소스

Posted at 2010/04/12 01:07 // in Programming // by 엔신
#include <afxinet.h>

    CInternetSession*    pSession = NULL;
    CHttpConnection*    pHttpConnect = NULL;
    CHttpFile*            pHttpFile = NULL;
    CString                url = _T("tc/index.php");

    try{
        
        // HTTP 메소드별로 사용 가능
        pSession = new CInternetSession;

        pHttpConnect = pSession->GetHttpConnection(_T("www.rain9.com"));

        /* 이런 식으로도 익셉션 처리 가능
        if(pHttpConnect == NULL)
            throw CString(_T("http connection failed!!!"));
        */

        pHttpFile = pHttpConnect->OpenRequest(CHttpConnection::HTTP_VERB_GET, url);

        pHttpFile->AddRequestHeaders(_T("HTTP/1.1\r\nAccept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, */*\r\nAccept-Language: ko\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB6.4; CNS_UA; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; CNS_UA)\r\nAccept-Encoding: gzip, deflate\r\nProxy-Connection: Keep-Alive\r\n"));

        pHttpFile->SendRequest();

        // GET 방법으로 간단하게
        /*
        pSession = new CInternetSession;
        pHttpFile = pSession->OpenURL(_T("http://www.rain9.com/tc/index.php"));
        */
        
    }
    catch(CInternetException *m_pEx)
    {
        m_pEx->ReprotError();
        m_pEx->Delete();
    }

    // result값 확인
    DWORD m_dwStatusCode;
    pHttpFile->QueryInfoStatusCode(m_dwStatusCode);

    // 객체 delete 부분
    if(pHttpFile)
    {
        delete pHttpFile;
        pHttpFile = NULL;
    }
    if(pHttpConnect)
    {
        delete pHttpConnect;
        pHttpConnect = NULL;
    }
    if(pSession)
    {
        pSession->Close();
        delete pSession;
        pSession = NULL;
    }

CInternetSession - http://msdn.microsoft.com/en-us/library/be5fa0d9%28v=VS.80%29.aspx
CHttpConnection - http://msdn.microsoft.com/en-us/library/6zsa3dfa%28v=VS.80%29.aspx
CHttpFile - http://msdn.microsoft.com/en-us/library/tzhfwc94%28v=VS.80%29.aspx

이올린에 북마크하기
2010/04/12 01:07 2010/04/12 01:07

FileTimeModify

Posted at 2010/02/13 20:46 // in Programming // by 엔신
사용자 삽입 이미지

윈도우에서 파일의 만든날짜, 수정한 날짜, 액세스한 날짜를 원하는 날짜로 수정함.

DayOfWeek는 입력하지 않아도 Day에 따라서 자동으로 변동됨.

VS 2008 SP1에서 만듬.

근데 왜 만들었지?

GetFileTime, SetFileTime, FileTimeToSystemTime, SystemTimeToFileTime

[실행파일]

[Source 파일]
이올린에 북마크하기
2010/02/13 20:46 2010/02/13 20:46

엑셀 사용자 지정 서식

Posted at 2010/01/21 15:07 // in Programming // by 엔신
#,###;[빨강](#,###);0.00;@"낭자"
양수;음수;0;텍스트

세미콜론으로 동시에 4가지 표시 형식을 지정 가능


서식코드 의미
# 유효 자리수 표시, 유효하지 않은 경우 미표시
0 유효하지 않은 경우 0으로 표시
? 소수점 앞이나 뒤에 있는 유효하지 않은 0 대신 공백을 추가하여 소수점을 맞춤
, 천단위 구분기호
[] 조건이나 색을 지정
m m:1~12, mm:01~12 월 의미
mmm은 Jan에서 Dec, mmmm은 January~December로 월 표시
d d:1~31, dd:01~31
mmm은 Sun~Sat, dddd는 Sunday~Saturday로 요일 표시
yy yy는 2자리로, yyyy는 4자리 연도 표시


이올린에 북마크하기
2010/01/21 15:07 2010/01/21 15:07

COleDateTime 클래스

Posted at 2009/11/23 00:21 // in Programming // by 엔신
----------------------------------------------------------------------------------------
COleDateTime now = COleDateTime::GetCurrentTime();
int a = now.GetMinute();
현재 시각이 1:27분이라면 27 정수를 리턴한다.

60초 체크하기
dwTimeStart = ::GetTickCount();    
dwTimeEnd   = dwTimeStart + 60000;  // 60초마다 체크

while (::GetTickCount() < dwTimeEnd)
{
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }

    Sleep(1);
}
----------------------------------------------------------------------------------------
COleDateTime    now;
        now    = COleDateTime::GetTickCount();
        CString    strFileName;
        strFileName.Format(_T("HashLog_%04d%02d%02d_%02d%02d%02d.txt"), now.GetYear(), now.GetMonth(),
            now.GetDay(), now.GetHour(), now.GetMinute(), now.GetSecond());
----------------------------------------------------------------------------------------

이런 식으로 사용이 가능함
ATL/MFC에서 사용 주로 사용하는 시간 클래스
그런데 GetCurrentTIme쓰면 댄다는데 왜 VS2008에서 객체에서 ::했는데 안나오길래 GetTickCount() 사용했었는데...

그리고 두 COleDateTime 객체간의 차이를 구할 때는

----------------------------------------------------------------------------------------
COleDateTime ATime(2007, 4, 26, 17, 20, 30);
COleDateTime BTime(2007, 4, 26, 18, 20, 50);

COleDateTimeSpan C = BTime - ATime;

C.GetTotalDays() - 차이나는 총 날짜
C.GetTotalHours() - 차이나는 총 시간
C.GetTotalMinutes() - 차이나는 총 분
C.GetTotalSeconds() - 차이나는 총 초
----------------------------------------------------------------------------------------

객채를 생성할 때에는 아래와 같이 초기화하면서 사용 가능함
가장 일반적으로는 COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec ) 이게 많이 쓰이겠지..

----------------------------------------------------------------------------------------
COleDateTime( )   Constructs a COleDateTime object initialized to 0 (midnight, 30 December 1899).
COleDateTime( dateSrc )   Constructs a COleDateTime object from an existing COleDateTime object.
COleDateTime( varSrc )   Constructs a COleDateTime object. Attempts to convert a VARIANT structure or COleVariant object to a date/time (VT_DATE) value. If this conversion is successful, the converted value is copied into the new COleDateTime object. If it is not, the value of the COleDateTime object is set to 0 (midnight, 30 December 1899) and its status to invalid.
COleDateTime( dtSrc )   Constructs a COleDateTime object from a DATE value.
COleDateTime( timeSrc )   Constructs a COleDateTime object from a time_t value.
COleDateTime( systimeSrc )   Constructs a COleDateTime object from a SYSTEMTIME value.
COleDateTime( filetimeSrc )   Constructs a COleDateTime object from a FILETIME value. . Note that FILETIME uses Universal Coordinated Time (UTC), so if you pass a local time in the structure, your results will be incorrect. See File Times in the Platform SDK for more information.
COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec )   Constructs a COleDateTime object from the specified numerical values.
COleDateTime( wDosDate, wDosTime )   Constructs a COleDateTime object from the specified MS-DOS date and time values.
----------------------------------------------------------------------------------------

%a     Abbreviated weekday name
%A     Full weekday name
%b     Abbreviated month name
%B     Full month name
%c     Date and time representation appropriate for locale
%d     Day of month as decimal number (01 – 31)
%H     Hour in 24-hour format (00 – 23)
%I      Hour in 12-hour format (01 – 12)
%j      Day of year as decimal number (001 – 366)
%m    Month as decimal number (01 – 12)
%M   Minute as decimal number (00 – 59)
%p    Current locale's A.M./P.M. indicator for 12-hour clock
%S    Second as decimal number (00 – 59)
%U    Week of year as decimal number, with Sunday as first day of week (00 – 53)
%w   Weekday as decimal number (0 – 6; Sunday is 0)
%W   Week of year as decimal number, with Monday as first day of week (00 – 53)
%x    Date representation for current locale
%X    Time representation for current locale
%y    Year without century, as decimal number (00 – 99)
%Y   Year with century, as decimal number
%z, %Z  Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
%%   Percent sign
----------------------------------------------------------------------------------------

라고 http://kgpark.net/tools/19 에 나와있었음...
클래스 멤버 변수는 아래 링크 참조
http://msdn.microsoft.com/en-us/library/by5d3kb1%28VS.80%29.aspx

이올린에 북마크하기
2009/11/23 00:21 2009/11/23 00:21

Tomcat 5.5.27 설치

Posted at 2009/05/28 17:37 // in Programming // by 엔신
서블릿과 JSP를 다루기 위해 웹서버인 Tomcat을 설치하여야 한다.
윈도우 기준으로 설명한다.

1. 다운로드
톰캣 사이트에서 Tomcat 5.5.27을 다운로드 받을수 있다.
톰캣을 설치하기 위해서는 JRE 또는 JDK가 설치되어 있어야 한다.
설치형이 아니므로 C드라이브에 압축을 풀고 경로명을 간단하게 줄인다.
C:\apache-tomcat 이라거나 C:\tomcat 이라거나...

2. 서블릿파일 복사하기
C:\apache-tomcat\common\lib\servlet-api.jar
위경로의 파일을 파일을 복사하여
C:\Java\jdk1.6.0_13\lib
경로에 붙여넣기

3. 시스템 환경 변수 등록
그리고 시스템 환경변수 설정

변수이름 : CATALINA_HOME
변수 값 : C:\apache-tomcat

변수이름 : JAVA_HOME
변수 값 : C:\Java\jdk1.6.0_13

변수이름 : CLASSPATH
변수 값 : C:\apache-tomcat\common\lib\jsp-api.jar
를 등록하거나 js-api.jar 파일을 C:\Java\jdk1.6.0_13\lib\servlet-api.jar 경로에 복사하여 경로를 설정.

본인의 경우 JDK 경로가 C:\Java\jdk1.6.0_13이다. 이렇게 3개의 환경변수를 등록하면 된다.

4. 톰캣 서버 포트 변경
C:\apache-tomcat\conf\server.xml
파일을 수정한다.
    <Connector port="8080" maxHttpHeaderSize="8192"
파일 내용에서 port 8080으로 된 것을 8090으로 변경
8080의 경우 프록시나 오라클과 충돌이 날 수 있다.

5.서브 디렉토리 생성하기
기본 디렉토리 파일 복사하여 서브디렉토리 생성하기
C:\apache-tomcat\webapps\jsp-examples\WEB-INF에서
classes - 폴더
lib - 폴더
web.xml
를 복사하여
C:\apache-tomcat\webapps\test007\WEB-INF
경로에다가 붙여넣기 한다.

web.xml 파일의 내용을 아래 내용만 남겨놓는다
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

</web-app>
test007/ 경로에 index.html 파일을 만들고
웹브라우저로 http://127.1.1.1:8090/test007/index.html 경로로 접속하여 본다.

6. 다른 시스템 디렉토리를 서브 디렉토리로 사용하기(1)
C:\apache-tomcat\conf\web.xml
파일에서 아래 두 내용에서 invoker가 주석 처리 되어 있는데 그 주석을 제거한다
    <servlet>
        <servlet-name>invoker</servlet-name>
        <servlet-class>
          org.apache.catalina.servlets.InvokerServlet
        </servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
이 곳과 아래 내용
    <servlet-mapping>
        <servlet-name>invoker</servlet-name>
        <url-pattern>/servlet/*</url-pattern>
    </servlet-mapping>

C:\apache-tomcat\conf\Catalina\localhost\test008.xml
파일을 생성하고 내용을 넣는다.
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:\test008"
         privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
위와 같이하고 xml 설정 파일을 reload하기 위해 톰캣을 재시작한다.
이렇게 하면 이제 웹에서는
http://127.1.1.1:8090/test008/index.html
와 같은 경로로 하위 폴더 접근이 가능해진다.

6. 다른 시스템 디렉토리를 서브 디렉토리로 사용하기(2)
위와 같은 서브디렉토리를 만드는 결과는 같지만, 방법만 다르다.

C:\apache-tomcat\conf\server.xml
파일에서
</host 로 검색하여 그 문장 바로 위에
<Context path="/test008" docBase="D:\test008"/>
를 삽입한다.
톰캣을 재시작하면 정상적으로 서브디렉토리 사용이 가능해진다.


이올린에 북마크하기
2009/05/28 17:37 2009/05/28 17:37

strcpy()와 memcpy()

Posted at 2008/08/20 16:27 // in Programming // by 엔신

strcpy 는 문자열 복사를 위한 함수로서
길이를 지정안하는 대신 source 문자열이 반드시 '\0' 으로 끝나야합니다.
source 에서 '\0'을 만나면 복사를 종료합니다
('\0' 까지 복사됩니다)

이에 반하여 memcpy는 형에 관계없이 임의의 영역을 지정한 byte 수만큼 복사하는
기능을 수행합니다

char dstS[64], srcS[]="string copy";

여기서 srcS를 dstS로 복사하려면

strcpy 로는

strcpy(dstS, srcS);

이렇게만 하면 되지만

memcpy로 복사하려면

memcpy(dstS, srcS, strlen(srcS)+1);

'\0' 까지 처리하기위해 복사할 size를 strlen(srcS)+1 로 지정해 줘야합니다

둘다 메모리 복사란 점에서는 같은 역할을 하지만
문자값을 비교하여 종료하느냐, byte 수를 따져 종료하느냐의 차이가 있습니다
용도가 틀리다고 말할 수는 있어도 어떤것이 더 효율적이다라고는 말하기 어렵습니다
memcpy쓸곳에는 memcpy를 쓰고 strcpy를 쓸 곳에는 strcpy를 쓰면 되느거지요


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


속도의 차이는 통상 컴파일러 종류와 운영체제에 따라서 가변사항이
있을것으로 생각됩니다.

요즘은 컴파일러가 좋아지고 님께서 구현하실때 이렇게 한다면
실질적인 의미가 없습니다.

strcpy( test_buff , test_buff_2 );

memcpy( test_buff , test_buff_2 , strlen(test_buff_2) );


그런데, 프로그램이라는 것은 언제나 실수를 할 수 있으며
속도와 안정성( 예외처리 )의 갈림길에 서게 됩니다.

가정을 하여 보시기 바랍니다.

1. test_buff_2 에 , 만약 널 문자 종료가 않생길수 있다면 ?
2. test_buff_2 보다 test_buff 가 작다면 ?

이렇게 된다는 가정이 발생한다면 않되겠지만 수많은 코드를 작성할때는
반드시 발생할 수 있으며, 이러한 문제들은 쉽게 디버깅 되지 않거나
예기치 않은 문제를 가져옵니다.

결과적으로 , 비용적으로 만약 strcpy 가 더 빠르다고 하더라도 ,
memcpy 을 추천합니다. 게다가 가정된 오류를 검사하는 루틴을 포함한다고
하더라도 , 그 효율성의 문제는 크게 발생하지 않습니다.

이올린에 북마크하기
2008/08/20 16:27 2008/08/20 16:27

널 포인터(NULL Pointer)

Posted at 2008/08/16 18:57 // in Programming // by 엔신
널 포인터와 널 문자의 차이를 혼동해서는 안된다. 정수 0, 널 포인터(NULL), 널 문자(\0) 모두 실제로는 0의 값을 가지지만 형이 다르다는 것을 명심하자. 0은 정수형이며 널 포인터는 void * 형. 널 문자는 char 형이므로 반드시 적합한 곳에 사용해야만 한다.
이올린에 북마크하기
2008/08/16 18:57 2008/08/16 18:57

time.h 시간 2

Posted at 2008/08/12 00:46 // in Programming // by 엔신

함수_날짜관련함수.c

/*
 함수 : 날짜 관련 함수. -> <time.h> (time, localtime, asctime, tm).


 2005년 11월 07일
 Son Byeong Hun
 
cidsang@naver.com
*/


#include <stdio.h>
#include <time.h>

void main(void)
{
 time_t time1;   //time_t형 변수 time1 선언
 struct tm * time2; //tm구조체 time2 선언
 char *str;
 int nowYear, nowMonth, nowDay, nowHour, nowMin, nowSec;


 time(&time1);   //time함수를 이용해 현재 시간을 가져온다.
 time2 = localtime(&time1); //tm 구조체를 이용해 시간을 표현하기 위해 localtime 함수를 사용.
 str = ctime(&time1);

 printf("현재 시간 : %s\n", asctime(time2));
 printf("현재 시간 : %s\n", str);


 // 현재 Date 정보 처리
 nowYear = time2->tm_year+1900; //구한 Date 정보를 변수에 할당
 nowMonth = time2->tm_mon+1;
 nowDay = time2->tm_mday;
 nowHour = time2->tm_hour;
 nowMin = time2->tm_min;
 nowSec = time2->tm_sec;

 printf("현재는 %d년 %d월 %d일 %d시 %d분 %d초 입니다. \n", nowYear, nowMonth, nowDay, nowHour, nowMin, nowSec);
}

 



함수_날짜관련함수.c
이올린에 북마크하기
2008/08/12 00:46 2008/08/12 00:46

time.h 시간

Posted at 2008/08/11 23:43 // in Programming // by 엔신

그리고 시간을 나타내는 함수는 보통 time.h 헤더파일에 거의 들어있습니다.


time_t time(time_t *timer);
char *ctime(const time_t *timer);

time_t형은 운영체제마다 타입이 다르며 윈도우의 경우 4바이트 정수로 표현하고
time_t형 포인터를 인수로 받아 조사된 시간을 리턴합니다.

time 함수는 1970년 1월 1일 자정이후 경과된 초를 조사합니다. (세계표준시)
ctime 함수는 time함수의 경과초를 문자열로 출력하며 지역설정에 맞게 시간을 조절할 수 있죠
출력시  개행문자를 자동으로 끝에 삽입합니다.


위 두 함수는 시간을 출력해주되 영어로 저장되고 출력후 알아서 줄바꿈을 하기때문에 조금 애용하기엔 불편합니다.


char *_strdate(char *datestr);
char *_strtime(char *timestr);

_strdate 함수는 MM/DD/YY 포맷으로 날짜를 구하여 datestr 버퍼에 복사한다.
_strtime 함수는 HH:MM:SS 포맷으로 구해서 timestr 버퍼에 복사한다.

24시간제로 시간을 나타내며 버퍼는 널문자까지 고려하여 9바이트 이상이어야 한다.
(문자열 배열)

YY는 연도, MM은 월, DD는 일

HH 는 시간 MM은 분 SS는 초 단위입니다.

9바이트이상의 문자열 배열 예) char t[9] 이상되는 배열에 함수를 사용하시면 해당시간을 입력시켜주죠


struct tm *gmtime(const time_t *timer);
struct tm *localtime(const time_t *timer);
time_t mktime(struct tm *timeptr);


gmtime 함수와 localtime 함수는 time_t형의 값을 헤더파일내에 선언되어있는 tm 구조체형태로 변환한다.
gmtime은 세계표준시, localtime은 지역시간으로 변환한다.

mktime 함수는 반대로 tm 구조체형식을 time_t 형식으로 바꾼다.


struct tm {
       int tm_sec;     /* seconds after the minute - [0,59] */   초(0~59)
       int tm_min;     /* minutes after the hour - [0,59] */       분(0~59)
       int tm_hour;    /* hours since midnight - [0,23] */        시(0~23)
       int tm_mday;    /* day of the month - [1,31] */             날짜(1~31)
       int tm_mon;     /* months since January - [0,11] */     월(0~11)
       int tm_year;    /* years since 1900 */                          1990년도이후 경과년수
       int tm_wday;    /* days since Sunday - [0,6] */           요일(0~6) 0이 일요일
       int tm_yday;    /* days since January 1 - [0,365] */      년중날짜(0~365)
       int tm_isdst;   /* daylight savings time flag */               일광 절약 시간과의 차
};

    time_t t;
    tm *pt;

    time(&t);
    pt=localtime(&t);

    printf("현재 시간 %d년 %d월 %d일 %d시 %d분 %d초입니다.\n",
         pt->tm_year+1900,pt->tm_mon+1,pt->tm_mday,
         pt->tm_hour,pt->tm_min,pt->tm_sec);;

실행결과 : 현재 시간 2008년 1월 17일 14시 13분 39초입니다.

위 gmtime과 localtime은 기본적으로 헤더파일에 정의되어있는 tm구조체에 시간별로 나누어 데이터를 저장해두기에 필요한 데이터만 뽑아서 사용할 수 있다는 장점이 있습니다. 위의 예제 참조하시면 이용하시는데 불편은 없을것이라 생각됩니다.



char *asctime(const struct tm *timeptr);
size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);

asctime 함수는 tm 구조체를 문자열로 바꾼다. 다만 영어이며 개행문자도  포함되어있다.

strftime 함수는 시간을 다양한 방식으로 변경하는데 첫번째 인수로 버퍼, 두번째 인수로 버퍼의 길이 세번째 인수로 포맷 방법, 네번째 인수로 tm 구조체를 넣는다.
포맷 형식은 %Y %B %D %HH 등 %의 여러가지 서식을 사용한다.
다만, 모두 영문으로 출력된다.

위에서 사용한 tm구조체를 문자열로 바꾸어주는 함수인데, 전부 영어형식이라 자주 쓰이지는 않습니다.


colck_t clock();

clock_t 타입은 long 형으로 정의되어 있으며 함수가 조사한 값을 CLOCKS_PER_SEC 값으로 나누면 프로그램 실행후의 경과 초를 알 수 있다.
값은 시스템에따라 다르며 윈도우에서는 1000으로 정의되어 있다.

프로그램 실행후 현재시간을 밀리초단위로 알려주는 함수입니다.

clock() / CLOCKS_PER_SEC  이럴경우 현재 프로그램 실행후의 경과초가 되는거죠


double difftime(time_t timer1, time_t timer2);

인수로 넘겨준 두개의 시간의 차이를 초단위로 리턴한다. (timer2 - timer1)

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10104&eid=nCzwy7UFoBFtqmwNclLzvdo83jv4XfeK&qb=Y3RpbWUgsLPH4A==&pid=f5/oMsoi5UZssuzi4Hhsss--417707&sid=SJ-oM2rVn0gAAAPBVEc

이올린에 북마크하기
2008/08/11 23:43 2008/08/11 23:43

문자열 처리 함수 < string.h >

Posted at 2008/07/26 19:11 // in Programming // by 엔신

문자열 처리 함수는 문자열을 조작하거나 처리하는 기능을 제공한다. 이 함수를 사용하기 위해 <string.h>를 포함(include)하여야 한다. 문자열과 관련된 함수는 아래의 표와 같으며 이들 함수의 변수 str1, str2는 문자형인 포인터 및 문자열 자체를 의 미한다. 문자열 함수들은 문자열을 조작하거나 복사, 연결, 비교, 검출하는 기능을 수행해 주는 함수들이다. 대표적으로 strlen() 함수는 문자 열의 수를 보여주고, strcpy() 함수는 문자열을 복사하며 strcmp() 함수는 두 문자열을 비교한다. 자세한 문자열 처리 함수들의 형식과 기능은 아래 표에서 보여주고 있다.

 

함수명

형식 / 기능

strlen()

unsigned strlen( const char *str )

str의 문자열 길이를 반환

strcat()

char *strcat( char *str1, const char *str2 )

str1의 문자열에 str2의 문자열을 연결

strncat()

char *strncat( char *str1, const char *str2, unsigned c )

str1의 문자열에 str2 문자열의 선두 c개의 문자를 연결

strcmp()

char *strcmp( char *str1, const char * str2 )

str1의 문자열과 str2를 서로 부호 없는 비교,
str1>str2 이면 양수값 반환 / str1<str2 이면 음수값 반환 / str1=str2 이면 0을 반환

strncpm()

char *strncpm( char *str1, const char *str2, unsigned c )

str1 문자열의 선두 c개의 문자와 str2의 문자열을 비교

strcpy()

char *strcpy( char *str1, const char *str2 )

str1의 문자열에 str2의 문자열을 복사, str1의 값을 반환함.

strncpy()

char *strncpy( char *str1, const char *str2, unsigned c )

str1의 문자열에 str2 문자열의 선두 c개의 문자를 복사

strstr()

char *strstr( const char *str1, const char *str2 )

문자열 str2가 문자열 str1에서 처음 일치하는 위치를 알려준다. 만약 문자열이 발견 되면 str1에 있는 그 문 자열의 포인터를 반환한다. 그 외에는 NULL 포인터를 반환한다.

strerror()

char *strerror( int num )

오류번호 num을 받아 해당하는 오류 메시지를 반환

strpbrk()

char *strpbrk( char *str1, const char *str2 )

지정한 str1의 문자열에서 str2의 문자열에 포함된 어떤 문자를 찾고 위치 포인터를 반환

strrchr()

char *strrchr( const char *str, int c )

문자열 str에서 c가 마지막으로 나타나는 위치를 알려준다. c가 발견되면 c의 포인터 를 반환한다. 그 외에는 NULL포인터를 반환한다.

strcspn()

char *strcspn( char *str, const char *str2 )

str1의 문자열에서 str2의 문자열에 포함된 문자가 첫 번째 나타날 때 까지의 문자수

strspn()

char *strspn( char *str1, const char str2 )

str1의 문자열에서 str2의 문자열에 포함되지 않은 문자가 첫 번째 나타날 때까지의 문자수

strtok()

char *strtok( char *str1, const char *str2 )

일련의 strtok 호출은 문자열 str1을 문자열 str2가 가지고 있는 문자로 구분되는 '토큰'으로 나눈다. 첫 번째 호출은 첫 번째 인수인 str1을 사용하여 두 번째 호출부터는 NULL을 첫 번째 인수로 사용한다. 매 호출마다 현재 토큰의 포인터를 반환한다. 더 이상 토큰이 없으면 NULL을 반환한다 .

strupr()

char *strupr( char *str )

지정한 str의 문자열 중 소문자를 대문자로 변환



자세한 설명 및 예제는 www.jjung.net에 있습니다.

[출처] string.h 함수들|작성자 아세트산

이올린에 북마크하기
2008/07/26 19:11 2008/07/26 19:11

입력 받을때 주의

Posted at 2008/04/06 20:42 // in Programming // by 엔신
int 형 자료를 입력 받을때 문자나 문자열로 입력 받게 되면 무한루프에 빠져버림
그러니 char 형으로 자료를 입력 받아서 atoi() 함수를 써서 정수로 변환시켜야함
그리고 문자열 길이 비교는 strcmp()으로 하면 됨
그런데 원래 숫자를 입력받을려고 했던거면 문자열에서 정수로 변환한 후 비교하면됨
이올린에 북마크하기
2008/04/06 20:42 2008/04/06 20:42