빅데이터 서비스 교육/JSP Servlet

JDBC MVC 패턴

Manly 2022. 5. 18. 17:43
반응형

sql

-- 게시판 저장할 테이블 생성
create table jdbc_board
(
bnum number(10) ,
title varchar2(50) not null,
writer varchar2(50) not null,
content varchar2(500),
day date,
 constraint board_num_pk primary key(bnum)
)

-- bnum에 사용할 sequence 생성
create sequence board_num_seq
start with 1
increment by 1
maxvalue 999999
nocycle
nocache

-- 데이터 저장하기
insert into JDBC_BOARD values (board_num_seq.nextval,'web jdbc','안현진','즐거운 JDBC',sysdate);

boardMain.jsp

<%@page import="kr.smhrd.model.BoardDAO"%>
<%@page import="java.util.List"%>
<%@page import="kr.smhrd.model.BoardVO"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Forty by HTML5 UP</title>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]-->
<link rel="stylesheet" href="assetsBoard/css/main.css" />
<link rel="stylesheet" href="assetsBoard/css/board.css" />
<!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]-->
<!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]-->

</head>
<body>
	<%
	 //DAO객체 생성
	 BoardDAO dao =  new BoardDAO();
	//만들어둔 boardList() 사용
	List<BoardVO> list = dao.boardList();

	// 7. 출력하기
	%>

	<div id="board">
		<h1>게시판 메인 페이지</h1>
		<table id="list">
			<thead>
				<tr>
					<td>번호</td>
					<td>제목</td>
					<td>작성자</td>
					<td>시간</td>
				</tr>
			</thead>
			<tbody>
				<%--게시글 목록을 출력해봅시다. --%>

				<%--for each문 활용
				
				<%
				// for(배열을 하나씩 넣을 객체:배열)
				for (BoardVO bvo : list) {%>
				<tr>
					<td><%=bvo.getBnum() %></td>
					<td><%=bvo.getTitle() %></td>
					<td><%=bvo.getWriter() %></td>
					<td><%=bvo.getDay() %></td>
				</tr>
				<%}%>
                          --%>
				<%
				for (int i = 0; i < list.size(); i++) {
					BoardVO bvo = list.get(i);%>
				<tr>
					<td><%=bvo.getBnum() %></td>
					<td><%=bvo.getTitle() %></td>
					<td><%=bvo.getWriter() %></td>
					<td><%=bvo.getDay() %></td>
				</tr>
				<%}%>

			</tbody>
		</table>

		<a href="writerBoard.jsp"><button id="writer">작성하러가기</button></a>
	</div>

	<!-- Scripts -->
	<script src="assets/js/jquery.min.js"></script>
	<script src="assets/js/jquery.scrolly.min.js"></script>
	<script src="assets/js/jquery.scrollex.min.js"></script>
	<script src="assets/js/skel.min.js"></script>
	<script src="assets/js/util.js"></script>
	<!--[if lte IE 8]><script src="assets/js/ie/respond.min.js"></script><![endif]-->
	<script src="assets/js/main.js"></script>
</body>
</html>

BoardVO.java

package kr.smhrd.model;

public class BoardVO {
	//String, int 들의 각각 다른 자료형을 하나로 묶어주기위해 VO를 만든다.
  
	// 반드시 지킬것
	// 필드의 이름과 테이블의 컬럼명이 일치할것
	
	// 글번호
	private int bnum;
	// 제목
	private String title;
	// 작성자
	private String writer;
	// 내용
	private String content;
	// 날짜
	private String day;
	
	public int getBnum() {
		return bnum;
	}
	public void setBnum(int bnum) {
		this.bnum = bnum;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getDay() {
		return day;
	}
	public void setDay(String day) {
		this.day = day;
	}
	public BoardVO(int bnum, String title, String writer, String content, String day) {
		this.bnum = bnum;
		this.title = title;
		this.writer = writer;
		this.content = content;
		this.day = day;
	}
	// 반드시 기본생성자를 만들어 둘 것
	public BoardVO() {}
	// 기본생성자: 매개변수가 없는 생성자
	
	// alt + shift + s
	
}

BoardDAO.java

package kr.smhrd.model;

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

public class BoardDAO {
	
	// JDBC코드 --> 메서드화
	
	// 게시글 전체 가져오는 메서드
	public List<BoardVO> boardList() {

		
		//main 한 파일에서 db에 접근하고, for문에 너무 무거워지기때문에
		//DAO를 만들어서 분리해준다.
		// ctrl + shift + o 전체 import
		List<BoardVO> list = new ArrayList<BoardVO>();
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		// 전역변수로 쓸 수 있게 맨위로 빼줬다

		// 문법상 오류는 없지만, 실행했을 때 나는 오류(런타임 에러)를 처리
		try {
			// 1. OracleDriver 사용을 위한 동적로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 2. 연결 객체 생성
			String url = "jdbc:oracle:thin:@localhost:1521:xe"; // 데이터베이스 url
			String user = "hr"; // 유저 id
			String password = "hr"; // 유저 pw
			conn = DriverManager.getConnection(url, user, password);

			// 3. sql문 실행 준비
			// 모든 글을 가져와서 -> 출력
			String sql = "select * from jdbc_board";
			psmt = conn.prepareStatement(sql);

			// 4. 바인드변수(?) 채우기

			// 5. 실행
			// executeUpdate() : sql문을 실행 했을때 데이터베이스에 변경이 있는경우 ex) insert, delete, update
			//                   반환값:   int리턴 --> 몇행 변경에 성공했는가?
			// executeQuery() : select
			//                   반환값:  ResultSet 객체 리턴

			rs = psmt.executeQuery();

			// rs.next(): 데이터 있으면 true, 없으면 false
			while (rs.next()) {
				int bnum = rs.getInt(1);
				String title = rs.getString(2);
				String writer = rs.getString(3);
				String content = rs.getString(4);
				String day = rs.getString(5);

				//String, int 들의 각각 다른 자료형을 하나로 묶어주기위해 만들었던 VO를 사용
				BoardVO bvo = new BoardVO(bnum, title, writer, content, day);
				// ArrayList이용해서 bvo를 하나로 묶기
				// List<저장할데이터 타입> list = new ArrayList<저장할 타입>();
				list.add(bvo);
			}

		} catch (Exception e) {
			// 에러 --> console창에 출력
			e.printStackTrace();
		} finally {
			//오류가 나던 안나던 반드시 실행  
			// 6. 객체들 닫기
			// 열때의 역순으로 닫아야 한다.
			try {
				if (rs != null) {
			rs.close();
				}
				if (psmt != null) {
			psmt.close();
				}
				if (conn != null) {
			conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
		// DB에서 꺼낸 List<BoardVO>를 리턴
		return list;
	}

}

 

 

ResultSet은 다음과 같은 테이블 형태이다.

rs는 커서가 맨위를 가리키고 있다가 rs.next()로 다음 행으로 움직이면서

데이터가 있으면 true반환, 없으면 false 반환

 

 

rs.getInt() or rs.getString() 등등

괄호안에는 숫자가 오고 이때 숫자는 처음열이 1번 다음 2번 3번....순으로 간다

 

Model : 실행에 직접적인 관여X , 데이터를 담거나, 보내거나, 수정, 삭제하는 객체

 

Model 1 방식

Model 2 방식

 

 

프로젝트 통채로 복사했을때

 

Servers 프로젝트에서 server.xml에 복사한 프로젝트명의 Context의 path가

   다른것과 겹치지 않나 ? -> 겹치면 겹치지 않게 바꿔준다.

 

 

 

 

로그인을 session 을 통해 유지시키고, 로그인 했을때만 홈페이지 기능들을 사용할 수 있게

로그인이 필요한 기능들에 조건문을 쓴다

 

 

Client 의 요청을 FrontController(Servlet)가 받는다

FrontController :  모든 요청을 받아서 구분 후 적절한 Controller로 사용 & 페이지 이동

각 Controller : 각 기능을 하고, 다음페이지로 이동 (Class 파일들 -> POJO)

 

 

index.jsp : welcomepage -> 반드시 webapp에 있어야한다.
GoMainCon --> boardMain으로 이동

                          boardMain  : 논리적인 view 이름

 

WEB-INF/views/boardMain.jsp

                             -> 물리적인 view 이름

반응형

'빅데이터 서비스 교육 > JSP Servlet' 카테고리의 다른 글

JSP 복습 (수정)  (0) 2022.06.02
JSP 내장객체 (Scope) & JDBC & Maven  (0) 2022.05.16
JSP Session  (0) 2022.05.13
JSP Cookie  (0) 2022.05.12
JSP request, response  (0) 2022.05.11