레이블이 스트럿츠 액션폼인 게시물을 표시합니다. 모든 게시물 표시
레이블이 스트럿츠 액션폼인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 27일 일요일

[자바배열정열]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)

[자바배열정열]java.util.Arrays.sort를 이용한 배열정렬(Array Sort)
 
예제를 보시면 이해가 되리라 생각 합니다.
참고하시구요, 열공 하세요.
 
//
//  @Java Tip
//  @author 오라클자바커뮤니티, 오엔제이프로그래밍
//  @Desc : java.util.Arrays 클래스의 sort메소드를 이용한 정렬
// 
package onj;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;

public class ArraySortExam {
 public static void main(String[] args) {
  String[] myArray = { "c", "a", "b" };
  // 일단 그냥 출력 해보자. c, a, b 순으로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // Ascending Sort, 오름차순 정렬
  Arrays.sort(myArray);
  // a, b, c로 출력
  for (String s : myArray) {
   System.out.println(s);
  }
  // 이번에는 내림차순(Descending) 졍렬
  Arrays.sort(myArray, Collections.reverseOrder());
  // c, b, a로 출력
  for (String s : myArray) {
   System.out.println(s);
  } 
 }
}

2013년 10월 21일 월요일

자바 싱글톤, 쓰레드 예제

자바 싱글톤, 쓰레드 예제

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("Sington Class의 인스턴스 생성!");                   
    }
    public static Singleton getInstance() {       
        return singleton;
    }                                        
}
 
public class Main extends Thread {
    public static void main(String[] args) {
        System.out.println("Start.");       
        Singleton obj1 = Singleton.getInstance();
  Singleton obj2 = Singleton.getInstance();
        if (obj1 == obj2){
   System.out.println("obj1 == obj2");
        }
  else {
   System.out.println("obj1 != obj2");
  }
    }
}
 
=======================================
 
 
public class Singleton {
    private static Singleton singleton = null;
    private Singleton() {
        System.out.println("인스턴스 생성...");
        slowdown();                            
    }
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
    private void slowdown() {                  
        try {                                  
            Thread.sleep(10);                
        } catch (InterruptedException e) {     
        }                                      
    }                                          
}
 
 
public class Main extends Thread {
    public static void main(String[] args) {
        System.out.println("Start.");
        new Main("A").start();
        new Main("B").start();
        new Main("C").start();
        System.out.println("End.");
    }
    public void run() {
        Singleton obj = Singleton.getInstance();
        System.out.println(getName() + ": obj = " + obj);
    }
    public Main(String name) {
        super(name);
    }
}

2013년 10월 15일 화요일

테이블이 몇개의 블록을 사용중인지 확인하는 방법 각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다.

테이블이 몇개의 블록을 사용중인지 확인하는 방법

각각의 테이블의 행(로우, ROW)은 의사 컬럼인 rowid를 가지고 있습니다 rowid에는 그 Rows의 물리적인 위치정보를 포함하고 있는데 파일번호블록번호블록내 행 번호와 같은 정보를 포함하고 있습니다.

하나의 데이터파일을 가지는 테이블스페이스에 테이블 데이터가 저장 되면 이 테이블의
ROWID는 유일한 블록번호(즉 하나의 테이블의 행들이 같은 블록 번호를 중복해서 가지지않는다는 의미)를 가지는 반면에 둘 이상의 데이터파일로 구성되는 테이블스페이스인 경우에 테이블에 데이터가 저장 되면 동일한 블록번호(서로 다른 파일에 각각의 블록 번호가 부여 되므로)를 가질 수 있습니다이러한 경우엔 블록번호와 파일번호 두 개의 항목을 조합하여 ROWID로부터 유일한 번호를 얻어 낼 수 있습니다.
 
즉 테이블이 몇 개의 블록으로 구성 되어 있는지는 이러한 점을 이용하여 구하면 되는데DBMS_ROWID라는 패키지를 이용하여 rowid에서 특정 값(파일번호블록번호등)을 얻어 낼 수 있습니다.
 
Rowid를 조회 하면 다음과 같습니다.
 
SQL> select rowid, jumin, name from addrbook;
rowed                            JUMIN      NAME
------------------ -------------- ------------
AAAJMZAABAAAPEKAAA 111111-2222222    
:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />홍길동

AAAJMZAABAAAPEKAAB 333333-4444444    
가길동
AAAJMZAABAAAPEKAAC 111111-2222222    
홍길동
 
다음과 같이 유일한 블록의 개수(테이블이 몇 개의 블록으로 구성되어 있는지)를 카운팅 할 수 있습니다.
 
SQL> SELECT COUNT ( DISTINCT
  2           DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)
  3           ||
  4           DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)
  5         ) "Used"
  6  FROM scott.emp;
 
      Used
----------
         2
 
 
또는 다음과 같은 방법도 가능 합니다.
 
SQL> SELECT COUNT (DISTINCT SUBSTR(rowid,1,15)) "Used"
  2  FROM scott.emp;
 
      Used
----------
         2

오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터(오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의)  


2013년 8월 9일 금요일

[오라클자바, 강좌, 교육, ORACLEJAVA, OnjProgramming]Oracle Number Data Type에 관해

========================
Number Data Type
========================

 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



1. 고정숫자와 부동 소수점 숫자를 저장한다.

2. Oracle을 작동하는 서로 다른 시스템간에 38자 까지 정밀도를 유지하며 호환가능

3. 최대 38자리의 유효숫자를 가지는 양수/음수,0 등이 저장된다.

4. Column_name Number;Column_name Number(precision, scale)등의 형식으로 선언한다.
- Scale을 지정하지 않으면 0
- precision에 ‘*’를 표시하면 38
- 숫자필드를 지정할 때 정밀도와 Scale을 지정하는것이 좋음
- 7,456,123.89의 숫자가 있을 때 number로 선언하면 7456123.89로 저장
- 7,456,123.89의 숫자가 있을 때 number(*,1)로 선언하면 7456123.9로 저장
- 7,456,123.89의 숫자가 있을 때 number(9)로 선언하면 7456124로 저장
- 7,456,123.89의 숫자가 있을 때 number(9,2)로 선언하면 7456123.89로 저장
- 7,456,123.89의 숫자가 있을 때 number(6)로 선언하면 오류

5. Number형의 Column길이 계산방법
- Oracle은 numeric data를 가변 길이 포맷으로 저장한다. 각 값은 scientific notation으로
저장된다.(1 byte used to store exponent and up to 20 bytes to store mantissa) Oracle은
앞뒤의 0을 저장하지 않는다.
-  즉 1 Byte는 지수를 저장하며, 최대 20 Byte가 가수를 저장하는데 사용된다.(정밀도는 
  최대 38) 또한 선행하는 0이나,후행하는 0은 저장하지 않는다. 예를들면 숫자 412는
  4.12 * 10^2과 유사한 형식으로 저장된다.

  즉 1 Byte가 지수2를 저장하는데 사용되며, 2 Byte가 가수 (4,1,2)를 저장하는데 사용
  된다.

  이를 이용하여 Number(p)에 대한 Column의 Byte계산이 가능하다.
  1 Byte(지수) + floor(p/2) + 1 Byte(가수) + 1 Byte(음수)

6. 정수부분과 소수부분을 구분하는 소수점문자(.)를 변경할려면
  NLS_NUMERIC_CHARACTERS Parameter를 변경해야 한다.

7.특히 주의할 사항은 소수점 이하는 반올림되어 저장된다는 사실을 감안하여 수치 연산이 많은
경우 이를 고려하여 소숫점이하 크기를 결정하여야 한다.

8.오라클에서는 원래의 데이타를 다른 타입의 데이타로 바꾸기위해 아래와 같은 여러가지 함수를
제공한다. TO_NUMBER(), TO_CHAR(), TO_DATE(), HEXTORAW(), RAWTOHEX(),
  ROWIDTOCHAR(), CHARTOROWID()을 이용하여 명시적으로 데이타 타입을 변경을 할 수 있을 뿐
아니라 값 지정(assignment)시 오라클은 자동적으로 변환 작업을 수행하고, 문장(expression)
내에서도 자동적으로 연산을 수행하기 위해 타입 변환을 수행한다. 

9.숫자 타입과 문자 타입의 값과 비교되면 상대 타입을 숫자 타입으로 바꾸어 비교된다.
예를 들어 NUM1이 NUMBER 타입이고 인덱스가 생성되어 있을때 아래의 쿼리문을 수행하게 되면
    SELECT * FROM TABLE1 WHERE NUM1 = '123';  일 경우
내부적으로 위의 문장은 문자 타입의 변환이 발생함으로 위의 문장은 아래와 같이 변동되어 처리
된다.
  SELECT  * FROM TABLE1 WHERE NUM1 = TO_NUMBER('123');
  로 변동 되어 처리 되므로 인덱스를 사용하게 된다.

10.NUMBER 타입으로 지정된 컬럼을 LIKE 'char%'로 비교하면 인덱스를 사용하지 않으므로 주의
하여야 한다.

    SELECT * FROM TABLE1 WHERE NUM1 LIKE '1%';
 
  을 수행하게 되면 일단 숫자 타입을 기준으로 '1%'을 바꾸려고 하지만 LIKE문으로 인해 숫자
타입으로 변경할 수 가없다. 따라서 NUM1이 문자 타입으로 변경된다.
  즉, 내부적으로

    SELECT * FROM TABLE1 WHERE TO_CHAR(NUM1) LIKE '1%';

  로 변형이 일어나 수행하게 되므로서 수행 속도 향상에 주요한 인자가 되는 인덱스를 사용할
수 없게 된다. 따라서 가능한한 인덱스를 생성할 컬럼은 문자 타입이 효과적이다.

2013년 8월 8일 목요일

[ORACLEJAVA STRUTS, oraclejavanew.kr]예외처리 및 스트럿츠 커스텀 태그 예제

예외처리 및 스트럿츠 커스텀 태그 예제 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



아래 예제는 모든 예외의 루트인 BaseException두어 예외에 대해 프로그램 내부에서 처리하는 예제 입니다.

JDBC오류에 대해서는 로깅을 이용하여 실제 오류를 확인하며 사용자에게는 아래와 같이 변환 된 오류정보를 반환 합니다.

 

우선 실행 흐름을 살펴보면 emp.jsp를 실행하면 부서코드를 입력 할 수 있는 창이 나타나는데 여기에서 EMP테이블의 DEPTNO에 해당하는 부서코드(예를 들면 10)를 입력한 후 “EMP LIST”를 클릭하게 되면 EMP TABLE에서 원하는 부서에 해당 하는 사원의 ename, job이 출력되는 예제 입니다.

 


 


유심히 볼 부분은 예외를 처리하는 방법과 emplist.jsp에서 EMP 테이블의 데이터를 출력 할 때 <logic:iterate>를 사용하여 반복적으로 자바 빈의 내용을 출력 하는 부분 입니다.

데이터베이스 커넥션 풀은 bitmechanic의 JDBC POOL을 사용 했으며 이 부분에 대한 자세한 사항은 오라클자바의 스트럿츠 강좌 “DB를 사용하여 로그인 하기” 강좌를 참고 하시기 바랍니다.

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

------------------
1. emp.jsp
------------------

<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<html>
<body>
<html:errors/>
<html:form action="/EmpSubmit">     
  <bean:message key="user.depttitle"/>:<html:text property="deptno" value=""/>
  <html:submit value="EMP LIST">       
  </html:submit>                 
</html:form>
</body>
</html>


------------------
2. emplist.jsp
------------------

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<html>
        <head>
                <title>Emp User List</title>
        </head>
<body>
<h1>Emp User List</h1>
<!-- ================================================ -->
<logic:present name="users">
        <table border="1">
                <tr>
                        <th>
                                <bean:message key="user.ename"/>
                        </th>
                        <th>
                                <bean:message key="user.job" />
                        </th>
                </tr>
               
                <!---------------------------------------------->
                <logic:iterate id="user" name="users">
                <tr>
                        <td>
                                <bean:write name="user" property="ename"/>
                        </td>
                        <td>
                                <bean:write name="user" property="job"/>
                        </td>
                </tr>
                </logic:iterate>
                <!---------------------------------------------->
</table>
</logic:present>
<!-- =================================================== -->
</body>
</html>


------------------
3. EmpForm.java
------------------

package logic;

import org.apache.struts.action.ActionForm;
public class EmpForm extends ActionForm {
        private String deptno=null;
                             
        public String getDeptno() {
                return deptno;
        }
               
        public void setDeptno(String deptno) {
                this.deptno = deptno;
        }                     
}

------------------------------
4. DisplayAllUserAction.java
------------------------------

본 예제의 경우 Action을 하나만 간단 하게 관리 하지만 실제 액션이 많이지는 경우 메인 액션을 하나 두고 나머지 액션들이 메인 액션을 상속 받게 하는 구조로 구성 할 수 있습니다. 그러한 경우 아래에서의 예외 처리 부분은 execute 메소드에 두고 execute의 마지막 부분에서 각 하위 액션들이 구현 할 메소드를 호출 하는 형태로 구성을 합니다. 이에 관한 사항은 스트럿츠 강좌 “Struts에서의 예외처리(2)”를 참고 하시기 바랍니다.

package logic;

import org.apache.struts.action.Action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import logic.BaseException;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;

import java.util.List;
import java.util.Iterator;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author 이종철
*/
public class DisplayAllUserAction extends Action {
        ActionForward forwardPage = null;
       
    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
           
            Log log = LogFactory.getLog(DisplayAllUserAction.class);
           
            try {
                       
                GetUserDAO user = new GetUserDAO();
                     
                List list = user.getUserList(((EmpForm)form).getDeptno());
   
                    if (list.size() > 0){
                            request.setAttribute("users", list);
                    }
   
                forwardPage = mapping.findForward("usersuccess"); 
            }
            catch (BaseException ex){           
                    log.info("BaseException : "  +ex);                   
            forwardPage = processExceptions( request, mapping, ex);
            }       
            return forwardPage;
    }
       
    protected ActionForward processExceptions( HttpServletRequest request,
                                                                                    ActionMapping mapping,
                                                                                                BaseException ex )
        {
            ActionErrors errors = new ActionErrors( );
            ActionForward forward = null;
       
                           
            //processBaseException(errors, (FieldException) ex);
            processBaseException(errors, ex);
       
            // 입력된 리소스와 failure 포워드를 반환 합니다.
            String inputStr = mapping.getInput( );
           
            if ( inputStr != null) {
                    forward = new ActionForward( inputStr );
            }
           
       
            // 예외가 하위 예외를 포함하고 있는지 확인
            List exceptions = ex.getExceptions( );
       
            if (exceptions != null && !exceptions.isEmpty() ){
                    int size = exceptions.size( );
                    Iterator iter = exceptions.iterator( );
       
                    while( iter.hasNext( ) ){
                            // 모든 하위예외들은 BaseException이어야 합니다.
                            BaseException subException =(BaseException)iter.next( );
                            processBaseException(errors, subException);
                    }
            }
       
            // Tell the Struts framework to save the errors into the request
            saveErrors( request, errors );
                                   
            // Return the ActionForward
            return forward;
        }
       
    protected void processBaseException( ActionErrors errors, BaseException ex)
        {               
                // 추가될 ActionError의 레퍼런스 저장
                ActionError newActionError = null;
               
                // 에러 코드는 리소스 번들의 키값
                String errorCode = ex.getMessageKey();
               
                /*
                * MessageFormat 객체가 사용하는 추가적인 인자가 있다면
                * args에 예외를 추가
                */
                Object[] args = ex.getMessageArgs( );
               
               
                // ACtionError 클래스의 인스턴스 생성자
                if ( args != null && args.length > 0 ){
                        // Use the arguments that were provided in the exception
                        newActionError = new ActionError( errorCode, args );
                }
                else{
                        newActionError = new ActionError(errorCode);
                }
               
                errors.add(ActionErrors.GLOBAL_ERROR, newActionError );
        }     
}


------------------------------
5. GetUserDAO.java
------------------------------

package logic;

import java.sql.*;

import com.bitmechanic.sql.*;
import java.util.*;
import logic.BaseException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class GetUserDAO  {
        private static String LIST_QUERY = "SELECT ename, job from emp where deptno=?";
       
        public List getUserList(String deptno) throws BaseException
    {
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
            List list = null;
           
            Log log = LogFactory.getLog(GetUserDAO.class);
                           
            try
            {                             
                con = DriverManager.getConnection(ConnectionPoolManager.URL_PREFIX+"wink");
                pstmt = con.prepareStatement(LIST_QUERY);
       
                pstmt.setInt(1,java.lang.Integer.parseInt(deptno)); 
                                                         
                rs = pstmt.executeQuery();
               
                list = new ArrayList(50);
           
                while ( rs.next() )
                {                   
                        String ename = rs.getString(1);
                        String job = rs.getString(2);
                       
                        User user = new User();
                        user.setEname(ename);
                        user.setJob(job);
                       
                        list.add(user);
                }
               
                return list;
                                                 
            }
            catch (SQLException e1)
            {                               
                log.info("SQLException : " + e1);
                BaseException b = new BaseException(e1);
                                b.setMessageKey("jdbc.error");
                                throw b;
            }
            finally
            {                   
                try
                {
                        if ( rs != null )  rs.close();
                        if ( pstmt != null ) pstmt.close();
                        if ( con != null ) con.close();                       
                }
                catch ( Exception ignore )
                {
                }               
            }
    }
}

------------------------------
6. User.java
------------------------------
package logic;

import java.io.Serializable;

public class User implements Serializable {
        private String ename=null;
        private String job=null;
                       
        public String getEname() {
                return ename;
        }
       
        public String getJob() {
                return job;
        }
       
        public void setEname(String ename) {
                this.ename = ename;
        }
       
        public void setJob(String job) {
                this.job = job;
        }
                       
}


------------------------------
7. BaseException.java
------------------------------

package logic;

import java.util.List;
import java.util.ArrayList;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* 이 클래스는 애플리케이션 예외의 공통 슈퍼 클래스 입니다.
* 이 클래스와 이 클래스의 서브 클래스는 chained exception 기능을 제공
* chained exception 기능은 원래 문제를 이 클래스나 이 클래스의 서브 클래스로
* 감싸서 다시 실행 할 수 있습니다.
* 이 클래스는 exception을 List로 관리 함으로서 다중 예외 처리가 가능 합니다.
*/
public class BaseException extends Exception{
        protected Throwable rootCause = null;
       
        //예외를 여러 개 관리하고 나중에 ActionError를 만들 때도 반영
        private List exceptions = new ArrayList( );

        private String messageKey = null;
        private Object[] messageArgs = null;

        public BaseException( ){
                super();
        }
       
        //생성자
        public BaseException( Throwable rootCause ) {
                this.rootCause = rootCause;
        }

        public List getExceptions( ) {
                return exceptions;
        }

        public void addException( BaseException ex ){
                exceptions.add( ex );
        }

        public void setMessageKey( String key ){
                this.messageKey = key;
        }

        public String getMessageKey( ){
                return messageKey;
        }
       
        //어떤 메시지는 아규먼트가 여러 개 일 수 있습니다.
        // 예를들면 나이는 0 ~ 99 사이의 수가 들어와야 합니다.
        public void setMessageArgs( Object[] args ){
                this.messageArgs = args;
        }

        public Object[] getMessageArgs( ){
                return messageArgs;
        }

        public void setRootCause(Throwable anException) {
                rootCause = anException;
        }

        public Throwable getRootCause( ) {
                return rootCause;
        }

        public void printStackTrace( ) {
                printStackTrace(System.err);
        }

        public void printStackTrace(PrintStream outStream) {
                printStackTrace(new PrintWriter(outStream));
        }

        public void printStackTrace(PrintWriter writer) {
                super.printStackTrace(writer);
                if ( getRootCause( ) != null ) {
                        getRootCause( ).printStackTrace(writer);
                }
                writer.flush( );
        }
}


------------------------------
8. struts-config.xml
------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
     
<!-- ============ Form Bean Definitions ======================== -->
    <form-beans>
<form-bean name="EmpForm" type="logic.EmpForm">                 
            <form-property name="deptno" type="java.lang.String" />                   
        </form-bean>
    </form-beans>
   
 
    <!-- ========== Global Forward Definitions ================ -->
    <global-forwards>
<forward name="usersuccess" path="/logic/emplist.jsp" />     
    </global-forwards>
   
    <!-- ========== Action Mapping Definitions ================ -->
<action-mappings>
<action         
                path="/EmpSubmit"
                type="logic.DisplayAllUserAction"
                          name="EmpForm"                       
                    validate="false"
                    input="/logic/emp.jsp"
        />                             
    </action-mappings> 
           

<!-- 아래는 스트러츠 Application에서 사용할 Message Resource들을 설정  -->
<message-resources parameter="resources.application"/>
</struts-config>



------------------------------
9. application.properties
-----------------------------

user.depttitle=DEPTNO
jdbc.error=SAVE FAIL!!!


###############################################3
errors.header=<h3><font color="red">ERROR!</font></h3>
                  You must correct the following error(s) before proceeding:<UL>
errors.footer=</ul><hr>



------------------------------
10. NewActionServlet.java
------------------------------

package logic;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;

//Connection Pool
import com.bitmechanic.sql.*;


public class NewActionServlet extends ActionServlet {
        private ConnectionPoolManager cpm;
       
        /*
        * poolAias는 커넥션 풀을 별칭(Alias)를 줘서 여러 개의 풀을 이용할 수 있게 해줍니다.
        * 이 값을 잘 기억하였다가 LoginDAO.java에서 실제 커넥션을 수립할때 인자로 줘야 합니다.
        */               
        private String POOL_ALIAS = "wink";
       
    private String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";  // driver
    private String DB_URL = "jdbc:oracle:thin:@localhost:1521:WINK"; // url
    private String DB_USER = "SCOTT"; // id
    private String DB_PASSWORD = "TIGER"; // pw
 
    private int REAP_CONN_INTERVAL = 300; // 여기서부터는 bitmechanic 을 위한 환경 설정 값
   
    /* 커넥션 풀에 담을 수 있는 커넥션의 최대 수 */
    private int MAX_CONNECTION = 20;
   
    /* idleTimeout은  ConnectionPoolManager가 그 간격으로 수행을
    * 하게 되므로 적당한 시간을 설정하면 됩니다.
    * (데이터베이스의 불필요한 Open Session 수를 줄일 수 있슴)
    */
    private int IDLE_TIMEOUT = 60;
   
    /* checkoutTimeout은 너무 짧게 설정해도 안되는게 정상적인 query 수행시간이 길다면
    * 정상적으로 작동하는 query 수행 중에 Connection을 Reaping(제거)해 버리므로
    * 최대의 쿼리 수행 시간보다 크게 설정해야 합니다.
    * 즉 풀에서 나갔다가 돌아오는 시간의 Timeout 설정
    */
    private int CHECKOUT_TIMEOUT = 60;
   
    //Checkout의 최대 수를 지정 합니다         
    private int MAX_CHECKOUT = 15;
   
   
    public void init(ServletConfig config) throws ServletException
    {
            try
            {
                    Class.forName(JDBC_DRIVER);
                   
                    cpm = new ConnectionPoolManager(REAP_CONN_INTERVAL);
                   
                    cpm.addAlias(POOL_ALIAS,JDBC_DRIVER,DB_URL,DB_USER,DB_PASSWORD,MAX_CONNECTION,IDLE_TIMEOUT,CHECKOUT_TIMEOUT, MAX_CHECKOUT);
                   
                    // connection pool 생성 후에 부모 class의 init method 연속 수행
                    super.init(config);
            }
            catch ( Exception e1 )
            {
                    e1.printStackTrace();
            }
    }

   
   
   

}




----------------------
12. web.xml
----------------------

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>Welcome to Tomcat</display-name>
  <description>
    Welcome to Tomcat
  </description>
        <!-- Struts Tag Library Descriptors -->
        <taglib>
            <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/WEB-INF/struts-html.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
        </taglib>
        <taglib>
            <taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
            <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
        </taglib>   
       
        <servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>logic.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>
       
       
        <!-- ActionServlet Mapping ====================================-->
        <servlet-mapping>
                <servlet-name>action</servlet-name>
                <url-pattern>*.do</url-pattern>
        </servlet-mapping>
           
</web-app>