레이블이 오라클 구체화뷰인 게시물을 표시합니다. 모든 게시물 표시
레이블이 오라클 구체화뷰인 게시물을 표시합니다. 모든 게시물 표시

2013년 11월 2일 토요일

[ORACLE UNIX]유닉스에서 오라클 환경변수 설정(UNIX 오라클 환경변수 설정)

[ORACLE UNIX]유닉스에서 오라클 환경변수 설정(UNIX 오라클 환경변수 설정)


설정된 환경 변수를 확인 하기 위해서는 다음과 같이 합니다.
 
env | grep e ORA e TNS
 
 
--------------------------
Oracle Environment Variables
--------------------------
 
LD_LISRARY_PATH : library file에 대한 경로(예를 들면 /usr/lib:/use/openwin/lib:$ORACLE_HOME/lib:use/games/lib)
 
ORACLE_BASE : 모든 ORACLE Products에 대한 BASE DIRECTORY에 대한 FULL PATH
 
ORACLE_HOME : 현재 사용중인 오라클 버전에 대한 FULL PATH, 오라클이 인스톨되어 있는 기본 디렉토리,  데이터베이스 이름은 ORACLE_SID로 사용 됩니다. ORACLE_HOME은 모든 오라클 Products에서 사용 되어 지며 coraenv 또는 oraenv 스크립트에 위해 setting 됩니다.
 
ORACLE_PATH : files location에 대한 경로만약 값이 setting 되어 있으면 응용 프로그램은 $ORACLE_PATH 부터 먼저 검색그다음 현재 디렉토리를 하게 됩니다만약 setting 되어 있지 않으면 현재 디렉토리를 먼저 검색 합니다.
 
ORACLE_TERM : 터미널 정의에 대한 것값이 setting 되어 있지 않으면 기본적으로 TERM environment 값이 사용됩니다.
 
ORAENV_ASK : 이 값이 YES이면 ORACLE_SID에 대해 묻지 않습니다이 변수는 oraenv가 스크립트로 불리어 지기 전까지는 NO setting 합니다즉 oraenv를 실행했을 때 ORACLE_SID,ORACLE_HOME을 물어볼 지를 지정하며, NO 이외의 경우는 모두 물어 봅니다.
 
TNS_ADMIN : tnsnames.ora, sqlnet.ora 파일과 같은 TNS 파일에 대한 경로 이름
 
ORACLE_TRACE 인스톨 시에 Verification/Trace(shell 에 의한 작업이 모두 화면출력)를 작동시킬지 않을지를 지정, T 이면 작동하고 그 외의 경우는 작동 하지 않습니다.
 
TWO_TASK :  원격의 DB에 대한 접속 시 사용하는 SQL*Net Connect String에 대한 정의,  SQL*Net TWO_TASK 변수를 체크하여 자동으로 그 값을 connect string의 뒤에 add 합니다.
 
아래의 예를 참고 하세요~
 
sqlplus scott/tiger@wink
 
and
 

export TWO_TASK=wink; sqlplus scott/tiger

 [개강임박강좌]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr)


[주간]
  [11/13]SQL초보에서실전전문가까지

  [11/13]안드로이드개발자과정

  [11/18]Spring3.X, MyBatis, Hibernate실무과정
  [11/18]iPhone 하이브리드 앱 개발 실무과정

[평일야간]
  [11/08]C#,ASP.NET마스터
  [11/08]Spring3.X, MyBatis, Hibernate실무과정

  [11/12]iPhone 하이브리드 앱 개발 실무과정
  [11/14]JAVA&WEB프레임워크실무과정
[주말]
  [11/09]C#,ASP.NET마스터
  [11/09]JAVA&WEB프레임워크실무과정
  [11/09]Spring3.X, MyBatis, Hibernate실무과정
  [11/09]웹퍼블리싱 마스터
  [11/16]PL/SQL,오라클힌트,SQL튜닝,사례연구
  [11/16]ASP.NET4.0 MVC 프로그래밍


2013년 10월 31일 목요일

[자바강좌]JAVA Method Overring(자바 메소드 재정의) 상위 클래스의 인스턴스 메소드를 새로 구현함으로써 ...

 [자바강좌]JAVA Method Overring(자바 메소드 재정의)
 
상위 클래스의 인스턴스 메소드를 새로 구현함으로써 외부에 다른 반응양식을 보일 수 있다
메쏘드 재정의를 하기위해서 메쏘드 이름, 매개변수개수, 타입, 리턴형이 같아야 한다.
객체의 타입과 관계없이 참조값(reference)이 가리키는 실제 객체 자료형의 메쏘드가 선택되어 런타입중 실행
실제 자료형에 메쏘드가 없으면 가장 가까운 상위 클래스의 메쏘드가 실행된다.
상위 클래스보다 접근 제어를 강화할 수 없다
상위 클래스에 public으로 되어있는 함수를 하위 클래스에서 private으로 할 수 없다.
 

[예제]
 
package onj;
class A1 {
 public void m(int i) {
  System.out.println("A1의  m(int)");
 }
 public void m(double f) {
  System.out.println("A1의  m(double)");
 }
}
class B1 extends A1 {
 //A1의 m(int i) 재정의
 public void m(int i) {
  System.out.println("B1의 m(int)");
 }
 //method overloading(매개변수의 개수를 변화줌)
 public void m() {
  System.out.println("B1의 m()");
 }
}
class Override {
 public static void main(String[] args) {
  A1 a = new A1();
  a.m(1); // A1의 m(int)가 호출됨
  B1 b = new B1();
  b.m(1);     // B1의 m(int)가 호출됨
  b.m(1.0);   // B1에는 m(double d)이  없다, 상위클래스 A1의 b.m(double d) 호출
  
  A1 c = new B1();
  c.m(1);   // 마지막으로 재정의된 메쏘드 B의 m(int)가 호출됨
  //c.m(); // 컴파일오류: 자료형 A1에는 메쏘드 m()이 정의되어 있지 않음.
 
 }
}
 
[결과]
 
A1의  m(int)
B1의 m(int)
A1의  m(double)
B1의 m(int)

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월 3일 목요일

[ORACLESQL강좌,오라클SQL가로출력, 오라클 SQL] 하나의 테이블 값을 가로로 두 번 표시하는 방법

[ORACLESQL강좌,오라클SQL가로출력, 오라클 SQL] 하나의 테이블 값을 가로로 두 번 표시하는 방법

오라클 SQL 하나의 테이블 값을 가로로 두 번 표시.

아래 EMP TABLE의 원본 데이터가 있다고 할 때

SQL> select empno, ename from emp;

    EMPNO ENAME
---------- ----------
      7369 SMITH
      7499 ALLEN
      7521 WARD
      7566 JONES
      7654 MARTIN
      7698 BLAKE
      7782 CLARK
      7788 SCOTT
      7839 KING
      7844 TURNER
      7876 ADAMS
      7900 JAMES
      7902 FORD
      7934 MILLER

14 개의 행이 선택되었습니다.


위 원본 데이터를 다음과 같이 한 테이블의 값을 가로로 두 번 표시하고자 하는 경우...


ORD      EMPNO ENAME      JOB            EMPNO ENAME      JOB
----- ---------- ---------- --------- ---------- ---------- ---------
    1      7369 SMITH      CLERK          7499 ALLEN      SALESMAN
    2      7521 WARD      SALESMAN        7566 JONES      MANAGER
    3      7654 MARTIN    SALESMAN        7698 BLAKE      MANAGER
    4      7782 CLARK      MANAGER        7788 SCOTT      ANALYST
    5      7839 KING      PRESIDENT      7844 TURNER    SALESMAN
    6      7876 ADAMS      CLERK          7900 JAMES      CLERK
    7      7902 FORD      ANALYST        7934 MILLER    CLERK.



STEP 1 : 우선 ROWNUM을 짝수, 홀수로 구분하여 가로로 표시한다.


SQL> SELECT ROWNUM,TRUNC((ROWNUM+1)/2) AS ORD,
  2            DECODE(MOD(ROWNUM,2),1,EMPNO,NULL) AS FIRST_EMPNO,
  3            DECODE(MOD(ROWNUM,2),0,EMPNO,NULL) AS SECOND_EMPNO
  4      FROM  EMP;

    ROWNUM        ORD FIRST_EMPNO SECOND_EMPNO
---------- ---------- ----------- ------------
        1          1        7369
        2          1                    7499
        3          2        7521
        4          2                    7566
        5          3        7654
        6          3                    7698
        7          4        7782
        8          4                    7788
        9          5        7839
        10          5                    7844
        11          6        7876
        12          6                    7900
        13          7        7902
        14          7                    7934

14 개의 행이 선택되었습니다.

STEP 2 : 빈 컬럼을 없애기 위해 SUM(DECODE...) 를 사용한다.

SQL>  SELECT TRUNC((ROWNUM+1)/2) AS ORD,
  2              SUM(DECODE(MOD(ROWNUM,2),1,EMPNO,NULL)) AS FIRST_EMPNO,
  3              SUM(DECODE(MOD(ROWNUM,2),0,EMPNO,NULL)) AS SECOND_EMPNO
  4      FROM  EMP
  5      GROUP BY TRUNC((ROWNUM+1)/2);

      ORD FIRST_EMPNO SECOND_EMPNO
---------- ----------- ------------
        1        7369        7499
        2        7521        7566
        3        7654        7698
        4        7782        7788
        5        7839        7844
        6        7876        7900
        7        7902        7934

7 개의 행이 선택되었습니다.

STEP 3 : 해당 EMPNO 컬럼에 ENAME, JOB 데이터를 덧붙인다.

SQL> SELECT ORD,
  2        F_EMPNO AS EMPNO,A.ENAME,A.JOB,
  3        S_EMPNO AS EMPNO,B.ENAME,B.JOB
  4  FROM  ( SELECT ORD,
  5                  SUM(FIRST_EMPNO)  AS F_EMPNO,
  6                  SUM(SECOND_EMPNO) AS S_EMPNO
  7          FROM  ( SELECT TRUNC((ROWNUM+1)/2) AS ORD,
  8                          DECODE(MOD(ROWNUM,2),1,EMPNO,NULL) AS FIRST_EMPNO,
  9                          DECODE(MOD(ROWNUM,2),0,EMPNO,NULL) AS SECOND_EMPNO
 10                    FROM EMP)
 11          GROUP BY ORD ), EMP A, EMP B
 12  WHERE  F_EMPNO = A.EMPNO
 13  AND    S_EMPNO = B.EMPNO(+)
 14  ORDER BY ORD ;

OUTER 조인을 사용하지 않으면 SECOND_EMPNO 컬럼의 값이 NULL인 경우 전체 로우의 값이 나오지 않게 되므로 반드시 S_EMPNO와 조인되는 B.EMPNO 컬럼에 (+) 사인을 추가해야 한다.

ORD      EMPNO ENAME      JOB            EMPNO ENAME      JOB
---- ---------- ---------- --------- ---------- ---------- ---------
  1      7369 SMITH      CLERK          7499 ALLEN      SALESMAN
  2      7521 WARD      SALESMAN        7566 JONES      MANAGER
  3      7654 MARTIN    SALESMAN        7698 BLAKE      MANAGER
  4      7782 CLARK      MANAGER        7788 SCOTT      ANALYST
  5      7839 KING      PRESIDENT      7844 TURNER    SALESMAN
  6      7876 ADAMS      CLERK          7900 JAMES      CLERK
  7      7902 FORD      ANALYST        7934 MILLER    CLERK

7 개의 행이 선택되었습니다. 

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



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>