까먹지 말자! 자주 보자!
JSP BOARDER(1)_게시판 관리를 위한 컴포넌트(AdminManager.java) 본문
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 실행을 위한 공통 메소드 종료**/
}
'JSP' 카테고리의 다른 글
JSP BOARDER(3)_(ConnectionFactory .java) (0) | 2016.05.24 |
---|---|
JSP BOARDER(2)_(BoardData .java) (0) | 2016.05.24 |
request와 response의 동작과정 (0) | 2016.05.18 |
doGet Servlet과 doPost Servlet (get방식, post방식) (0) | 2016.05.18 |
서블릿(Servler) 동작원리 (0) | 2016.05.18 |