반응형

게시판 연습

 

[여기서는 먼저 전 게시물의 JDBC 프로그래밍을 복습한 후에 내용을 보시기 바랍니다.]

 

JDBC 프로그래밍에서 실습한 GetEmp.java 순수 애플리케이션을 서블릿으로 바꾸고 실행해 보세요(servlet API 참고)

[참고] JDBC 드라이버 (ORACLE_HOME/jdbc/lib/classes12.jar, nls_charset12.jar)를 {애플리케이션홈}/WEB-INF/lib 에

복사합니다.

 

문제 1 답:

 

package example;

 

import java.sql.*;

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class GetEmp extends HttpServlet {

         private String DB_URL;

         private String DB_USER;

         private String DB_PASSWORD;

        

         public void init(ServletConfig config) throws ServletException {

                  super.init(config);

                  //설치과정에서 자신이 정한 정보에 맞게 바꾼다.

                  DB_URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";

                  DB_USER="scott";

                  DB_PASSWORD="tiger";

                 

                  try {

                           //드라이버를 로딩합니다.

                           Class.forName("oracle.jdbc.driver.OracleDriver");

                  }catch(ClassNotFoundException e){

                           e.printStackTrace();

                  }

         }

 

         public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException,ServletException {

                  res.setContentType("text/html;charset=euc-kr");

                  PrintWriter out = res.getWriter();

                  Connection conn = null;

                  Statement stmt = null;

                  ResultSet rs = null;

                  String query="select * from emp";

                  try {

                           //데이터베이스의 연결을 설정합니다.

                           conn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD);

                           //Statement를 가져온다.

                           stmt=conn.createStatement();

                           //SQL문을 실행합니다.

                           rs=stmt.executeQuery(query);

                           while(rs.next())  {

                                   String empno=rs.getString(1);

                                   String ename=rs.getString(2);

                                   String job=rs.getString(3);

                                   String mgr=rs.getString(4);

                                   String hiredate=rs.getString(5);

                                   String sal=rs.getString(6);

                                   String comm=rs.getString(7);

                                   String depno=rs.getString(8);

                                   //결과를 출력합니다.

                                    out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

                           }

                  } catch (SQLException e) {

                           e.printStackTrace(out);

                  }

                  finally {

                           try{

                                   rs.close();

                                   stmt.close();

                                   conn.close();

                           }catch(SQLException e){}

                  }

         }

}


7369 : SMITH : CLERK : 7902 : 1980-12-17 00:00:00.0 : 800 : null : 20
7499 : ALLEN : SALESMAN : 7698 : 1981-02-20 00:00:00.0 : 1600 : 300 : 30
7521 : WARD : SALESMAN : 7698 : 1981-02-22 00:00:00.0 : 1250 : 500 : 30
7566 : JONES : MANAGER : 7839 : 1981-04-02 00:00:00.0 : 2975 : null : 20
7654 : MARTIN : SALESMAN : 7698 : 1981-09-28 00:00:00.0 : 1250 : 1400 : 30
7698 : BLAKE : MANAGER : 7839 : 1981-05-01 00:00:00.0 : 2850 : null : 30
7782 : CLARK : MANAGER : 7839 : 1981-06-09 00:00:00.0 : 2450 : null : 10
7788 : SCOTT : ANALYST : 7566 : 1987-04-19 00:00:00.0 : 3000 : null : 20
7839 : KING : PRESIDENT : null : 1981-11-17 00:00:00.0 : 5000 : null : 10
7844 : TURNER : SALESMAN : 7698 : 1981-09-08 00:00:00.0 : 1500 : 0 : 30
7876 : ADAMS : CLERK : 7788 : 1987-05-23 00:00:00.0 : 1100 : null : 20
7900 : JAMES : CLERK : 7698 : 1981-12-03 00:00:00.0 : 950 : null : 30
7902 : FORD : ANALYST : 7566 : 1981-12-03 00:00:00.0 : 3000 : null : 20
7934 : MILLER : CLERK : 7782 : 1982-01-23 00:00:00.0 : 1300 : null : 10

 

위와 같은 결과 화면을 웹 브라우저에서 확인하셨습니까?

GetEmp 서블릿의 57번째 줄에서 에러가 발생한다는 메시지를 보신다면 /bbs/WEB-INF/lib 에 classes12.jar 파일을 복사하지 않으셨거나 오라클이 가동중이 아니거나 리슨너가 가동중이 아니거나 한 경우입니다.

윈도우에서 오라클을 설치하셨다면 나중 2개는 무시하시고 JDBC 드라이버를 올바른 위치에 복사했는지 확인하시기 바랍니다.

 

문제 2 : 위 서블릿을 JSP로 바꾸어 보세요

 

문제 2 답: 파일명 getEmp.jsp

 

<%@ page contentType="text/html;charset=euc-kr" %>

<%@ page import="java.sql.*" %>

<%

         String DB_URL="jdbc:oracle:thin:@127.0.0.1:1521:orcl";

         String DB_USER="scott";

         String DB_PASSWORD="tiger";

         //설치과정에서 자신이 정한 정보에 맞게 바꾼다.

         try {

                  //드라이버를 로딩합니다.

                  Class.forName("oracle.jdbc.driver.OracleDriver");

         } catch(ClassNotFoundException e){

                           e.printStackTrace();

         }

 

         Connection conn = null;

         Statement stmt = null;

         ResultSet rs = null;

         String query="select * from emp";

         try {

                  //데이터베이스의 연결을 설정합니다.

                  conn=DriverManager.getConnection(DB_URL,DB_USER,DB_PASSWORD);

                  //Statement를 가져온다.

                  stmt=conn.createStatement();

                  //SQL문을 실행합니다.

                  rs=stmt.executeQuery(query);

                  while(rs.next()) {

                           String empno=rs.getString(1);

                           String ename=rs.getString(2);

                           String job=rs.getString(3);

                           String mgr=rs.getString(4);

                           String hiredate=rs.getString(5);

                           String sal=rs.getString(6);

                           String comm=rs.getString(7);

                           String depno=rs.getString(8);

                           //결과를 출력합니다.

                           out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

                  }

         } catch (SQLException e) {

                  out.println("SQLException: " + e.getMessage());

         }

         finally {

                  try {

                           rs.close();

                           stmt.close();

                           conn.close();

                  } catch(SQLException e){}

         }

%>

 

문제 1 에서와 같은 결과를 확인했습니까?

문제1의 서블릿과 지금 JSP는 코드가 조금 다릅니다.

서블릿에서는 init 메소드에서 JDBC 드라이버에 대한 설정을 했습니다.

서블릿의 라이트 사이클에서 살펴 보았듯이 init 메소드안의 내용은 처음 사용자가 요청한 경우를 제외하고는 다음 요청 부터는 JDBC 드라이버 설정을 하지 않으므로 그렇지 않은 코드보다는 성능이 좋습니다.

JSP에서도 서블릿의 init 메소드와 같은 메소드가 있을 것입니다. 이것은 여러분이 찾아서 고치시기 바랍니다.

 

 

ConnectionPool 사용법

 

데이터베이스에 대한 Connection 을 관리하는 것은 매우 바람직한 일입니다.
왜냐하면 매 페이지마다 데이터베이스에 연결을 시도하는 것(= 커넥션 객체를 얻는것)은 시간이 많이 걸리는 작업입니다.
그럼에도 불구하고 위에서 우리는 Connection 을 얻은 후 사용 후 바로 자원을 반납했습니다
.

 

Database Connection Pool 이란 이전에 연결된 Connection 을 종료하지 않고 웹 클라이언트의 요구시 기존의 Connection을

통하여 데이터베이스에 접근할 수 있도록 하는 free Connection list 입니다.

즉, 시간이 오래 걸리는 커넥션 객체를 쓰고 난 다음에 리스트에서 넣고 관리하겠다는 의미입니다.

적절하게 리스트를 관리하면 시간을 절약하는데 크게 기여하게 하는 기법입니다.

 

. 전체 클래스 요약

 

Log.java
에러 메시지를 콘솔화면에 표시하기 위한 클래스입니다.

 

DBConnectionPoolManager.java

각 데이터베이스의 커넥션풀을 관리하기 위한 클래스입니다.

 

DBConnectionPool.java
DBConnectionPoolManager가 관리하는 데이터베이스당 가지는 커넥션 풀
실제로 이 클래스가 이미 생성된 커넥션을 관리
합니다.

 

ConnectionManager.java
DBConnectionPoolManager 클래스에 일을 시키는 클래스인데
여러 데이터베이스를 고려한 추상클래스입니다.
데이터베이스에 따라서 이 클래스를 상속받아 알맞는 클래스
를 만듭니다.

 

OracleConnectionManager.java 
데이터베이스 오라클을 사용하기 위해 ConnectionManager 클래스를 상속한 서브 클래스입니다.

 

oracle.properties
오라클 설정 파일입니다.
최대 커넥션 수, 초기 커넥션 수 등의 셋팅을 담당합니다.

이렇게 설정 내용을 코드가 아닌 파일에 저장하면 관리하기가 쉽습니다.

 

. 커넥션 풀 관련 소스

 

Log.java


package net.java_school.util;

 

import java.io.*;

import java.util.Date;

 

public class Log {

         public String dbgFile = "H:\\debug\\error.dbg"; // 윈도우  계열

         //public String dbgFile = "/debug/error.dbg"; // 유닉스 계열

 

         FileWriter fw = null;

         public Log() {

                  super();

                  try{

                           fw = new FileWriter(dbgFile, true);

                  }catch(IOException e){}

         }

 

         public void close() {

                  try{

                           fw.close();

                  }catch(IOException e){}

         }

 

         public void close(FileWriter fw) {

                  try{

                           fw.close();

                  }catch(IOException e){}

         }

 

         public void debug(String msg) {

                  try{

                           fw.write("-------------------------------------------------\r\n");

                           fw.write(new java.util.Date()+ " : ");

                           fw.write(msg + " \r\n");

                           fw.write("-------------------------------------------------\r\n");

                           fw.flush();

                  }catch(IOException e){

                           System.err.println("IOException.......!!");

                  }

         }

 

         public static void out(String msg) {

                  System.out.println(new Date() + ": "+msg);

         }

 

         public static void err(String msg) {

                  System.out.println(new Date() + ": "+msg);

         }

 

         public static void err(Throwable e,String msg) {

                  System.err.println(new Date() + ": "+msg);

                  e.printStackTrace(System.out);

         }

}


DBConnectionPool.java


package net.java_school.db.dbpool;


import java.util.*;
import java.sql.*;
import java.util.Date;
import net.java_school.util.Log;


// Connection Pool을 관리하는 클래스
class DBConnectionPool {
 
    // 현재 사용 중인 Connection 개수
    private int checkedOut;
 
    // Free Connection List
    private Vector freeConnections = new Vector();

    // Connection 최대 개수
    private int maxConn;

    // Connection 초기 개수
    private int initConn;

    // Waiting time (pool에 connection이 없을때 기다리는 최대시간)
    private int maxWait;

    // Connection Pool Name
    private String name;

    // DB Password
    private String password;

    // DB URL
    private String URL;

    // DB UserID
    private String user;

    // Constructor
    public DBConnectionPool(String name, String URL, String user, String password, int maxConn, int initConn, int waitTime) {
        this.name = name;
        this.URL = URL;
        this.user = user;
        this.password = password;
        this.maxConn = maxConn;
        this.maxWait = waitTime;
 
        for (int i = 0; i < initConn; i++) {
            freeConnections.addElement(newConnection());
        }
    }
 
    // Connection 반납
    // @param con : 반납할 Connection
    public synchronized void freeConnection(Connection con) {
        freeConnections.addElement(con);
        checkedOut--;
        // Connection을 얻기 위해 대기하고 있는 thread에 알림
        notifyAll();
    }
 
    // Connection 을 얻음
    public synchronized Connection getConnection() {
        Connection con = null;

        // Connection이 Free List에 있으면 List의 처음 것을 얻음
        if (freeConnections.size() > 0) {
            con = (Connection) freeConnections.firstElement();
            freeConnections.removeElementAt(0);
            try {
                // DBMS에 의해 Connection이 close 되었으면 다시 요구
                if (con.isClosed()) {
                    Log.err("Removed bad connection from " + name);
                    con = getConnection();
                }
            } // 요상한 Connection 발생하면 다시 요구
            catch (SQLException e) {
                Log.err(e, "Removed bad connection from " + name);
                con = getConnection();
            }
        } // Connection이 Free List에 없으면 새로 생성
        else if (maxConn == 0 || checkedOut < maxConn) {
            con = newConnection();
        }
        if (con != null) {
            checkedOut++;
        }
        return con;
    }
 
    // Connection을 얻음
    // @param timeout : Connection을 얻기 위한 최대 기다림 시간
    public synchronized Connection getConnection(long timeout) {
        long startTime = new Date().getTime();
        Connection con;

        while ((con = getConnection()) == null) {
            try {
                wait(timeout * maxWait);
            } catch (InterruptedException e) {}
            if ((new Date().getTime() - startTime) >= timeout) {
                // 기다림 시간 초과
                return null;
            }
        }
        return con;
    }
 
    // Connection 생성
    private Connection newConnection() {
        Connection con = null;

        try {
            if (user == null) {
                con = DriverManager.getConnection(URL);
            } else {
                con = DriverManager.getConnection(URL, user, password);
            }
            Log.out("Created a new connection in pool " + name);
        } catch (SQLException e) {
            Log.err(e,
                    "Can't create a new connection for " + URL + " user : "
                    + user + " passwd : " + password);
            return null;
        }
        return con;
    }
}



DBConnectionPoolManager.java


package net.java_school.db.dbpool;

 

import java.sql.*;

import java.util.*;

import net.java_school.util.Log;


public class DBConnectionPoolManager {

         // 인스턴스를 하나만 유지하기 위해 static 으로 선언

         static private DBConnectionPoolManager instance=null;

         //JDBC 드라이버 관리

         private Vector drivers = new Vector();

         // DB Connection Pool List

         private Hashtable pools = new Hashtable();

         // DBConnectionPoolManager의 instance를 얻음

         // @return DBConnectionManger

         static synchronized public DBConnectionPoolManager getInstance() {

                  if (instance == null) {

                           instance = new DBConnectionPoolManager();

                  }

                  return instance;

         }

        

         // Default Constructor

         private DBConnectionPoolManager() {}

 

         // 현재 Connection을 Free Connection List로 보냄

         // @param name : Pool Name

         // @param con : Connection

         public void freeConnection(String name, Connection con) {

                  DBConnectionPool pool = (DBConnectionPool) pools.get(name);

                  if (pool != null) {

                           pool.freeConnection(con);

                  }

                  Log.out("One Connection of " + name + " was freed");

         }

 

         // Open Connection을 얻음. 현재 열린 커넥션이 없고 최대 커넥션 개수가

         // 사용 중이 아닐 때는 새로운 커넥션을 생성. 현재 열린 커넥션이 없고

         // 최대 커넥션 개수가 사용 중일 때 기본 대기 시간을 기다림

         // @param name : Pool Name

         // @return Connection : The connection or null

         public Connection getConnection(String name) {

                  DBConnectionPool pool = (DBConnectionPool) pools.get(name);

                  if (pool != null) {

                           return pool.getConnection(10);

                  }

                  return null;

         }

 

         // Connection Pool을 생성

         // @param poolName : 생성할 Pool Name

         // @param url : DB URL

         // @param user : DB UserID

         // @param password : DB Password

         private void createPools(String poolName, String url, String user, String password, int maxConn, int initConn, int maxWait) {

                  DBConnectionPool pool = new DBConnectionPool(poolName, url, user, password, maxConn, initConn, maxWait);

                  pools.put(poolName, pool);

                  Log.out("Initialized pool " + poolName);

         }

 

         // 초기화 작업

         public void init(String poolName, String driver, String url, String user, String passwd, int maxConn, int initConn, int maxWait) {

                  loadDrivers(driver);

                  createPools(poolName, url, user, passwd, maxConn, initConn, maxWait);

         }

 

         // JDBC Driver Loading

         // @param driverClassName : 사용하고자 하는 DB의 JDBC 드라이버

         private void loadDrivers(String driverClassName) {

                  try {

                           Class.forName(driverClassName);

                           drivers.addElement(driverClassName);

                           Log.out("Registered JDBC driver " + driverClassName);

                  } catch (Exception e) {

                           Log.err(e, "Can't register JDBC driver: " + driverClassName);

                  }

         }

        

         public Hashtable getPools() {

                  return pools;

         }

        

         public int getDriverNumber() {

                  return drivers.size();

         }

}



ConnectionManager.java


package net.java_school.db.dbpool;

 

import java.sql.*;

import java.io.*;

import java.util.*;

import net.java_school.util.Log;

 

public abstract class ConnectionManager {

         protected DBConnectionPoolManager connMgr=null;

         protected String poolName, dbServer, dbName, port, userID, passwd;

         int maxConn,initConn, maxWait;

         private Properties dbProperties;

         private String configFile;

 

         public ConnectionManager(String pool) {

                  poolName = pool;

                  // mnd 컨텍스트 베이스에 config디렉토리에 Property파일이 있음을 가정

                  configFile = "F:\\apps\\tomcat\\webapps\\mnd\\config\\"+poolName+".properties";

                  try {

                           dbProperties = readProperties();

                           dbServer = getProperty( "dbServer" );

                           port = getProperty( "port" );

                           dbName = getProperty( "dbName" );

                           userID = getProperty( "userID" );

                           passwd = getProperty( "passwd" );

                           maxConn = Integer.parseInt(getProperty("maxConn"));

                           initConn = Integer.parseInt(getProperty("initConn"));

                           maxWait = Integer.parseInt(getProperty("maxWait"));

                  } catch( IOException ioe ) {

                           Log.err( "Error reading properties of " + configFile);

                  }

         }

 

         public Connection getConnection() {

                  return (connMgr.getConnection(poolName));

         }

 

         public void freeConnection(Connection conn) {

                  connMgr.freeConnection(poolName,conn);

         }

 

         private String getProperty( String prop ) throws IOException {

                  return ( dbProperties.getProperty( prop ) );

         }

 

         protected synchronized Properties readProperties() throws IOException {

                  Properties tempProperties = new Properties();

                  FileInputStream in = new FileInputStream(configFile);

                  tempProperties.load(in);

                  return tempProperties;

         }

        

         public int getDriverNumber() {

                  return connMgr.getDriverNumber();

         }

}


OracleConnectionManager.java


package net.java_school.db.dbpool;

 

public class OracleConnectionManager extends ConnectionManager {

         public OracleConnectionManager() {

                  super("oracle");

                  String JDBCDriver = "oracle.jdbc.driver.OracleDriver";

                  // 오라클용 JDBC thin driver

                  String JDBCDriverType = "jdbc:oracle:thin";

                  String url = JDBCDriverType+":@"+dbServer + ":" + port + ":" + dbName;

                  connMgr = DBConnectionPoolManager.getInstance();

                  connMgr.init(poolName, JDBCDriver, url, userID, passwd, maxConn, initConn, maxWait);

         }

}

 

oracle.properties

 

#########################################
# Database Connection Properties for Oracle 9i
#########################################

# Database Server Name OR IP address
dbServer=127.0.0.1

# The port number your DB server listents to.
port=1521

# Database Name
dbName=ORCL

# Database User
userID=scott

# Database Password
passwd=tiger

# Maximum Connection Number
maxConn=20

# Inital Connection Number
initConn=5

# Maximum Wait Time
maxWait=5

 

문제 1

getEmp.jsp 를 ConnectionPool을 이용하게 고쳐보세요

 

 

getEmpWithPool.jsp

 

<%@ page contentType="text/html;charset=euc-kr" %>

<%@ page import="java.sql.*, net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" class="net.java_school.db.dbpool.OracleConnectionManager" scope="application" />

<%

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

String query="select * from emp";

try {

          //데이터베이스의 연결을 설정합니다.커넥션풀 이용

          conn=dbmgr.getConnection();

          //Statement를 가져온다.

          stmt=conn.createStatement();

          //SQL문을 실행합니다.

          rs=stmt.executeQuery(query);

          while(rs.next()) {

                   String empno=rs.getString(1);

                   String ename=rs.getString(2);

                   String job=rs.getString(3);

                   String mgr=rs.getString(4);

                   String hiredate=rs.getString(5);

                   String sal=rs.getString(6);

                   String comm=rs.getString(7);

                   String depno=rs.getString(8);

                   //결과를 출력합니다.

                   out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

          }

} catch (SQLException e) {

         out.println("SQLException: " + e.getMessage());

} finally {

         try {

                  rs.close();

                  stmt.close();

                  dbmgr.freeConnection(conn);

         } catch(SQLException e){}

}

%>

 

문제 2 : 위 파일을 로그 클래스(Log.java)를 이용해서 SQLException이 일어날때 이를 로그 파일(error.dbg)에 기록하게 고치세요

 

: getEmpWithPooldbg.jsp

 

<%@ page contentType="text/html;charset=euc-kr" %>

<%@ page import="java.sql.*, net.java_school.db.dbpool.*, net.java_school.util.*" %>

<jsp:useBean id="dbmgr" class="net.java_school.db.dbpool.OracleConnectionManager"

scope="application" />

<%

Log log = new Log();

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

String query="select * from emp";

try {

         //데이터베이스의 연결을 설정합니다.커넥션풀 이용

         conn=dbmgr.getConnection();

         //Statement를 가져온다.

         stmt=conn.createStatement();

         //SQL문을 실행합니다.

         rs=stmt.executeQuery(query);

         while(rs.next()) {

                  String empno=rs.getString(1);

                  String ename=rs.getString(2);

                  String job=rs.getString(3);

                  String mgr=rs.getString(4);

                  String hiredate=rs.getString(5);

                  String sal=rs.getString(6);

                  String comm=rs.getString(7);

                  String depno=rs.getString(8);

                  //결과를 출력합니다.

                  out.println(empno+" : "+ename+" : "+job+" : "+mgr+" : "+hiredate+" : "+sal+" : "+comm+" : "+depno+"<br>");

         }

} catch (SQLException e) {

         log.debug("Error Source:getEmpWithPooldbg.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally {

         try {

                  rs.close();

                  stmt.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch (SQLException e){}

}

%>

 

위 파일에서 select * from emp 란 스트링을 일부러 에러가 나게 select * fromemp 라고 고치고 다시 테스트해봅니다.

 

로그파일은 Log.java 파일에서 정한대로의 위치에 error.dbg 란 파일을 내용없이 만들어 위치시켜야 합니다.

 

그러면 다음과 같이 로그 파일에 기록이 쌓이는 것을 확인할 수 있습니다.

 

Sat Jun 19 14:01:58 KST 2004 : Error Source:getEmpWithPooldbg.jsp : SQLException
Sat Jun 19 14:01:58 KST 2004 : SQLState : 42000
Sat Jun 19 14:01:58 KST 2004 : message : ORA-00923: FROM 키워드가 있어야할 곳에 없습니다
Sat Jun 19 14:01:58 KST 2004 : Oracle Error Code : 923
Sat Jun 19 14:01:58 KST 2004 : Query : select * fromemp

여기까지 오셨다면 게시판을 위한 준비가 다 된 것입니다.

파일에 로그 파일 쌓이지 않은다면 ConnectionManager.java 의 코드에서 명시한 디렉토리에 error.dbg 파일이 없기 때문입니다.


 

 게시판 연습

 

먼저 테이블을 만듭니다. (오라클에 대한 내용은 오라클 카테고리의 글을 참고하세요)

 

-- 게시판 연습 테이블
create table board(
 num number primary key,
 subject varchar2(200) not null,
 sogae varchar2(4000) not null,
 content varchar2(4000),
 wdate date
);

create sequence seq_board_num
start with 1
increment by 1;

 

적당한 디렉토리에 board.sql로 위 내용으로 만들고 scott 계정으로 접속하여 (C:\에 저장했다면)

 

@C:\board.sql

 

하면 테이블과 시퀀스가 생성됩니다.

 

여기서의 게시판은 단순한 기본적인 기능만을 가진 것을 만들어 보겠습니다.

다음은 게시판을 위해 쓸 파일 흐름도 입니다.

(서블릿과 JSP 를 모두 이용하기 위해 애쓴것이지 이와 같이 프로그래밍하지는 않습니다.)

 

list.jsp ---> write_form.jsp

                  |              |--------->BoardWriter.java(서블릿) - DB insert 문 실행

                  |                                         

                  |---> view.jsp : 게시물의 내용을 보여준다.

                             |

                             |

                             |---> modify_form.jsp

                             |            |----------> BoardModifier.java(서블릿) --- DB update 문 실행

                             |

                             |---> delete_confirm.jsp

                                          |-----------> BoardDeleter.java(서블릿) -- DB delete 문 실행

 

list.jsp : 게시물을 모두 보여줍니다.(페이지분할 기능, 페이지 직접 이동 기능, 검색 기능은 후에 붙이도록 합니다.)

write_form.jsp : 새글 입력 폼 화면

BoardWriter.java : 새글 입력을 실제로 DB에 입력하는 서블릿

view.jsp : 해당 게시물의 상세 정보를 출력하는 페이지

modify_form.jsp : 수정 입력 폼 화면

BoardModifier.java : 수정을 위해 실제로 DB 테이블을 수정을 행하는 서블릿

delete_confirm.jsp : 삭제를 사용자가 선택했을 때 삭제를 정말로 할 것인가 확인하는 화면

BoardDeleter.java : 테이블에서 해당 레코드를 삭제하는 서블릿

 

각각의 소스

 

/bbs/bbs01/list.jsp


<%@ page contentType="text/html;charset=euc-kr" %>

<%@ page import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application" class="net.java_school.db.dbpool.OracleConnectionManager" />

<html>

<body>

<%

Log log = new Log();

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String query = null;

try{

         conn = dbmgr.getConnection();

         query = "select num,subject,wdate from board order by num desc";

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

         while(rs.next()){

         int num = rs.getInt("num");

         String subject = rs.getString("subject");

         Date wdate = rs.getDate("wdate");

%>

<a href="view.jsp?num=<%= num %>"><%= subject%></a>&nbsp;&nbsp;<%= wdate.toString() %><br>

<%

         }

} catch(SQLException e){

         log.debug("Error Source:bbs/list.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally {

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch (SQLException e){}

}

%>

<br>

<br>

<p>

<a href="write_form.jsp">새글 쓰기</a>

</body>

</html>

 

/bbs/bbs01/write_form.jsp

 

<%@ page contentType="text/html;charset=euc-kr" %>
<html>
<body>
<center><h1>새글 쓰기</h1></center>
<hr>
<table cellspacing="0" cellpadding="0" border="0" width="600" align="center">
<form name="frm" method="POST" action="../servlet/bbs01.BoardWriter">
<tr>
 <td width="100" align="center">제목</td><td><input type="text" name="subject" size="45"></td>
</tr>
<tr>
 <td width="100" align="center">소개글</td><td><textarea name="sogae" rows="10"

cols="60"></textarea></td>
</tr>
<tr>
 <td width="100" align="center">본문</td><td><textarea name="content" rows="10"

cols="60"></textarea></td>
</tr>
<tr>
 <td colspan="2" align="center"><input type="submit" value="전송">&nbsp;&nbsp;&nbsp;<input type="reset" value="취소"></td>
</tr>
</form>
</table>
<br>
<center><a href="list.jsp">목록으로</a></center>
</body>
</html>

 

/bbs/WEB-INF/classes/BoardWriter.java

 

package bbs01;

 

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import net.java_school.db.dbpool.*;

import net.java_school.util.*;

 

public class BoardWriter extends HttpServlet {

         PreparedStatement prepare = null;

         OracleConnectionManager dbmgr = null;

         // 입력 순서 : 시퀀스 , 제목, 소개글, 본문

         String query = "insert into board values (seq_board_num.nextval,?,?,?,sysdate)";

 

         public void init()  throws ServletException {

           ServletContext sc = getServletContext();
           dbmgr = (OracleConnectionManager)sc.getAttribute("dbmgr");
         }
 

         public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

                  req.setCharacterEncoding("euc-kr");

                  Log log = new Log();

                  String subject = req.getParameter("subject");

                  String sogae = req.getParameter("sogae");

                  String content = req.getParameter("content");

                  Connection con = dbmgr.getConnection();

                  try {

                           prepare = con.prepareStatement(query);

                           prepare.setString(1,subject); //제목 부분

                           prepare.setString(2,sogae); // 소개글 부분

                           prepare.setString(3,content); // 본분 부분

                           prepare.executeUpdate();      // 쿼리 실행

                  } catch (SQLException e){

                           log.debug("Error Source:BoardWriter.java : SQLException");

                           log.debug("SQLState : " + e.getSQLState());

                           log.debug("Message : " + e.getMessage());

                           log.debug("Oracle Error Code : " + e.getErrorCode());

                           log.debug("Query : " + query);

                  } finally {

                           try {

                                   prepare.close();

                                   dbmgr.freeConnection(con);

                                   log.close();

                           } catch(SQLException e){}

                           String path = req.getContextPath();

                           res.sendRedirect(path+"/bbs01/list.jsp");

                  }

         }

}

 

/bbs/bbs01/view.jsp

 

<%@ page contentType="text/html;charset=euc-kr" import="java.sql.*,

net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application"

class="net.java_school.db.dbpool.OracleConnectionManager" />

<html>

<body>

<%

int num = Integer.parseInt(request.getParameter("num"));

Log log = new Log();

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String query = null;

try{

         conn = dbmgr.getConnection();

         query = "select num,subject,sogae,content,wdate from board where num="+num;

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

         while(rs.next()){

                  String subject = rs.getString("subject");

                  String sogae = rs.getString("sogae");

                  String content = rs.getString("content");

                  Date wdate = rs.getDate("wdate");

%>

<%= subject %></a><br>

<hr>

<%= sogae %><br>

<hr>

<%= content %><br>

<hr>

<%= wdate.toString() %><br>

<%

         }

} catch(SQLException e){

         log.debug("Error Source:bbs/view.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally{

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch(SQLException e){}

}

%>

<form name="modify" method="POST" action="modify_form.jsp">

<input type="submit" value="수정">

<input type="hidden" name="num" value="<%= num %>">

</form>

<form name="delete" method="POST" action="delete_confirm.jsp">

<input type="submit" value="삭제">

<input type="hidden" name="num" value="<%= num %>">

</form>

<br>

<a href="list.jsp">목록으로</a>

</body>

</html>

 

/bbs/bbs01/modify_form.jsp

 

<%@ page contentType="text/html;charset=euc-kr"

import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application"

class="net.java_school.db.dbpool.OracleConnectionManager" />

<%

Log log = new Log();

int num = Integer.parseInt(request.getParameter("num"));

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String subject = null;

String sogae = null;

String content = null;

String query = "select subject,sogae,content from board where num ="+num;

try {

         conn = dbmgr.getConnection();

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

 

         while(rs.next()){

                  subject = rs.getString("subject");

                  sogae = rs.getString("sogae");

                  content = rs.getString("content");

         }

} catch(SQLException e){

         log.debug("Error Source:modify_form.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally{

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch(SQLException e){}

}

%>

<html>

<body>

<center><h1>글 수정</h1></center>

<hr>

<table cellspacing="0" cellpadding="0" border="0" width="600" align="center">

<form name="frm" method="POST" action="../servlet/bbs01.BoardModifier">

<input type="hidden" name="num" value="<%= num %>">

<tr>

         <td width="100" align="center">제목</td><td><input type="text" name="subject" size="45" value="<%= subject %>"></td>

</tr>

<tr>

         <td width="100" align="center">소개글</td><td><textarea name="sogae" rows="10" cols="60"><%= sogae %></textarea></td>

</tr>

<tr>

         <td width="100" align="center">본분</td><td><textarea name="content" rows="10" cols="60"><%= content %></textarea></td>

</tr>

<tr>

         <td colspan="2" align="center"><input type="submit" value="전송">&nbsp;&nbsp;&nbsp;<input type="reset" value="취소"></td>

</tr>

</form>

</table>

<br>

<center><a href="list.jsp">목록으로</a></center>

</body>

</html>

 

/bbs/WEB-INF/classes/BoardModifier.java

 

package bbs01;

 

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import net.java_school.db.dbpool.*;

import net.java_school.util.*;

 

public class BoardModifier extends HttpServlet {

         PreparedStatement prepare = null;

         OracleConnectionManager dbmgr = null;

         String query = "update board set subject=?, sogae=?, content=? where num=?";

        

         public void init()  throws ServletException {
           ServletContext sc = getServletContext();
           dbmgr = (OracleConnectionManager)sc.getAttribute("dbmgr");
         }
 

         public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

                  req.setCharacterEncoding("euc-kr");

                  Log log = new Log();

                  int num = Integer.parseInt(req.getParameter("num"));

                  String subject = req.getParameter("subject");

                  String sogae = req.getParameter("sogae");

                  String content = req.getParameter("content");

                  Connection con = dbmgr.getConnection();

                  try{

                           prepare = con.prepareStatement(query);

                           prepare.setString(1,subject);   //제목 부분

                           prepare.setString(2,sogae);    // 소개글 부분

                           prepare.setString(3,content);   // 본분 부분

                           prepare.setInt(4,num);     // 시퀀스 primary key

                           prepare.executeUpdate();    // 쿼리 실행

                  }catch(SQLException e){

                           log.debug("Error Source:BoardModifier.java : SQLException");

                           log.debug("SQLState : " + e.getSQLState());

                           log.debug("Message : " + e.getMessage());

                           log.debug("Oracle Error Code : " + e.getErrorCode());

                           log.debug("Query : " + query);

                  } finally {

                           try {

                                   prepare.close();

                                   dbmgr.freeConnection(con);

                                   log.close();

                           } catch(SQLException e){}

                           String path = req.getContextPath();

                           res.sendRedirect(path+"/bbs01/view.jsp?num="+num);

                  }

         }

}

 

/bbs/bbs01/delete_confirm.jsp

 

<%@ page contentType="text/html;charset=euc-kr"

import="java.sql.*,net.java_school.util.*,net.java_school.db.dbpool.*" %>

<jsp:useBean id="dbmgr" scope="application"

class="net.java_school.db.dbpool.OracleConnectionManager" />

<%

Log log = new Log();

int num = Integer.parseInt(request.getParameter("num"));

Connection conn = null;

PreparedStatement prepare = null;

ResultSet rs = null;

String subject = null;

String sogae = null;

String query = "select subject,sogae from board where num ="+num;

try {

         conn = dbmgr.getConnection();

         prepare = conn.prepareStatement(query);

         rs = prepare.executeQuery();

 

         while(rs.next()){

         subject = rs.getString("subject");

         sogae = rs.getString("sogae");

         }

} catch(SQLException e){

         log.debug("Error Source:delete_confirm.jsp : SQLException");

         log.debug("SQLState : " + e.getSQLState());

         log.debug("Message : " + e.getMessage());

         log.debug("Oracle Error Code : " + e.getErrorCode());

         log.debug("Query : " + query);

} finally{

         try {

                  rs.close();

                  prepare.close();

                  dbmgr.freeConnection(conn);

                  log.close();

         } catch(SQLException e){}

}

%>

<html>

<body>

<center><h1>삭 제 확 인</h1></center>

<hr>

<table cellspacing="0" cellpadding="0" border="0" width="600" align="center">

<form name="frm" method="POST" action="../servlet/bbs01.BoardDeleter">

<input type="hidden" name="num" value="<%= num %>">

<tr>

         <td width="100" align="center">제목</td><td><input type="text" name="subject" size="45" value="<%= subject %>"></td>

</tr>

<tr>

         <td width="100" align="center">소개글</td><td><textarea name="sogae" rows="10" cols="60"><%= sogae %></textarea></td>

</tr>

<tr>

         <td colspan="2" align="center">위 글을 정말로 삭제하겠습니까?</td>

</tr>

<tr>

         <td colspan="2" align="center"><input type="submit" value="삭제">&nbsp;&nbsp;&nbsp;

<input type="button" value="취소" onClick="javascript:history.go(-1)"></td>

</tr>

</form>

</table>

</body>

</html>

 

/bbs/WEB-INF/classes/BoardDeleter.java

 

package bbs01;

 

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import net.java_school.db.dbpool.*;

import net.java_school.util.*;

 

public class BoardDeleter extends HttpServlet {

         PreparedStatement prepare = null;

         OracleConnectionManager dbmgr = null;

         String query = "delete board where num=?";

 

         public void init()  throws ServletException {
           ServletContext sc = getServletContext();
           dbmgr = (OracleConnectionManager)sc.getAttribute("dbmgr");
         }
 

         public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

                  req.setCharacterEncoding("euc-kr");

                  Log log = new Log();

                  int num = Integer.parseInt(req.getParameter("num"));

                  Connection con = dbmgr.getConnection();

                  try{

                           prepare = con.prepareStatement(query);

                           prepare.setInt(1,num);

                           prepare.executeUpdate();    // 쿼리 실행

                  }catch(SQLException e){

                           log.debug("Error Source:BoardDeleter.java : SQLException");

                           log.debug("SQLState : " + e.getSQLState());

                           log.debug("Message : " + e.getMessage());

                           log.debug("Oracle Error Code : " + e.getErrorCode());

                           log.debug("Query : " + query);

                  } finally {

                           try {

                                   prepare.close();

                                   dbmgr.freeConnection(con);

                                   log.close();

                           } catch(SQLException e){}

                           String path = req.getContextPath();

                           res.sendRedirect(path+"/bbs01/list.jsp");

                  }

         }

}

<출처: http://cafe.naver.com/webprogramguide >

+ Recent posts