레이블이 oraclejavanew인 게시물을 표시합니다. 모든 게시물 표시
레이블이 oraclejavanew인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 3일 목요일

[오라클강좌,오라클데이터사전,오라클데이터딕셔너리,오라클Data Dictionary]ORACLE 데이터딕셔너리 1. Data Dictionary 란? - DB의 가장 중요한 부분의 하나로 Data Dictionat에는 연관된 DataBase 정보 를 제공하는 일기전용 Table의 집합이다. 아래와 같은 정보들로 구성된다. Oracle 사용자 이름 권한과 롤 Schema 개체이름(Table, View, Snapshot, index, cluster, Synonym,,,) 무결성제약 조건에 관한 정보 Column에 대한 기본값 DB의 개체에 대한 할당된 영역과 현재 사용중인 양 기타 일반적인 DataBase 정보 2. 구성 - 기본 Table과 사용자가 Access 할수있는 View로 구성된다. - 기본 Table 연관된 DB의 정보를 저장하는 Table Oracle 만이 Read/Write가 가능하며 사용자가 직접 Access할수 없다. - 사용자 Access 가능 View Dictionary 기본 Table의 내용을 요약하여 편리하게 보여줌 3. Dictionary의 소유자 SYS - Oracle 사용자 SYS는 데이타 딕셔널리의 모든 기본 Table과 View를 소유한다. - 기본 Dictionary Table의 내용을 변경하면 DataBase에 치명적인 악영향을 끼칠수 있다. 4. Dictionary 작용 - Oracle은 DDL 명령이 실행될때 마다 Data Dictionary를 Access한다. - 모든 Oracle 사용자는 DB정보에 대한 읽기 전용 참조로 Data Dictionary 사용할 수 있다. - DB작업동안 Oracle은 Data Dictionary를 읽어 개체의 존재여부와 사용자에게 적 합한 Access 권한이 있는지 확인한다. 또한 Oracle은 Data Dictionary를 계속 갱신하여 DataBAse 구조, 감사, 사용자권한,데이터등의 변경사항을 반영한다. - DataBase 작업동안 Oracle은 항상 Data Dictionary에 Access하여 사용자 Access권한을 확인하고 개체 상태를 확인 하므로 Data Dictionary의 많은 정보 가 SGA에 저장된다. 모든 정보는 LRU(Least Recently Used) 알고니즘을 사용하여 메모리에 저장되며 Table과 열을 설명하는 Comments는 Column을 자주 Access하지 않으면 저장되지 않는다. - Data Dictionary에 새로운 Table이나 View를 추가할수 있는데 소유자는 SYSTEM이나 제3의 ORacle 사용자여야 하며 SYS사용자에게 속한 새로운 개체는 생성하면 안된다. 5. User 접두어를 가진 View - 사용자와 밀접하게 관련된 View - 사용자 자신의 전용환경을 참조 - ALL_ View의 모든 정보의 부분 집합이다. - Public Synonym을 가질수 있다. <예> 아래의 예는 Scott 사용자의 Table을 조회항 결과이다. SQL> connect scott/tiger Connected. SQL> select table_name, tablespace_name from user_tables; TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ BONUS TOOLS DEPT TOOLS DUMMY TOOLS EMP TOOLS SALGRADE TOOLS 6. ALL 접두어를 가진 View - 사용자가 소유한 개체와 공용 권한과 명시적으로 부여된 권한및 롤을 사용하여 사용자가 Access할수 있는 개체정보를 돌려준다. <예>라애의 예는 Scott 사용자가 Access 가능한 DB Link를 보이는 예이다. SQL> connect scott/tiger Connected. SQL> select owner, db_link from all_db_links; OWNER ------------------------------ DB_LINK -------------------------------------------------------------------------------- PUBLIC LINUX.WORLD PUBLIC SANAE.WORLD PUBLIC WINK.WORLD 7. DBS 접두어를 가진 View - 전체 DB에 대한 전역 View를 제공 - DataBase 관리자만이 질의가 가능하며 select any table 권한이 있는 사용자 또한 질의가 가능하다. - 이러한 View에 대한 동의어는 생성되지 않으며, 다른 사용자가 질의 하려면 앞에 sys.이라는 접두어를 붙여야 한다. select owner, object_name from sys.dba_objects; - select any table권한이 있는 사용자는 dba_sysnonyms.sql을 실행하여 자신의 계정에 DBA View에 대한 동의어를 생성할수 있다. 이를 사용하면 현재 사용자에게 해당되는 동의어가 생성된다. 8. DUAL Table - Oracle과 사용자 작성 프로그램이 알려져 있는 결과를 보장하도록 참조할수 있는 작은 Table이며, 하나의 열과 하나의 행으로 구성되어 있다. - [출처] 오라클자바커뮤니티 - http://www.oraclejavanew.kr/bbs/board.php?bo_table=LecOracle&wr_id=75 오라클자바커뮤니티에서 설립한 개발자교육6년차 오엔제이프로그래밍 실무교육센터 (오라클SQL,튜닝,힌트,자바프레임워크,안드로이드,아이폰,닷넷 실무개발강의) www.onjprogramming.co.kr [개강안내]오라클자바커뮤니티에서 운영하는 개발자 전문교육 ,개인80%환급(www.onjprogramming.co.kr) [주말] [10/5]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 [10/5]SQL초보에서실전전문가까지 [평일야간] [10/4]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis까지 [10/4]SQL초보에서실전전문가까지 [평일주간] [10/8]스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 [10/4]PL/SQL,오라클힌트,SQL튜닝,사례연구 JAVA ORACLE iPhone/Android .NET 표준웹/HTML5 채용/취업무료교육 초보자(재학생)코스 PL/SQL,오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-04 스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-08 SQL초보에서실전전문가까지 총 8일 56시간 10-10 SQL초보에서실전전문가까지 총 18일 54시간 10-04 스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 총 11일 33시간 10-08 오라클 마스터 총 18일 54시간 10-10 PL/SQL,오라클힌트,SQL튜닝,사례연구 총 10일 30시간 10-10 오라클 마스터 총 8일 56시간 10-05 SQL초보에서실전전문가까지 총 8일 56시간 10-05 스프링3.X게시판&오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-05 PL/SQL,오라클힌트,SQL튜닝,사례연구 총 4일 32시간 10-05

[오라클강좌,오라클데이터사전,오라클데이터딕셔너리,오라클Data Dictionary]ORACLE 데이터딕셔너리




1. Data Dictionary 란?
- DB의 가장 중요한 부분의 하나로 Data Dictionat에는 연관된 DataBase 정보
 를 제공하는 일기전용 Table의 집합이다. 아래와 같은 정보들로 구성된다.
 
 Oracle 사용자 이름
 권한과 롤
 Schema 개체이름(Table, View, Snapshot, index, cluster, Synonym,,,)
 무결성제약 조건에 관한 정보
 Column에 대한 기본값
 DB의 개체에 대한 할당된 영역과 현재 사용중인 양
 기타 일반적인 DataBase 정보

2. 구성
- 기본 Table과 사용자가 Access 할수있는 View로 구성된다.
- 기본 Table
 연관된  DB의 정보를 저장하는 Table
 Oracle 만이 Read/Write가 가능하며 사용자가 직접 Access할수 없다.
- 사용자 Access 가능 View
 Dictionary 기본 Table의 내용을 요약하여 편리하게 보여줌

3. Dictionary의 소유자 SYS
- Oracle 사용자 SYS는 데이타 딕셔널리의 모든 기본 Table과 View를 소유한다.
- 기본 Dictionary Table의 내용을 변경하면 DataBase에 치명적인 악영향을
 끼칠수 있다.

4. Dictionary 작용
- Oracle은 DDL 명령이 실행될때 마다 Data Dictionary를 Access한다.
- 모든 Oracle 사용자는 DB정보에 대한 읽기 전용 참조로 Data Dictionary
 사용할 수 있다.
- DB작업동안 Oracle은 Data Dictionary를 읽어 개체의 존재여부와 사용자에게 적
 합한 Access 권한이 있는지 확인한다. 또한 Oracle은 Data Dictionary를 계속
 갱신하여 DataBAse 구조, 감사, 사용자권한,데이터등의 변경사항을 반영한다.
- DataBase 작업동안 Oracle은 항상 Data Dictionary에 Access하여 사용자
 Access권한을 확인하고 개체 상태를 확인 하므로 Data Dictionary의 많은 정보
 가 SGA에 저장된다. 모든 정보는 LRU(Least Recently Used) 알고니즘을
 사용하여 메모리에 저장되며 Table과 열을 설명하는 Comments는 Column을
 자주 Access하지 않으면 저장되지 않는다.
- Data Dictionary에 새로운 Table이나 View를 추가할수 있는데 소유자는
 SYSTEM이나 제3의 ORacle 사용자여야 하며 SYS사용자에게 속한 새로운 개체는
 생성하면 안된다.

5. User 접두어를 가진 View
- 사용자와 밀접하게 관련된 View
- 사용자 자신의 전용환경을 참조
- ALL_ View의 모든 정보의 부분 집합이다.

- Public Synonym을 가질수 있다.
<예> 아래의 예는 Scott 사용자의 Table을 조회항 결과이다.
SQL> connect scott/tiger
Connected.
SQL> select table_name, tablespace_name from user_tables;

TABLE_NAME                    TABLESPACE_NAME
------------------------------ ------------------------------
BONUS                          TOOLS
DEPT                          TOOLS
DUMMY                          TOOLS
EMP                            TOOLS
SALGRADE                      TOOLS

6. ALL 접두어를 가진 View
- 사용자가 소유한 개체와 공용 권한과 명시적으로 부여된 권한및 롤을 사용하여
 사용자가 Access할수 있는 개체정보를 돌려준다.
<예>라애의 예는 Scott 사용자가 Access 가능한 DB Link를 보이는 예이다.
SQL> connect scott/tiger
Connected.
SQL> select owner, db_link from all_db_links;

OWNER
------------------------------
DB_LINK
--------------------------------------------------------------------------------
PUBLIC
LINUX.WORLD

PUBLIC
SANAE.WORLD

PUBLIC
WINK.WORLD

7. DBS 접두어를 가진 View
- 전체 DB에 대한 전역 View를 제공
- DataBase 관리자만이 질의가 가능하며 select any table 권한이 있는
 사용자 또한 질의가 가능하다.
- 이러한 View에 대한 동의어는 생성되지 않으며, 다른 사용자가 질의 하려면
 앞에 sys.이라는 접두어를 붙여야 한다.
 select owner, object_name from sys.dba_objects;
- select any table권한이 있는 사용자는 dba_sysnonyms.sql을 실행하여
 자신의 계정에 DBA View에 대한 동의어를 생성할수 있다. 이를 사용하면
 현재 사용자에게 해당되는 동의어가 생성된다.

8. DUAL Table
- Oracle과 사용자 작성 프로그램이 알려져 있는 결과를 보장하도록
 참조할수 있는 작은 Table이며, 하나의 열과 하나의 행으로 구성되어 있다.
-

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



2013년 8월 10일 토요일

[오라클자바,오라클자바커뮤니티]Oracle Types of Data Integrity

Oracle Types of Data Integrity

A. Nulls
- 기본적으로 Column은 Null을 허용한다. 
Column에 대해서 null을 포함하는 row들의 insert나 또는 update를 허용하는 또는 허용하지 않는  하나의 column에 대해서 정 의되는 규칙.

B. Unique Column Values
-Column(또는 column들의 집합)에 대해서 unique value를 포함하는 row들의 insert나 또는  update만을 허용하는 column들(또는 column들의 집합)에 대해서 정
의되는 규칙, 즉 지정된 열또는 열들에서중복된 값을 허용안함

- Unique 제약조건을 구성하는 열중 일부분이 Null을 허용한다면 Null을 허용하지 않는 열은  동일한 값을 가질수 없다.

C. Primary Key Values
-Table에 있는 각 row는 column(또는 column들의 집합)에 있는 value들에 의해서 유일하게 식별될 수 있도록 하는 하나의 column(또는 column들의 집합)에 정의된
규칙.

- Primary Key Column은 Null을 허용하지 않는다.

- 만약 dept Table의 dept_no Column이 Primary Key라면 해당열에 대한 고유 인덱스를 암시적으로  생성하며 해당열에대해 not null제약조건을 암시적으로 생성한다.

- Primary Key Column은 16개 까지로 제한됨

D. Referential Integrity(참조 무결성)과 Foreign Key 무결성 제약조건
- 만약 Column 또는 column들의 집합에 대한 값(the dependent value)이 관련된 table의 column에 있는 값(the referenced value)과 match 된다면 하나의 row에
대한 insert 또는 update만을 허용하는 하나의 table에 존재하는 column(또는 column들의 집합)에 대해서 정의된 규칙.

-Referential integrity는 또한 어떤 data 조작의 유형이 참조되는 값들에 허용되는 지와 이러한 action들이 종속된 값들에 어떠한 영향을 주는 지를 지시하는 규칙들을 포함한다. 

Restrict
 참조되는 data의 update 또는 deletion을 허용하지 않는 referential
integrity.

Set to Null
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 NUll이 설정된다.

Set to Default
 참조되는 data가 update되거나 delete될 때, 관련되는 모든 종속된 data는 default value가 설정된다.

Cascade
 참조되는 data가 update될 때, 관련되는 모든 종속된 data도 update된다; 참조되는 row가 delete될 때, 관련되는 모든 종속된 row들도 delete된다.

F. Check Constrints
- 각 열또는 열집합에 대한 Check Constraints는 지정된 조건이 참인지 거짓인지 알수있게 한다.

- 사용자가 확인 조건을 지정함으로서 특수하거나 복잡한 무결성 조건을 시행한다.

- 문자열 리터럴이나 인수(투캐랙터, 투넘버, 투데이트)로 NLS 매개변수를 가지는 SQL을 포함한는  제약조건을 평가하기 위해 Oracle은 기본적으로 DataBase의 NLS설정값을 사용한다.

2013년 8월 8일 목요일

[오라클자바커뮤니티]에서 파라미터 넘기는 법

보통 <global-forwards>에서는 다음과 같은 방법을 매핑될 페이지를
입력합니다.

<forward name="insert_success"        path="BoardList.do" />

여기서 파라미터를 다음과 같이 입력해서 코딩하면 xml 파싱에러가 납니다.
파라미터가 하나는 들어가는데 두개이상이 안들어 가게 됩니다.

<forward name="order"        path="BoardList.do?code=00001" />
  => 에러 안남

<forward name="order"        path="BoardList.do?code=00001&page=1" />
  => 에러 발생

이 경우에는 다음과 같은 방법으로 코딩하면 다수의
파라미터값을 넘길 수 있습니다.

<forward name="board_insert_success"      path="/BoardList.do?run=BoardList & a m p ; current_page=1"/>

윗 부분의 & a m p ; <=요 부분의 띄어쓰기된 부분을 붙여주면 됩니다.
유용하게 쓰일때가 꼭 있을 거라는 생각이 들어서 올려봤습니다. ^^

[ORACLEJAVANEW.KR]Struts DispacthAction 클래스

Struts DispacthAction 클래스 DispacthAction 클래스


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


액션의 경우 하나의 클래스에 관련된 action이 정의 되어 있는 것이 좋은 방법인데  DispacthAction 클래스는 관련된 action은 하나의 클래스에 관리하는 방법을 제공 합니다.

DispacthAction 클래스는 추상 클래스 이므로 사용하기 위해서는 액션 클래스에서 오버라이드 해야 하며 DispacthAction 클래스에서는 어느 action이 불리어져야 하는지를 관리 하기 위해 hidden request parameter를 관리 합니다.

DispacthAction 을 상속 받은 하위 클래스로 넘어오는 hidden parameter는 스트럿츠 설정 파일에 있는 <action> 요소의 parameter 라는 속성의 값이 넘어 오게 됩니다.

결국 DispacthAction 클래스를 상속 받은 하위 클래스는 execute() 메소드와 signature가 같은 많은 메소드(각각의 Action이 수행 해야 하는 메소드)를 정의해야 합니다.


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

1. Action 처리를 위한 DispatchAction클래스의 하위 클래스를 작성

public class UserRegistrationMultiAction extends DispatchAction {
...
}

2. 관계된 action을 구현 합니다.

public ActionForward processPage1( ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
}

public ActionForward processPage2(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
...
}


3. Action Mapping을 작성 합니다. 이때 paramter라는 속성에 “action” 이라고 줍니다. 이 action이라는 파라미터와 그 값(이건 JSP에서 넘어 옵니다)이 위에서 구현한 DispatchAction 클래스를 상속한 UserRegistrationMultiAction 클래스에 넘어 가게 됩니다.
즉 paramter인 action의 값이 수행 하고자 하는 action이 되는 것 입니다.

<action path="/userRegistrationMultiPage1"
type="strutsTutorial.UserRegistrationMultiAction"
name="userRegistrationForm"
attribute="user"
parameter="action"
input="/userRegistrationPage1.jsp">
...
</action>

<action path="/userRegistrationMultiPage2"
type="strutsTutorial.UserRegistrationMultiAction"
name="userRegistrationForm"
attribute="user"
parameter="action"
input="/userRegistrationPage2.jsp">
...
</action>

4. 이젠 JSP에서 action이라는 히든 텍스트를 만들어 Action이 일어 날 때 Action을 처리하는  클래스(UserRegistrationMultiAction ) 로 넘기게 됩니다.

userRegistrationPage1.jsp 에 포함된 히든 태그

<html:hidden property="action" value="processPage1"/>

userRegistrationPage2.jsp 에 포함된 히든 태그

<html:hidden property="action" value="processPage2"/> 

[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>