-
게시판 만들기 - 4. 게시판 글을 DB에 저장하기JAVA/웹 프로그래밍 - JSP 2020. 11. 25. 19:12
아래의 내용에 뒤이어 구현해보자.
designatedroom87.tistory.com/320?category=901206
게시판 만들기 - 3. 로그인 하고 세션 유지 & 로그인 상태에 따라 게시판 보기
아래의 내용을 이어서 진행한다. designatedroom87.tistory.com/319 게시판 만들기 - 2. 로그인 폼 만들기 아래의 내용과 이어진다. designatedroom87.tistory.com/318?category=901206 게시판 만들기 - 1. 기본..
designatedroom87.tistory.com
먼저 만들려고 하는 게시판은 댓글도 가능한 게시판이다.
DB를 좀 다뤄야 하고 조금 복잡하다.
DB의 테이블에 여러 정보가 있지만, 그 중에서 index, groupid, re_order 라는 세 가지 개념이 중요하다.
처음에 글을 쓴 사람은 인덱스와 그룹아이디가 같다.
그룹 아이디는 최초 글을 쓴 사람의 아이디이다.
처음 글을 쓴 사람의 글의 깊이는 0이다. 원 글의 첫 댓글은 글의 깊이는 1이다.
원 글의 댓글의 댓글은 깊이가 2이다.
리오더는 글의 순서를 다시 정렬을 위해 쓴 것이다.
1번 글의 댓글의 댓글을 출력하고 나머지 게시글의 출력을 위해 존재. 즉, 인덱스가 아니다.아래의 모습은 댓글이 없다고 가정하고 4개의 글이 입력된 상태이다.
(각 글들에 댓글이 없이 게시가 된 상태를 의미한다.)
index groupid
1 1
2 2
3 3
4 4위의 상황에서는 각 글들에 댓글이 없이 게시가 된 상태를 의미한다.
아래의 상황에서는 1,2,3,4이렇게 4개의 게시글이 존재한다고 하자.
이 상태에서 5번과 6번 인덱스 글은 인덱스1의 게시글의 댓글들이다.
그러므로 5번과 6번 인덱스 글은 그룹 인덱스가 1이 된다.
그리고 이 경우에는 원 게시글을 기준으로 깊이가 1이 된다.
7과 8인덱스 글들은 모두 4번 인덱스 게시글의 댓글이므로 그룹 아이디는 4가 된다.
만약 9번 인덱스가 5번 인덱스 글의 댓글이라면, 9번 인덱스는 depth는 2가 된다.
9번 인덱스 글은 원 글의 댓글의 댓글이라는 의미이다.
index groupid depth
1 1 0
5 1 1
6 1 1
2 2 0
3 3 0
4 4 0
7 4 1
8 4 1아래는 기본적으로 테이블에 있어야 할 데이터들이다.
테이블 생성 명령
create table board(
idx int not null primary key, // 글 번호. 글이등록되는 순서
title varchar(100) not null,
content CLOB not null,
readcount int not null,
groupid int not null, // 그룹번호.
depth int not null, //글의 깊이.
re_order int not null, //재 순서
isdel int null,
write_id varchar(12) not null, // 글쓴이의 id
write_name varchar(12) not null, // 글쓴이의 이름
write_day date not null //글쓴 날짜
);테이블에 데이터를 입력하는 명령
insert into board values(
board_idx_seq.nextval,
'제목','내용',0,
board_groupid_seq.nextval,0,0,
0,
'id','name',sysdate
);테이블 제거 명령
drop table board;
테이블에서 이름을 변경하는 명령
alter table board rename column re_order to reindex;
테이블의 필드의 자료형을 수정하는 명령. 기존의 12를 20으로 늘림
alter table board modify write_id varchar(20);
테이블에 필드를 추가하는 명령
alter table board add filename varchar(30);
테이블에서 필드를 제거하는 명령. 사용하지 않는 필드를 제거
alter table board drop column filename;
시퀸스 생성 명령(게시글의 시퀸스와 댓글의 시퀸스)
최소 글 게시자는 글 인덱스와 그룹 아이디는 같다.
create sequence board_idx_seq increment by 1 start with 1;
create sequence board_groupid_seq increment by 1 start with 1;
시퀸스 조회 명령
select * from user_sequences;
시퀸스 제거 명령
drop sequence board_idx_seq;
drop sequence board_groupid_seq;필드 명에 별명을 주어서 처리하는 명령
select rownum,idx,title,content from board order by idx asc;
필드 명에 별명을 주어서 처리하는 명령
select rownum rnum,idx,title,content from board order by idx asc;
아래는 테이블에 별명을 줘서 처리하는 명령. 테이블 명이 길 때 사용하면 유용
select * from board a order by a.idx desc
select * from board a order by a.idx desc, a.title asc;자바에서 DB에 접속해보자.
designatedroom87.tistory.com/319?category=901206
게시판 만들기 - 2. 로그인 폼 만들기
아래의 내용과 이어진다. designatedroom87.tistory.com/318?category=901206 게시판 만들기 - 1. 기본 설정 우선, 아래의 두 파일을 다운 받아서 열어보도록 하자. 아래의 내용을 기반으로 환경 구축을 할 것이
designatedroom87.tistory.com
위의 중단 쯤에 DB에 접속해서 Open SQL Scrapbook 까지 열어보자.
그리고 현재 사용 중인 DB 타입을 선택하고 DB를 선택하자.
아래의 두 문장을 한 번에 드래그해서 호출하자.
create sequence board_idx_seq increment by 1 start with 1;
create sequence board_groupid_seq increment by 1 start with 1;아래의 명령을 호출해서 테이블을 생성하자.
create table board(
idx int not null primary key,
title varchar(100) not null,
content CLOB not null,
readcount int not null,
groupid int not null,
depth int not null,
re_order int not null,
isdel int null,
write_id varchar(12) not null,
write_name varchar(12) not null,
write_day date not null
);첫 번째로 위의 명령어를 저장할 jsp 파일을 만들자.
이 파일의 용도는 DB에서 쓸 명령어를 잊어버리면 참고해서 쓸 용도이다.
WebContent에 jsp파일을 만들자.
boardTable.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> create table board( idx int not null primary key, title varchar(100) not null, content CLOB not null, readcount int not null, groupid int not null, depth int not null, re_order int not null, isdel int null, write_id varchar(12) not null, write_name varchar(12) not null, write_day date not null ); alter table board rename column reindex to re_order; alter table board modify write_id varchar(20); alter table board add filename varchar(30); alter table board drop column filename; create sequence board_idx_seq increment by 1 start with 1; create sequence board_groupid_seq increment by 1 start with 1; select * from user_sequences; drop sequence board_idx_seq; drop sequence board_groupid_seq; drop table board; select * from board; select rownum,idx,title,content from board order by idx asc; select rownum rnum,idx,title,content from board order by idx asc; select * from board a order by a.idx desc select * from board a order by a.idx desc, a.title asc; insert into board values( board_idx_seq.nextval, '제목','내용',0, board_groupid_seq.nextval,0,0, 0, 'id','name',sysdate ); </body> </html>
앞에서도 했다시피, 로그인을 해야 게시판에 들어가는 것이 가능했다.
로그인을 하고 게시판으로 들어오면 그 때 게시판에 있는 내용들을 모두 보여주면 된다.
이 부분이 src/board.controller의 Controller.java 에서 if (command.equals("board")) 문에서 처리를 해야 한다.
기존의 body.jsp에서 list.jsp로 수정한다.
게시글들의 보여주는 내용은 list.jsp에서 하도록 한다.
우선 진행에 앞서 Controller.java 에서 구조적인 변경이 필요하다.
그 이유는 게시판 공간은 게시판에서 로그인의 유무가 중요하다.
게시판에서 로그인을 하지 않아도 보여줄 수 있는 정보가 있다.그러므로 로그인의 상태를 먼저 확인하는 것이 순서이다.
기존의 Controller를 WEB-INF/board에 복사해서 붙여 넣어 백업하는데, 이름을 Controller_backup이라 한다.
Controller를 같은 패키지에 두면 안된다. 서블릿의 어노테이션이 서로 충돌하기 때문이다.
절대 같은 공간에 Controller를 두면 안 된다.
Controller_backup.java
더보기package board.controller; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; 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 javax.servlet.http.HttpSession; // member로 들어오는 모든 url에 대해서 해당 컨트로럴가 이에 대한 처리를 하겠다는 의미 @WebServlet("/board/*") public class Controller_backup extends HttpServlet { private static final long serialVersionUID = 1L; public void init(ServletConfig config) throws ServletException {} protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //ServletContext application = request.getServletContext(); // 전역 객체 // 페이지 페이지 마다 연결 시간 설정 가능. 전역 객체이다. HttpSession session = request.getSession(); // 1. 페이지를 전송하기 전에 url을 분석하고 분류해서 실행 String url = request.getRequestURI(); //System.out.println("url : " +url); String contextPath = request.getContextPath(); //System.out.println("contextPath : " +contextPath); String path = url.substring(contextPath.length()); //System.out.println("path : " +path); String lastPath = url.substring(url.lastIndexOf('/') + 1); // 마지막 /를 기준으로 분리 System.out.println("subPath : " +lastPath); String command = lastPath; if (command.equals("board")) { if (session.getAttribute("id") != null) { //request.setAttribute("page", "body.jsp"); request.setAttribute("page", "list.jsp"); } else { request.setAttribute("page", "fail.jsp"); } } /* else if (command.equals("joinMember")) {request.setAttribute("page", "body.jsp");} */ else if (command.equals("list")) { // 1. DB생성(memberTable.jsp) // 폼에서 전송할 데이터 처리 // (1). 생성자를 통해 한 번에 담는 방법 // (2). 메소드 set함수를 이용하여 데이터를 저장하는 방법 // 2. 서비스 작업, dao작업을 한다. //BoardService service = BoardService.getInstance(); //int result = service.insertMember(member); // 3. data를 객체에 저장 request.setAttribute("page", "list.jsp"); } else{ if (session.getAttribute("id") != null) { //request.setAttribute("page", "body.jsp"); request.setAttribute("page", "list.jsp"); } else { request.setAttribute("page", "fail.jsp"); } } // 2. 분류된 url을 선택하고 전송하는 작업 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/board/index.jsp"); // 3. 페이지로 밀어주는 작업 dispatcher.forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} }
그리고, WEB-INF/board의 index.jsp 파일의 내용은 아래와 같다.
index.jsp
더보기<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link href="/css/style.css" rel="stylesheet"> <script src="/js/jquery-3.5.1.min.js"></script> <link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Montserrat"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script> <title>Insert title here</title> </head> <body> <jsp:include page="/WEB-INF/common/header.jsp"></jsp:include> <jsp:include page="/WEB-INF/board/${page}"></jsp:include> <jsp:include page="/WEB-INF/common/footer.jsp"></jsp:include> </body> </html>
src/board.controller/Controller.java 파일의 내용은 아래와 같다.
Controller.java
더보기package board.controller; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; 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 javax.servlet.http.HttpSession; import board.model.Board; import board.service.BoardService; // member로 들어오는 모든 url에 대해서 해당 컨트로럴가 이에 대한 처리를 하겠다는 의미 @WebServlet("/board/*") public class Controller extends HttpServlet { private static final long serialVersionUID = 1L; public void init(ServletConfig config) throws ServletException {} protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); // 한글 깨짐 방지 //ServletContext application = request.getServletContext(); // 전역 객체 // 페이지 페이지 마다 연결 시간 설정 가능. 전역 객체이다. HttpSession session = request.getSession(); // 1. 페이지를 전송하기 전에 url을 분석하고 분류해서 실행 String url = request.getRequestURI(); //System.out.println("url : " +url); String contextPath = request.getContextPath(); //System.out.println("contextPath : " +contextPath); String path = url.substring(contextPath.length()); //System.out.println("path : " +path); String lastPath = url.substring(url.lastIndexOf('/') + 1); // 마지막 /를 기준으로 분리 System.out.println("subPath : " +lastPath); String command = lastPath; // 로그인 여부를 먼저 확인 if (session.getAttribute("id") != null) { if (command.equals("board")) { request.setAttribute("page", "list.jsp"); } else if (command.equals("list")) { // 폼에서 전송된 데이터 받기 request.getParameter() String requestPage_ = request.getParameter("requestPage"); System.out.printf("%s\n",requestPage_); int requestPage = 1; if (requestPage_ != null) { requestPage = Integer.parseInt(requestPage_); } // service-dao work // BoardService service = BoardService.getInstance(); request.setAttribute("page", "list.jsp"); } else if (command.equals("searchList")) { String field = request.getParameter("field"); String search = request.getParameter("search"); System.out.printf("%s %s\n",field,search); request.setAttribute("page", "list.jsp"); } // 글쓰기버튼이 눌리면 else if (command.equals("insert")) { request.setAttribute("page", "writeForm.jsp"); } else if (command.equals("insert.do")) { String title = request.getParameter("title"); String content = request.getParameter("content"); String write_name = request.getParameter("write_name"); System.out.printf("%s %s %s\n",title,content,write_name); // model을 적용하여 전송 Board board = new Board(); board.setTitle(title); board.setContent(content); board.setWrite_name(write_name); // model 적용 end BoardService service = BoardService.getInstance(); //int result = service.insert(title,content,write_name); int result = service.insert(board); if (result == 1) { System.out.println("글입력 성공"); request.setAttribute("page", "success.jsp"); } else { System.out.println("글입력 실패"); request.setAttribute("page", "fail.jsp"); } } else { request.setAttribute("page", "list.jsp"); } } else{ request.setAttribute("page", "fail.jsp"); } // 2. 분류된 url을 선택하고 전송하는 작업 RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/board/index.jsp" ); // 3. 페이지로 밀어주는 작업 dispatcher.forward(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} }
WEB-INF/board폴더에 list.jsp파일을 만든다.
list.jsp
더보기<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <title>Page Message List</title> <script> function dataCheck() { if (document.getElementById("search").value ==""){ alert('검색할 단어를 입력하세요') document.getElementById("search").focus(); // 커서의 이동 return; } document.form.submit(); // name이 "form" 정보를 전송 } </script> </head> <body> <h2><button class="btn" onclick="location.href='/index'"><i class="fa fa-home"></i></button>리스트 출력</h2> <!-- 검색 리스트 --> <form name=form action="/board/searchList" method=post> <div class="form-group"> <select name=field> <option value=title>제목</option> <option value=content>내용</option> <option value=write_name>작성자</option> </select> <!-- <input type="text" name="name" placeholder="찾을 내용을 입력하세요"> --> <input onmouseover="this.focus()" type="text" id="search" name="search" placeholder="찾을 내용을 입력하세요"> <button type="button" onclick=dataCheck() class="btn btn-default">검색</button> </div> </form> <table class="table"> <tr class="success"> <th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회수</th> </tr> <!-- setAttribute함수에서 --> <c:forEach var="item" items = "${board.list}"> <tr onClick="location.href='/board/print?no=${item.idx}'" onmouseover="this.style.backgroundColor='lightgray'" onmouseout="this.style.backgroundColor='white'"> <td>${item.idx}</td> <td>${item.title}</td> <td>${item.content}</td> <td>${item.write_day}</td> <td>${item.readcount}</td> </tr> </c:forEach> <!-- Start Page list --> <tr> <td colspan=2 align=center valign="center"> <ul class="pagination"> <c:if test="${pageboard.requestPage!=1}"> <li class="page-item"><a class="page-link" href="/board/list?requestPage=${pageboard.requestPage-1}">이전페이지</a></li> </c:if> <c:forEach var="i" begin="${pageboard.beginPage}" end="${pageboard.endPage}"> <li class="page-item"><a class="page-link" href="/board/list.do?requestPage=${i}">${i}</a></li> </c:forEach> <c:if test="${pageboard.totalPage!=pageboard.requestPage}"> <li class="page-item"><a class="page-link" href="/board/list.do?requestPage=${pageboard.requestPage+1}">다음페이지</a></li> </c:if> </ul> </td> <td> <button onclick="location.href='/board/insert'">글쓰기</button> </td> </tr> <!-- End Page list --> </table> </body> </html>
위의 list.jsp 파일에서 글쓰기 버튼이 클릭되면 Controller 서블릿의 else if()command.equals("insert")) 에서 처리를 한다.
이 부분에서 writeForm.jsp로 웹 페이지를 이동해서 입력을 받고 나서, DB에 데이터를 저장해야 한다.
WEB-INF/board폴더에 writeForm.jsp 파일을 만들자.
글의 작성 뿐만 아니라 추가적으로 나중에 파일 업로드까지 이 jsp파일에서 할 수 있다.
writeForm.jsp
더보기<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <script> function dataCheck(){ if(document.getElementById("title").value==""){ alert("제목을 입력해 주세요") return; } if(document.getElementById("content").value==""){ alert("내용을 입력해 주세요") return; } document.form.submit(); } </script> <div class="container"> <h2><button class="btn" onclick="location.href='/index'"><i class="fa fa-home"></i></button>메시지 입력</h2> <form name=form action="/board/insert.do" method=post> <div class="form-group"> <label for="title">제목</label> <input type="text" class="form-control" id="title" name="title" placeholder="제목을 입력 하세요"> </div> <div class="form-group"> <label for="write_name">작성자</label> <input type="text" class="form-control" id="write_name" name="write_name" value="${sessionScope.id}" readonly /> </div> <div class="form-group"> <label for="content">글내용</label> <textarea class="form-control" id="content" name="content" cols="80%" rows="10" placeholder="글을 입력하세요"></textarea> </div> <button type="button" onclick=dataCheck() class="btn btn-default">입력</button> </form> </div>
writeForm.jsp에서 입력을 하고 입력 버튼을 누르면, Controller로 넘어가서
else if (command.equals("insert.do")) 에서 처리를 해야 한다.
이 부분에서는 폼에서 입력받은 데이터를 가지고 와서 DB에 접속해 저장하면 된다.
즉, 데이터를 전달받고, 서비스 접근 객체를 만들고 처리하면 된다.
이 기능을 만들기 위해서는 먼저, model이 필요하다.
src/board.model패키지에 Board.java 파일을 만든다.
Board.java 파일 내용
더보기package board.model; public class Board { int idx; String title; String content; int readcount; int groupid; int depth; int re_order; int isdel; String write_id; String write_name; String write_day; public Board() {} public Board(int idx, String title, String content, int readcount, int groupid, int depth, int re_order, int isdel, String write_id, String write_name, String write_day) { this.idx = idx; this.title = title; this.content = content; this.readcount = readcount; this.groupid = groupid; this.depth = depth; this.re_order = re_order; this.isdel = isdel; this.write_id = write_id; this.write_name = write_name; this.write_day = write_day; } public int getIdx() {return idx;} public void setIdx(int idx) {this.idx = idx;} public String getTitle() {return title;} public void setTitle(String title) {this.title = title;} public String getContent() {return content;} public void setContent(String content) {this.content = content;} public int getReadcount() {return readcount;} public void setReadcount(int readcount) {this.readcount = readcount;} public int getGroupid() {return groupid;} public void setGroupid(int groupid) {this.groupid = groupid;} public int getDepth() {return depth;} public void setDepth(int depth) {this.depth = depth;} public int getRe_order() {return re_order;} public void setRe_order(int re_order) {this.re_order = re_order;} public int getIsdel() {return isdel;} public void setIsdel(int isdel) {this.isdel = isdel;} public String getWrite_id() {return write_id;} public void setWrite_id(String write_id) {this.write_id = write_id;} public String getWrite_name() {return write_name;} public void setWrite_name(String write_name) {this.write_name = write_name;} public String getWrite_day() {return write_day;} public void setWrite_day(String write_day) {this.write_day = write_day;} }
src/board.service 패키지를 만들고, BoardService.java 파일을 만든다.
BoardService.java
더보기package board.service; import board.dao.BoardDAO; import board.model.Board; public class BoardService { private static BoardService service = new BoardService(); public BoardDAO dao = BoardDAO.getInstance(); private BoardService() {} public static BoardService getInstance(){return service;} // 글 입력 public int insert(String title, String content, String write_name) { return dao.insert(title,content,write_name); } // 글 입력 public int insert(Board board) { return dao.insert(board); } }
src/board.dao 패키지에 BoardDAO.java 파일을 만든다.
BoardDAO.java 파일 내용
더보기package board.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import board.model.Board; public class BoardDAO { private static BoardDAO dao = new BoardDAO(); private BoardDAO() {} public static BoardDAO getInstance() { return dao; } public Connection connect() { Connection conn = null; try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn=DriverManager.getConnection( "jdbc:oracle:thin:@localhost:1521:xe","hr","1234"); if(conn==null) {System.out.println("DB접속에 실패");} System.out.println("DB접속 성공"); }catch(Exception e) {} return conn; } public void close(Connection conn, PreparedStatement pstmt, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) {e.printStackTrace();} } this.close(conn,pstmt); } public void close(Connection conn, PreparedStatement pstmt) { try { pstmt.close(); conn.close(); } catch (SQLException e) {e.printStackTrace();} } // 글 입력 public int insert(String title, String content, String write_name) { Connection conn = null; PreparedStatement pstmt = null; int result = 0; String sql = null; try { conn = this.connect(); conn.setAutoCommit(false); // DB 트랜잭션의 시작 sql = "insert into board values("; sql += "board_idx_seq.nextval,"; sql += "?,?,0,"; sql += "board_groupid_seq.nextval,0,0,"; sql += "0,"; sql += "?,?,sysdate"; sql += ")"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, title); pstmt.setString(2, content); pstmt.setString(3, write_name); // id pstmt.setString(4, write_name); // name result = pstmt.executeUpdate(); if (result > 0) { System.out.println("SQL 글 입력 성공"); conn.commit(); }else { System.out.println("SQL 글 입력 실패"); conn.rollback(); } this.close(conn, pstmt); } catch(Exception e) { try { conn.rollback(); } catch (SQLException e1) {e1.printStackTrace();} } return result; } // 글 입력 public int insert(Board board) { Connection conn = null; PreparedStatement pstmt = null; int result = 0; String sql = null; try { conn = this.connect(); conn.setAutoCommit(false); // DB 트랜잭션의 시작 sql = "insert into board values("; sql += "board_idx_seq.nextval,"; sql += "?,?,0,"; sql += "board_groupid_seq.nextval,0,0,"; sql += "0,"; sql += "?,?,sysdate"; sql += ")"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, board.getTitle()); pstmt.setString(2, board.getContent()); pstmt.setString(3, board.getWrite_name()); // id pstmt.setString(4, board.getWrite_name()); // name result = pstmt.executeUpdate(); if (result > 0) { System.out.println("SQL 글 입력 성공"); conn.commit(); }else { System.out.println("SQL 글 입력 실패"); conn.rollback(); } this.close(conn, pstmt); } catch(Exception e) { try { conn.rollback(); } catch (SQLException e1) {e1.printStackTrace();} } return result; } }
그리고, WEB-INF/board폴더에, success.jsp 파일을 만들자.
이 파일들의 용도는 게시글의 입력이 DB에 접속해서 저장이 무사히 완료된 경우와 그렇지 않은 경우에
그 결과를 보여줄 웹 페이지이다.
데이터의 저장이 무사히 완료되면, Controller의 list로 가서 list.jsp로 이동한다.
success.jsp
더보기<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <script> result = alert("글입력이 성공하셨습니다.") location.href = "/board/list" </script>
실행은 늘 항상 index파일을 run on server로 실행하자.
내용을 입력하면 list.jsp에는 내용이 나오지 않지만, DB에서는 저장이 되어 있음을 알 수 있다.
아래의 내용을 뒤이어 구현해보자.
designatedroom87.tistory.com/324?category=901206
게시판 만들기 - 5. DB에 저장한 게시글을 조회하고 읽기 가능하게 만들기
게시글 나오게 하고, 글 읽기하고 조회한 게시물 증가를 구현하자. src/board.model/Board.java 파일에 수정이 필요하다. 기존에 날짜는 자료형을 String에서 Date로 수정한다. Board.java 더보기 package board.m..
designatedroom87.tistory.com
'JAVA > 웹 프로그래밍 - JSP' 카테고리의 다른 글
게시판 만들기 - 5. DB에 저장한 게시글을 조회하고 읽기 가능하게 만들기 (0) 2020.11.26 웹 채팅 만들기 (0) 2020.11.25 게시판 만들기 - 3. 로그인 하고 세션 유지 & 로그인 상태에 따라 게시판 보기 (0) 2020.11.24 게시판 만들기 - 2. 로그인 폼 만들기 (0) 2020.11.23 게시판 만들기 - 1. 기본 설정 (0) 2020.11.20