Programming/JAVA & JSP2010/08/24 16:07
Sqlite JDBC 다운

Example Source
import java.sql.*;

public class Test {
public static void main(String[] args) throws Exception {
Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:test.db");
        Statement stat = conn.createStatement();
        
        stat.executeUpdate("drop table if exists people;");
        stat.executeUpdate("create table people (name, occupation);");
        PreparedStatement prep = conn.prepareStatement(
        "insert into people values (?, ?);");

        prep.setString(1, "Gandhi");
        prep.setString(2, "politics");
        prep.addBatch();
        prep.setString(1, "Turing");
        prep.setString(2, "computers");
        prep.addBatch();
        prep.setString(1, "Wittgenstein");
        prep.setString(2, "smartypants");
        prep.addBatch();

        conn.setAutoCommit(false);
        prep.executeBatch();
        conn.setAutoCommit(true);
        
        ResultSet rs = stat.executeQuery("select * from people;");
        while (rs.next()) {
                System.out.println("name = " + rs.getString("name"));
                System.out.println("job = " + rs.getString("occupation"));
        }
        rs.close();
        conn.close();
}
}
저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

Sqlite DB + java 연동  (0) 2010/08/24
각종 DB JDBC 연결  (0) 2010/08/17
JDK 1.6 + mssql 2005 연동하기.  (0) 2010/06/25
페이징 처리 UI&Application Logic  (0) 2010/03/08
소스 사이트  (0) 2010/01/08
Posted by Mizix
Programming/JAVA & JSP2010/08/17 13:11
1. Oracle
    1). 서버환경
        - 서버 주소 : 127.0.0.1
        - 서비스 포트 : 1521
    
    2). JDBC 설정
        - Driver 클래스 : oracle.jdbc.driver.OracleDriver
        - URL 형식 : jdbc:oracle:thin:@127.0.0.1:1521

2. MySQL
    1). 서버환경
        - 서버 주소 : 127.0.0.1
        - 서비스 포트 : 3306
        - MySQL Database Name : mydb
    
    2). JDBC 설정
        - Driver 클래스 : com.mysql.jdbc.Driver
        - URL 형식 : jdbc:mysql://127.0.0.1:3306/mydb

3. MS-SQL
    1). 서버환경
        - 서버 주소 : 127.0.0.1
        - 서비스 포트 : 1433
    
    2). JDBC 설정
        - Driver 클래스 : com.microsoft.jdbc.sqlserver.SQLServerDriver
        - URL 형식 : jdbc:microsoft:sqlserver://127.0.0.1:1433

4. JavaDB
    1). 서버환경
        - 서버 주소 : 127.0.0.1
        - JavaDB Database Name : derbyDB
    
    2). JDBC 설정
        - Driver 클래스 : org.apache.derby.jdbc.EmbeddedDriver
        - URL 형식 : jdbc:derby:derbyDB

5. Postgresql
    1). 서버환경
        - 서버 주소 : 127.0.0.1
        - 서비스 포트 : 5432
        - Postgresql Database Name : postDB
    
    2). JDBC 설정
        - Driver 클래스 : org.postgresql.Driver
        - URL 형식 : jdbc:postgresql://127.0.0.1:5432/postDB
저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

Sqlite DB + java 연동  (0) 2010/08/24
각종 DB JDBC 연결  (0) 2010/08/17
JDK 1.6 + mssql 2005 연동하기.  (0) 2010/06/25
페이징 처리 UI&Application Logic  (0) 2010/03/08
소스 사이트  (0) 2010/01/08
Posted by Mizix
Programming/JAVA & JSP2010/06/25 09:00
마이크로소프트에 가서 mssql용 jdbc를 다운 받는다.
sqljdbc_2.0.1803.100_kor.exe <-- 이 파일을 압축 해제한다.
kor 폴더 안에 sqljdbc4.jar, sqljdbc.jar 이 두가지가 있는데, 자신의 java JDK 버전이 1.6 이상이면 sqljdbc4.jar 을 톰캣 안의 lib 폴더 안에 복사한다.
(절대, 두 파일을 같이 넣으면 안됨. 반드시 둘 중에 하나만 복사. 버전이 1.5 이하 버전이면, sqljdbc.jar을 넣는다.)

<< 기본적인 소스 코드 >>

    Connection conn=null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = null;

    try{
        String jdbcUrl="jdbc:sqlserver://주소:포트;DatabaseName=DB명";
        String dbId="DB 접속 ID";
        String dbPass="DB 접속 PASS";
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");


        conn = DriverManager.getConnection(jdbcUrl,dbId,dbPass);
        
        
        sql = "SELECT * FROM users";
        pstmt = conn.prepareStatement(sql);
        rs = pstmt.executeQuery(); 
        while(rs.next()) {  
            String id = rs.getString("uid");  
            String pass = rs.getString("pwd");
            String dateTime = rs.getDate("since").toString();
            out.println(id);  
            out.println(pass);
out.println(dateTime);
        }  
        rs.close();  
        pstmt.close();  
        conn.close();  
        
        out.println("제대로 연결되었습니다.");
        
    }catch(Exception e){
        out.println("오류..");
        e.printStackTrace();
    }finally{
        //con.close();
        out.println("제대로 종료되었습니다.");

<< mssql용 JDBC >>
저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

Sqlite DB + java 연동  (0) 2010/08/24
각종 DB JDBC 연결  (0) 2010/08/17
JDK 1.6 + mssql 2005 연동하기.  (0) 2010/06/25
페이징 처리 UI&Application Logic  (0) 2010/03/08
소스 사이트  (0) 2010/01/08
Posted by Mizix
Programming/JAVA & JSP2010/03/08 03:11
페이징 처리 UI&Application Logic

  

    UI 페이징은 왜 필요할까?

    게시판의 글은 1개 부터 수천 혹은 수만개 일수 있다. 게시글이 몇 개에 그치는 경우는 굳이 페이징 처리라는 개념을 생각

    할 필요가 없다. 하지만 게시글 수가 증가가 예상되거나 혹은 게시글 수가 엄청 많은 경우 하나의 페이지에 모든 것을

    표현하기에는 불가능하겠다. 그럼으로 게시판 하단에 페이지 나누어서 페이지간의 이동을 원활하게 해줄 수 있는 페이지

    링크를 만들기 위해 필요하다고 하겠다.

 

    TonkJsp 카페 전체 게시글에 대해서 보면 아래 그림과 같이 나올 것이다.

 

    

 

    네이버는 보통 게시글을 10개 페이지로 나누어서 보여줍니다. 11개 페이지는 다음으로 링크가 걸려 있는 거죠 .

    만일 11페이지를 보고 있다면 "이전" 이라는 글자가 나오고 10페이지로 링크가 걸려 있을 것입니다.

 

    현재 페이지는 굵게 표시가 되고 나머지는 링크가 걸려 있습니다. "다음"은 11페이지를 가르키면서 링크가 걸려 있는 것이

    되겠네요.

    즉, 게시글이 더 있지만 한 페이지에 다 표시하기에는 무지 불편할 것입니다. 페이지가 나누어져 있지 않다면 마우스 커서

    로 해당 게시물을 찾거나 커서를 움직여서 해당 게시물을 봐야 하지 않을까 싶네요. 허허 ^^

 

    DB 단의 페이징 쿼리가 시스템의 성능면을 강조한 것이라면 UI 단의 페이징 처리는 사용자의 편리성을 더 강조한 것이라

    할 수 있을 것입니다.     

 

    JSP 스크립트 단에서 처리

 

        예를 들어 DB에 데이터가 총 26개가 아래 그림과 같이 들어 있다고 가정합니다.(오라클 기준)

 

       

       

        그리고 한 페이지에 3개의 게시물이 출력되도록 하고 네비게이션 부분은 3 페이지씩 나오도록 설계를 하겠습니다.

       

        

 

        [방법 - 1]

 

        pagenum : 페이지 번호 (1페이지, 2페이지, ....)

        pagesize : 페이지 사이즈(한 페이지에 몇개의 게시글을 출력할 것인지 나타내는 변수) 

        total  :  전체 게시글 수는 26개 위의 데이터를 기준으로 ^^

 

        int pagenum = 1;

        int pagesize = 3;

        int pageGroup = 3; 

 

        total =  26 (위의 데이터를 기준으로 ^^)

      

        ① 페이지 네비게이션을 위한 전체 페이지 수

            int totalPage = (total-1)/pagesize + 1; 혹은 int totalPage= total/pagesize + (total%pagesize == 0?0:1);

 

            [예 1 페이지인 경우 - 결과는 나머지 페이지] 

 

           

        

        ② 이전 페이지 존재 여부

            

             이전에 보여줄 3개의 페이지가 있는지 계산은

             int prev3 = (int)Math.floor((pagenum-1)/pageGroup(3.0))*pageGroup;

 

             [1,2,3 페이지의 경우는 모두 0개의 이전 페이지가 존재]

 

             

 

             [4,5,6 페이지의 경우는 모두 3개의 이전 페이지가 존재]

 

            

             

             [7,8,9 페이지의 경우는 모두 6개의 이전 페이지가 존재]

              

             계산 생략 ...

          

             실제로 사용하는 경우예는

 

             if(prev3>0){

                  <a href="listTest.jsp?pagenum=<%=prev3%>" style="text-decoration: none">이전</a>

             }

 

             Math : double floor() 메소드

             입력된 매개변수보다 같거나 적은 수들 중에서 가장 작은 정수를 리턴하는 메소드           

 

        ③ 다음 페이지 존재 여부

 

            이후에 보여줄 3 개의 페이지가 존재하는 경우는

            int next3 = prev3+(pageGroup+1);

           

            [1,2,3 페이지의 경우는 모두 4페이지라는 다음 페이지가 존재]

            [4,5,6 페이지의 경우는 모두 7페이지라는 다음 페이지가 존재]

            [7,8,9 페이지의 경우는 모두 10페이지라는 다음 페이지가 존재]

            [10,11,12 페이지의 경우는 모두 13페이지라는 다음 페이지가 존재]

            [13,14,15 페이지의 경우는 모두 16페이지라는 다음 페이지가 존재]

            [16,17,18 페이지의 경우는 모두 19페이지라는 다음 페이지가 존재]

            [19,20,21 페이지의 경우는 모두 22페이지라는 다음 페이지가 존재]

            [22,23,24 페이지의 경우는 모두 25페이지라는 다음 페이지가 존재]

            [25,26 페이지의 경우는 모두 27페이지라는 다음 페이지가 존재할까?]

            

            위의 데이터를 보면 27페이지는 존재하지 않는다. 무작정 prev3+(pagesize+1)를 더하는 것이 아니라 

            어느 시점이 되면 없다는 것을 표시하는 로직을 구현해야 한다. 그 시점이라는 것은 위에서 구한 

            totalPage를 넘어서는 안되는 것이다. totalPage 크다는 것은 로직상 맞지 않음으로 표현할 수 없다. 오류^^

 

            실제로 사용하는 경우에는

           

            if(next3<=totalPage){

                 <a href="listTest.jsp?pagenum=<%=next3%>" style="text-decoration: none">다음</a>

            }

 

        ④ 페이지 링크 수

            페이지 네비게이션 부분은 반복문을 써야 하는 로직으로 어떻게 보면 복잡해 보이지만 또 어떻게 보면

            별로 복잡한 것도 없다.

 

           - 반복문의 초기값은

             매 페이지마다 시작되는 값은 다 틀리다. 즉, 값을 고정해서 사용할 수 없다는 결론을 같게 된다. 

             int i=prev3+1;     // 시작값으로 적당하겠네요 ,,, 생각하는 관점에 따라 틀림 ...

 

           - 반복문의 조건은

             총 페이지 수를 넘어선 되지 않고 다음 페이지 값보다는 무조건 작아야 한다.

              i<next3 && i<=totalPage

 

          - 반복될 내용의 조건은

            현재 페이지가 링크 페이지를 구별 짓기 위해 간단 조건문을 하나 넣어 둔다.

            if(i==pagenum){

                 [<b><font color="red"><%=i%></font></b>]

            }else{

                 [<a href="listTest.jsp?pagenum=<%=i%>" style="text-decoration: none"><%=i%></a>]

            }          

 

            실제로 사용하는 경우예

 

           for(int i=1+prev3 ; i<next3 && i<=totalPage ; i++){
                 if(i==pagenum){
                      [<b><font color="red"><%=i%></font></b>]
                 }else{
                      [<a href="listTest.jsp?pagenum=<%=i%>" style="text-decoration: none"><%=i%></a>]
                 }
            }

         

        ⑤ 첫 페이지, 마지막 페이지

             첫 페이지를 나타내는 Top는 1 페이지를 링크만 걸면 되어서 굳이 설명할 것도 없네요 ^^

             예) <a href="listTest.jsp?=pagenum=1" style="text-decoration: none">Top</a>

             마지막 페이지는 총 페이지를 구한 값이 되겠다. 즉 Bottom 값은 총 페이지 값과 동일하다. ^^

             예) <a href="listTest.jsp?pagenum=<%=totalPage%>" style="text-decoration: none">Bottom</a>           

 

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

 

        [방법 - 2]

 

        [방법 -1] 과는 별반 차이는 없지만 생각하는 관점을 다른 식으로 하여 접근하도록 하겠습니다.

        

        pagenum : 페이지 번호 (1페이지, 2페이지, ....)

        pagesize : 페이지 사이즈(한 페이지에 몇개의 게시글을 출력할 것인지 나타내는 변수) 

        total  :  전체 게시글 수는 26개 위의 데이터를 기준으로 ^^

 

        int pagenum = 1; //  현재 페이지를 나타냄... 기본 1페이지 부터 시작을 해서, 별 다른 기준은 없음

        int pagesize = 3;

        int pageGroup = 3;

        total =  26 (위의 데이터를 기준으로 ^^)

 

        ① 페이지 네비게이션을 위한 전체 페이지 수

            [방법-1]과 동일함.

        ② 출력될 시작 페이지와 끝 페이지 별도로 계산

            [시작 페이지 계산]

            int startPage = ((pagenum-1)/pageGroup)*pageGroup+1;

            혹은 int startPage=(int)(pagenum/pageGroup)*pageGroup+1

           

            예) 1,2,3 페이지인 경우는 1 시작페이지다.  

 

               

 

            예) 4,5,6 페이지인 경우는 4 시작페이지다.

 

            

 

            예) 7,8,9 페이지인 경우는 7 시작페이지다.

     

             계산 생략 ...

                                      

           [끝 페이지 계산]

           int endPage = (((startPage -1)+pageGroup)/pageGroup)*pageGroup;

           혹은 int endPage=startPage+pageGroup-1;

          

           예) 시작 페이지가 1 인 경우 끝 페이지는 3

           

           

 

           예)  시작 페이지가 4인 경우 끝 페이지는 6

 

           

 

           예) 시작 페이지가 7인 경우 끝 페이지는 9

 

           계산 생략 ...          

 

        ③ 이전

            "이전" 버튼이라는 것이 나오기 위해서는 현재 페이지가 한 페이지에 출력되는 링크의 수보다 클 경우에

             나오게 된다. (말이 좀 복잡해 보이지만 그렇지도 않는 거 같다.) 

 

             [방법 -1]과는 틀리게 생각할 문제인데, [방법-1]은 "이전" 페이지 계산에서 1를 더하지 않았다.

             즉, "이전" 페이지가 0보다 크다면 무조건 이전 페이지가 존재한다는 것으로 계산한 것이다. 

 

             하지만 [방법-2]의 경우는 좀 틀리다.  pagesize가 현재 페이지 보다 크다면 무조건 "이전" 페이지가

             존재하는 것으로 계산한 것이다. 결국 [방법-1]과 [방법-2]의 결론은 같다. 생각하는 관점이 틀린 것 뿐이다.  

            

             실제로 사용하는 경우는

           

             if(pagenum>pageGroup){

                    <a href="listTest.jsp?pagenum=<%=startPage-1%>" style="text-decoration: none">이전</a>

             }

  

        ④ 다음

            "다음" 버튼이 나오기 위한 방법은 [방법-1]과 비슷하다.

            "다음" 버튼이 나오기 위해서는 전체 페이지 수 보다는 작게 로직을 짜면 되겠다.

 

            실제로 사용하는 경우에는

 

            if(totalPage>endPage){

                   <a href="listTest.jsp?pagenum=<%=endpage+1%>" style="text-decoration: none">다음</a>

            }

              

        ⑤ 페이지 링크 수

            현재 페이지가 위치한 그룹 내의 페이지를 모두 구하는 로직을 구현해야 한다. 시작 페이지와 끝 페이지를 

            이미 구하였음으로 시작과 끝사이의 값 사이를 반복하면 된다. 

 

            실제로 사용하는 경우에는 

             

             for(int i=startpage; i<=endpage; i++){
                    if(i==pagenum){
                        [<b><font color="red"><%=i%></font></b>]          
                   }else{
                       [<a href="listTest1.jsp?pagenum=<%=i%>" style="text-decoration: none"><%=i%></a>]
                  }
             } 

        

    JAVA 어플리케이션을 이용하는 방법(빈즈 사용)

 

         JSP 스크립트 단에서 처리하는 것과는 별반 차이는 없다. 빈즈 처리 임으로 별도의 유틸리티 메소드를 만드는 과정이

         필요하다.

 

         메소드는 2개로 분리해서 작성하도록 한다.

 

         ① 게시물의 총 페이지 구하기

 

          [인자 값]

          - 총 게시물 수 : total

          - 페이지 사이즈 : pagesize

 

          [리턴 값]

          - 총 페이지수 : page_cnt 

 

          [로직]

          int page_cnt = (int)(total/pagesize);

    

          if(page_cnt == 0)

               page_cnt = 1;

         else if(page_cnt >0 && (total%pagesize) > 0 )

               page_cnt = page_cnt+1;

         else if(page_cnt >0 && (total%pagesize) == 0 )

               page_cnt = page_cnt+1;

 

         return page_cnt;

 

         위의 식을 한 줄로 쓰려면  int page_cnt = total/pagesize + (total%pagesize == 0?0:1);

 

         실제로 사용하는 경우

           

         public static int totalpage(int total , int pagesize){

                   int page_cnt = (int)(total/pagesize);

    

                   if(page_cnt == 0)

                        page_cnt = 1;

                  else if(page_cnt >0 && (total%pagesize) > 0 )

                        page_cnt = page_cnt+1;

                  else if(page_cnt >0 && (total%pagesize) == 0 )

                        page_cnt = page_cnt+1;

 

                  return page_cnt;

         }

  

         ② 페이지 링크 메소드

 

         [인자 값]

         list 게시물 페이지를 나타내는 페이지명 : list_url

         파라미터로 값을 넘기는 경우 파라미터 값들 : queryString

         총 게시물 수 : total

         페이지 사이즈 :  pagesize

         현재 페이지 : pagenum        

         링크 페이지 그룹 : pageGroup

 

         [리턴 값]

         "이전" + 페이지 링크 + "이후" 를 받아 전달하기 위한 문자열 값  : pBuf

 

         [로직]

         StringBuffer pBuf = new StringBuffer("\r\n");

 

         if(queryString == null || queryString.equals("")) queryString = "";

 

         /*

             실제로 사용하는 경우에는 페이지 번호와 문자열 값이 붙어서 하나의 스트링 값으로 넘기는 경우가 많다. 

             그도 그럴께 하나 하나 파라미터 값을 메소드에 넘기는 것은 무지하게 비효율적이다. 파라미터가 100개라고 가정하면

             끝도 없을 것이다. 따라서 이런 경우 페이지 번호와 문자열 값을 분리해서 작업을 해야 한다.

 

             문자열 값은 보통 게시물 검색에 주로 사용됨으로 띠어 놓고 생각하기 어려운 문제이다. 꼭 로직을 이해하고

             본인의 개발 스타일에 맞추기 바란다.

 

             페이지 번호를 맨 뒤에 파라미터 값으로 붙여서 사용하는 경우로 예를 들어서 설명하겠다.

             req_pg = 1, 2, 3, .........

         */

        

         int idx = queryString.indexof("&req_pg");

 

         /* indexof("문자열 인자값") 해당 문자열 값이 없으면 -1를 반환한다.  */

 

         if(idx>-1) {

              queryString = queryString.subString(0,idx);

         }

 

         int totalpage = totalpage(int total , int pagesize);  //  위에서 작성한 총 페이지를 구하는 메소드 사용

 

        /* 시작 페이지 */

        

       int startPage = ((pagenum%pageGroup)>0)

                            ?((int)(pagenum/pageGroup)*pageGroup+1)

                            :(((int)(pagenum/pageGroup)-1)*pageGroup+1);

       int endPage = startPage+pageGroup-1;

 

       /* "이전" 버튼

            1. pagenum>pageGroup 보다 큰 경우에도 이전페이지는 존재한다.  

            2. 아니면 이전 버튼 값을 미리 구하는 경우

                int prev3 = (int)Math.floor((pagenum-1)/pageGroup(3.0))*pageGroup;

                prev3>0 보다 큰 경우에도 이전 페이지는 존재한다.

       */ 

 

       if(startPage !=1){

            pBuf.append("<a href='" + list_url + "?" + queryString + "&req_pg=" + (startPage-1) + "'> ◀◀ </a> /");

       }

    

       /* 페이지 링크 반복 문 */

 

      for(int i = startPage ; i<endPage && i<=totalPage; i++){

           if(i == pagenum){

                 pBuf.append("<Font size=2 color=red> " + i + " </Font>/");

           }else{

                 pBuf.append("<a href='" + list_url + "?" + queryString + "&req_pg=" + i + "'><Font size=2> ");

                 pBuf.append(i + " </Font></a>/"); 

           }

      }

 

       /*  "이후" 버튼 */

      

      if(totalPage>endPage){

           pBuf.append("<a href='" + list_url + "?" + queryString + "&req_pg=" + (endPage+1) + "'> ▶▶ </a> /");

      }

 

      /*  리턴 값  */

    

     return pBuf.toString();

 

     실제로 사용하는 경우에는

 

     public static String pageNavigation(String list_url,String queryString,int total,int pagesize,int pagenum,int pageGroup){

           StringBuffer pBuf = new StringBuffer("\r\n");

           if(queryString == null || queryString.equals("")) queryString = "";

 

           int idx = queryString.indexof("&req_pg");

 

           if(idx>-1) {

              queryString = queryString.subString(0,idx);

           }

 

           int totalpage = totalpage(int total , int pagesize);  //  위에서 작성한 총 페이지를 구하는 메소드 사용       

        

           int startPage =  ((pagenum%pageGroup)>0)

                                 ?((int)(pagenum/pageGroup)*pageGroup+1)

                                 :(((int)(pagenum/pageGroup)-1)*pageGroup+1);

           int endPage = startPage+pageGroup-1;

 

           if(startPage !=1){

                pBuf.append("<a href='" + list_url + "?" + queryString + "&req_pg=" + (startPage-1) + "'> ◀◀ </a> /");

           }

   

           for(int i = startPage ; i<endPage && i<=totalPage; i++){

                 if(i == pagenum){

                       pBuf.append("<Font size=2 color=red> " + i + " </Font>/");

                 }else{

                      pBuf.append("<a href='" + list_url + "?" + queryString + "&req_pg=" + i + "'><Font size=2> ");

                      pBuf.append(i + " </Font></a>/"); 

                }

           }

       

           if(totalPage>endPage){

                  pBuf.append("<a href='" + list_url + "?" + queryString + "&req_pg=" + (endPage+1) + "'> ▶▶ </a> /");

           }

    

           return pBuf.toString();

     }

 

   ⑶ JavaScript 를 이용하는 방법

 

   페이징 처리 UI 단을 자바 스크립트로 구현한 경우도 있다. 하지만 별로 추천하고 싶지는 않다.  왠지 자바스크립트는

   엔진에 대한 완벽성을 보장 받기 힘이든다. IE와 FireFox, 넷스케이프 모두 지원하도록 크로스 브라우저 코딩하기가 여간

   힘이 드는게 아니게 때문이다. 소스의 노출 역시 막기 힘이들고 이것은 결국엔 보안에 취약함을 나타내게 된다

저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

각종 DB JDBC 연결  (0) 2010/08/17
JDK 1.6 + mssql 2005 연동하기.  (0) 2010/06/25
페이징 처리 UI&Application Logic  (0) 2010/03/08
소스 사이트  (0) 2010/01/08
Struts – Validator  (0) 2010/01/07
Posted by Mizix
Programming/JAVA & JSP2010/01/08 12:51
1. Visual C++, C# and Visual Basic 및 윈도우즈 .Net에 관련된 소스코드들이 공유되는 대표적인 사이트 
http://www.codeguru.com/ 

2. 인터넷 상의 돌아다니는 코드들을 모아놓은 사이트
http://www.planet-source-code.com/ 

3. Codeguru와 더불어 많은 소스코드와 튜토리얼을 제공하고 있는 사이트
http://www.codeproject.com/ 

4. 전세계를 석권하고 있는 구글에서 제공하는 오픈소스 사이트
http://code.google.com/

http://code.google.com/projects.html

5. C++, Visual Basic, ASP, sourcecode, programming, javascript, code, delphi, ... 일반적인 조그만 코드들이 많이 모여있음.
http://www.programmersheaven.com/ 

6. OSI에 대한 정보가 나와 있는 사이트
http://www.opensource.org/

7. 프로젝트 단위의 소스코드를 오픈해주는 세계에서 가장 유명한 사이트
http://sourceforge.net/index.php

8. 자바스크립트가 많이 오픈되어 있는 사이트
http://javascript.internet.com/

9. Gamelan.com is a leading site for Java articles, tutorials, news, discussions, and other resources. ...
http://www.developer.com/open/

10. 세계적인 오픈소스에 대한 라이센스 정책을 세우는 GNU 사이트
http://www.gnu.org/copyleft/gpl.html

11. 세계적인 모바일 업체인 노키아에서 공유하고 있는 소스코드 사이트
http://opensource.nokia.com/projects/S60browser/

12. 애플컴퓨터를 위한 오픈소스 사이트
http://developer.apple.com/opensource/index.html

13. 영국의 개발자들의 소스코드 공유 커뮤니티 사이트
http://www.developerfusion.co.uk/

14. 한국의 대표적인 VS 개발자 공유 사이트
http://www.devpia.com/

15. 개발자 포럼 및 소스공유사이트, BREW에 대한 정보 제공을 잘해주고 있는 사이트
http://www.developer.com/ws/brew/
저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

JDK 1.6 + mssql 2005 연동하기.  (0) 2010/06/25
페이징 처리 UI&Application Logic  (0) 2010/03/08
소스 사이트  (0) 2010/01/08
Struts – Validator  (0) 2010/01/07
Ajax의 정의  (0) 2010/01/07
Posted by Mizix
Programming/JAVA & JSP2010/01/07 22:07

※ Struts – Validator

 

Validator 프레임워크는 요청 파라미터의 검증을 프로그래밍 할 필요 없이 검증 규칙의 선언만으로 해결할 수 있도록 해준다.

즉 검증 규칙을 외부의 설정 파일에 정의한다는 뜻이다.

 

Struts Framework의 장점.

  • 이미 살펴본 것처럼 ActionForm클래스의 validate() 메소드를 통해 검증할 수 있었습니다.

 

Struts Framework의 단점.

  • 많은 필드 값들이 똑같은 검증 로직을 포함할 경우 각각의 validate() 메소드 내에도 똑같은 검증 코드가 죽복되어 질수 있다.

 

Struts Framework의 단점을 보완하기 위한 Validator framework

David Winterfeldt는 Validator framework을 Struts를 위한 third-party add-on으로 만들게 되었고 나중엔 Struts core에 포함되게 됩니다.  현재는 Struts core와 함께 배포됩니다( 하지만, 별도의 Jakarta Commons project랍니다)

  • Validator framework는 몇몇 (미리 정의된)validation 루틴과 함께 패키징 되어 배포됩니다. 이것들을 이용해서 validation logic을 어렵지 않게 적용할 수도 있습니다.

  • 각각의 validate() 메소드를 코딩하는 대신, validator를 이용하게 되면, 검증 방식을 정의 하기 위해 XML 설정파일을 사용하게 될 것이고, 이 설정내용이 각각의 폼 빈에 적용됩니다.

  • Validator에 의해 제공되지 않는 검증 방식이 필요하다면, 사용자 정의 검증방식(custom validation)을 Validator에 껴 넣을 수도 있습니다.

  • Validator는 server-side / client-side validation 양 쪽에서의 검증을 지원합니다. 폼 빈의 경우 server-side 검증 인터페이스만을 제공하는데 이와는 다르죠

 

※ Validator Overview

Validator는 두 개의 XML 설정 파일을 사용합니다.  어떤 검증 루틴이 사용될 것인지, 어떻게 그 루틴들이 애플리케이션에 적용될 것인지를 기술하는 파일이죠.

validator-rules.xml

  • 이 파일에 어떤 검증 루틴이 사용(설치)되는지를 기술한다.
  • 검증 루틴(validation rutine)을 선언 하고, 이 각각의 검증 루틴에 대한 이름(local name)이 할당된다.


validation.xml

  • 어떤 검증 루틴이 어떤 폼 빈(Form Bean)에 적용될 것인지를 기술합니다.
  • Struts-config.xml 파일에서 정의된 폼 빈의 이름과 validator-rules.xml 에서 정의된 검증 루틴의 이름을 사용해서  ‘어떤 빈에 어떤 검증 루틴이 사용될 것’인지를 기술하게 되죠. 

 


 

※ Validator 사용하기

- Validator 플러그 인을 사용 가능하게 한 후에
- 두 개의 설정 파일을 손보고
- 폼 빈을 만들면 됩니다.

※ 다음과 같은 술서로 살펴보겠습니다.

1.Enabling the Validator Plugin

  • Validator가 Struts와 함께 패키징 되어 배포 되지만, 기본적으로 바로 사용가능하도록 설정되어 있는 것은 아닙니다.
  • Validator를 사용할 수 있도록 하려면, 다음과 같은 설정을 Struts의 설정 파일에 추가시켜줘야 합니다

validator_configuration.jpg

  • 위의 설정은 Struts가 Validator 플러그인을 로드하고 초기화 하도록 합니다. 일단 초기화가 되면, 플러그인은 콤마로 분리된 Validator 설정 파일( pathnames 속성에 기술된)을 로드(load)합니다.

 

2. Creating Form Beans

  • Validator를 사용하기 위해선, 여러분이 작성하는 폼빈이 ActionForm 클래스가 아닌 'Validator의 ActionFrom 클래스'를 상속해야합니다.

* Validator의 ActionFrom클래스는 여러분의 애플리케이션이 Validator 프레임워크에 연결되도록 ActionFrom 클래스의 reset()과 validate()메소드를 구현합니다.

  • 여러분이 직접 validate() 메소드 내에 검증 코드를 구현하지 않아도 됩니다. Validator가 여러분을 위해 검증 코드를 제공하기 때문이죠.
  • Struts에서 제공되었던 기능 구현 방법과 비슷하게, Validator는 폼 빈(From Bean)을 만들 때, 두 가지의 선택 옵션을 제공합니다.

그 첫 번째는 다음의 코드 처럼 구체적인 폼 빈(From Bean) 객체를 만드는 것입니다.

 

<-- 첫번재 방법 -->

1. 먼저 폼빈 클래스를 작성한다.

1-1.png

LogonForm 클래스 들여다 보기

이 클래스는 ActionFrom 대신 ValidatorForm 클래스를 상속합니다.

이 클래스는 reset() 이나 validate() 메소드를 구현하고 있지 않습니다.

일반적인 폼 빈을 Struts의 설정 파일에 등록했던 것처럼, 설정 파일에 설정해주면 됩니다.

 

2. 폼빈 설정(struts-config.xml)

1-2.png

<form-beans>태그의 name 속성은 validation.xml 파일에 검증내용(validation)을 정의할 때 사용될 것입니다.

 

3. Validation.xml 파일에 validation  설정

1-3.png

Validator는 2번 폼빈설정에서 '폼빈 태그의 name 속성값'을 validation.xml에 정의된 검증내용(validation)과 매칭합니다.

 

<-- 두번재 방법 -->

Struts 설정 파일에 Dynamic 폼빈을 설정하는 방법입니다,

- Dynamic Form Beans을 이용하면 실제 클래스를 작성하지 않아도 됩니다; 폼 빈이 가져야 하는 속성 값들만 정의해주면, 스트럿츠가 알아서 해당 폼 빈을 작성해줍니다.
2-1.png

* Validator를 이용하려면, org.apache.struts.action.DynaActionForm가 아닌 org.apache.struts.validator.DynaValidatorForm 타입의 폼빈을 지정해줘야한다는 것만 다릅니다.

- 첫 번째 방법에서와 마찬가지로, Dynamic Form Bean에 주어진 name은 validation.xml 파일에 validation을 정의할 때 사용할 것입니다(validation.xml파일의 내용은 따로 보지 않겠습니다)

 

◆ 앞서 본 두 가지의 폼빈 생성 방법에 덧붙여, 하나의 폼빈을 정의한 뒤에 여기에 다수의 validation을 연결하는 방법도 제공됩니다.

ValidationFrom 이나 DynaValidatorFrom 기반의 폼빈을 이용할 때 폼빈과 validation.xml 파일의 validation 내용과 매핑하기 위해서, 스트럿츠 설정파일의 폼빈에 대한 이름(logical name)을 사용하는데,

대부분의 경우엔 적절하지만, 그럿지 못한 경우도 있습니다. 여러 개의 액션이 하나의 폼빈을 공유하여 사용할 때이죠, 이 경우 어떤 액션은 그 폼빈에 선언된 모든 속성(field)을 모두 사용할 수도 있지만, 다른 액션은 그 중 몇 개만을 사용할 수도 있습니다. 이럴 경우 에러가 발생하겠죠.

이런 문제를 해결하기 위해, Validator는 validation을 폼빈에 연결하는 대신 액션에 연결할 수 있도록 해주는 두 개의 클래스를 제공합니다.

 

구체적인 폼빈(concrete form bean)을 작성할 경우엔 org.apache.,struts.validator.ValidatorActionFrom 을 상속하고...

2-2.png

다이나믹 폼빈(Dynamic Form Bean)을 사용하려면, org.apache.struts.validator.DynaValidatorActionFrom 을 Struts 설정 파일에 설정해주면 됩니다.

2-3.png

그리고 나서, validation.xml 파일에(확인), 폼빈의 이름에 매핑하지 않고, 액션 경로(action path)에 매핑해주면됩니다.

2-4.png

 

다음의 validation.xml 파일은 동일한 폼 빈에 적용되는 두가지의 validation 을 보여줍니다.

2-5.png

여러분이 작성한 폼 빈이 ValidatorActionForm 클래스나 DynaValidatorActionForm을 상속할 것이기 때문에, Validator는 validation을 찾기 위해 폼 빈의 이름(logical name)대신 액션 경로(action path)를 이용하는 방법을 알고 있습니다.

 

◆ Using Validator in Conjunction with the Form Bean's reset() and validate() methods.

앞서 말한대로, Validator의 ActionFrom  서브클래스를 이용하면, reset()이나 validate()메소드를 구현해 줄 필요가 없지만, 어떤 경우에는, 여러분 자신의(사용자 정의) 유효성 검사나 초기화가 필요한 경우도 있다.

이럴 때엔, reset()이나 validate() 메소드를 오버라이딩 한 후에, 자신의 코드를 메소드에 추가 하기 전에 꼭 super.reset()과 super.validae() 메소드를 먼저 호출하도록 하라.

3-1.png

 

◆ Configuring validator-rules.xml

대부분의 경우에는 미리 설정된 것을 사용하기만 하면 되고, 수정 해야 할 일이 많지 않습니다.

3-2.png

validator-rules.xml에 있는 각각의 validation 루틴은 validator 태그에 선언된 자신만의 정의내용(definition)이 있습니다.

  • validator 태그는 루틴에 대한 이름을 부여하는 데 사용되며(name attribure) 이 루틴에 사용퇸 클래스와 메소드 이름을 지정합니다.

    • 논리 이름(logical name)은 이 파일 안의 다른 루틴에 의해 참조될 때는 물론 validation.xml 파일의 validation 정의(validation definition)에 의해 참조될 때 사용횝니다.
  • msg: 검증이 실패 했을 때의 에러 메시지로 사용될, 리소스 번들 내의 메시지를 위한 key 값을 지정합니다.
  • the jsFuction : 검증 루틴(validation runtine)에 필요한(쓰이는) '클라이언트 쪽에서 실행될 자바스크립트 코드에 대한 경로'를 지정합니다.

 

이 글은 스프링노트에서 작성되었습니다.

'Programming > JAVA & JSP' 카테고리의 다른 글

페이징 처리 UI&Application Logic  (0) 2010/03/08
소스 사이트  (0) 2010/01/08
Struts – Validator  (0) 2010/01/07
Ajax의 정의  (0) 2010/01/07
ValueOf 와 parseInt의 차이점.  (0) 2010/01/07
Posted by Mizix
TAG struts
Programming/JAVA & JSP2010/01/07 21:23

웹상에서 자바스크립트를 통해서 서버와 통신을 하는 개발 방식이다.
웹페이지를 개발할때 DB연동을 위한 통신을 일반적으로 JSP,ASP,PHP 등 서버 사이드 언어로 개발을 했는데,이것을 자바스크립트상에서 구현하는 방식이다.
서버사이드언어와 Ajax의 큰 차이라고 보면 페이지 전환이라고 볼 수 있다
보통 서버사이드 언어로 값을 전달할 때 form,submit 태그를 이용해서 값을 받고 전달하게 된다. 이 때 페이지 전환이 이루어 지게 되는데, 이 때 아무것도 못하는 상태가 된다.
Ajax는 자바스크립트 선상에서 처리를 하고, 화면에 뿌려준다. 이 때 중요한것은 서버와의 통신 과정 중에도 다른 작업을 수행 할 수 있다는 것이다. 단 ajax 는 서버에서 값을 받아오기 위해서 xml 을 사용하기 때문에 넘어오는 값이 xml 형태이므로 xml파서를 이용해서 값을 받아올 수 있다.





즉 웹상에서 자바스크립트를 통해서 서버와 통신을 하는 개발 방식입니다.

예를들어 웹페이지를 개발할떄 DB와 연동을 하기 위해서는

jsp 와 asp 등의 서버사이드 스크립트의 도움이 필요했습니다.

그리고 form 태그를 이용해서 값을 전달죠, 이때 submit 을 통해서 값을 보내게 됩니다.

그러면 값을 보낼때 사용되는 페이지는 서버와 통신하고 response 값이 넘어오기 전까지는 아무것도 못하는 상태가 됩니다.

하지만 ajax 는 이를 자바스크리트 선상에서 처리를 할수있습니다.

즉,

자바스크립트를 통해서 서버와 통신하고 값을 받아온다는 거죠. 그리고 중요한것은

서버와 통신하고 값을 받아오는 중에도 다른 일을 수행할수가 있다는 것이죠.

다시말해서 jsp 와 asp , php 등은 값을 전달 할떄마다 페이지 이동이 생깁니다.

그리고 각 역할에 맡는 페이지가 따로 존재해야한다는 것이죠.

하지만 ajax 는 페이지 하나로 페이지 이동없이 값을 보내고 받아올수있다는 것이죠.

그리고 서버와 통신하는 동안에도 다른 일을 처리할수가 있다는 것입니다 ^^

단 ajax 는 서버에서 값을 받아오기 위해서 xml 을 사용합니다.

넘어오는 값이  xml 형태이기 떄문에 자바스크립트의 xml 파서를 이용해서 값을 받아올수가 있습니다 ^^

저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

소스 사이트  (0) 2010/01/08
Struts – Validator  (0) 2010/01/07
Ajax의 정의  (0) 2010/01/07
ValueOf 와 parseInt의 차이점.  (0) 2010/01/07
Java Map(HashMap, TreeMap, Hashtable)  (0) 2010/01/07
Posted by Mizix
Programming/JAVA & JSP2010/01/07 21:11
ValueOf
Integer 객체에서 int형 값을 뽑아 내는 메소드.
parseInt()
String형 객체에서 int형 값을 뽑아 내는 메소드 입니다.
저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

Struts – Validator  (0) 2010/01/07
Ajax의 정의  (0) 2010/01/07
ValueOf 와 parseInt의 차이점.  (0) 2010/01/07
Java Map(HashMap, TreeMap, Hashtable)  (0) 2010/01/07
스트럿츠2 태그 사용을 위한 필수 지식  (0) 2009/10/01
Posted by Mizix
Programming/JAVA & JSP2010/01/07 12:04

1. Collection
  • Map은 key와 value를 가진 집합이며, 중복을 허용하지 않는다.
  • 즉, 한개의 key에 한개의 value가 매칭된다.
  • java.util 패키지에 여러 집합들을 사용하기 위한 여러 interface와 class 들이 정의되어 있다.
2. HashMap
  • HashMap은 Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
  • Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용한다.
  • 아래의 예는 HashMap을 사용한 간단한 예제이다.

    import java.util.*;

    public class HashMapTest
    {
        public static void main(String argv[])
        {
            HashMap hm = new HashMap();
            System.out.println(hm.put("aaa", "111"));
            System.out.println(hm.put("bbb", "222"));
            System.out.println(hm.put("aaa", "444"));
            System.out.println(hm.put("ccc", "333"));    
            System.out.println(hm.put("ccc", null));       
            
            System.out.println("HashMap size : " + hm.size());
            
            Set set = hm.keySet();
            Object []hmKeys = set.toArray();
            for(int i = 0; i < hmKeys.length; i++)
            {
                String key = (String)hmKeys[i];   
                System.out.print(key);
                System.out.print(" - ");
                System.out.println((String)hm.get(key));
            }
        }
    }


    /**
    실행:java HashMapTest
    결과:
    null
    null
    111
    null
    333
    HashMap size : 3
    ccc - null
    bbb - 222
    aaa - 444
    */

3. TreeMap
  • TreeMap역시 중복을 허용하지 않으며, key와 value의 쌍으로 이루어져 있다.
  • HashMap과 다른 점은 SortedMap을 implements 하였으므로, key 값들에 대한 정렬이 이루어진다는 점이다.
  • 아래의 예는 TreeMap을 사용하여 각 요소가 몇몇 이나 나왔는지 알아보는 간단한 예제이다.

    import java.util.*;

    public class Freq
    {
        private static final Integer ONE = new Integer(1);

        public static void main(String args[])

        {
            Map m = new TreeMap();

            // Initialize frequency table from command line
            for (int i=0; i < args.length; i++)

            {
                Integer freq = (Integer) m.get(args[i]);
                m.put(args[i], (freq==null ? ONE :
                                new Integer(freq.intValue() + 1)));
            }

            System.out.println(m.size()+" distinct words detected:");
            System.out.println(m);
        }
    }


    /**
    실행:java Freq if it is to be it is up to me to delegate
    결과:
    8 distinct words detected:
    {be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}
    */

4. Hashtable
  • Hashtable Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
  • Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용하지 않는다.(HashMap과의 차이점)
  • 아래의 예는 HashTable을 사용한 간단한 예제이다.

    import java.util.*;

    public class HashtableTest
    {

        public static void main(String argv[])
        {
            Hashtable ht = new Hashtable();
            System.out.println(ht.put("aaa", "111"));
            System.out.println(ht.put("bbb", "222"));
            System.out.println(ht.put("aaa", "444"));
            System.out.println(ht.put("ccc", "333"));    
            
            System.out.println("Hashtable size : " + ht.size());
            
            System.out.println("aaa value : " + (String)ht.get("aaa");
            
        }
    }


    /**
    실행:java HashMapTest
    결과:
    null
    null
    111
    null
    Hashtable size : 3
    aaa value : 444
    */

저작자 표시 비영리 변경 금지

'Programming > JAVA & JSP' 카테고리의 다른 글

Ajax의 정의  (0) 2010/01/07
ValueOf 와 parseInt의 차이점.  (0) 2010/01/07
Java Map(HashMap, TreeMap, Hashtable)  (0) 2010/01/07
스트럿츠2 태그 사용을 위한 필수 지식  (0) 2009/10/01
스트럿츠2  (0) 2009/09/29
Posted by Mizix
Programming/JAVA & JSP2009/10/01 14:22
액션, 인터셉터, 밸류 스택과 태그와의 관계
태그는 동적 데이터를 출력하기 디자인되었다. 그림과 같이 액션 클래스와 JSP가 구성되어 있는 경우를 예로 들어보자. 만약 액션 클래스의 postalCode 프로퍼티에 값이 설정된 상태에서 이 액션을 실행하여 comePage.jsp 가 출력되면 처음 입력된 값이 화면의 텍스트 필드 안에출력된다. 이와 같이 출력될 수 있는 것은 액션이 밸류 스택에 저장되고 <s:textfield /> 태그는 밸루스텍에 저장된 postalCode 값을 함께 랜더링하기 때문이다.

비 문자열 속성
HTTP 프로토콜은 텍스트 기반이다. 그러나 어떤 태그는 BOOLEAN 또는 int 같은 비 문자열 타입의 속성을 가진다. 비 문자열 속성을 직관적으로 사용하기 위해 스트럿츠2는 모든 비 문자열 속성을 하나의 표현식으로 받아들인다.
즉, 자바 소스코드에서 boolean, int 등의 변수를 문자열로 변환되서 받아들이는게 아니라 그 타입의 값으로 받아들인다.
그렇기 때문에 jsp에서 문자열로 받아들이기 위해서는
"%{boolean}"과 같이 ""을 붙여서 문자열로 받아들이면 된다.

태그의 value 속성은 객체이다
보통의 경우, 스트럿츠2 태그의 name속성은 액션의 어떤 프로퍼티와 매핑하는지를 말해준다. 따라서 태그의 value 속성은 name 속성과 매핑되는 액션 클래스의 프로퍼티와 같은 타입으로 자동적으로 설정된다. 따라서 value 속성에 정의된 내용을 문자열이 아닌 객체로 다룬다.
value 속성에 설정된 값은 문자열이 아니기 때문에 value 속성에 어떤 것을 성정하더라도 표현식으로 다룬다.

OGNL 이란?
스트럿츠2에서 사용하는 OGNL에 대해 간단한 개요를 소개하겠다.
스트럿츠2는 OGNL 표현식을 사용하기 위해 컨텍스트를 사용한다. OGNL을 다루기 위한 최상위 객체로 맵을 사용한다. 이것을 컨텍스트 맵 또는 컨텍스트라 부른다, OGNL은 컨텍스트 안에 루트 객체를 갖는다. 컨텍스트의 다른 객체를 참조할 때는 '#' 기호를 사용한다.
저작자 표시 비영리 변경 금지
Posted by Mizix