[개요 - 사용한 코드의 설계도 ]
editBoard.jsp | boardform.js | processboard.jsp |
기본 작성 화면 구성 제목, 내용, 이름등을 적을 공간과 버튼 등을 table로 구성 id값, menu값은 hidden으로 전달 boardform.js 연결 - 알람 받음 proessboard.jsp 연결 |
editBoard.jsp에 연결된 scirpt 이다. 입력된 값을 전달 받아서 그에 따른 alter() 수행 boardform.sumit을 통해 editBoard로 전송을 수행 >> edicBoard의 form에서 받아서processbboard로 이동 |
editBoard로 부터 전달된 menu에 따라 BoardDBCP.java로 전달된 파라미터를 전달하여 데이터베이스 작업을 명령 하고 listBoard로 이동 |
listBoard.jsp | BoardDBCP.java | BoardEntity .java |
게시판을 작성하고 이동하는 목록창 구현 BoardDBCP를 이용해 테이블의 모든 내용을 get함 get한 내용을 BoardEntity에 담아서for문을 이용하여 목록창 형태로 출력한다. 날짜는 simpleDateFormat을 통해 현재시간 받아오기 id값에 링크를 달아 그 아이디에 대한 editBoard.jsp로 이동하도록 함 |
DB로의 연결을 위한 객체를 생성 쿼리문을 실행하는 공간 생성자를 통해 드라이버를 로드함 getBoardList() : 테이블 내의 모든 데이터를 BoardEntity 인스턴스를 통해서 list에 담는다. getSearchList (): name값에 대한 데이터 를 list에 추가 하고 return getBoard : 전달 받은 id값에 대한 데이터를 BoardEntity인스턴스에 담아서 set한다 insertDB() :DB에 값을 저장한다. updateDB() : DB의 값을 변경 deletDB() : DB의 값을 전달받은 id에 따라 삭제 isPasswd() : 전달받은 passwd와 DB에 저장된 passwd가 같은지 확인 |
getter, setter 가 있는공간 폼에 입력한 정보를 DB로 옮기거나 DB의 내용을 폼으로 꺼내올때 그것을 옮길 바구니로써 사용하는 공간을 구현함 BoardEntity의 인스턴스를 생성하여 데이터를 옮긴다. |
editBoard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시폼 작성</title>
</head>
<!-- 파일 boardform.js: 폼의 각 입력값이 있는지를 검토하는 함수 구현 -->
<script src="boardform.js"></script>
<!-- boardform.js를 가져다 쓰겠다는 말 -->
<body>
<%@ page import="univ.*"%>
<%
String name = "";
String email = "";
String title = "";
String content = "";
String headline = "등록"; // 시작하는 값은 등록
String id = request.getParameter("id");
// listBoard.jsp로 부터 전달받는 값 id
//새 문서 쓰기에서는 아이디값이 전달되지 않음으로 null
if (id != null) {
//등록이 아닌 경우, 출력을 위해 선택한 게시의 각 필드 내용을 저장
int idnum = Integer.parseInt(id);
BoardDBCP brddb = new BoardDBCP();
BoardEntity brd = brddb.getBoard(idnum);
name = brd.getName();
email = brd.getEmail();
title = brd.getTitle();
content = brd.getContent();
headline = "수정 삭제"; // 수정할떄는 게시판 헤드라인 변경
}
;
%>
<h2>
게시판
<%=headline%>
프로그램
</h2>
<hr>
<form action="processboard.jsp" name="boardform" method="post">
<!-- menu : 등록, 수정 또는 삭제 구분을 위한 매개 변수로 이용 -->
<input type="hidden" name="menu" value="insert">
<!-- 수정 또는 삭제를 위한 게시 id를 hidden으로 전송 -->
<input type="hidden" name="id" value=<%=id%>>
<table>
<!-- 5행2열 -->
<tr>
<td align="center">
<!-- 안에 들어오는 table을 중앙에 위치시키기 위해 -->
<table>
<!-- 첫번째 행 전체 안에 작성, 2행4열 테이블 -->
<tr>
<td colspan="2">
<table>
<tr>
<td>이름 :</td>
<td width="50"><input type="text" name="name" value="<%=name%>" size="30" maxlength="20"></td>
<td>전자 메일 :</td>
<td width="50"><input type="text" name="email" size="30" value="<%=email%>" maxlength="30"></td>
<tr>
<td>제목 :</td>
<td colspan="3"><input type="text" name="title" size="80" value="<%=title%>" maxlength="100"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan="2">
<!-- 두번째행 --> <textarea name=content rows=10 cols=90> <%=content%> </textarea>
</td>
</tr>
<tr>
<!-- 세번째 행 -->
<td colspan="2">비밀번호 : <input type="password" name="passwd" size="20" maxlength="15"> <font color="red">현재 게시판 수정 또는 삭제하려면 이미 등록한 비밀번호가 필요합니다.</font>
</td>
</tr>
<tr>
<!-- 네번째 행 -->
<td colspan="2" height="5">
<hr size="2">
</td>
</tr>
<tr>
<!-- 다섯번째행 -->
<td colspan="2">
<%
if (id == null) {
%>
<!-- 버튼을 누르면 boardform.js의 함수를 실행하여 processboard.jsp로 이동 -->
<input type="button" value="등록" onclick="insertcheck()"> <%
} else {
%> <!-- 버튼을 누르면 boardform.js의 각 함수를 힐생하여 processbaord.jsp로 이동 -->
<input type="button" value="수정 완료" onclick="updatecheck()">
<input type="button" value="삭제" onclick="deletecheck()"> <%
}
%> <!-- 목록보기 버튼을 listboard.jsp로 이동 -->
<input type="button" value="목록보기" onclick="location.href='listboard.jsp'">
</td>
</tr>
</table>
</td>
</tr>
</table>
</form>
</body>
</html>
각종 알람을 띄우고 menu의 값을 변경할 boardform.js
function deletecheck() {
if (document.boardform.passwd.value == "") {
alert("암호를 입력해 주세요!!");
document.boardform.passwd.focus();
return;
}
ok = confirm("삭제하시겠습니까");
if (ok) {
document.boardform.menu.value = "delete";
document.boardform.submit();
} else {
return;
}
}
function insertcheck() {
if (document.boardform.name.value == "") {
alert("이름을 입력해 주세요 !!");
document.boardform.name.focus();
return;
}
if (document.boardform.passwd.value == "") {
alert("암호를 입력해 주세요 !!");
document.boardform.passwd.focus();
return;
}
document.boardform.menu.value = "insert";
document.boardform.submit(); // processboard.jsp로 전송됨 (넘어감)
}
function updatecheck() {
if (document.boardform.name.value == "") {
alert("이름을 입력해 주세요");
document.boardform.name.focus();
return;
}
if (document.boardform.passwd.value == "") {
alert("암호를 입력해주세요");
document.boardform.passwd.focus();
return;
}
document.boardform.menu.value = "update";
document.boardform.submit();
}
boardform.js로 부터 editboard로 submit >> processboard로 이동한다.
processboard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시글 등록 수정 삭제 처리</title>
</head>
<body>
<!-- 게시글 등록, 수정, 삭제를 위한 자바빈즈 선언 -->
<jsp:useBean id="brd" class="univ.BoardEntity" scope="page"/> <!-- 한사람의 입력정보를 전달하기 위한 객체 -->
<jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>
<%
// 한글 처리를 위해 문자인코딩 지정
request.setCharacterEncoding("utf-8");
//등록(insert) 수정(update) 삭제(delete) 중 하나를 저장
String menu = request.getParameter("menu");
// 등록 또는 수정 처리 모듈
if(menu.equals("delete") || menu.equals("update")){
String id = request.getParameter("id");
String passwd = request.getParameter("passwd");
int idnum = Integer.parseInt(id);
// 데이터베이스 자바빈즈에 구현된 메소드 isPasswd()로 id와 암호가 일치하는지 검사
if(!brddb.isPasswd(idnum, passwd)){
%>
<!-- 암호가 틀리면 이전 화면으로 이동 -->
<script>alert("비밀번호가 다릅니다."); history.go(-1);</script>
<%
} else{
if(menu.equals("delete")){
// 삭제를 위한 데이터베이스 자바빈즈에 구현된 메소드 deleteDB() 실행
brddb.deleteDB(idnum);
}else if(menu.equals("update")){
%>
<!-- 수정 시 BoardEntity에 저장해야 하는 필드 id -->
<jsp:setProperty name="brd" property="id"/>
<jsp:setProperty name="brd" property="name"/>
<jsp:setProperty name="brd" property="title"/>
<jsp:setProperty name="brd" property="email"/>
<jsp:setProperty name="brd" property="content"/>
<%
// 수정을 위해 데이터베이스 자바빈즈에 구현된 메소드 updateDB() 실행
brddb.updateDB(brd);
}
// 기능 수행 후 다시 게시 목록 보기로 이동
response.sendRedirect("listboard.jsp");
}
}else if(menu.equals("insert")){
%>
<!-- 등록 시 BoardEntity에 저장해야 하는 필드 passwd -->
<!-- 입력 받은 값들을 집어넣음 -->
<jsp:setProperty name="brd" property="name"/>
<jsp:setProperty name="brd" property="title"/>
<jsp:setProperty name="brd" property="email"/>
<jsp:setProperty name="brd" property="content"/>
<jsp:setProperty name="brd" property="passwd"/>
<%
// 등록을 위해 데이터베이스 자바빈즈에 구현된 메소드 insertDB() 실행
brddb.insertDB(brd);
// 기능 수행 후 다시 게시 목록 보기로 이동
response.sendRedirect("listboard.jsp");
}
%>
</body>
</html>
process에서 BoardEntity의 인스턴스에 값을 저장하여 BoardDBCP의 인스턴스를 호출하여 명령에 맞는 쿼리문을 실행한다.(쿼리문 실행을 통하여 오라클에서 명령을 수행 )
그리고 response.sendRedirect를 통해 listboard.jsp로 이동한다.
listboard.jsp
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="univ.BoardEntity"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 기본 예제 : 게시 목록 표시</title>
</head>
<body>
<h2>게시판 목록 표시 프로그램</h2>
<hr>
<jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>
<%
//게시목록을 위한 배열 리스트를 자바빈즈를 이용하여 확보
ArrayList<BoardEntity> list = brddb.getBoardList();
int count = list.size();
int row =0;
if(count > 0){
%>
<table>
<tr>
<th><font color="blue"><b>번호</b></font></th>
<th><font color="blue"><b>제목</b></font></th>
<th><font color="blue"><b>작성자</b></font></th>
<th><font color="blue"><b>작성일</b></font></th>
<th><font color="blue"><b>전자메일</b></font></th>
</tr>
<%
//게시 등록일을 2022-10-14 10:33:21 형태로 출력하기
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
for(BoardEntity brd :list){
//홀짝으로 다르게 색상지정
String color ="papayawhip";
if(++row % 2 ==0)color ="white";
%>
<tr bgcolor="<%=color%>" onmouseover="this.style.backgroundColor='SkyBlue'"
onmouseout="this.style.backgroundColor='<%=color %>'">
<!-- 수정과 삭제를 위한 링크로 id를 전송 -->
<td align="center"> <a href="editBoard.jsp?id=<%= brd.getId()%>"> <%=brd.getId() %> </a></td>
<!--id값을 가지고 aditBoard.jsp로 이동하라 -->
<td align="left"> <%=brd.getTitle() %></td>
<td align="center"> <%= brd.getName()%></td>
<td align="center"> <%=df.format(brd.getRegdate()) %></td>
<td align="center"> <%=brd.getEmail() %></td>
</tr>
<%
}
%>
</table>
<%
}
%>
<hr width="90%">
<p>조회된 게시판 목록 수가 <%=count %>개 입니다. </p>
<hr>
<form name="form" method="post" action="editBoard.jsp">
<input type="submit" value="게시물 등록">
</form>
</body>
</html>
테이블을 구성할때 brddb.getBoardList()를 사용한다.
즉 데이터 베이스에서 테이블 내에 있는 모든 내용을 한 행씩 BoardEntity의 인스턴스로 만들어서 담아둔 list를 만들고
이 리스트로 부터 한행씩 정보를 꺼내서 테이블을 구성한다.
이때 id값에 링크를 달아주는데 eidtBoard.jsp?id= 으로 해서 id값이 해당 값인 editboard로 이동한다.
BoardDBCP.java
package univ;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.InitialContext;
import javax.sql.DataSource;
//DBCP를 이용한 테이블 board_1 처리 데이터베이스 연동 자바빈즈 프로그램
public class BoardDBCP {
// 데이터베이스 연결관련 변수 선언
private Connection con = null;
private PreparedStatement pstmt = null;
private DataSource ds = null;
// JDBC 드라이버 로드 메소드
public BoardDBCP() { // 생성자
try {
InitialContext ctx = new InitialContext();
ds = (DataSource)ctx.lookup("java:comp/env/jdbc/OracleDB");
}catch(Exception e) {
e.printStackTrace();
}
}
// 데이터베이스 연결 메소드
public void connect() {
try {
con = ds.getConnection();
}catch(Exception e) {
e.printStackTrace();
}
}
// 데이터베이스 연결 해제 메소드
public void disconnect() {
if(pstmt != null) {
try {
pstmt.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
}
// 게시판의 모든 레코드를 반환 메소드
public ArrayList<BoardEntity> getBoardList(){
connect();
ArrayList<BoardEntity> list = new ArrayList<BoardEntity>();
String SQL = "select * from board_1 order by id desc";
try {
pstmt = con.prepareStatement(SQL);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
BoardEntity brd = new BoardEntity();
brd.setId(rs.getInt("id"));
brd.setName(rs.getString("name"));
brd.setPasswd(rs.getString("passwd"));
brd.setTitle(rs.getString("title"));
brd.setEmail(rs.getString("email"));
brd.setRegdate(rs.getTimestamp("regdate"));
brd.setContent(rs.getString("content"));
// 리스트에 추가
list.add(brd);
}
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}finally {
disconnect();
}
return list;
}
// 게시판의 레코드를 반환 메소드
public ArrayList<BoardEntity> getSearchList(String name){
connect();
ArrayList<BoardEntity> list = new ArrayList<BoardEntity>();
String SQL = "select * from board_1 where name = ?";
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, name);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
BoardEntity brd = new BoardEntity();
brd.setId(rs.getInt("id"));
brd.setName(rs.getString("name"));
brd.setPasswd(rs.getString("passwd"));
brd.setTitle(rs.getString("title"));
brd.setEmail(rs.getString("email"));
brd.setRegdate(rs.getTimestamp("regdate"));
brd.setContent(rs.getString("content"));
// 리스트에 추가
list.add(brd);
}
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}finally {
disconnect();
}
return list;
}
// 주 키 id의 레코드를 반환하는 메소드
public BoardEntity getBoard(int id) {
connect();
String SQL = "select * from board_1 where id = ?";
BoardEntity brd = new BoardEntity();
try {
pstmt = con.prepareStatement(SQL);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
rs.next();
//한 id에 대해 저장된 내용을 set하는 것이므로 rs.next로 한 행만 출력
brd.setId(rs.getInt("id"));
brd.setName(rs.getString("name"));
brd.setPasswd(rs.getString("passwd"));
brd.setTitle(rs.getString("title"));
brd.setEmail(rs.getString("email"));
brd.setRegdate(rs.getTimestamp("regdate"));
brd.setContent(rs.getString("content"));
rs.close();
}catch(SQLException e) {
e.printStackTrace();
}finally {
disconnect();
}
return brd;
}
// 게시글 등록 메소드
public boolean insertDB(BoardEntity board) {
boolean success = false;
connect();
String SQL = "insert into board_1 values(board_1_seq.nextval, ?, ?, ?, ?, sysdate, ?)";
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, board.getName());
pstmt.setString(2, board.getPasswd());
pstmt.setString(3, board.getTitle());
pstmt.setString(4, board.getEmail());
pstmt.setString(5, board.getContent());
pstmt.executeUpdate();
success = true;
}catch(SQLException e) {
e.printStackTrace();
return success;
}finally {
disconnect();
}
return success;
}
// 데이터 갱신을 위한 메소드
public boolean updateDB(BoardEntity board) {
boolean success = false;
String SQL = "update board_1 set name=?, title=?, email=?, content=? where id=?";
// String SQL = "update board_1 set name=?, title=?, email=?, content=? where title=?";
try {
pstmt = con.prepareStatement(SQL);
pstmt.setString(1, board.getName());
pstmt.setString(2, board.getTitle());
pstmt.setString(3, board.getEmail());
pstmt.setString(4, board.getContent());
pstmt.setInt(5, board.getId());
int rowUdt = pstmt.executeUpdate();
// System.out.println(rowUdt);
if(rowUdt == 1) success = true;
}catch(SQLException e) {
e.printStackTrace();
return success;
}finally {
disconnect();
}
return success;
}
// 게시물 삭제를 위한 메소드
public boolean deleteDB(int id) {
boolean success = false;
connect();
String SQL = "delete from board_1 where id=?";
try {
pstmt = con.prepareStatement(SQL);
// 인자로 받은 주 키인 id 값을 이용해 삭제
pstmt.setInt(1, id);
pstmt.executeUpdate();
success = true;
}catch(SQLException e) {
e.printStackTrace();
return success;
}finally {
disconnect();
}
return success;
}
// 데이터베이스에서 인자인 id와 passwd가 일치하는지 검사하는 메소드
public boolean isPasswd(int id, String passwd) {
boolean success = false;
connect();
String SQL = "select passwd from board_1 where id=?";
try {
pstmt = con.prepareStatement(SQL);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
rs.next();
String orgPasswd = rs.getString(1);
if(passwd.equals(orgPasswd)) success = true;
System.out.println(success);
rs.close();
}catch(SQLException e) {
e.printStackTrace();
return success;
}finally {
disconnect();
}
return success;
}
}
쿼리문을 만들고 DB와 연결하여 쿼리문을 실행하는 역할을한다.
또한 실행된 쿼리문을 BoardEntity에 담아서 return하는 역할을 한다.
'KH > JDBC' 카테고리의 다른 글
JQuery_selector (0) | 2022.10.20 |
---|---|
jQuery _01 (0) | 2022.10.19 |
ResultSet과 commit, rollback의 문제 (0) | 2022.10.19 |
JSTL_XML, SQL, 파일 업로드 기능 구현하기 (0) | 2022.10.18 |
EL(Expression Language) 연산자 (0) | 2022.10.17 |