Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

까먹지 말자! 자주 보자!

JSP BOARDER(1)_게시판 관리를 위한 컴포넌트(AdminManager.java) 본문

JSP

JSP BOARDER(1)_게시판 관리를 위한 컴포넌트(AdminManager.java)

Phonetographer 2016. 5. 24. 17:10

package board;

/**

 * 게시판 관리 컴포넌트

 * **/


import java.util.*;

import java.sql.*;

import board.*;

/**

 * AdminManager의 기능 구분

 * 멀티 게시판 생성 : 데이터베이스 Connection, 게시판 테이블 생성

 * 멀티 게시판 제어 : 로그인, 게시판 수정 및 삭제

 * 

 * AdminManager클래스는 현재 관리자로 로그인 되어 있는지 확인하고 새로운

 * 게시판을 생성하거나 게시판을 수정 및 삭제하는 기능을 제공하는 클래스

 * 

 * **/

public class AdminManager {

private static ConnectionPool connectionPool = null;

private static AdminManager adminManager = null;

private String id = "jabook";

private String password = "jabook";

/**게시판 관리를 위한 컴포넌트 시작**/

static{

//Connection을 초기화하는 connectionPool을 생성

try{

connectionPool = connectionPool.getConnectionPool();//ConnectionPool로부터 객체를 얻어 온다.

adminManager = adminManager.getInstance();//AdminManager클래스의 인스턴스를 얻어 온다.

}catch(Exception e){}

}

public AdminManager(){}

public static AdminManager getInstance(){

//AdminManager객체를 반환하는 메소드

//다른 클래스 또는 JSP에서 AdminManager클래스를 사용하려면 getInstance()메소드를 통해 객체를 얻은 후 사용가능하다.

adminManager = new AdminManager();

return adminManager;

}

/**게시판 관리를 위한 컴포넌트 끝**/

/**관리자 확인과 게시판 확인 중 게시판**/

public boolean existBoard(String boardName){

//해당하는 이름의 게시판이 존재하는지 유무를 검사하기 위한 메소드

//이 게시판은 멀티 게시판으로써 여러개의 게시판운영이 가능하다. 각 게시판은 게시판의 글들이 저장된 하나의 테이블을 각각 가지고 잇으며

//게시판 이름이 바로 해당 테이블으 이름으로 사용된다. 따라서 existBoard()메소드는 새로운 게시판을 생성할 때 그 이름의 게시판 테이블이 

//이미 데이터 베이스에 존재하는지의 여부를 체크하기 위해서 이용된다.

//만약 동일한 이름이 존재한다면 다른 이름을 이용해서 게시판을 생성하여야 한다.

//BoardAdmin테으블로부터 동일한 이름을 가진 테이블의 개수를 세는 SQL구문을 작성해서 질의를 수행한다. 

//이때 SQL구문의 리턴 값이 하나의 int형 숫자이기 때문에 우리가 앞서 작성한 adminExecuteQueryNum()메소드를 이용해서 질의를 수행한 것이다.

String sql = "select count(boardName) fromBoardAdmin where boardName='"+boardName+"'";

int num = this.adminExecuteQueryNum(sql);

if(num ==0){

return false;

}else{

return true;

}

}

/**새로운 게시판 생성**/

public void makeBoard(String boardName, String boardSubject){

//새로운 게시판을 만들기 위한 메소드

//BoardAdmin테이블에 게시판의 이름과 제목정보를 삽입한 후 새로운 게시판 테이블을 하나 만드는 역할의 메소드

String insertBoardSQL = "insert BoardAdmin values('"+boardName+"','"+boardSubject+"')";

String makeBoardSQL = "create table" + boardName + "(";

makeBoardSQL += "num int NOT NULL PRIMARY KEY,";

makeBoardSQL += "name varchar(20) NOT NULL,";

makeBoardSQL += "subject varchar(100) NOT NULL,";

makeBoardSQL += "content test null,";

makeBoardSQL += "writeDate datetime,";

makeBoardSQL += "password varchar(20) NOT NULL,";

makeBoardSQL += "count int NOT NULL,";

makeBoardSQL += "ref int NOT NULL,";

makeBoardSQL += "step int NOT NULL,";

makeBoardSQL += "depth int NOT NULL,";

makeBoardSQL += "childCount int NOT NULL,";

makeBoardSQL += ")";

this.adminExecuteUpdate(insertBoardSQL);

this.adminExecuteUpdate(makeBoardSQL);

}

/**관리자 확인과 게시판 확인 중 관리자**/

public boolean chkAdmin(String id, String pass){

//관리자로 로그인 했는지의 여부를 파악하기 위한 메소드

//로그인 하려는 사용자가 게시판을 생성 및 수정, 삭제를 할 수 있는 권한을 가진 사용자인지 판별하기 위한 메소드

//오직 관리자만이 게시판을 생성하고 수정 및 삭제할 수 있는 권한을 갖는다. 

//여기서는 chkAdmin()메소드로 전달된 매개변수의 id와 pass를 가지고 인증을 통하여 관리자 권한을 주고,

//그렇지 않다면 false값을 반환함으로서 권한이 없음을 알려준다.

if(this.id.equals(id)&&this.password.equals(pass)){

return true;

}else{

return false;

}

}

public boolean isAdmin(String id){

//관리자로 로그인 했는지의 여부를 파악하기 위한 메소드

if(id.equals(this.id)){

return true;

}else{

return false;

}

}

/**게시판 목록 반환**/

public Hashtable getBoardList() throws Exception{

//게시판의 리스트를 해쉬테이블로 반환하는 메소드

//getBoardList()메소드는 데이터베이스의 BoardAdmin테이블로부터 전체 필드의 내용을 가져오는 역할을 하는 메소드

//여기서 가져 오는 정보는 게시판의 이름과 게시판의 제목으로써, 이를 키와 값으로 구성된 Hashtable형태로 반환

//이때 게시판의 이름은 Hashtable의 키로서 저장되며, 게시판의 제목은 Hashtable의 값으로 저장

Hashtable ht = new Hashtable();

Connection conn = null;

try{

conn = connectionPool.getConnection();

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("select * from BoardAdmin");

while(rs.next()){

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

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

ht.put(boardName, boardSubject);

}

rs.close();

stmt.close();

}catch(Exception e){

e.printStackTrace();

}finally{

connectionPool.releaseConnection(conn);

}

return ht;

}

public void updateBoard(String boardName, String boardSubject){

//게시판의 제목을 수정하는 메소드

//updateBoard메소드는 BoardAdmin테이블의 정보를 수정하는 역할을 하는 메소드이다. 

//그러나 BoardAdmin테이블은 단지 게시판의 이름과 게시판의 제목에 대한 필드만 가지고 있고 게시판의 이름은 한번

//정하면 변경이 불가능하기 때문에 테이블의 제목만 변경이 가능하다. 실제로 사용할 때는 테이블의 필드를 보다 구체화 하여 여러가지 옵션을

//더해 줄 수 있을 것이다.

String sql = "update BoardAdmin set boardSubject ='"+ boardSubject+"'where boardName='"+boardName+"'";

this.adminExecuteUpdate(sql);

}

public void deleteBoard(String BoardName){

//게시판 삭제 메소드

//BoardAdmin테이블에 존재하던 게시판에 대한 정보를 삭제하고 실제 게시판 테이블을 삭제하는 두 가지 작업을 해야한다.

//코드를 보면 매개변수로 전달된 게시판 이름에 해당하는 레코드를 BoardAdmin테이블로부터 삭제한 후 Drop Table질의문을 이용해서 해당 테이블을 삭제하고 있다.

String deleteRecoedSQL = "delete from BoardAdmin where voardNAme='"+BoardName+"'";

String dropBoardSQL = "Drop Table" + BoardName;

this.adminExecuteUpdate(deleteRecoedSQL);

this.adminExecuteUpdate(dropBoardSQL);

}

/**SQL 실행을 위한 공통 메소드 시작**/

public void adminExecuteUpdate(String sql){

//리턴값이 없는 sql 실행 메소드(Update, delete 등의 sql구문 실행 시 사용)

Connection conn = null;

try{

conn = connectionPool.getConnection();

Statement stmt = conn.createStatement();

stmt.executeUpdate(sql);

stmt.cancel();

}catch(Exception e){

e.printStackTrace();

}finally{

connectionPool.releaseConnection(conn);//반드시 Connection을 반납해 줘야함.

  //finally를 사용하여 예외와 상관없이 무조건 데이터베이스의 Connection을 받납해줌.

}

}

public Vector adminExecuteQuery(String sql){

//게시판 전체 내용을 Vector로 반환하는 메소드

//질의를 수행한 후 그 결과를 받아 BoardData 클래스의 setter 메소드를 이용해서 BoardData객체로 저장한다.

//그리고 이렇게 저장된 하나 이상의 BoardData의 객체를 vector형태로 리턴해주는 메소드이다.

Vector v = new Vector();

Connection conn = null;

try{

conn = connectionPool.getConnection();

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

BoardData data = new BoardData();

data.setNum(rs.getInt(1));

data.setName(rs.getString(2));

data.setSubject(rs.getString(3));

data.setContent(rs.getString(4));

data.setDate(rs.getDate(5));

data.setPassword(rs.getString(6));

data.setCount(rs.getInt(7));

data.setRef(rs.getInt(8));

data.setStep(rs.getInt(9));

data.setDepth(rs.getInt(10));

data.setChildCount(rs.getInt(11));

v.addElement(data);

}

rs.close();

stmt.close();

}catch(Exception e){

e.printStackTrace();

}finally{

connectionPool.releaseConnection(conn);

}

return v;

}

public int adminExecuteQueryNum(String sql){

//질의문의 결과가 하나의 int형일 경우를 위한 메소드(질의를 날리고 그 결과를 받아 올 대 그 값이 하나 뿐이며, 데이터 형이 int와 대응될 때 사용.)

//게시판 글의 전체 개수나 검색된 글의 수 등과 같은 질의에 대하여 숫자 값 하나가 리턴 될 때 쓰일 수 있음.

int num = 0;

Connection conn = null;

try{

conn = connectionPool.getConnection();

Statement stmt  = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

num = rs.getInt(1);

}

rs.close();

stmt.close();

}catch(Exception e){

e.printStackTrace();

}finally{

connectionPool.releaseConnection(conn);

}

return num;

}

public String adminExecuteQueryString(String sql){

//질의문의 결과가 하나의 String형일 경우를 위한 메소드

//public int adminExecuteQueryNum(String sql) 메소드와는 반대로 쿼리에 대한 결과가 하나의 String형으로 나올 때 사용된다.

//게시판 글을 삭제할 때 비밀번호를 대조하는 곳에 사용

String str = null;

Connection conn = null;

try{

conn = connectionPool.getConnection();

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(sql);

while(rs.next()){

str = rs.getString(1);

}

rs.close();

stmt.close();

}catch(Exception e){

e.printStackTrace();

}finally{

connectionPool.releaseConnection(conn);

}

return str;

}

/**SQL 실행을 위한 공통 메소드 종료**/

}