반응형

이번에는 mvc패턴을 사용한 model2 방식으로 게시판을 만들어보았습니다. 이번에 처음으로 만들어 본 model2방식 게시판이므로 오류가 많을 수 있습니다.

아직 초보라 설명이 잘못되거나 순서가 잘못되었으면 알려주시길 부탁드립니다 ㅠㅠ.. 피드백은 언제나 감사합니다.

 

시작 전에 mvc패턴과 model2방식에 대한 글을 작성하며 구조에 대해 파악하였습니다. 아래는 작성한 글입니다.

 

JSP -MVC디자인패턴(MODEL1, MODEL2)

이전에 만들었던 게시판은 비즈니스 로직과 화면 기능을 모두 동일한 JSP에서 수행하도록 개발하여 만든 모델1방식(jsp파일로 만든)게시판이었습니다. 그래서 이번에는 DAO와 Action 등의 클래스를

kobalja2020.tistory.com

JSP로 Model1방식 게시판을 이전에 만들어 보았으므로 환경 설정이나 톰캣 연결은 생략하겠습니다. 환경 설정에 대해 궁금하시면 아래의 링크로 들어가셔서 보시면 됩니다. 

 

JSP와 mysql을 이용하여 MVC패턴 MODEL1 방식 게시판 만들기(2020년 8월 17일까지 진행 과정)

현재 진행 중인 프로젝트에 Spring이나 JSP를 이용한 게시판이 필요할거 같아서 만들면서 공부하기로 하여 여러 블로그와 동빈나님의 유튜브를 참고하여 만들어 보았습니다. 아직 완성 단계는 아�

kobalja2020.tistory.com

 

 

1. JSP게시판 만들기 위한 준비물 

  • 구글
  • mysql 8.0
  • jdk-14.0.2
  • 윈도우 64 Tomcat 8.5v
  • 부트스트랩(Bootstrap)

사용한 부트스트랩 파일을 다운 받을 수 있는 링크입니다. 

https://www.w3schools.com/bootstrap

 


★ JSP 게시판 만들기 위한 설계

※ 게시판 만드는 순서

1. 메인 화면(index.jsp) 만들기 - 메인화면의 navigation bar에서 dropdown menu를 통해 각 페이지 이동 가능하게 만들기

2. 로그인, 로그아웃, 회원정보수정, 회원탈퇴 페이지 및 기능 구현

3. 관리자 아이디(admin) 로그인 시에 회원히스토리 볼 수 있게 구현 및 회원 히스토리 페이지 페이지, 기능 만들기

4. 게시판 페이지 만들기(검색기능, 게시판 글 내용 보기, 글쓰기 버튼 만들기, (미완성)추천수 볼 수 있게 구현)

5. 게시판 글 내용 페이지에서 작성자와 아이디 동일할 시 글 수정, 삭제 가능하게 구현

6. 게시판 페이지네이션 구현

7. (미완성)게시판 글 내용 페이지에서 댓글 넣을 수 있게 구현

8. (미완성)게시판 글 쓰기 화면에서 유튜브 링크 넣을 수 있게 구현

 

2. 간단하게 게시판 데이터를 조회하는 것으로 JDBC로 Mysql과 이클립스와 연결 확인해보기

(원래는 로그인 먼저 구현해야하지만 게시판 연결부터 확인해보았습니다.)

 

2-1. 우선 게시판을 만들기 전 IA 만들기

 

IA(Information Architecture)란 UI/UX 디자인을 하는 데 있어서 중요하며 정보 구조로 해석할 수 있습니다. 가장 기초적이고 기반이 되는 것이란 의미이기도 합니다. 사용자에게 친숙하며 사용성을 고려해 구축해야하므로 게시판의 핵심 기능을 정리하고 핵심 기능을 받쳐주는 서브 기능들을 보기 쉽게 정리하여 나타낸 것이라고 합니다. 즉, 게시판 설계를 그림으로 나타낸 것이라고 생각할 수 있습니다.

kboard IA

2-2. 프로젝트를 만들기 전 Mysql로 DB만들기

 

2-2-1. 먼저 DataBase와 사용자를 생성합니다.

(저는 사용자이름은 kobalja로 비밀번호는 0506으로 생성하였습니다.)

 

create database kboard;

 

create user 'kobalja'@'localhost' identified by '0506';  

 

grant all privileges on kboard.* to kobalja@'localhost';

 

2-2-2. 데이터베이스 kboard에 IA에서 설계한 테이블을 생성합니다.

 

A. 게시판(kboard)

num: 게시글 번호, mb_sq: 회원 번호, subject: 게시글 제목, content: 게시글 내용, hit: 조회수,

wdate: 작성날짜, udate: 수정날짜, ddate: 삭제날짜

create table kboard(
num int auto_increment primary key,
mb_sq int,
subject varchar(100) not null,
content text,
hit int default 0,
wdate datetime default now(),
udate datetime,
ddate datetime);

 

B. 사용자(member)

sq: 회원번호, mb_id: 회원아이디, mb_pw: 회원 비밀번호, mb_name: 회원이름, mb_email: 회원 이메일,

mb_gender: 회원 성별, login_st: 로그인 상태, leave_fl: 탈퇴 상태

create table member(
sq int auto_increment primary key,
mb_id varchar(50),
mb_pw varchar(200),
mb_name varchar(20),
mb_email varchar(100),
mb_gender varchar(20),
login_st tinyint default 0,
leave_fl tinyint default 0);

 

C. 사용자 히스토리(member_history)

sq: 회원번호, mb_sq: 회원히스토리번호, evt_type: 이벤트타입(int), dttm: datetime

create table member_history(
sq int primary key,
mb_sq int,
evt_type tinyint,
dttm datetime default current_timestamp);

 

D. 추천수(recommend) - 미완성

num:글 번호, mb_sq: 회원번호, recommend_fl: 추천 수

create table recommend(
num int,
mb_sq int,
recommend_fl tinyint default 0);

 

D. 댓글(comment) - 미완성

comment_num:댓글 번호,num: 글 번호,mb_sq: 회원번호,comment_content: 댓글 내용

create table comment(
comment_num int,
num int,
mb_sq int,
comment_content text);

 

2-3. 이클립스로 게시판 프로젝트를 생성한 후 mysql을 연결해주기 위해 WebContent폴더 안의 META-INF 폴더 안에 context.xml 파일을 생성합니다.

그리고 오토커맛이 아닌 수동 커밋을 하기 위해 src 폴더에 패키지를 생성해주고 mysql연결과 컨트롤러의 이동 경로(path)설정을 해주기 위해 Action(인터페이스) 및 ActionForward, JdbcUtil을 생성해줍니다.

(참고: mysql connector파일과 tomcat 8.5.5.7의 servlet.api는 라이브러리에 추가한 상태입니다.)

 

● context.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource
     name="jdbc/MysqlDB" 
     auto="Container"
        type="javax.sql.DataSource" 
        username="kobalja" 
        password="0506"
        driverClassName="com.mysql.cj.jdbc.Driver"
        factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
        url="jdbc:mysql://localhost:3306/kboard?serverTimezone=UTC" 
        maxActive="500" />
</Context> 
cs

 

● com.kb.www.common 패키지 안의 Action.java(인터페이스), ActionForward.java, JdbcUtil.java

 

▶ Action

package com.kb.www.common;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception;
}

 

▶ ActionForward

package com.kb.www.common;
public class ActionForward {
	//define Attributes
	private String path;
	private boolean redirect;
	
	//construct
	public ActionForward() {
		//TODO Auto-generated constructor stub
	}
	
	public ActionForward(String path, boolean redirect) {
		this.path=path;
		this.redirect=redirect;
	}
	//get, set Attributes
	
	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	
	public boolean isRedirect() {
		return redirect;
	}
	public void setRedirect(boolean redirect) {
		this.redirect = redirect;
	}
}

 

▶ JdbcUtil

package com.kb.www.common;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
//JDBC MysqlDB 연결(오토커밋은 꺼진상태)
public class JdbcUtil {
	public static Connection getConnection() {
		Connection con = null;
		try {
			Context initCtx = new InitialContext();
			Context envCtx = (Context) initCtx.lookup("java:comp/env");
			DataSource ds = (DataSource) envCtx.lookup("jdbc/MysqlDB");
			con = ds.getConnection();
			con.setAutoCommit(false);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
	// 리소스를 돌려주는 역할 close(con, pstmt, rs)
	public static void close(Connection con) {
		if (con != null) {
			try {
				con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	public static void close(PreparedStatement pstmt) {
		if (pstmt != null) {
			try {
				pstmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	public static void close(ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// 수동 커밋 ( commit-저장되지 않은 모든 데이터를 데이터베이스에 저장하고 현재의 트랜잭션을 종료하라는 명령
	public static void commit(Connection con) {
		if (con != null) {
			try {
				con.commit();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// 수동 롤백(Rollback- 트랜잭션의 실패로 작업을 취소하고 이전 상태로 되돌리는 데이터제어어)
	public static void rollback(Connection con) {
		try {
			con.rollback();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

2-4. mysql의 kboard의 데이터를 가져오기 위해서 VO파일(MemberVO, ArticleVO, MemberHitstoryVO) 을 작성해줍니다. (추천과 댓글의 데이터는 나중에 추가할 것입니다.) 

 

● ArticleVO.java

package com.kb.www.vo;

public class ArticleVO {
	// 글번호
	private int ArticleNum;
	// 사용자의 고유코드
	private int mb_sq;
	// 글 제목
	private String ArticleTitle;
	// 작성자
	private String id;
	// 글 내용
	private String ArticleContent;
	// 조회수
	private int Hit;
	// 작성일자
	private String writeDate;
	// 수정일자
	private String updateDate;
	// 삭제일자
	private String deleteDate;

	// get&set
	public int getArticleNum() {
		return ArticleNum;
	}

	public void setArticleNum(int articleNum) {
		ArticleNum = articleNum;
	}

	public int getMb_sq() {
		return mb_sq;
	}

	public void setMb_sq(int mb_sq) {
		this.mb_sq = mb_sq;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getArticleTitle() {
		return ArticleTitle;
	}

	public void setArticleTitle(String articleTilte) {
		ArticleTitle = articleTilte;
	}

	public String getArticleContent() {
		return ArticleContent;
	}

	public void setArticleContent(String articleContent) {
		ArticleContent = articleContent;
	}

	public int getHit() {
		return Hit;
	}

	public void setHit(int hit) {
		Hit = hit;
	}

	public String getWriteDate() {
		return writeDate;
	}

	public void setWriteDate(String writeDate) {
		this.writeDate = writeDate;
	}

	public String getUpdateDate() {
		return updateDate;
	}

	public void setUpdateDate(String updateDate) {
		this.updateDate = updateDate;
	}

	public String getDeleteDate() {
		return deleteDate;
	}

	public void setDeleteDate(String deleteDate) {
		this.deleteDate = deleteDate;
	}
}

 

● MemberVO.java

package com.kb.www.vo;

public class MemberVO {
	private int mb_sq;
	private String mb_id;
	private String mb_pw;
	private boolean login_st;
	private boolean leave_fl;
	private String mb_name;
	private String mb_email;
	private String mb_gender;
	
	
	
	public int getMb_sq() {
		return mb_sq;
	}

	public void setMb_sq(int mb_sq) {
		this.mb_sq = mb_sq;
	}

	public String getMb_id() {
		return mb_id;
	}

	public void setMb_id(String mb_id) {
		this.mb_id = mb_id;
	}

	public String getMb_pw() {
		return mb_pw;
	}

	public void setMb_pw(String mb_pw) {
		this.mb_pw = mb_pw;
	}

	public boolean isLogin_st() {
		return login_st;
	}

	public void setLogin_st(boolean login_st) {
		this.login_st = login_st;
	}

	public boolean isLeave_fl() {
		return leave_fl;
	}

	public void setLeave_fl(boolean leave_fl) {
		this.leave_fl = leave_fl;
	}

	public String getMb_name() {
		return mb_name;
	}

	public void setMb_name(String mb_name) {
		this.mb_name = mb_name;
	}

	public String getMb_email() {
		return mb_email;
	}

	public void setMb_email(String mb_email) {
		this.mb_email = mb_email;
	}

	public String getMb_gender() {
		return mb_gender;
	}

	public void setMb_gender(String mb_gender) {
		this.mb_gender = mb_gender;
	}
	
}

 

● MemberHistoryVO.java

package com.kb.www.vo;

public class MemberHistoryVO {
	private int sq;
	private int mb_sq;
	private int evt_type;
	private String dttm;
	private String name;
	private String email;
	private String gender;

	public int getSq() {
		return sq;
	}

	public void setSq(int sq) {
		this.sq = sq;
	}

	public int getMb_sq() {
		return mb_sq;
	}

	public void setMb_sq(int mb_sq) {
		this.mb_sq = mb_sq;
	}

	public int getEvt_type() {
		return evt_type;
	}

	public void setEvt_type(int evt_type) {
		this.evt_type = evt_type;
	}

	public String getDttm() {
		return dttm;
	}

	public void setDttm(String dttm) {
		this.dttm = dttm;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getGender() {
		return gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

}

 

 

2-5. 연결 확인을 하기 위해 메인화면(index.jsp)에서 게시판(list.jsp)으로 이동할 수 있게 해주는 Controller와 ArticleListAction 만들기

 

● index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>프로젝트 게시판 웹사이트</title>
<link rel="stylesheet" href="css/custom.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/custom.css">
</head>
<body>
	<%
		String id = null;
	if (session.getAttribute("id") != null) {
		id = (String) session.getAttribute("id");
	}
	%>
	<nav class="navbar navbar-default">

		<div class="navbar-header">

			<button type="button" class="navbar-toggle collapsed"
				data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
				aria-expaned="false">

				<span class="icon-bar"></span> <span class="icon-bar"></span> <span
					class="icon-bar"></span>

			</button>

			<a class="navbar-brand" href="index.jsp">kobalja의 게시판</a>

		</div>

		<div class="collapse navbar-collapse"
			id="#bs-example-navbar-collapse-1">

			<ul class="nav navbar-nav">

				<li class="active"><a href="index.jsp">메인</a></li>
				<!-- <--- 현재 접속 페이지가 메인이란 걸 알려줌 -->
				<li><a href="/list.do">게시판</a></li>
				<li><a href="index.jsp">공지사항</a></li>
				<li><a href="list">1:1 문의</a></li>
			</ul>
			<%
				if (id == null) {
			%>
			<ul class="nav navbar-nav navbar-right">

				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">접속하기<span class="caret"></span></a>

					<ul class="dropdown-menu">

						<li><a href="login.jsp">로그인</a></li>
						<li><a href="join.jsp">회원가입</a></li>

					</ul></li>
			</ul>
			<%
				} else {
			%>
			<ul class="nav navbar-nav navbar-right">

				<li class="dropdown"><a href="#" class="dropdown-toggle"
					data-toggle="dropdown" role="button" aria-haspopup="true"
					aria-expanded="false">회원관리<span class="caret"></span></a>

					<ul class="dropdown-menu">
						<li><a href="logoutAction.jsp">로그아웃</a></li>
					</ul></li>
			</ul>
			<%
				}
			%>
		</div>

	</nav>
	<!-- 점보트론 -->
	<div class="container">
		<div class="jumbotron">
			<div class="container">
				<h1>MODEL2 방식으로 디자인한 게시판</h1>
				<p>kobalja 부트스트랩 이용한 JSP 웹 사이트 프로젝트</p>
				<a class="btn btn-primary btn-pull" href="kobalja_blog.html"
					role="button">관리자에 대해 알아보기</a>
			</div>
		</div>
	</div>
	<!-- 캐러샐이미지 -->
	<div class="container">
		<div id="myCarousel" class="carousel slide" data-ride="carousel">
			<ol class="carousel-indicators">
				<li data-target="#myCarousel" data-slide-to="0" class="active"></li>
				<li data-target="#myCarousel" data-slide-to="1"></li>
				<li data-target="#myCarousel" data-slide-to="2"></li>
			</ol>
			<div class="carousel-inner">
				<div class="item active">
					<img src="images/0.jpg">
				</div>
				<div class="item">
					<img src="images/1.jpg">
				</div>
				<div class="item">
					<img src="images/2.jpg">
				</div>
			</div>
			<a class="left carousel-control" href="#myCarousel" data-slide="prev">
				<span class="glyphicon glyphicon-chevron-left"></span>
			</a> <a class="right carousel-control" href="#myCarousel"
				data-slide="next"> <span
				class="glyphicon glyphicon-chevron-right"></span>
			</a>
		</div>
	</div>
	<!-- 애니매이션 담당 JQUERY -->

	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

	<!-- 부트스트랩 JS  -->

	<script src="js/bootstrap.js"></script>
</body>
</html> 

 

● list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="com.kb.www.vo.ArticleVO"%>
<%@page import="java.util.ArrayList"%>
<%
ArrayList<ArticleVO> list = (ArrayList<ArticleVO>) request.getAttribute("list");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>IntelliJ 게시판</title>
<script src="https://code.jquery.com/jquery-1.11.3.js"
	type="text/javascript"></script>
</head>
<body>
<!-- 게시판 화면 -->
	<div class="container">
		<div class="row">
			<table class="table table-striped"
				style="text-align: center; border: 1px solid #dddddd">
				<thead>
					<tr>
						<th colspan="5"
							style="background-color: #eeeeee; text-align: center;">게시판
							목록</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td style="background-color: #b7b7ff; text-align: center;">번호</td>
						<td style="background-color: #b7b7ff; text-align: center;">작성자</td>
						<td style="background-color: #b7b7ff; text-align: center;">제목</td>
						<td style="background-color: #b7b7ff; text-align: center;">조회수</td>
						<td style="background-color: #b7b7ff; text-align: center;">작성날짜</td>
					</tr>
					<%
						if (list.size() > 0) {
						for (int i = 0; i < 1; i++) {
					%>
					<tr onclick="ShowDetail(<%=list.get(i).getArticleNum()%>)">
						<td><%=list.get(i).getArticleNum()%></td>
						<td><%=list.get(i).getId()%></td>
						<td><%=list.get(i).getArticleTitle()%></td>
						<td><%=list.get(i).getHit()%>
						<td><%=list.get(i).getWriteDate()%></td>
					</tr>
					<%
						}
					} else {
					%>
					<tr>
						<td colspan="3">게시글이 없습니다.</td>
					</tr>
					<%
						}
					%>
				</tbody>
			</table>
		</div>
</body>
</html> 

 

● BoardController.java

package com.kb.www.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.kb.www.action.ArticleListAction;
import com.kb.www.common.Action;
import com.kb.www.common.ActionForward;

@WebServlet("*.do")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doProcess(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String RequestURI=request.getRequestURI();
		String contextPath=request.getContextPath();
		String command=RequestURI.substring(contextPath.length());
		ActionForward forward = null;
		Action action = null;
		// 이벤트 처리 콘트롤러 모듈화
		if(command.equals("/list.do")) {
			action=new ArticleListAction();
			try {
				forward = action.execute(request, response);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if (forward != null) {
			response.sendRedirect(forward.getPath());
		} else {
			RequestDispatcher dispatcher = request.getRequestDispatcher(forward.getPath());
			dispatcher.forward(request, response);
		}
	}

	public BoardController() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doProcess(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doProcess(request, response);
	}

}

 

● ArticleListAction.java

package com.kb.www.action;

import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.kb.www.common.Action;
import com.kb.www.common.ActionForward;
import com.kb.www.service.BoardService;
import com.kb.www.vo.ArticleVO;

public class ArticleListAction implements Action {
	@Override
	public ActionForward execute(HttpServletRequest request,HttpServletResponse response) throws Exception{
		BoardService svc=new BoardService();
		ArrayList<ArticleVO> articleList=svc.getArticleList();
		ActionForward forward=new ActionForward();
		request.setAttribute("list",articleList);
		forward.setPath("/views/list.jsp");
		return forward;
	}
}

 

2-7. ArticleListAction를 통해 데이터를 가져올 수 있도록 BoardDao와 BoardService를 만들어주어야합니다. 따라서 각각 패키지를 만들고 아래와 같이 작성해줍니다.

 

● BoardDAO.java

package com.kb.www.dao;

import java.sql.Connection;
import java.util.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import com.kb.www.vo.ArticleVO;

import static com.kb.www.common.JdbcUtil.close;
import static com.kb.www.common.JdbcUtil.commit;

public class BoardDAO {
	private Connection con;

	private BoardDAO() {

	}

	public static BoardDAO getInstance() {
		return LazyHolder.INSTANCE;
	}

	private static class LazyHolder {
		private static final BoardDAO INSTANCE = new BoardDAO();
	}

	public void setConnection(Connection con) {
		this.con = con;
	}

	public ArrayList<ArticleVO> getArticleList() {
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		ArticleVO vo = new ArticleVO();
		ArrayList<ArticleVO> list = new ArrayList<ArticleVO>();
		String NowDate = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
		vo.setWriteDate(NowDate);
		try {
			pstmt = con.prepareStatement("select * from kboard");
			rs = pstmt.executeQuery();
			while (rs.next()) {
				vo.setArticleNum(rs.getInt("num"));
				vo.setArticleTitle(rs.getString("subject"));
				vo.setId(rs.getString("id"));
				vo.setHit(rs.getInt("hit"));
				vo.setWriteDate(rs.getString("wdate"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			close(rs);
			close(pstmt);
		}
		return list;
	}

}

 

● BoardService.java

package com.kb.www.service;

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


import com.kb.www.dao.BoardDAO;
import com.kb.www.vo.ArticleVO;
import static com.kb.www.common.JdbcUtil.*;



public class BoardService {
//ArticleListAction에서 호출
	public ArrayList<ArticleVO> getArticleList() {
		// TODO Auto-generated method stub
		BoardDAO dao=BoardDAO.getInstance();
		//JdbcUtil의 getConnetcion을 이용하여 MysqlDB와 연결
		Connection con=getConnection();
		//dao와 mysqldb의 데이터를 con을 사용하여 공유
		dao.setConnection(con);
		ArrayList<ArticleVO> list =dao.getArticleList();
		close(con);
		return list;
	}

}

 

2-8.  메인페이지(index.jsp)에서 게시판(list.jsp)을 눌러 게시판 목록 확인하기

(지금까지 개발한 것을 기준으로 두어 페이징과 검색 및 글쓰기는 이번 게시글의 코드에는 없습니다.)

※ 정리(MysqlDB와 연결한 후 DB의 데이터를 JSP로 불러오기)

 

1. index.jsp의 드롭다운 메뉴에서 <a href="list.do">게시판<a> 의 링크를 통해 list.do로 주소로 이동합니다.

 

2. BoardController에서 doProcess를 통해(doGet,doPost도 전부 doProcess작동하도록 만들어준다.) CharacterEncoding을 UTF-8로 request하고 이벤트 처리 콘트롤러 모듈화를 위해 RequestURI를 선언 , contextPath를 통해 경로 선언하여 command라는 subString으로 주소를 받는 구문을 만들어 주소 *.do로 가도록 설정합니다.

 

3. 그러면 command.equals를 통해 주소 뒤에 (.do)가 들어간다면 command가 받을 수 있도록 해주어 list.do라는 주소를 받을 수 있게 됩니다.

 

4. 조건문을 걸어(다른 기능을 추가했을때 주소만 바꾸면 다른 기능 구현할 수 있도록) list.do일 때 action클래스를 통해 ArticleListAction()으로 데이터를 가지고 이동하도록 해줍니다.(forward=action.execute(request,response)으로 이동할 수있다. forward는 ActionForward클래스에서 데이터를 가져올 수 있도록 Redirect가 아닌 Dispatcher로 받도록 설정해두었습니다.)

 

5.  ArticleListAction안의 BoardService svc=new BoardService() 구문으로 서비스 객체를 생성합니다. 그 다음 svc.getArticleList를 실행하고 BoardService안의 getArticleList를 호출하면

BoardDAO의 Instance를 받아오며 Connection을 통해 MysqlDB와 연결해주고 mysql의 데이터와 dao를 데이터를 공유해줍니다.

 

5. Connection con을 통해 연결한뒤 BoardDAO의 dao.getArticleList를 호출해줍니다. dao의 getArticleList에서는 try catch 구문안의 while(rs.next())로 ResultSet인 rs의 값이 있다면 계속해서 데이터를 불러올 수 있습니다.

 

이제 쿼리문이 실행되어 게시판 목록 데이터를 설정하여 쿼리문(select * from kboard)을 실행하고 배열로 선언한 list를 return 해주고 BoardService에서 list를 받고 다시 ArticleListAction으로(articleList로) return 해줍니다.

(여기서 PreparedStatement를 쓰는 이유는 sql 삽입 공격을 막기위해서입니다.)

 

마지막으로 ArticleListAction에서 list값을 request.setAttirbute("list",articleList)를 통해 list를 키값으로  articleList로  return한 데이터를  forward로 보내줍니다.

 

그러면 list.jsp의 <%ArrayList<ArticleVO> list= (ArrayList<ArticleVO> request.getAttirbute("list");%>  와 name="list"를 통해 list를 키값으로 데이터를 받고 list.jsp에서 게시판 데이터가 조회됩니다.

 

 

 

☆ 아래의 주소는 위의 과정의 파일을 커밋한 제 깃허브 주소입니다.(list.jsp부분은 조금 다를 수 있습니다.)

 

khs-st/JSP_Board_MODEL2

모델2방식으로 만든 jsp게시판. Contribute to khs-st/JSP_Board_MODEL2 development by creating an account on GitHub.

github.com

 

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기