import mx.controls.Alert;
   import mx.events.CloseEvent;

   // show alert
   private function clickButton():void {
     Alert.yesLabel = "예", Alert.noLabel = "아니오";
     Alert.show("예 아니오 냐는?", "", Alert.YES|Alert.NO, this, buttonAlertListener, null);
   }
  
   // alert listener
   private function buttonAlertListener(evt:CloseEvent):void {
    if ( evt.detail == Alert.YES ) {
        Alert.okLabel = "예";
        Alert.show("예 선택했다는");
    } else if ( evt.detail == Alert.NO ) {
        Alert.okLabel = "아니오 선택했소";
        Alert.buttonWidth = 200;
        Alert.show("아니오 선택했다는");
    }
   }


간단 예제 입니다
Alert.yesLabe  Alert.noLabel   Alert.okLabel 등으로 버튼 이름을 한글로 세팅해줄수 있숩니다.


만약 버튼에 할당한 이름이 길다면  Alert.buttonWidth = 200 으로 버튼 길이를 조정하여 글자가 짤리는걸 방지할수 있습니다.


선택에 따라 맞는 행위?를 실행시키려면 Alert.show에 각종 인자를 줍니다


...buttonAlertListener ... 부분이 선택에 따라 실행할 함수 지정 부분


그럼 private function buttonAlertListener(evt:CloseEvent):void 식으로 함수 만들어서
조건에 따라 맞는 행위를 기술해 주시면 된다는.. :)

Posted by 나비:D
:

select를 했으면, insert, update, delete를 사용하는 것을 알아본다.

Apache common DbUtils 사용법 1에서 사용한 방법과 거의 동일한 방법으로 사용을 한다.

먼저 insert를 한번 해보자
insert into testdb(name, addr) values(’Park’ ‘Seoul’)
이런 문장을 가지고 코드를 만들어 보면 아래와 같다.
public int insert()
{
int result = 0;
int index = 0;
String query = “insert into testdb(name, addr) values(:name,:addr)”;
try
{
QueryRunner runner = new QueryRunner();
Vector v = new Vector();
v.add(index++, ‘Park’);
v.add(index++, ‘Seoul’);
result = runner.update(conn, query, v.toArray());
}catch(SQLException ex)
{
log.error(ex);
log.error(”[SQL:]” + query);
throw ex;
}
return result;
}

리턴값이 0보다 크면 정상적으로 insert된다. 여기서 유의해 볼것은 Vector에 입력되는 값인데, 반드시 sql의 구조와 동일한 순서로 되어야 한다. QueryRunner class에서 Vector와 query를 가지고 PreparedStatement를 재구성하기 때문이다.

update, delete는 위에서 query만 변경되면 된다. 간단하지 아니한가??

작성자 : 박남준(criticalbug@gmail.com)

Posted by 나비:D
:

DB를 사용할때 가장 속썩이는 부분이 DB connection pool과 Connection, PreparedStatment, ResultSet 이 클래스들 일것이다.

사용을 했으면 반드시 닫아 주어야 시스템에 문제가 생기지 않는다.

일반적으로 select를 사용해보자

public static void main(String args[]) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String tableName = “”;
try {
conn = ConnectionManager.getConnection();
pstmt = conn.prepareStatement(”select * from tab”);
rs = pstmt.executeQuery();
while(rs.next()) {
tableName = String.format(”tname:%s, tabtype:%s”, rs.getString(1), rs.getString(2));
System.out.println(tableName);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(rs != null) try { rs.close(); } catch(Exception e) {}
if(pstmt != null) try { pstmt.close(); } catch(Exception e) {}
if(conn != null) try { conn.close(); } catch(Exception e) {}
}
}

상당히 익숙한 코드들이다. 여기서 유의해 볼것은 while이 있는 부분인데 rs에 있는 데이터의 크기도 크기지만, set을 이용해서 코딩하는것 자체가 한마디로 삽질인데, 이것을 dbutils을 사용해서 한번 줄여 보자

먼저 데이터의 구조를 가지고 있는 클래스를 하나 만든다

public static class TabDTO {
private String tname = “”;
private String tabtype = “”;
public String getTabtype() {
return tabtype;
}
public void setTabtype(String tabtype) {
this.tabtype = tabtype;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}

}

이것을 사용해서 위에서 연습한 것과 동일한 것을 만들어 보자

public static void main(String args[]) {
Connection conn = null;
int index = 0;
String tableName = “”;
String query = “select * from tab”;
List list = new ArrayList();

try {
conn = ConnectionManager.getConnection();
QueryRunner runner = new QueryRunner();
ResultSetHandler rsh = new BeanListHandler(TabDTO.class); //레코드 여러건
//ResultSetHandler rsh = new BeanHandler(TabDTO.class); //레코드 1건
Vector v = new Vector();
//v.add(index++, “TBLBANK”);
list = (List)runner.query(conn, query, v.toArray(), rsh);
//TabDTO dto = (TabDTO)runner.query(conn, query, v.toArray(), rsh);

Iterator iter = list.iterator();
while(iter.hasNext()) {
TabDTO dto = new TabDTO();
dto = (TabDTO)iter.next();
tableName = String.format(”tname:%s, tabtype:%s”, dto.getTname(), dto.getTabtype());
System.out.println(tableName);
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(conn != null) try { conn.close(); } catch(Exception e) {}
}
}
어떤가? 더 어려워졌다고 느끼는 분도 있을것이다. 누구나 그러하니까..

중점적으로 볼것은 QueryRunner, ResultSetHandler 이것들은 항상 같이 쓰이고 BeanListHandler는 데이터가 여러건 즉, 리스트 형태일때 사용한다. QueryRunner의 속을 깊이 들여다 보면, query가 여러개 정의되어 있는데 시간이 있으면 한번 들여다 보는것을 권장한다. 그다음에 Vector로 정의된 부분은 dynamic query,즉 PreparedStatement에 사용되는 것을 순서대로 add하여 사용한다. 참고로 query가 ~~where abe=? and def=? 이렇게 되어 있다면 v.add(1, “a”); v.add(2, “b”) 이렇게 되겠다.

조금전에 QueryRunner의 query를 살펴보았다면, query의 역할을 알 것이고 이것은 Object를 리턴함으로 List로 casting하여 사용하게 된다.

글을 처음 쓰는거라 손가락 무지아프다. 다음편에는 insert, update, delete를 알아보자

작성자 : 박남준(criticalbug@gmail.com)

Posted by 나비:D
:
출처 : http://www.okjsp.pe.kr/bbs?act=VIEW&bbs=bbs4&keyfield=content&keyword=&seq=48115&pg=0

jakarta commons DbUtils 간단한 사용법

Commons DbUtils : 데이터베이스 사용에 있어서 단순노가다로 이루어지던 많은 작업을 편리하게 해준다. 그동안 "이거 귀찮은데 유틸로 뽑아놓을까?" 아니면 "우씨~ 이런 노가다" 하던 부분이 한방에 해결됐다. 단순한 유틸 패키지이기에 사용법도 간단하고 편리하다.


//1. JDBC 드라이버 로딩을 간략화(로딩 성공시 true 반환)

        if (!DbUtils.loadDriver("com.mysql.jdbc.Driver")) {

            System.out.println("Failed Loading JDBC Driver!");
            System.exit(0);

        }


//2. Connection, ResultSet, Statement 등의 close를 간단하게

(null 확인 - > 예외처리의 과정을 간단하게)
        DbUtils.closeQuietly(connection);


//3. QueryRunner - 쿼리문 수행

- SELECT

query(Connection conn, String sql, ResultSetHandler rsh)

query(Connection conn, String sql, Object param, ResultSetHandler rsh)

query(Connection conn, String sql, Object[] params, ResultSetHandler rsh) 등

param은 PreparedStatement의 ?에 해당 .. 2개 이상은 배열을 만들어서 전달


- INSERT, UPDATE, DELETE의

int update(Connection conn, String sql)

int update(Conneciton conn, String sql, Object param) 등

executeUpdate()와 사용법 동일


//4. ResultSetHandler - 빈이나 맵을 만들어서 ResultRet에서 읽어들여 넣어주는 노가다여 안녕~!

BeanHandler, BeanListHandler, MapHandler, MapListHandler


예)

String query = "SELECT * FROM user WHERE name = ?";

User user = null;

ResultSetHandler rsh = new BeanHandler(User.class);

QueryRunner runner = new QueryRunner();

user = (User) runner.query(conn, query, "홍길동", rsh);


-----------

import java.sql.*;
import org.apache.commons.dbutils.DbUtils;


public class CommonsDBUtilExample {
    public static void main(String[] args) {
        Connection connection = null;
        String url = "jdbc:mysql://localhost/mysql";
        String user = "root";
        String password = "";

        if (!DbUtils.loadDriver("com.mysql.jdbc.Driver")) {
           System.out.println("Failed Loading JDBC Driver!");
           System.exit(0);
        }

        try {
            connection = DriverManager.getConnection(url, user, password);
            System.out.println("Connection successful!!");
            Statement select = connection.createStatement();
   ResultSet rs = select.executeQuery("select * from user");
   while (rs.next()) {
    System.out.println(rs.getString(1));
   }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            DbUtils.closeQuietly(connection);
        }
    }
}
------------


그냥 사용법 까먹지 않기위해 Blog에 적어둔거 올려봅니다. Jakarta Project 책에서 많이 참고했습니다.

Posted by 나비:D
:

출처 블로그 > 거리에 뛰노는 아이들 웃음처럼~ 젬스
원본 http://blog.naver.com/jambeer/90000104051

Tomcat 5 JNDI DataSource
를 통한 DB 커넥션 풀 사용

 

 

 

이미 눈치 채셨겠지만, 요즘 내가 RDBMS 배우기에 열을 올리고 있다.
지금까지는 JSP/Servlet에서 직접 커넥션을 맺거나, 컨텍스트내에 커넥션 라이브러리를 두고 호출에서 사용했는데, 바꿔야겠다.
JNDI
통한 커넥션 사용은 J2EE 표준이고, 현존하는 거의 모든 컨테이너가 지원한다고 한다.

 

JNDI 서버에 설정하는 방법은 WAS 별로 다르지만, 사용하는 것은 모두 동일하므로 호환성에 문제도 없다.

 

글은 Jakarta DBCP 커넥션 Tomcat JNDI 설정을 통해 데이터베이스 커넥션 풀을 사용하는 방법이다.

 

JNDI 커넥션 풀에 관한 자세한 설명이 JavaServer Pages 3rd ed. 실려있다. 너무 좋다. 읽어보라고 강력하게 권하고 싶다.

 

기본적으로 필요한 라이브러리

  • commons-dbcp.jar
  • commons-collections.jar
  • commons-pool.jar

예제 JDBC 드라이버

  • Oracle 9i classes12.jar

JNDI Naming Resource 설정

1.       라이브러리들을 $CATALINA_HOME/common/lib 복사한다. 이외 디렉토리에 두면 안된다. ZIP 파일은 JAR 확장자를 바꿔야 한다. 톰캣은 JAR파일만 클래스패스에 추가한다.

2.       Connection 풀을 이용할 경우에는 ResultSet Connection 객체를 필히 직접 닫아 줘야만 한다.

3.       $CATALINA_HOME/conf/server.xml 혹은 컨텍스트별 XML 파일의 <Context> 자식 요소로 다음을 추가한다.

4.                <Resource name="jdbc/forumDb" auth="Container" type="javax.sql.DataSource"/>

5.                <!-- Resource name 속성을 이용해서 어플리케이션에서

6.                                javax.sql.DataSource 객체를 얻어가게 된다. -->

7.             

8.               

9.                <!-- 자세한 파라미터 설정은

10.               http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jndi-datasource-examples-howto.html 참조 -->

11.            <ResourceParams name="jdbc/forumDb">

12.              <parameter>

13.                <name>factory</name>

14.                <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

15.              </parameter>

16.         

17.              <parameter>

18.                <name>maxActive</name>

19.                <value>100</value>

20.              </parameter>

21.         

22.              <parameter>

23.                <name>maxIdle</name>

24.                <value>30</value>

25.              </parameter>

26.         

27.              <parameter>

28.                <name>maxWait</name>

29.                <value>10000</value>

30.              </parameter>

31.         

32.                              <!-- DB 사용자명과 비밀번호 설정 -->

33.              <parameter>

34.               <name>username</name>

35.               <value>dbuser</value>

36.              </parameter>

37.              <parameter>

38.               <name>password</name>

39.               <value>dbpasswd</value>

40.              </parameter>

41.         

42.                              <!-- JDBC 드라이버 클래스 -->

43.              <parameter>

44.                 <name>driverClassName</name>

45.                 <value>oracle.jdbc.driver.OracleDriver</value>

46.              </parameter>

47.             

48.                              <!-- JDBC 접속 URL -->

49.              <parameter>

50.                <name>url</name>

51.                <value>jdbc:oracle:thin:@dbhost:1521:ORA</value>

52.              </parameter>

53.         

54.                  <!-- 커넥션에 문제 없는지 테스트하는 쿼리 -->

55.              <parameter>

56.                <name>validationQuery</name>

57.                <value>select sysdate</value>

58.              </parameter>

59.            </ResourceParams>

 

60.    어플리케이션의 web.xml파일에 다음을 추가하여 JNDI 리소스를 사용할 있도록 한다.

61.                              <resource-ref>

62.                                                   <description>Forum DB Connection</description>

63.                                                   <!-- 다음이 바로 리소스의 이름 -->

64.                                                   <res-ref-name>jdbc/forumDb</res-ref-name>

65.                                                   <res-type>javax.sql.DataSource</res-type>

66.                                                   <res-auth>Container</res-auth>

67.                              </resource-ref>

 

JSP/Servlet 에서 사용하기

이제 다음과 같이 JNDI 이용해 DataSource 객체를 얻고, 객체에서 커넥션을 얻어오면 된다.

 

다음은 서블릿을 작성하고, 서블릿에서 DB커넥션을 얻고, 쿼리를 날린 , 결과를 JSP 파일에 포워딩하여 JSTL 이용해 출력하는 것이다.

 

1.       예제 테이블과 데이터 SQL - 오라클 계정으로 다음과 같은 데이터를 생성했다고 가정하면

2.              create table test (

3.                                  num NUMBER NOT NULL,

4.                                  name VARCHAR2(16) NOT NULL

5.              );

6.             

7.              truncate table test;

8.             

9.              insert into test values(1,'영희');

10.          insert into test values(2, '철수');

11.          insert into test values(3, '미숙');

12.          commit;

 

13.    test.JndiDataSourceTestServlet 소스

14.          package test;

15.         

16.          import java.io.IOException;

17.          import java.sql.Connection;

18.          import java.sql.ResultSet;

19.          import java.sql.SQLException;

20.          import java.sql.Statement;

21.          import java.util.ArrayList;

22.          import java.util.HashMap;

23.          import java.util.List;

24.          import java.util.Map;

25.         

26.          import javax.naming.Context;

27.          import javax.naming.InitialContext;

28.          import javax.naming.NamingException;

29.          import javax.servlet.RequestDispatcher;

30.          import javax.servlet.ServletException;

31.          import javax.servlet.http.HttpServlet;

32.          import javax.servlet.http.HttpServletRequest;

33.          import javax.servlet.http.HttpServletResponse;

34.          import javax.sql.DataSource;

35.         

36.          public class JndiDataSourceTestServlet extends HttpServlet {

37.         

38.              protected void doGet(HttpServletRequest request,

39.                      HttpServletResponse response) throws ServletException, IOException {

40.         

41.                  Connection conn = null;

42.                  ResultSet rs = null;

43.                  Statement stmt = null;

44.         

45.                  try {

46.                      // 커넥션을 얻기 위한 전초작업. 부분을 메소드화 하면 되겠다. ------------

47.                      Context initContext = new InitialContext();

48.                      Context envContext = (Context)initContext.lookup("java:/comp/env");

49.                      DataSource ds = (DataSource)envContext.lookup("jdbc/forumDb");

50.                     

51.                      // 커넥션 얻기

52.                       conn = ds.getConnection();

53.                      //------------------------------------------------------------------

54.                     

55.                      String sql = "SELECT * from test";

56.                      stmt = conn.createStatement();

57.                     

58.                      rs = stmt.executeQuery(sql);

59.                     

60.                      List results = new ArrayList();

61.                     

62.                      while (rs.next()) {

63.                          Map row = new HashMap();

64.                         

65.                          row.put("num", rs.getString("num"));

66.                          row.put("name", rs.getString("name"));

67.                         

68.                          results.add(row);

69.                      }

70.                     

71.                      request.setAttribute("results", results);

72.                     

73.                      RequestDispatcher rd = request.getRequestDispatcher("/dbtest.jsp");

74.                      rd.forward(request, response);

75.                     

76.                  } catch (NamingException e) {

77.                      throw new ServletException("JNDI 부분 오류", e);

78.                  } catch (Exception e) {

79.                      throw new ServletException("뭔가 다른 부분 오류", e);

80.                  } finally {

81.                      // 리소스를 필히 반환할 !

82.                      if (rs != null) { try { rs.close(); } catch (Exception ignored) {} }

83.                      if (stmt != null) { try { stmt.close(); } catch (Exception ignored) {} }

84.                      if (conn != null) { try { conn.close(); } catch (Exception ignored) {} }

85.                  }

86.              }

87.          }

88.    web.xml 서블릿 등록

89.                              <servlet>

90.                                                   <servlet-name>dbtest.svl</servlet-name>

91.                                                   <servlet-class>test.JndiDataSourceTestServlet</servlet-class>

92.                              </servlet>

93.                              <servlet-mapping>

94.                                                   <servlet-name>dbtest.svl</servlet-name>

95.                                                   <url-pattern>/dbtest.svl</url-pattern>

96.                              </servlet-mapping>

97.    /dbtest.jsp 소스

98.          <%@ page contentType="text/html" pageEncoding="EUC-KR" %>

99.          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

100.       <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

101.      

102.       <!DOCTYPE HTML PUBLIC "-//w3c//dtd html 4.0 transitional//en">

103.       <html>

104.       <head>

105.       <title>JNDI DataSource Test</title>

106.       </head>

107.                        <body                  bgcolor="#FFFFFF">

108.                           <h2>Results</h2>

109.                          

110.                           <c:forEach var="row" items="${results}">

111.                                                                    NUM : ${row.num}<br />

112.                                                                    Name : ${row.name}<br />

113.                                                                    <hr />

114.                           </c:forEach>

115.       </body>

116.       </html>

 

117.이제 브라우저에서 "/dbtest.svl" 호출해보면 결과를 있다.

 

전역적인 JNDI 리소스 이용

<Resource> <ResourceParams> 요소를 server.xml <GlobalNamingResources> 자식노드로 옮기면 특정 어플리케이션이 아니라, 톰캣에 설치된 전체 어플리케이션에서 사용 있게 된다. 하지만 어플리케이션 "<Context>" 다음과 같은 설정을 해야 한다.

                    <ResourceLink

                                         name="jdbc/forumDb"

                                         global="jdbc/forumDb"

                                         type="javax.sql.DataSource"

                      />

 

아니면 server.xml에서 <Host> 요소의 자식으로 다음을 추가하면 컨텍스트별 설정 필요없이 전체 어플리케이션 컨텍스트에서 GlobalNamingResources 지정된 JNDI 리소스를 사용할 있다.

 

                    <DefaultContext>

                                         <ResourceLink

                                                             name="jdbc/forumDb"

                                                             global="jdbc/forumDb"

                                                             type="javax.sql.DataSource"

                                           />

        </DefaultContext>

 

문제가 생겼어요!

1.       DB 커넥션이 간혹 끊어져요.
Tomcat
작동중인 JVM 가비지 컬렉션을 , 시간이 JNDI Resource 파라미터로 설정한 maxWait보다 길게 경우 DB 커넥션이 끊어질 있다.
CATALINA_OPTS=-verbose:gc
옵션을 주면 $CATALINA_HOME/logs/catalina.out 가비지 컬렉션 상황이 기록된다. 거기에 GC 작업에 걸린 시간도 나오니 그것을 참조로 maxWait 파라미터를 늘려주면 된다. 보통 10~15초로 주면 된다.
GC
시간은 거의 99% 이상 1 이내에 끝나야 하나보다..

2.       무작위로 커넥션이 close 되요.
그건.. Connection 객체를 이상 close 했기 때문이다.
DB Connection Pool
close() 호출할 정말로 닫는 것이 아니라, 단지 재사용할 있다고 표시만 뿐이다.
커넥션을 사용하다가 close()하면 다른 쓰레드이서 커넥션을 있는데, 이걸 현재 쓰레드에서 계속 잡고 있다가 다시 close() 해버리면, 다른 쓰레드에서 사용중에 close()됐다고 나와 버리게 되는 거다.

3.                  conn.close();

4.                  conn = null;

위와 같이 커넥션을 close() 뒤에 바로 null 설정하여 절대로 다시 사용할 없게 만들면 이런 실수는 생기지 않을 것이다.

Tomcat 5.5 예제

        <Resource name="jdbc/myDbResource" auth="Container" type="javax.sql.DataSource"

               maxActive="10" maxIdle="5" maxWait="10000"

               username="ao" password="ao"

               driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/myWebApp"

 

               removeAbandoned="true"

               removeAbandonedTimeout="60"

               logAbandoned="true"

               validationQuery="select 1"

               testOnBorrow="true"

               testWhileIdle="true"

               timeBetweenEvictionRunsMillis="10000"

               minEvictableIdleTimeMillis="60000"

       />

 

저기서 removeAbandoned 리소스 반환에 실패한 (혹은 안한) 커넥션을 자동으로 닫아주는 것이다.

 

validationQuery 커넥션이 살아 있는지 테스트하는 코드이다.

 

MySQL, Connector/J Tomcat 5 예제

http://dev.mysql.com/doc/connector/j/en/cj-tomcat-config.html 나온 내용임.

<Context ....>

 

  ...

 

  <Resource name="jdbc/MySQLDB"

               auth="Container"

               type="javax.sql.DataSource"/>

 

  <!-- The name you used above, must match _exactly_ here!

 

       The connection pool will be bound into JNDI with the name

       "java:/comp/env/jdbc/MySQLDB"

  -->

 

  <ResourceParams name="jdbc/MySQLDB">

    <parameter>

      <name>factory</name>

      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>

    </parameter>

 

    <!-- Don't set this any higher than max_connections on your

         MySQL server, usually this should be a 10 or a few 10's

         of connections, not hundreds or thousands -->

 

    <parameter>

      <name>maxActive</name>

      <value>10</value>

    </parameter>

 

        <!-- You don't want to many idle connections hanging around

         if you can avoid it, onl    y enough to soak up a spike in

         the load -->

 

    <parameter>

      <name>maxIdle</name>

      <value>5</value>

    </parameter>

 

    <!-- Don't use autoReconnect=true, it's going away eventually

         and it's a crutch for older connection pools that couldn't

         test connections. You need to decide if your application is

         supposed to deal with SQLExceptions (hint, it should), and

         how much of a performance penalty you're willing to pay

         to ensure 'freshness' of the connection -->

 

    <parameter>

      <name>validationQuery</name>

      <value>SELECT 1</value>

    </parameter>

 

   <!-- The most conservative approach is to test connections

        before they're given to your application. For most applications

        this is okay, the query used above is very small and takes

        no real server resources to process, other than the time used

        to traverse the network.

 

        If you have a high-load application you'll need to rely on

        something else. -->

 

    <parameter>

      <name>testOnBorrow</name>

      <value>true</value>

    </parameter>

 

   <!-- Otherwise, or in addition to testOnBorrow, you can test

        while connections are sitting idle -->

 

    <parameter>

      <name>testWhileIdle</name>

      <value>true</value>

    </parameter>

 

    <!-- You have to set this value, otherwise even though

         you've asked connections to be tested while idle,

         the idle evicter thread will never run -->

 

    <parameter>

      <name>timeBetweenEvictionRunsMillis</name>

      <value>10000</value>

    </parameter>

 

    <!-- Don't allow connections to hang out idle too long,

         never longer than what wait_timeout is set to on the

         server...A few minutes or even fraction of a minute

         is sometimes okay here, it depends on your application

         and how much spikey load it will see -->

 

    <parameter>

      <name>minEvictableIdleTimeMillis</name>

      <value>60000</value>

    </parameter>

 

    <!-- Username and password used when connecting to MySQL -->

 

    <parameter>

     <name>username</name>

     <value>someuser</value>

    </parameter>

 

    <parameter>

     <name>password</name>

     <value>somepass</value>

    </parameter>

 

    <!-- Class name for the Connector/J driver -->

 

    <parameter>

       <name>driverClassName</name>

       <value>com.mysql.jdbc.Driver</value>

    </parameter>

 

    <!-- The JDBC connection url for connecting to MySQL, notice

         that if you want to pass any other MySQL-specific parameters

         you should pass them here in the URL, setting them using the

         parameter tags above will have no effect, you will also

         need to use & to separate parameter values as the

         ampersand is a reserved character in XML -->

 

    <parameter>

      <name>url</name>

      <value>jdbc:mysql://localhost:3306/test</value>

    </parameter>

 

  </ResourceParams>

</Context>

 

Oracle 만을 위한 JNDI 설정

원문 : http://www.microdeveloper.com/html/JNDI_Orcl_Tomcat1p.html

 

1) Modify the server.xml file
In<CATALINA_HOME>/conf/server.xml between <GlobalNamingResources> and </GlobalNamingResources> add the following

   <Resource name="jdbc/<alias>"

   auth="Cont   ainer"

   type="oracle.jdbc.pool.OracleDataSource"

   driverClassName="oracle.jdbc.driver.OracleDriver"

   factory="oracle.jdbc.pool.OracleDataSourceFactory"

   url="jdbc:oracle:thin:@<host>:<port>:<sid>"

   [user=<user>]

   [password=<password>]

   maxActive="20"

   maxIdle="10"

   maxWait="-1" />

   

 

Example

<!-- Global JNDI resources -->

 <GlobalNamingResources>

 

 <!-- Test entry for demonstration purposes -->

 <Environment name="simpl   eVal   ue" type="java.lang.Integer" value="30"/>

 

 <!-- Editable user database that can also be used by

   UserDatabaseRealm to authenticate users -->

 <Resource name="UserDatabase" auth="Container"

   type="org.apache.catalina.UserDatabase"

   description="User database that can be updated and saved"

   factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

   pathname="conf/tomcat-users.xml" />

    <!-- Every connection to 'db1' uses the same user -->

 <Resource name="jdbc/db1"

   auth="Container"

   type="oracle.jdbc.pool.OracleDataSource"

   driverClassName="oracle.jdbc.driver.OracleDriver"

   factory="oracle.jdbc.pool.OracleDataSourceFactory"

   url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db1"

   user="scott"

   password="tiger"

   maxActive="20"

   maxIdle="10"

   maxWait="-1" />

    <!-- Every connection to 'db2' must provide a username and password -->  <Resource name="jdbc/db2"

   auth="Container"

   type="oracle.jdbc.pool.OracleDataSource"

   driverClassName="oracle.jdbc.driver.OracleDriver"

   factory="oracle.jdbc.pool.OracleDataSourceFactory"

   url="jdbc:oracle:thin:@oracle.microdeveloper.com:1521:db2"

   maxActive="20"

   maxIdle="10"

   maxWait="-1" />

</GlobalNamingResources>

 

2) Modify the context.xml file
In <CATALINA_HOME>/conf/context.xml between <Context> and </Context> add the following for each entry in the JNDI resource list:

<ResourceLink global="jdbc/<alias>" name="jdbc/<alias>" type="oracle.jdbc.pool.OracleDataSource"/>

 

Example

<!-- The contents of this file will be loaded for each web application -->

 <Context>

 

 <!-- Default set of monitored resources -->

 <WatchedResource>WEB-INF/web.xml</WatchedResource>

 <WatchedResource>META-INF/context.xml</WatchedResource>

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->

 <!--

 <Manager pathname="" />

   -->

 <ResourceLink global="jdbc/db1" name="jdbc/db1" type="oracle.jdbc.pool.OracleDataSource"/>

 <ResourceLink global="jdbc/db2" name="jdbc/db2" type="oracle.jdbc.pool.OracleDataSource"/>

 </Context>

 

3) Modify the context's web.xml file (5.0.x step only - not necessary for 5.5.x)
In the <CONTEXT>/WEB-INF/web.xml between <web-app> and </web-app> add the following:

<resource-ref>

   <description><Your Description></description>

   <res-ref-name>jdbc/<alias></res-ref-name>

   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

 

Example

 

<resource-ref>

   <description>Oracle Development Datasource</description>

   <res-ref-name>jdbc/db1</res-ref-name>

   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

 

<resource-ref>

   <description>Oracle Development Datasource</description>

   <res-ref-name>jdbc/db2</res-ref-name>

   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>

   <res-auth>Container</res-auth>

</resource-ref>

 

 

4) Restart Tomcat

 

Posted by 나비:D
:

출처 : http://blog.naver.com/thinkers09?Redirect=Log&logNo=37787712

0. 설치 버젼

 0.1  JDK        : j2sdk1.4.2_09

 0.2  TOMCAT : tomcat-5.5.23

 0.3  ORACLE : oracle 9i

 

1. 톰캣 다운로드 및 설치

 1.1 톰캣을 다운로드한다. ( http://tomcat.apache.org/download-55.cgi )

 1.2 Core를 다운로드 했을 경우 jdk1.4 버젼에서 구동되지 않으니

      jdk1.4버젼용을 다시 다운받고(아래 있음..ㅋㅋ) Core 압축푼곳에 덮어쓴다.



2. DataSource 설정

 2.1  <CATALINA_HOME>/common/lib 디렉토리에 ojdbc14.jar 파일을 복사한다.(ojdbc14.zip 아님..ㅠㅠ)

 2.2  server.xml  파일 설정

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

   <!-- Global JNDI resources -->
  <GlobalNamingResources>

    .
    <Resource name="ORCL"
           auth="Container"
           type="oracle.jdbc.pool.OracleDataSource"
           driverClassName="oracle.jdbc.driver.OracleDriver"
           factory="oracle.jdbc.pool.OracleDataSourceFactory"
           url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"
           maxActive="20"
           maxIdle="10"
           maxWait="-1"
           user="kbs"
           password="0000"
           />

  </GlobalNamingResources>
-----------------------------------------------------------------------------------------------

 2.3 context.xml  설정

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

<Context>

    . 

    <ResourceLink global="ORCL" name="ORCL" type="oracle.jdbc.pool.OracleDataSource"/>

</Context>

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

 2.4 web.xml  설정

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

 <resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>ORCL</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>
-----------------------------------------------------------------------------------------------

 2.5 톰캣 시작~~~!!!!


3. ERROR 메세지

 3.1 Cannot create JDBC driver of class '' for connect URL 'null'

  3.1.1 ojdbc14.jar 파일이 혹 zip파일이 아닌지 확인하고, 복사한 위치가

       <CONTEXT>/WEB-INF/lib인지 확인한다. 요기 들어가 있음 위의 메세지를 볼수두 있당.

       확인해보고 <CATALINA_HOME>\common\lib 에만...!!!  복사한다.


 3.2 java.sql.SQLException: 호출에 부적합한 인수입니다

  3.2.1 server.xml에 정의한 <Resource>에 빠진게 있는지 확인한다.. 주로 user, password를 빼먹으니

          url 및 user 등을 확인해본다.


 

4. 의문점

  4.1 왜 추가한 context에 정의하면 안되는지 모르겠당. 블로그들 보면 \tomcat\conf\catalina\localhost\에

       <context>.xml 파일을 추가하고 resource를 넣어주면 되던데.. 이러면 꼭 <CATALINA_HOME>\common\lib

       ojdbc14.jar파일을 넣지 않아도 될것 같은데 말이다.. 휴.. 이틀 해매다.. 구냥 이렇게 설정하는데 혹 아시는분 계신다면

       알려주심 감사하겠습니다.^^



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

5.0과 5.5의 설정 방법이 다르다..

server.xml에 있는 내용을 제거하고 \tomcat\conf\catalina\localhost\<context>.xml 파일에 아래와 같이 추가해준다.


<Resource name="ORCL" auth="Container" type="javax.sql.DataSource"
               maxActive="5" maxIdle="2" maxWait="10000"
               username="kbs" password="0000" driverClassName="oracle.jdbc.driver.OracleDriver"
               url="jdbc:oracle:thin:@127.0.0.1:1521:ORCL"/>

Posted by 나비:D
:

Eclipse 3.01 웹 프로그래밍 플러그인들

내가 사용하는 웹 프로그래밍을 위한 플러그인들을 정리해봤다.

이클립스 플러그인에 대한 정보는 http://eclipse-plugins.2y.net/eclipse/index.jsp 에서 얻는다.
이클립스 웹 툴즈 플랫폼이 어서 빨리 나왔으면 좋겠다..
플러그인 이것 저것 테스트 하다가 정작 일을 제대로 못하겠다. 통합 되서 하나가 딱 평정을 했으면..

참고로 http://www.myeclipseide.com 의 My EclipseIDE를 이용하면 아래에 설명한 모든 환경이 다 갖춰지고 성능도 더 좋은데... 상용이다... 사실 상용인게 문제가 아니라 우리 회사 컴퓨터가 안 받쳐줘서 MyEclipseIDE를 못쓴다.. ^^

1. Lomboz J2EE 개발 플러그인

JSP와 J2EE 개발을 도와준다. 웹 프로그래밍을 위해 현재로서는 유일한 오픈 소스 개발 도구이다.
예전엔 버그가 너무 많아서 쓰기 힘들었는데, 이젠 쓸만한 것 같다.
JSP 코드 자동완성기능 때문에 사용한다.

  • http://forge.objectweb.org/projects/lomboz

  • 리눅스에서는 이 롬보즈 플러그인 디렉토리에 이클립스를 실행한 사용자에게 쓰기 권한이 있어야만 한다. 이유는 이 플러그인이 WAS 설정 저장을 플러그인 디렉토리에 직접해버리기 때문이다.
    만약 root 이외의 사용자 권한으로 실행할 경우 롬보즈 설정을 저장할 수 없어 짜증날 수 있으니 주의요망!
  • 이 플러그인을 설치하려면 emf,sdo 플러그인이 필요하다.
  • 설치후 주의점.
    • "환경설정 -> Java -> 빌드경로"에서 "소스 및 출력 폴더" 설정을 "폴더(F)"로 해야한다.
    • "환경설정 -> Lomboz" 에서 JDK의 tools.jar의 정확한 경로를 지정해줘야한다.
    • JSP 컨터에너 서버 설정은 "환경설정 -> Lomboz -> Server Definition"에서 한다.
    • "창 -> Perspective 사용자정의 -> 신규 -> Java -> Lomboz J2EE Wizard"에서 JSP와 Servlet 등을 신규 생성 목록에 추가시켜주면 손쉽게 JSP와 Servlet을 생성할 수 있다.
  • JSP 편집기능을 사용하려면 프로젝트를 롬보즈 프로젝트로 생성하고, Web Module을 추가해줘야한다.

2. Sysdeo Tomcat Plugin

톰캣을 자동으로 실행시켰다 종료했다 할 수 있는 플러그인이다.
롬보즈 자체에도 이 기능이 있지만 이 플러그인을 쓰는게 더 편하다.

  • http://www.sysdeo.com/eclipse/tomcatPlugin.html

  • Tomcat을 디버그 모드로 실행하면 컴파일 된 JSP 파일을 이용해 JSP 페이지 디버깅도 가능하다. "환경설정 -> Tomcat -> JVM Settings" 에서 디버깅 모드 설정. 기본값을 디버깅 모드.

  • 톰캣 프로젝트 환경 설정
    • 먼저 웹 어플리케이션 프로젝트를 생성할 때 Lomboz 프로젝트로 생성하고, 나중에 프로젝트 생성이 끝나면, 프로젝트 속성에서 "Tomcat -> Is Tomcat Project"를 체크하면 그 때부터 톰캣 프로젝트에 등록된다.
    • 그리고서 Context Name을 지정한다. 컨텍스트 네임은 필히 "/"로 시작해야만 한다!
    • "Subdirectory to set as web application root" 부분에 롬보즈에서 추가한 웹 모듈 디렉토리를 지정하면 된다.
    • 이제 프로젝트 이름에서 오른쪽 마우스 단추를 클릭하면 "Tomcat Project"메뉴가 뜬다.
    • 프로젝트에서 오른쪽 단추를 눌러 Tomcat Project -> Add tomcat libraries to project build path 를 해서 servlet.jar 를 라이브러리에 추가해야 한다. Lomboz에서 WAS설정을 제대로 했을 경우에는 필요없다.
    • Tomcat Project -> Create JSP Work Directory를 클릭하면 "work"라는 디렉토리가 생성되면서 JSP파일을 Java로 변환한 소스와 클래스 파일이 여기 생성된다. 여기 생성된 Java 소스에 디버깅을 걸 수 있게 된다.
    • 환경설정 -> Tomcat -> Tomcat Manager App -> ManagerApp Url을 http : //localhost : 8080/manager/html로 바꾸고, 관리자 사용자명과 비밀번호를 지정한다. (콜론 좌우의 공백을 빼고 쓸것. 야후 블로그의 버그 때문에 띄워쓴 것임)
    • "Tomcat Project"의 다른 메뉴들은 감이 팍 오리라~

3. Properties Editor

어플리케이션 설정 파일로 *.properties를 많이 사용할텐데, 문제가 하나 있다.
프라퍼티 파일은 "한글을 쓸 수 없다". 프라퍼티 파일의 인코딩은 무조건 latain1으로 지정된다. 한글을 쓰면서 자연스럽게 latin1으로 저장하려면 이 플러그인을 써야 한다.

4. XML Buddy

이젠 XML 필수 시대!!
XML 에디터 하나쯤은 키워야지~~

  • http://www.xmlbuddy.com/

  • 설치 후에 "환경설정 -> XMLBuddy -> XML -> Encoding"에서 "Default to workbench encoding"으 살짝 활성화 시켜주자.

5. SQL Explorer

언제나 졸졸 따라 다니는 RDBMS 접속은 필수!

6. 자바스크립트 에디터

자바 스크립트도 깔끔하게 독립 파일로 작성해야 하는 법~

출처 : http://kr.blog.yahoo.com/kwon37xi/1236485.html

출처 : Tong - mahoon님의 이클립스 플러그인통

Posted by 나비:D
:

smalltalk란?

2007. 12. 18. 16:23
간단히 말하면 객체지향언어이지요...

JAVA C++같은거요 그러나 C++같은거보다 더 객체지향적인 언어라고 알고있습니다

미국 제록스(XEROX)사의 Palo Alto 연구 센터(PARC)에서 개발한 객체 지향 프로그램 작성 언어와 개발 시스템.
제1판은 1972년에 개발된 Smalltalk-72이며, 그 후 개량이 계속되어 1980년에 완성된 Smalltalk-80이 처음으로 상품화되어 출시되었다.
현재 널리 사용되고 있는 객체 지향 언어인 C++와 비교해 다음과 같은 장점이 있다. ㉠소프트웨어를 재

이용하기가 쉽다.

C++보다 엄격하게 객체 지향적이어서, 프로그램은 반드시 논리와 데이터가 일체화된 객체의 형태로 실현된다.
㉡품질이 양호한 클래스 라이브러리(객체의 표본)가 풍부하다.

예를 들면, 대표적인 스몰토크 제품인 VisualWorks는 900종 이상의 클래스 라이브러리를 가지며, 이것들에 의해 응용 프로그램 개발 효율이 대폭 향상되었다.

㉢클래스를 검색하는 브라우저(browser)나 기억 장치의 비어 있는 영역을 자동적으로 확보하는 폐영역 회

수(garbage collection) 등을 표준적으로 구비하고 있어서 개발 환경이 충실하게 되어 있다. 주요한 스몰

토크 처리 시스템으로는 IBM사의 VisualAge, 스몰토크와 같은 Parkplace Digitalk사의 VisualSmalltalk

등이 있다. 최근 수년 간 기업용 클라이언트/서버 시스템 개발에 스몰토크가 이용되고 있으나, 객체 지

향 언어로서 스몰토크와 비슷한 장점을 갖추고 있는 자바 언어가 등장하면서 자바 언어가 더 주목을 받

고 있다.
Posted by 나비:D
:

출처 :http://cafe.naver.com/javasolution/58

* Exception은 2가지 종류가 있다.

시스템 정의 Exception ( System Define Exception ) 과 사용자정의 Exception ( User Define Exception).


 

1. 다음과 같은 이름으로 사용자정의 Exception를 작성하시오. ( UserDefineException.java  )




 

2. 다음 코드를 실행시키면 에러가 발생한다. UserDefineException으로 예외처리하시오.

public class ExceptionTest {


 

 public static void main ( String [ ] args){

      a();

}//

 public static void a(){

     b();

}//

 public static void b(){

String name;

Systme.out.println(  name.charAt( 0 ) );

 }//

}//


1번정답:

public class UserDefineException extends Exception {


public UserDefineException( String mesg){

super( mesg );
}

}
사용자정의클래스를 만들때에는 구현내용은 정해진것이 없지만 반드시 Exception클래스를
상속받아야 한다. 일반적으로 문자열을 처리할수 있는 생성자를 만드는것이 보통이다.
또한 필요에 의해서 인스턴스변수 및 메소드도 추가할 수 있다.



2번정답:

public class ExceptionTest {


public static void main ( String [] args ){

try{
a();
}catch( UserDefineException u ){
System.out.println( u.getMessage() );
}
}//

public static void a() throws UserDefineException{

b();

}//
public static void b() throws UserDefineException{

try{
String name = null;
System.out.println( name.charAt(0) );
} catch( NullPointerException e){ // 실제로 catch한것은 NullPointerException 이지만 사용자정의클래스를 생성하여 처리.
throw new UserDefineException( "널포인터 발생");
}
}//

}//
어느 메소드에서나 예외처리를 할 수 있지만 main에서 처리하게 구현함.
이와 같은 예외처리 방법을 반드시 숙지할것

Posted by 나비:D
:

링크관리도 구현했으니 이제 디자인 패턴을 구현해본다.


디자인 패턴의 구현은 자동화 도구를 통한 소스생성과 컬레보레이션을 구현한 클래스라이브러리의 결합에 의해 가능하다. 여기에서는 어느 부분을 자동화 도구로 지원해야 하고, 어떤 부분이 구현된 라이브러리가 될 수 있는지를 구분해서 설명하도록 한다.

구현언어는 C#이다.


기본적인 내용은 책을 참조하고, 여기에서는 어떻게 자동화 도구로 디자인 패턴 구현을 자동화 할 것인지, 어떻게 컬레보레이션을 구현하는지에 집중하도록 하자.


1장. Iterator 패턴

컬렉션의 요소를 하나씩 열거하면서 처리한다.


컬렉션에서 요소를 얻는 방법

- 키를 통해(예: Hashtable)

- 컬렉션 내의 위치 정보를 통해(예: List)

- 처음부터 끝까지 하나씩 열거를 통해(Iterator)


Iterator는  컬렉션 내의 요소를 처음부터 차례로 스캔한다.

스캔 방법은 다음 요소가 있는지 확인 해 보고, 있으면 다음 요소를 얻는다.


Aggregate는 Iterator를 통해 요소를 얻는 방법을 제공하는 컬렉션이다. 즉, Iterator를 지원하는 컬렉션이 Aggregate이다.


Client에서는 Aggregate 컬렉션에게 Iterator를 요청하고, 이것을 사용해서 Aggregate가 포함하는 요소를 하나씩 열거할 수 있게 된다.


사용자 삽입 이미지

컬레보레이션 모델링
Iterator방식의 Aggregate의 처리를 하나의 컬레보레이션 관점에서 보면 다음과 같이 풀 수 있다.
1. 하나씩  열거하면서  처리한다는 것은 무슨 말인가?
1.1 무엇을 처리한다는 말인가? 컬렉션
1.2 무엇을 하나씩 열거한다는 말인가? 컬렉션이 포함한 모든 요소들
1.3 하나씩 열거한다는 말은?
컬렉션이 포함한 모든 요소들에 대해 순차적으로 하나씩 처리한다는 것
1.4 어떻게 처리한다는 것인가?
구체적인 처리는 결정되어 있지 않다.
 
Iterator 패턴을 컬레보레이션으로 표현하면 다음과 같다.
컬렉션의 모든 요소들에 대해 순차적으로 하나씩 열거하면서 Client가 정해준 방법으로 처리해라.
순차적으로 하나씩 열거하면서 처리해라(어떤 컬렉션, 어떤 핸들러)
 
Iteration 컬레보레이션은 아래 그림과 같이 Aggregate에 대해서 하나씩 열거하면서 핸들러에게 넘겨주어서 처리하도록 한다.
하나씩 열거할 수 있는 방법으로 Iterator가 hasNext와 next 오퍼레이션을 가진다.
 
다수의 핸들러들이 있을 수 있고, 역방향으로 열거하는 것도 가능하다.
Aggregate와 Handler사이의 연결 뒤에 컬레보레이션 오퍼레이션을 호출하는 것이 아니기 때문에 연결을 유지할 필요가 없다.
 
아래 그림은 정형화된 표현이 아니라, 개념적으로 표현한 것이다.
 
 
사용자 삽입 이미지
 
 
 
자동화 방법
1. 라이브러리
Iterator가  고유  행위(hasNext, next) 를  가지므로  인터페이스로  구현  가능
자바 또는 .NET의 컬렉션은 Iterator 를  리턴 하도록  구현되어  있다.
 
.NET 의  경우 foreach문으로 직접 iterator를 갖는 컬렉션을 열거할 수 있도록 지원
자바의  경우,  처리자에  해당하는  메소드를  전달할  다른  방법을  찾거나  설계/ 코드  생성  수준에서  자동화  한다.
 
2. 설계/ 코드  생성
- Aggregate, Iterator 는  인터페이스로
   hasNext, next,  클라이언트에서 iterator 를  사용하는  부분의  코드  생성
- 패턴요소  설정할  수  있는  폼  지원( 나머지  모든  자동화  방법에  동일  적용)
 
.NET에서는 컬렉션과 foreach문을 직접 사용하므로 위의 내용이 불필요하다.
이러한 방식으로 구현하면 컬렉션 처리 부분을 분리할 수 있게 된다.
 
Iteration 구현
 
    public delegate void Iterate(object element);
    public class Iteration
    {
        public event Iterate IterateHandler = null;       
       
        public void Iterate(ICollection collection, Iterate handler)
        {
            foreach (object element in collection)
            {
                handler(element);
            }
        }
        public void IterateWithHandlers(ICollection collection)
        {
            foreach (object element in collection)
            {
                if (IterateHandler != null) IterateHandler(element);
            }
        }
        public void ReverseIterate(ICollection collection, Iterate handler)
        {
            Stack reverseCollection = new Stack();
            foreach (object element in collection)
            {
                reverseCollection.Push(element);
            }
            foreach (object element in reverseCollection)
            {
                handler(element);
            }
        }
        public void ReverseIterateWithHandlers(ICollection collection)
        {
            Stack reverseCollection = new Stack();
            foreach (object element in collection)
            {
                reverseCollection.Push(element);
            }
            foreach (object element in reverseCollection)
            {
                if (IterateHandler != null) IterateHandler(element);
            }
        }
        public void Reset()
        {
            IterateHandler = null;
        }
    }
 
 
 
예제
1. 단일 핸들러에 의한 처리
    public class Book
    {
        private string _name = string.Empty;
        public Book(string name)
        {
            _name = name;
        }
        public string Name
        {
            get
            {
                return _name;
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList bookShelf = new ArrayList();
            bookShelf.Add(new Book("Around the World in 80 Days"));
            bookShelf.Add(new Book("Bible"));
            bookShelf.Add(new Book("Cinderella"));
            bookShelf.Add(new Book("Daddy-Long-Legs"));
            Iteration iteration = new Iteration();
            iteration.Iterate(bookShelf,new Iterate(WriteBookName));

            System.Console.Read();
        }
        public static void WriteBookName(object book)
        {
            System.Console.WriteLine(((Book)book).Name);
        }
    }
 
2. 다중 핸들러에 의한 처리
   
    public class Book
    {
        private string _name = string.Empty;
        private string _isbn = string.Empty;
        public Book(string name, string isbn)
        {
            _name = name;
            _isbn = isbn;
        }
        public string Name
        {
            get
            {
                return _name;
            }
        }
        public string ISBN
        {
            get
            {
                return _isbn;
            }
        }
    }
   
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList bookShelf = new ArrayList();
            bookShelf.Add(new Book("Around the World in 80 Days", "aaa"));
            bookShelf.Add(new Book("Bible","bbb"));
            bookShelf.Add(new Book("Cinderella", "ccc"));
            bookShelf.Add(new Book("Daddy-Long-Legs", "ddd"));
            Iteration iteration = new Iteration();
            iteration.IterateHandler +=new Iterate(WriteBookName);
            iteration.IterateHandler += new Iterate(WriteBookISBN);
            iteration.IterateWithHandlers(bookShelf);

            System.Console.Read();
        }
        public static void WriteBookName(object book)
        {
            System.Console.WriteLine(((Book)book).Name);
        }
        public static void WriteBookISBN(object book)
        {
            System.Console.WriteLine(((Book)book).ISBN);
        }
    }
Posted by 나비:D
:

BLOG main image
by 나비:D

공지사항

카테고리

분류 전체보기 (278)
Programming? (0)
---------------------------.. (0)
나비의삽질 (5)
Application (177)
SQL (51)
Web (27)
etc. (14)
Omnia (0)
---------------------------.. (0)

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

달력

«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total :
Today : Yesterday :