본문 바로가기

JSP

221014_JSP_DBCP/ 게시판만들기

<예시_1>

studentdatabasecp.jsp 파일 생성)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>stdentdatabasejdbc.jsp / 데이터베이스 자바빈즈 테스트 cp이용</title>
</head>
<%@ page import="java.util.ArrayList, univ.StudentEntity" %>
<body>
<h2>javaBeans SttudentDatabaseCP를 이용한 테이블  Student 조회 프로그램</h2>
<hr size="5" color="red">
<h2>학생정보조회</h2>
<jsp:useBean id="stdtdb" class="univ.StudentDatabaseCP" scope="page"/>
<%
	ArrayList<StudentEntity>list = stdtdb.getStudentList();
	int counter= list.size();
	if(counter>0){
%>
<table border="2">
	<tr>
		<td align="center"><b>아이디</b></td>
		<td align="center"><b>암호</b></td>
		<td align="center"><b>이름</b></td>
		<td align="center"><b>입학년도</b></td>
		<td align="center"><b>학번</b></td>
		<td align="center"><b>학과</b></td>
		<td align="center"><b>핸드폰1</b></td>
		<td align="center"><b>핸드폰2</b></td>
		<td align="center"><b>주소</b></td>
		<td align="center"><b>이메일</b></td>
	</tr>
<%
	for(StudentEntity stdt : list){
%>
	<tr>
       <td align="center"><%=stdt.getId() %></td>
       <td align="center"><%=stdt.getPasswd() %></td>
       <td align="center"><%=stdt.getName() %></td>
       <td align="center"><%=stdt.getYear() %></td>
       <td align="center"><%=stdt.getSnum() %></td>
       <td align="center"><%=stdt.getDepart() %></td>
       <td align="center"><%=stdt.getMobile1() %></td>
       <td align="center"><%=stdt.getMobile2() %></td>
       <td align="center"><%=stdt.getAddress() %></td>
       <td align="center"><%=stdt.getEmail() %></td>

	</tr>
<%
	}
}
%>
</table>
<p>
<hr size="5" color="green">
조회된 학생 수가 <%=counter	 %>명 입니다
</body>
</html>

 

StudentDatabaseCP.java 파일 생성)

package univ;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import javax.naming.InitialContext;
import javax.sql.DataSource;

public class StudentDatabaseCP {

	private Connection conn = null;
	private PreparedStatement pstmt = null;
	private DataSource ds = null;
	
	public StudentDatabaseCP () { //생성자
		try {
			InitialContext ctx = new InitialContext();
			ds = (DataSource)ctx.lookup("java:comp/env/jdbc/OracleDB");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	void connection() {
		try {
			conn = ds. getConnection();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	void disConnection() {
		if(pstmt != null) {
			try {
				pstmt.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		if(conn != null) {
			try {
				conn.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}
		
		//게시판의 모든 레코드 반환하는 메소드
	  public ArrayList<StudentEntity> getStudentList(){
		   connection();
			
			ArrayList<StudentEntity> list = new ArrayList<>();
			String SQL = "select * from student";
			
			try {
				pstmt = conn.prepareStatement(SQL);
		        ResultSet rs = pstmt.executeQuery();

				
				while(rs.next()) {
					//한 행의 학생 정보를 저장할 자바빈즈 객체 생성
				    StudentEntity stu = new StudentEntity();
					
					//한 행의 정보를 자바빈즈에 저장
				    stu.setId(rs.getString("id"));
		            stu.setPasswd(rs.getString("passwd"));
		            stu.setName(rs.getString("name"));
		            stu.setYear(rs.getInt("year"));
		            stu.setSnum(rs.getString("snum"));
		            stu.setDepart(rs.getString("depart"));
		            stu.setMobile1(rs.getString("mobile1"));
		            stu.setMobile2(rs.getString("mobile2"));
		            stu.setAddress(rs.getString("address"));
		            stu.setEmail(rs.getString("email"));

					
					//리스트에 추가
					list.add(stu);
				}
				rs.close();
			}catch(Exception e) {
				e.printStackTrace();				
			}finally {
				disConnection();
			}
			return list;
		}
	
}

 

↓결과

 

 

<게시판 예시>

oracle_1.sql에서 board_1테이블 생성)

create table board_1(
	id number(20) not null,
	name varchar2(20) not null,
	passwd varchar2(20) not null,
	title  varchar2(100) null,
	email varchar2(30) null,
	regdate date null,
	content varchar2(3000) null,
	primary key(id)
	)

 

primary key 중복 허용하지 않기 위해 sequence 생성)

create sequence board_1_seq
	start with 1
	increment by 1
	maxvalue 10000
	nocache

 

jdbc_1014폴더 editboard.jsp 파일생성)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>editboard.jsp / 게시판 기본 예제 : 게시 폼 작성</title>
</head>

<!-- 파일 boardform.js : 폼의 각 입력 값이 있는지를 검토하는 함수 생성 -->
<script src="boardform.js"></script>
<body>
<%@ page import ="univ.*" %>
<%
	String name = "";
	String email = "";
	String title = "";
	String content = "";
	String headline = "등록";
	
	String id = request.getParameter("id");
	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>

<!-- 이 폼 데이터를 processboard.jsp로 넘김 -->
<form name =boardform method=post action="processboard.jsp">
<!--menu : 등록, 수정 또는 삭제 구분을 위한 매개변수로 이용  -->
<input type=hidden name="menu" value="insert">

<!-- 수정 또는 삭제를 위한 게시 id를 hidden으로 전송 -->
<input type=hidden name="id" value=<%=id %>>

<table>
	<tr><td align=center>
		<table>
			<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>
							<input type=text name=email value="<%=email %>" size=35 maxlength=30></td>
						</tr>
						<tr>
							<td width>제목 : </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><br>
						<font color=red>현재 게시 내용을 수정 또는 삭제하려면 이미 등록한 비밀번호가 필요합니다	</font>	</td>
				</tr>
					
				<tr>
					<td colspan=2 height=5 size=2></td>
					</tr>
				<tr>
					<td colspan=2>
						<% if(id==null){ %>
						<!--버튼을 누르면 boardform.js의 함수를 실행하여 processboard.jsp로 이동  -->
						<input type=button value="등록" onClick="insertcheck()">
						<%} else{ %>
						<!-- 버튼을 누르면 boardford.js의 각 함수를 실행하여 processboard.jsp로 이동 -->
							<input type=button value="수정완료" onClick="updatecheck()">
							<input type=button value="삭제" onClick="deletecheck()">
						<%} %>
						<!--  목록보기 버튼을 listboard.jsp로 이동-->
						<input type=button value="목록보기" onClick="location.href='listboard.jsp' ">
						<input type=reset value="취소" >
					</td>
				</tr>
			</table>
			
		</td></tr>
		
</table>

</form>

</body>
</html>

 

univ폴더 BoardEntity.java파일 생성)

package univ;

import java.util.Date;

public class BoardEntity {

	private int id;
	private String name;
	private String passwd;
	private String title;
	private String email;
	private Date regdate;
	private String content;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	
}

 

univ폴더 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;

public class BoardDBCP {

//DBCP를 이용한 테이블 board_1 처리 데이터베이스 연동 자바빈즈 프로그램
	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>();
		
		//목록에 id 내림차순으로 정렬
		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();
			
			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;
	}
	
	//데이터 갱신을 위한 메서드
	public boolean updateDB(BoardEntity board) {
		boolean success = false;
		connect();
		String sql ="update board_1 set name=?, title=?, email=?, content=? where id=?";
		//String sql ="update board_1 set name=?, title=?, emai=?, content=?, where title=?";
		try {
			pstmt = con.prepareStatement(sql);
			//인자로 받은 객체를 이용해 사용자가 수정한 값을 가져와 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;
	}
	
}

 

jdbc_1014폴더 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.boardfrom.passwd.focus();
		return;
	}document.boardform.menu.value="insert";
		document.boardform.submit();
}

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();
}

 

jdbc_1014폴더 processboard.jsp파일 생성)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>process.jsp / 게시판 기본예제 : 게시글 등록 수정 삭제 처리</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>

 

jdbc_1014폴더 listboard.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>
   <h2>게시판 목록 표시 프로그램</h2>
   <hr>
   
   <%@page import="java.util.ArrayList, univ.BoardEntity, java.text.SimpleDateFormat" %>
   <jsp:useBean id="brddb" class="univ.BoardDBCP" scope="page"/>
   
   <%
      //게시 목록을 위한 배열 리스트를 자바빈즈를 이용하여 확보
      ArrayList<BoardEntity> list = brddb.getBoardList();
      int counter = list.size();
      int row = 0;
      
      if(counter > 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 14: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>
         <td align=left><%=brd.getTitle() %></td>
         <td align=center><%=brd.getName() %></td>
         
         <!-- 게시 작성일을 2022-10-14 14:33:21 형태로 출력 -->
         <td align=center><%=df.format(brd.getRegdate()) %></td>
         <td align=center><%=brd.getEmail() %></td>
      </tr>
      <%
         }
      %>
      </table>
   <% } %>
   <hr width=90%>
   <p>조회된 게시판 목록 수가 <%=counter %>개 입니다.
   <hr>
   
   <form name=form method=post action="editboard.jsp">
      <input type=submit value="게시등록">
   </form>
</body>
</html>

 

↓ editboard.jsp결과

 

↓ listboard.jsp결과