전체 글 목록보기 기능에 이어 글 작성 기능을 구현할 것입니다.
글 작성 기능은 글 수정 기능과 매우 유사하기 때문에 작성 기능만 완료하면 수정 기능도 금방 만들 수 있습니다.
글 작성 구현
Controller
case "/write.do":
viewPage = "write.jsp";
break;
case "/writeOk.do":
command = new WriteCommand();
command.execute(request, response);
viewPage = "writeOk.jsp";
break;
Controller 부분의 write.do와 writeOk.do 부분에는 위와 같이 작성합니다.
write.do에서는 form 부분만 작성하고, form에서 입력받은 데이터를 데이터베이스에 저장하는 것은 writeOk.do에서 처리하게 됩니다.
그러므로 write.do에서는 사용자가 입력할 form을 보여주는 viewPage만 있으면 되고, writeOk.do에서는 Command가 필요하게 됩니다.
write.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>신규 도서 등록</title>
</head>
<body>
<h2>신규 도서 등록</h2>
<form name="frm" action="writeOk.do" method="post" onsubmit="return chkSubmit()">
도서 제목 <input type="text" name="title"/><br>
도서 가격 <input type="number" name="price"/><br><br>
내용 <br>
<textarea name="summary"></textarea>
<br><br>
<input type="submit" value="등록하기"/>
</form>
<br>
<button type="button" onclick="location.href='list.do'">목록으로</button>
<script>
function chkSubmit() {
frm = document.forms['frm'];
let title = frm['title'].value.trim();
if (title == '') {
alert("도서 제목은 반드시 입력해야 합니다");
frm['title'].focus();
return false;
}
return true;
}
</script>
</body>
</html>
title 값은 not null로 설정을 해놓았으므로 JS를 이용해 writeOk로 입력받은 데이터를 보내기 전 title 값이 null인지 체크를 합니다.
chkSubmit() 함수를 사용해 form에 입력받은 title 값을 받고, 앞 뒤 공백을 제거한 뒤 해당 값이 빈 문자열인 경우 알림창을 띄우고, false를 리턴합니다. 만약 해당 조건에 부합하지 않는 경우는 도서 제목을 올바르게 입력한 경우이므로 true를 리턴하여 writeOk.do로 넘어갑니다.
BookController에 작성한 바에 따르면 writeOk.do로 넘어가면 WriteCommand 클래스의 execute() 메서드가 실행됩니다.
WriteCommand
package com.controller;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.beans.BookDAO;
import com.beans.BookDTO;
import com.command.Command;
public class WriteCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
int cnt = 0;
String title = request.getParameter("title");
String summary = request.getParameter("summary");
int price = Integer.parseInt(request.getParameter("price"));
BookDTO dto = new BookDTO();
dto.setTitle(title);
dto.setSummary(summary);
dto.setPrice(price);
if (title != null && title.trim().length() > 0) {
try {
cnt = new BookDAO().insert(dto);
} catch(SQLException e) {
e.printStackTrace();
}
}
request.setAttribute("result", cnt);
request.setAttribute("dto", dto); // auto-generated key (uid)
}
}
write.jsp에서 입력한 title과 summary, price 값을 가져와 변수에 저장합니다.
BookDTO 객체를 생성하여 가져온 값들을 dto에 set 합니다.
이때도 title 값을 검증합니다. 프론트엔드에서와 백엔드에서 모두 한 번씩 검증을 해주면 조금 더 안전한 코드가 됩니다.
만약 title 값이 null이 아닌 경우 BookDAO() 인스턴스의 insert() 메서드를 실행시키고 반환된 값을 cnt 변수에 저장합니다.
writeOK.jsp에 request Attribute를 "result"와 "dto" 두 가지를 설정합니다.
cnt 값이 1이라면 데이터베이스에 데이터가 제대로 insert가 되었다는 뜻입니다. 또한 게시글이 올바르게 등록되었다면 해당 게시글을 view 하는 창으로 바로 넘어갈 것이므로 해당 글의 uid가 필요합니다. dto에 담긴 uid를 사용할 것이므로 dto도 attribute에 set해서 넘겨줍니다.
BookDAO().insert()
public int insert(BookDTO dto) throws SQLException {
int cnt = 0;
String title = dto.getTitle();
String summary = dto.getSummary();
int price = dto.getPrice();
int uid;
String[] generatedCols = {"bk_uid"};
try {
pstmt = conn.prepareStatement(D.SQL_BOOK_INSERT, generatedCols);
pstmt.setString(1, title);
pstmt.setString(2, summary);
pstmt.setInt(3, price);
cnt = pstmt.executeUpdate();
if (cnt > 0) {
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
uid = rs.getInt(1);
dto.setUid(uid);
}
}
} finally {
close();
}
return cnt;
}
WriteCommand에서 사용한 BookDAO 클래스의 insert() 메서드입니다.
사용자가 입력한 값인 title, summary, price 값을 가져옵니다.
이후 auto_incremenet 값인 uid 값을 dto 객체에 담아야 합니다. uid 값은 auto_increment 값이므로 prepareStatement() 메서드 사용 시 매개변수를 두 개 줍니다.
첫 번째 값은 SQL 문이고, 두 번째 값은 auto_increment 값인 컬럼의 이름입니다. 이때 컬럼의 이름은 String[] 형태로 들어가야하므로 String[] generatedCols을 선언하여 "bk_uid" 문자열 값을 하나 저장하였습니다.
String[]을 선언하지 않고 값을 넣는 방법도 있습니다.
이후 getFeneratedKeys() 메서드를 사용하여 가져온 bk_uid 값을 ResultSet에 저장하고, 해당 값을 uid 변수에 저장하여 dto에 set합니다.
Query문
public static final String SQL_BOOK_INSERT = "INSERT INTO book" + "(bk_title, bk_summary, bk_price)"
+ "VALUES (?, ?, ?)";
bk_uid는 auto_increment이고, bk_viewcnt와 bk_regdate는 default 값이 설정되어있으므로 bk_title, bk_summary, bk_price 세 값만 데이터를 입력합니다.
writeOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.beans.*" %>
<%
int cnt = (Integer)request.getAttribute("result");
BookDTO dto = (BookDTO)request.getAttribute("dto");
%>
<% if (cnt == 0) { %>
<script>
alert("등록 실패");
history.back();
</script>
<% } else { %>
<script>
alert("등록 성공");
location.href = "view.do?uid=<%=dto.getUid()%>";
</script>
<% } %>
WriteCommand에서 설정해주었던 attribute인 "result"와 "dto"를 가져와 각각 변수 cnt와 dto에 저장합니다.
이때 cnt가 0인 경우 insert 쿼리문이 제대로 실행되지 않았다는 의미이므로 등록 실패라는 알림창을 띄웁니다.
등록이 성공하였다면 등록 성공이라는 알림창을 띄우고 해당 게시글 상세 보기 페이지인 view.do로 이동합니다.
view.do는 게시글의 uid 값이 필요하므로 dto에 저장된 uid값을 불러와 사용합니다.
Github
https://github.com/MJKim99/JSP_Board_Book.git
GitHub - MJKim99/JSP_Board_Book: JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판
JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판. Contribute to MJKim99/JSP_Board_Book development by creating an account on GitHub.
github.com
전체 글 목록보기 기능에 이어 글 작성 기능을 구현할 것입니다.
글 작성 기능은 글 수정 기능과 매우 유사하기 때문에 작성 기능만 완료하면 수정 기능도 금방 만들 수 있습니다.
글 작성 구현
Controller
case "/write.do":
viewPage = "write.jsp";
break;
case "/writeOk.do":
command = new WriteCommand();
command.execute(request, response);
viewPage = "writeOk.jsp";
break;
Controller 부분의 write.do와 writeOk.do 부분에는 위와 같이 작성합니다.
write.do에서는 form 부분만 작성하고, form에서 입력받은 데이터를 데이터베이스에 저장하는 것은 writeOk.do에서 처리하게 됩니다.
그러므로 write.do에서는 사용자가 입력할 form을 보여주는 viewPage만 있으면 되고, writeOk.do에서는 Command가 필요하게 됩니다.
write.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>신규 도서 등록</title>
</head>
<body>
<h2>신규 도서 등록</h2>
<form name="frm" action="writeOk.do" method="post" onsubmit="return chkSubmit()">
도서 제목 <input type="text" name="title"/><br>
도서 가격 <input type="number" name="price"/><br><br>
내용 <br>
<textarea name="summary"></textarea>
<br><br>
<input type="submit" value="등록하기"/>
</form>
<br>
<button type="button" onclick="location.href='list.do'">목록으로</button>
<script>
function chkSubmit() {
frm = document.forms['frm'];
let title = frm['title'].value.trim();
if (title == '') {
alert("도서 제목은 반드시 입력해야 합니다");
frm['title'].focus();
return false;
}
return true;
}
</script>
</body>
</html>
title 값은 not null로 설정을 해놓았으므로 JS를 이용해 writeOk로 입력받은 데이터를 보내기 전 title 값이 null인지 체크를 합니다.
chkSubmit() 함수를 사용해 form에 입력받은 title 값을 받고, 앞 뒤 공백을 제거한 뒤 해당 값이 빈 문자열인 경우 알림창을 띄우고, false를 리턴합니다. 만약 해당 조건에 부합하지 않는 경우는 도서 제목을 올바르게 입력한 경우이므로 true를 리턴하여 writeOk.do로 넘어갑니다.
BookController에 작성한 바에 따르면 writeOk.do로 넘어가면 WriteCommand 클래스의 execute() 메서드가 실행됩니다.
WriteCommand
package com.controller;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.beans.BookDAO;
import com.beans.BookDTO;
import com.command.Command;
public class WriteCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
int cnt = 0;
String title = request.getParameter("title");
String summary = request.getParameter("summary");
int price = Integer.parseInt(request.getParameter("price"));
BookDTO dto = new BookDTO();
dto.setTitle(title);
dto.setSummary(summary);
dto.setPrice(price);
if (title != null && title.trim().length() > 0) {
try {
cnt = new BookDAO().insert(dto);
} catch(SQLException e) {
e.printStackTrace();
}
}
request.setAttribute("result", cnt);
request.setAttribute("dto", dto); // auto-generated key (uid)
}
}
write.jsp에서 입력한 title과 summary, price 값을 가져와 변수에 저장합니다.
BookDTO 객체를 생성하여 가져온 값들을 dto에 set 합니다.
이때도 title 값을 검증합니다. 프론트엔드에서와 백엔드에서 모두 한 번씩 검증을 해주면 조금 더 안전한 코드가 됩니다.
만약 title 값이 null이 아닌 경우 BookDAO() 인스턴스의 insert() 메서드를 실행시키고 반환된 값을 cnt 변수에 저장합니다.
writeOK.jsp에 request Attribute를 "result"와 "dto" 두 가지를 설정합니다.
cnt 값이 1이라면 데이터베이스에 데이터가 제대로 insert가 되었다는 뜻입니다. 또한 게시글이 올바르게 등록되었다면 해당 게시글을 view 하는 창으로 바로 넘어갈 것이므로 해당 글의 uid가 필요합니다. dto에 담긴 uid를 사용할 것이므로 dto도 attribute에 set해서 넘겨줍니다.
BookDAO().insert()
public int insert(BookDTO dto) throws SQLException {
int cnt = 0;
String title = dto.getTitle();
String summary = dto.getSummary();
int price = dto.getPrice();
int uid;
String[] generatedCols = {"bk_uid"};
try {
pstmt = conn.prepareStatement(D.SQL_BOOK_INSERT, generatedCols);
pstmt.setString(1, title);
pstmt.setString(2, summary);
pstmt.setInt(3, price);
cnt = pstmt.executeUpdate();
if (cnt > 0) {
rs = pstmt.getGeneratedKeys();
if (rs.next()) {
uid = rs.getInt(1);
dto.setUid(uid);
}
}
} finally {
close();
}
return cnt;
}
WriteCommand에서 사용한 BookDAO 클래스의 insert() 메서드입니다.
사용자가 입력한 값인 title, summary, price 값을 가져옵니다.
이후 auto_incremenet 값인 uid 값을 dto 객체에 담아야 합니다. uid 값은 auto_increment 값이므로 prepareStatement() 메서드 사용 시 매개변수를 두 개 줍니다.
첫 번째 값은 SQL 문이고, 두 번째 값은 auto_increment 값인 컬럼의 이름입니다. 이때 컬럼의 이름은 String[] 형태로 들어가야하므로 String[] generatedCols을 선언하여 "bk_uid" 문자열 값을 하나 저장하였습니다.
String[]을 선언하지 않고 값을 넣는 방법도 있습니다.
이후 getFeneratedKeys() 메서드를 사용하여 가져온 bk_uid 값을 ResultSet에 저장하고, 해당 값을 uid 변수에 저장하여 dto에 set합니다.
Query문
public static final String SQL_BOOK_INSERT = "INSERT INTO book" + "(bk_title, bk_summary, bk_price)"
+ "VALUES (?, ?, ?)";
bk_uid는 auto_increment이고, bk_viewcnt와 bk_regdate는 default 값이 설정되어있으므로 bk_title, bk_summary, bk_price 세 값만 데이터를 입력합니다.
writeOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.beans.*" %>
<%
int cnt = (Integer)request.getAttribute("result");
BookDTO dto = (BookDTO)request.getAttribute("dto");
%>
<% if (cnt == 0) { %>
<script>
alert("등록 실패");
history.back();
</script>
<% } else { %>
<script>
alert("등록 성공");
location.href = "view.do?uid=<%=dto.getUid()%>";
</script>
<% } %>
WriteCommand에서 설정해주었던 attribute인 "result"와 "dto"를 가져와 각각 변수 cnt와 dto에 저장합니다.
이때 cnt가 0인 경우 insert 쿼리문이 제대로 실행되지 않았다는 의미이므로 등록 실패라는 알림창을 띄웁니다.
등록이 성공하였다면 등록 성공이라는 알림창을 띄우고 해당 게시글 상세 보기 페이지인 view.do로 이동합니다.
view.do는 게시글의 uid 값이 필요하므로 dto에 저장된 uid값을 불러와 사용합니다.
Github
https://github.com/MJKim99/JSP_Board_Book.git
GitHub - MJKim99/JSP_Board_Book: JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판
JSP와 Java Servlet을 사용해 만드는 도서 목록 게시판. Contribute to MJKim99/JSP_Board_Book development by creating an account on GitHub.
github.com