JSP

[ KH 정보교육원 ] 자바 프레임워크 개발자 양성과정 - 게시판 만들기(1)

코드사냥꾼 2019. 11. 27. 12:14

** KH정보교육원에서 실제로 수강한 내용을 개인적으로 정리한 것입니다. **

서블릿을 사용하지 않고 데이터베이스와 jsp 파일만을 이용하여 만들어 보았다. 이 단계에서는 데이터베이스를 만들고 dao 와 vo 파일 그리고 view 파일을 만들어 화면을 구현하는 방법을 알아본다.

1-1. 제일 첫 번째 작업 : 데이터베이스 만들기

CREATE SEQUENCE MYSEQ;

CREATE TABLE MYBOARD(
   MYNO NUMBER PRIMARY KEY,
   MYNAME VARCHAR2(100) NOT NULL,
   MYTITLE VARCHAR2(2000) NOT NULL,
   MYCONTENT VARCHAR2(4000) NOT NULL,
   MYDATE DATE NOT NULL
);

INSERT INTO MYBOARD VALUES (MYSEQ.NEXTVAL, '관리자', '게시판 테스트', '테스트 중입니다', SYSDATE);

1-2. 데이터의 값을 담기 위한 VO 파일 만들기

import java.util.Date;

public class MyBoard {
	private int myno;
	private String myname;
	private String mytitle;
	private String mycontent;
	private Date mydate;

	public MyBoard() {
	}
	
	// myupdate_res 에서 사용하기 위한 생성자
    public MyBoard(int myno, String mytitle, String mycontent) {
		super();
		this.myno = myno;
		this.mytitle = mytitle;
		this.mycontent = mycontent;
	}

	// myinsert_res 에서 사용하기 위한 생성자
	public MyBoard(String myname, String mytitle, String mycontent) {
		this.myname = myname;
		this.mytitle = mytitle;
		this.mycontent = mycontent;
	}

	// select(전체)
	public MyBoard(int myno, String myname, String mytitle, String mycontent, Date mydate) {
		this.myno = myno;
		this.myname = myname;
		this.mytitle = mytitle;
		this.mycontent = mycontent;
		this.mydate = mydate;
	}

	public int getMyno() {
		return myno;
	}

	public void setMyno(int myno) {
		this.myno = myno;
	}

	public String getMyname() {
		return myname;
	}

	public void setMyname(String myname) {
		this.myname = myname;
	}

	public String getMytitle() {
		return mytitle;
	}

	public void setMytitle(String mytitle) {
		this.mytitle = mytitle;
	}

	public String getMycontent() {
		return mycontent;
	}

	public void setMycontent(String mycontent) {
		this.mycontent = mycontent;
	}

	public Date getMydate() {
		return mydate;
	}

	public void setMydate(Date mydate) {
		this.mydate = mydate;
	}
}

1-3. 데이터에 접근하기 위한 DAO 파일 만들기

mport java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.vo.MyBoard;

public class MyBoardDao { // 데이터에 접근
	Connection con = null;

	// 객체가 생성될때 바로 DB와 연결
	public MyBoardDao() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("01.Driver 연결");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.out.println("01.Driver 연결 실패");
		}
	}

	// List<MyBoard> : 리턴 타입 즉, 이 구문에서는 list를 리턴
	public List<MyBoard> selectAll() {
		try {
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "KH", "KH");
			System.out.println("2. 계정 연결");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("2. 계정 연결 실패");
		}

		Statement stmt = null;
		ResultSet rs = null;

		String sql = "SELECT * FROM MYBOARD";

		List<MyBoard> res = new ArrayList<>();

		try {
			stmt = con.createStatement();
			System.out.println("3. statement 생성 및 쿼리 준비 : " + sql);
			// stmt.executeQuery(sql)을 통해 쿼리문을 실행해서 결과값을 rs에 담아주자
			rs = stmt.executeQuery(sql);
			System.out.println("4. query 실행 및 리턴");

			while (rs.next()) {
				// DB에서 긁어온 정보를 객체 생성과 동시에 MyBoard 클래스에 값을 넣어준다
				MyBoard mb = new MyBoard(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getString(4),
						rs.getDate(5));

				// 리스트객체에 넣어줌
				res.add(mb);
			}
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("3 또는 4 단계 실패");
		} finally {
			try {
				rs.close();
				stmt.close();
				con.close();
				System.out.println("5. db종료");
			} catch (SQLException e) {
				e.printStackTrace();
				System.out.println("5. db종료 실패");

			}
		}
		return res;
	}

	public MyBoard selectOne(int myno) {

		try {
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "KH", "KH");
			System.out.println("2. 계정 연결");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("2. 계정 연결 실패");
		}

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM MYBOARD WHERE MYNO=?";

		MyBoard res = null;

		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, myno);
			System.out.println("3. query 준비 : " + sql);

			rs = pstmt.executeQuery();

			System.out.println("4. query 실행 및 리턴");

			while (rs.next()) {
				res = new MyBoard();
				res.setMyno(rs.getInt(1));
				res.setMyname(rs.getString(2));
				res.setMytitle(rs.getString(3));
				res.setMycontent(rs.getString(4));
				res.setMydate(rs.getDate(5));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rs.close();
				pstmt.close();
				con.close();
				System.out.println("5. db종료");
			} catch (SQLException e) {
				e.printStackTrace();
				System.out.println("6. db 종료 실패");
			}
		}

		return res;
	}

	public int insert(MyBoard vo) {
		try {
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "KH", "KH");
			System.out.println("2. 계정 연결");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("2. 계정 연결 실패");
		}

		PreparedStatement pstmt = null;

		int res = 0;

		String sql = "INSERT INTO MYBOARD VALUES (MYSEQ.NEXTVAL,?,?,?,SYSDATE)";

		try {
			pstmt = con.prepareStatement(sql);

			pstmt.setString(1, vo.getMyname());
			pstmt.setString(2, vo.getMytitle());
			pstmt.setString(3, vo.getMycontent());

			res = pstmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return res;
	}

	public int update(MyBoard vo) {
		try {
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "KH", "KH");
			System.out.println("2. 계정 연결");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("2. 계정 연결 실패");
		}

		PreparedStatement pstmt = null;

		int res = 0;

		String sql = "UPDATE MYBOARD SET MYTITLE = ? , MYCONTENT = ? WHERE MYNO = ?";

		try {
			pstmt = con.prepareStatement(sql);

			// 위의 물음표 채워주기
			pstmt.setString(1, vo.getMytitle());
			pstmt.setString(2, vo.getMycontent());
			pstmt.setInt(3, vo.getMyno());
			res = pstmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

		return res;
	}
    
    public int delete(int myno) {
		try {
			con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "KH", "KH");
			System.out.println("2. 계정 연결");
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("2. 계정 연결 실패");
		}

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "DELETE FROM MYBOARD WHERE MYNO = ?";

		int res = 0;

		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, myno);

			res = pstmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				pstmt.close();
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return res;
	}
}

2. index.jsp  

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<jsp:forward page="mylist.jsp"></jsp:forward>
</body>
</html>

💡 <jsp:forward>  : 이 액션 태그는 해당 페이지가 시작될 때 바로 다른 페이지로 넘어가도록 제어할 때 사용하는 태그이다.

3. mylist.jsp ( = 실행 시 메인페이지 )

해당 jsp 파일은 실제 게시판의 목록이 보이는 즉, view(컨트롤러)의 기능을 하는 파일이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="com.dao.MyBoardDao"%>
<%@ page import="com.vo.MyBoard"%>
<%@ page import="java.util.List"%>
<%
	request.setCharacterEncoding("UTF-8");
%>
<%
	response.setContentType("text/html; charset=UTF-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>view(컨트롤러)역할을 하는 페이지 = 게시판 나오게 하는 페이지</title>
</head>
<body>
	<%
		MyBoardDao dao = new MyBoardDao();
		List<MyBoard> list = dao.selectAll();
	%>
	<h1>List Page</h1>
	<table border="1">
		<col width="50px">
		<col width="100px">
		<col width="200px">
		<col width="100px">

		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>제목</th>
			<th>날짜</th>
		</tr>

		<%
			for (int i = 0; i < list.size(); i++) {
		%>

		<tr>
			<td><%=list.get(i).getMyno()%></td>
			<td><%=list.get(i).getMyname()%></td>
			<td><a href="selectone.jsp?myno=<%=list.get(i).getMyno()%>"><%=list.get(i).getMytitle()%></a></td>
			<td><%=list.get(i).getMydate()%></td>
		</tr>

		<%
			}
		%>
		<tr>
			<td colspan="4" align="right">
			   <button onclick="location.href='myinsert.jsp'">글쓰기</button>
			</td>
		</tr>
	</table>
</body>
</html>