• 적용환경 : WindowsXP, Java 1.6 SDK 설치된 상태

     

Java에서 데이터베이스와 관련된 처리를 담당하기 위해 제공하는 표준 스펙으로서, 각 밴더사들은 이 스펙을 만족하는 JDBC 드라이버를 제공해야 한다.

각 밴더사(DBMS제조사)의 다운로드 페이지에서 제공하는 파일을 다운로드 받아보면, 그 압축파일 안에 JDBC를 사용하는 방법을 제공하고 있으므로, jar 파일만 받지 말고, 제공하는 JDBC 압축파일을 받는 것이 좋을 듯 하다.

 

각 밴더사들이 제공하는 JDBC 파일은 JDK/JRE/lib/ext 폴더에 넣어두면, 이클립스나 IDE 프로그램이 자동으로 인식하여 설치를 진행할 수 있다.

JavaExt.JPG

이하 페이지에서는 각각의 JDBC 를 이용하여 각각의 DB에 접속하는 방법을 기술하도록 하겠다.



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

1. 오라클 JDBC Driver를 다운로드 받는다.
  - http:// otn.oracle.com/software/tech/java/sqlj_jdbc/index.html 
  - 또는 C:\oraclexe\app\oracle\product\10.2.0\server\jdbc 에도 있음
  - 또는 :\oracle\product\10.2.0\db_1\jdbc\lib 에 보면 ojbcd 에도 있음

2. JDBC Driver를 %JAVA_HOME%\jre\lib\ext 에 복사
    (혹은 CLASSPATH 에 추가)

3. 혹시 eclipse 에서 package가 포함이 안될경우
    eclipse 메뉴에서 
    Window -> Preferences -> Java -> Installed JREs 에서
    Location 을 edit 에서 위치를 jdk 의 위치로 변경

Contact.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class Contact extends HttpServlet {

        public void doGet(HttpServletRequest req, HttpServletResponse res){
            try {
                res.setContentType("text/html; charset=KSC5601");
                PrintWriter out  = res.getWriter();
                req.setCharacterEncoding("KSC5601");
                String number = req.getParameter("number");
                String name = req.getParameter("name");
                String address = req.getParameter("address");
                out.println("<html>");
                out.println("<head><title>Contact 서블릿 실행하기</title></head>");
                out.println("<body><h3> " +number + " 번 당신!!<h3><br>");
                out.println("이름은 " + name + " 이고!!!");
                out.println("사는 곳은 " + address + " 가 맞지!?");
                out.println("조사하면 다나와~~ ㅡㅅ-)ㅋ");
                out.println("</body>");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

어제 작성했던 doPost()를 doGet() 방식으로 변경했다. GET 방식은 실행될 때, 주소표시줄에 파라메터(인자)의 값이 모두 나타난다.

그래서 주소 표시줄에서 http://localhost:8080/servlet/Contact?number=700&name=허니몬&address=경기도 라고 입력하면 doGet() 메소드가 호출되어 나타난다. GET 방식으로 넘어갈 때는 서블릿 뒤에서 ? 부터 시작하여, 각 파라메터마다 & 으로 연결이 된다.

MessageServlet.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class MessageServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=KSC5601");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Message Servlet : ");
            out.println("<a href='HelloServlet'>HelloServlet Link</a>");
    out.println("<a href='Contact?number=700&name=허니몬&address=경기도'>Contact Servlet Link</a>"); //에서 보는 것처럼 서블릿을 호출하면서 뒤에 ?로 하여 매개변수들을 직접 지정해줄 수도 있다.
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

doPost() 메소드는 반드시 HTML <FORM METHOD=POST> 에 의해서만 호출되어 사용이 가능하다.

 

● 폼 데이터 처리(09/05/18 배운 내용 하단부에 입력됨)

HTML의 폼에서 태그에 사용된 이름이 유일한 경우에는 getParameter9)로 값을 알아볼 수 있었다. 하지만, 동일한 이름이 여러 번 사용된 경우에는 어떻게 될까? 이러한 경우에는 전달되는 값도 여러 개이다. 따라서 값을 얻을 때 여러 개의 값을 저장할 수 있는 배열 형태를 사용해야 한다. HttpServletRequest는 이러한 용도로 getParameterValues() 메소드를 제공한다. 이 메소드는 다음 예와 같은 방법으로 사용할 수 있다. 이 메소드를 사용할 때 주의할 점은 해당 이름으로 값이 전달되지 않는 경우에 리턴 값이 "null"이 올 수도 있기 때문에 "null"인지 여부를 반드시 확인하여야 한다.

폼처리는 중요합니다~!!! Check it up now!! Bebe!! 베뤼베뤼 임포딴뜨!!! 유노우!!!! 푸햐햐햐햣!!

 

예 : 값이 여러 개 전달되는 경우

  1. String values[] = res.getParameterValues("name");
    if ( values != null) {
       ...
    }

※ 전달되는 값

HTML 의 폼(Form)에서 Input 타입이 text인 경우에는 사용자가 입력한 문자열이 서블릿에 전달된다. 그런데 입력 타입이 checkbox나 radio인 경우에는 어떤 값들이 전달될까? HML 폼에서 체크박스를 사용하면 선택된 체크 박스의 value 속성으로 기술된 값만 서블릿에 전달된다. 만약 HTML 폼의 체크 박스에 value 속성을 기술하지 않으면 'on' 값이 서블릿에 전달되기 때문에 주의해야 한다.

 

예 : 파라미터 이름을 모를 경우(잘 사용하지 않는다.)

  1. import java.util.Enumeration; //필요

    Enumeration e = req.getParameterNames(); // 이전에서 사용한 파라메터들을 몽땅 주머니에 때려넣는 거라고 생각하면 된다.
    while( e.hasMoreElements() ) {
       String name = (String) e.nextElement();
       String value = req.getParameter(name);
       if (values != null){
          for(int i = 0; i < values.length; i++ ) {
             out.println("<li>" + name + " : " + values[i]);
          }
       }
    }

 

resin.conf를 수정하여, 작업하는 폴더를 변경하기

resinConfEdit.JPG

이 작업(resin.conf를 변경한 다음 웹엔진 다시 시작하기)을 마친 다음에 C:\myservlet 폴더에 가면 resin 작동에 필요한 폴더들을 스스로 생성한다.

앞으로 서블릿 작업은 c:\myservlet\WEB-INF\classes에서 사용하면 된다.

resinConfEditCreateFolder.JPG

서블릿을 제외한 파일들은 c:\myservlet\ 에 저장하면 된다.

 

JdbcOracleServlet.java

  1. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class JdbcOracleServlet extends HttpServlet {
        String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        String user = "scott";
        String passwd = "tiger";

        public void init(ServletConfig conf) throws ServletException {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Constructor Succeeded");
        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con;
            PrintWriter out;
            Statement stat;

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement();
                ResultSet rs = stat.executeQuery("SELECT * FROM customer");

                out.println("<html><head><title>JdbcServlet Test</title></head>");
                out.println("<body>");
                out.println("<h1>JdbcOracleServlet Test</h1>");
                out.println("<p>This is the out form of the JdbcOracleServlet Test</p>");

                while ( rs.next() ) {
                    String num = rs.getString(1);
                    String name = rs.getString(2);
                    String address = rs.getString(3);
                    out.println( num + " -- " + name + " -- " + address );
                    out.println("<p>");
                }

                out.println("</body></html>");

                out.close();
                rs.close();
                stat.close();
                con.close();

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

컴파일 후, http://localhost:8080/servlet/JdbcOracleServlet 하면 된다. ㅡㅅ-)b

JdbcOracleServlet Test (이렇게 나오면 된다.)

This is the out form of the JdbcOracleServlet Test

111 -- dada -- seoul

211 -- dayon -- seoul

311 -- mel gibson -- la

411 -- tom cruise -- seoul

511 -- hue grant -- la

611 -- diane soyer -- london

711 -- tom hanks -- london

811 -- gim carry -- seattle

911 -- shone cornery -- seattle

121 -- george cloony -- florida

131 -- michel phiper -- tokyo

141 -- allec boldwin -- beijing

337 -- bella -- la

418 -- jerry -- la

586 -- tom -- seoul

739 -- merry -- paris

200 -- honeymon -- gyunggi

333 -- kim -- gyounggi

444 -- kim -- nara

  1. //코드를 살짝 수정하면!!!
  2. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class JdbcOracleServlet extends HttpServlet {
        String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        String user = "scott";
        String passwd = "tiger";

        public void init(ServletConfig conf) throws ServletException {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Constructor Succeeded");
        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con;
            PrintWriter out;
            Statement stat;

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement();
                ResultSet rs = stat.executeQuery("SELECT * FROM customer");

                out.println("<html><head><title>JdbcServlet Test</title></head>");
                out.println("<body>");
                out.println("<h1>JdbcOracleServlet Test</h1>");
                out.println("<p>This is the out form of the JdbcOracleServlet Test</p>");
                out.println("<table border=1  width=300>");
                out.println("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");

                while ( rs.next() ) {
                    String num = rs.getString(1);
                    String name = rs.getString(2);
                    String address = rs.getString(3);
                    out.println("<tr>");
                    out.println("<td>"+ num + "</td><td>" + name + "</td><td>" + address + "</td>");
                    out.println("</tr>");
                }
                out.println("</table>");

                out.println("</body></html>");

                out.close();
                rs.close();
                stat.close();
                con.close();

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

요렇게도 된다. +_+)

JdbcOracleServlet.JPG

 

서블릿(Form method = get) 을 이용하여 CustomerFind 서블릿에서 파라메터를 받아서 쿼리를 처리하여 출력하여 보자. <input> 태그들에 name 과 value를 입력하는 걸 잊지 말자. req.getParameter('name');으로 빼와야 한다.

JdbcOracleServlet.java

  1. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class JdbcOracleServlet extends HttpServlet {
        String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        String user = "scott";
        String passwd = "tiger";

        public void init(ServletConfig conf) throws ServletException {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Constructor Succeeded");
        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con;
            PrintWriter out;
            Statement stat;

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement();
                ResultSet rs = stat.executeQuery("SELECT * FROM customer");

                out.println("<html><head><title>JdbcServlet Test</title></head>");
                out.println("<body>");
                out.println("<h1>JdbcOracleServlet Test</h1>");
                out.println("<p>This is the out form of the JdbcOracleServlet Test</p>");
                // <Form> 태그 추가
                out.println("<form method = 'get' action = '/servlet/CustomerFind'>");
                out.println("<table border=1  width=300>");
                out.println("<tr>");
                out.println("<select name='title'>");
                out.println("<option value='num'>번호");
                out.println("<option value='name'>이름");
                out.println("<option value='address'>주소</select>");
                out.println("<input type='text' name='search'><input type='submit'>");

                out.println("</tr>");
                out.println("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");

                while ( rs.next() ) {
                    String num = rs.getString(1);
                    String name = rs.getString(2);
                    String address = rs.getString(3);
                    out.println("<tr>");
                    out.println("<td>"+ num + "</td><td>" + name + "</td><td>" + address + "</td>");
                    out.println("</tr>");
                }
                out.println("</table></form>");

                out.println("</body></html>");

                out.close();
                rs.close();
                stat.close();
                con.close();

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

 CustomerFindSearch.JPG

CustomerFind.java

  1. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class CustomerFind extends HttpServlet {
        private String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        private String user = "Scott";
        private String passwd = "tiger";


        public void init(ServletConfig conf) throws ServletException {
            // JDBC 드라이버 등록하기
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }


        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con; //Connect 생성
            Statement stat; //Statement 생성
            PrintWriter out;//PrintWriter 생성

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                String stitle = req.getParameter("title");
                String search = req.getParameter("search");
                String sql = "Select * from customer where " + stitle + " like '%" + search + "%'";

                ResultSet rs = stat.executeQuery(sql);
                out.println("<html><head><title>CustomerFind Servlet Execute</title></head><body>");
                out.println("<h1>JdbcOracleServlet Execute CustomerFind Servlet</h1>");
                out.println("INPUT Query : " + sql +"<br><br>");

               
                // 검색된 결과값 출력하기
                if ( rs.next() == true ) {
                    rs.beforeFirst();
                    out.println("<table border=1 width=350>");
                    out.println("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");
                    while ( rs.next() ) {
                        String num = rs.getString(1);
                        String name = rs.getString(2);
                        String address = rs.getString(3);
                        out.println("<tr>");
                        out.println("<td>" + num + "</td><td>" + name + "</td><td>" + address +"</td>");
                        out.println("</tr>");
                    }
                } else {
                    out.println("<h4>아쉽지만, 찾으시는 데이터가 없습니다.</h4>");
                }


                out.println("</table></body></html>");
               
                out.close();    //PrintWriter 파이프 종료
                rs.close();        //ResultSet 종료
                stat.close();    //Statement 종료
                con.close();    //Connection 종료
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

CustomerFindSearchResult.JPG

 

CustomerFindSearchNoResult.JPG

 


storedata.sql

  1. create table store(pid varchar2(3) primary key,
    pkind varchar2(20) not null, -- 종류
    pname varchar2(20) not null, --이름
    pexp varchar2(50) not null, -- 설명
    pnum number(3) not null, -- 수량
    pmaker varchar2(100) ); -- 제조사

    insert into store values('111','세탁기','통돌이 세탁기','통이 도는 강력 세탁기',20,'LG');
    insert into store values('121','세탁기','신바람 세탁기','첨단 FUZZY 세탁기',25,'SAMSUNG');

    insert into store values('211','디스켓','IMATION','3M의 새 디스켓',100,'3M');
    insert into store values('221','필름','SUPER100','KODAK의 자동 카메라용 필름',300,'KODAK');
    insert into store values('231','필름','MONO2000','KONICA흑백 필름',300,'KONICA');

    insert into store values('311','청소기','싹싹이','구석 구석 말끔히- 강력 진공 청소기',15,'LG');
    insert into store values('321','청소기','동글이','소음 걱정 없는 조용한 청소기',80,'DAEWOO');

    insert into store values('411','자동차','트라제XG','품위 있는 레져카 ',96,'HYUNDAI');
    insert into store values('412','자동차','아반테','실속파의 선택',30,'HYUNDAI');

    insert into store values('421','자동차','코란도','강력한 4륜 구동 RV ',88,'SSANGYONG');
    insert into store values('431','자동차','엘란','20C 마지막 스포츠카 ',30,'KIA');

    commit;

DadaStore.JPG

 

 

 

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

출처 :  http://www.okjsp.pe.kr/seq/307

끔찍한 java 에러입니다.
jdbc연결시 에러입니다.


classes12.zip 이 연결이 안된 경우입니다.

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:120)
at getEmp.main(getEmp.java:18)

해결1: classes12.zip을 classes12.jar 로 이름을 바꾼 뒤에 <CATALINA_HOME>/common/lib 에 놓고 재시동


host 주소가 맞지 않은 경우입니다.
또는 listener가 떠있지 않은 상태입니다.

java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:210)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:251)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:224)
at java.sql.DriverManager.getConnection(DriverManager.java:517)
at java.sql.DriverManager.getConnection(DriverManager.java:177)
at getEmp.main(getEmp.java:20)


db명이 틀릴경우입니다. 호스트스트링이라고도 합니다.
java.sql.SQLException:IO 예외 상황: Connectionrefused(DESCRIPTION=(TMP=)(VSNNUM=135290880)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:210)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:251)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:224)
at java.sql.DriverManager.getConnection(DriverManager.java:517)
at java.sql.DriverManager.getConnection(DriverManager.java:177)
at getEmp.main(getEmp.java:20)


아이디와 패스워드가 틀릴경우입니다.
java.sql.SQLException: 널 사용자나 암호가 THIN 드라이버에서 지원되지 않습니다
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:803)
at oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:179)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:198)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:251)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:224)
at java.sql.DriverManager.getConnection(DriverManager.java:517)
at java.sql.DriverManager.getConnection(DriverManager.java:177)
at getEmp.main(getEmp.java:20)

+ Recent posts