SQL 디벨로퍼에서 방명록 게시글을 저장하기 위한 GUEST 테이블 생성
create table guest(num number primary key, writer varchar2(50), subject varchar2(200),
content varchar2(1000), regdate date);
방명록 게시글의 글번호를 제공하기 위한 시퀀스 생성
create sequence guest_seq;
GUEST 테이블의 행을 표현하기 위한 GuestDTO 클래스 생성
package xyz.itwill.dto;
public class GuestDTO {
private int num;
private String writer;
private String subject;
private String content;
private String regdate;
//생성자
public GuestDTO() {
// TODO Auto-generated constructor stub
}
public GuestDTO(int num, String writer, String subject, String content, String regdate) {
super();
this.num = num;
this.writer = writer;
this.subject = subject;
this.content = content;
this.regdate = regdate;
}
//SETTER GETTER 메소드
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
}
GUEST 테이블에 행을 삽입, 변경, 삭제, 검색하기 위한 기능을 제공하는 GuestDAO 클래스 생성
package xyz.itwill.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import xyz.itwill.dto.GuestDTO;
public class GuestDAO extends JdbcDAO {
private static GuestDAO _dao;
private GuestDAO() {
// TODO Auto-generated constructor stub
}
static {
_dao=new GuestDAO();
}
public static GuestDAO getDAO() {
return _dao;
}
//방명록 게시글정보를 전달받아 GUEST 테이블에 삽입하고 삽입행의 갯수를 반환하는 메소드
public int insertGuest(GuestDTO guest) {
Connection con=null;
PreparedStatement pstmt=null;
int rows=0;
try {
con=getConnection();
String sql="insert into guest values(guest_seq.nextval, ?, ?, ?, sysdate)";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, guest.getWriter());
pstmt.setString(2, guest.getSubject());
pstmt.setString(3, guest.getContent());
rows=pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("[에러]insertGuest() 메소드의 SQL 오류 = "+e.getMessage());
} finally {
close(con, pstmt);
}
return rows;
}
//방명록 게시글정보를 전달받아 GUEST 테이블에 저장된 행을 변경하고 변경행의 갯수를 반환하는 메소드
public int updateGuest(GuestDTO guest) {
Connection con=null;
PreparedStatement pstmt=null;
int rows=0;
try {
con=getConnection();
String sql="update guest set writer=?, subject=?, content=? where num=?";
pstmt=con.prepareStatement(sql);
pstmt.setString(1, guest.getWriter());
pstmt.setString(2, guest.getSubject());
pstmt.setString(3, guest.getContent());
pstmt.setInt(4, guest.getNum());
rows=pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("[에러]updateGuest() 메소드의 SQL 오류 = "+e.getMessage());
} finally {
close(con, pstmt);
}
return rows;
}
//방명록 게시글번호를 전달받아 GUEST 테이블에 저장된 행을 삭제하고 삭제행의 갯수를 반환하는 메소드
public int deleteGuest(int num) {
Connection con=null;
PreparedStatement pstmt=null;
int rows=0;
try {
con=getConnection();
String sql="delete from guest where num=?";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, num);
rows=pstmt.executeUpdate();
} catch (SQLException e) {
System.out.println("[에러]deleteGuest() 메소드의 SQL 오류 = "+e.getMessage());
} finally {
close(con, pstmt);
}
return rows;
}
//방명록 게시글번호를 전달받아 GUEST 테이블에 저장된 행을 검색하여 반환하는 메소드
public GuestDTO selectGuest(int num) {
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
GuestDTO guest=null;
try {
con=getConnection();
String sql="select * from guest where num=?";
pstmt=con.prepareStatement(sql);
pstmt.setInt(1, num);
rs=pstmt.executeQuery();
if(rs.next()) {
guest=new GuestDTO();
guest.setNum(rs.getInt("num"));
guest.setWriter(rs.getString("writer"));
guest.setSubject(rs.getString("subject"));
guest.setContent(rs.getString("content"));
guest.setRegdate(rs.getString("regdate"));
}
} catch (SQLException e) {
System.out.println("[에러]selectGuest() 메소드의 SQL 오류 = "+e.getMessage());
} finally {
close(con, pstmt, rs);
}
return guest;
}
//GUEST 테이블에 저장된 모든 행을 검색하여 반환하는 메소드
public List<GuestDTO> selectGuestList() {
Connection con=null;
PreparedStatement pstmt=null;
ResultSet rs=null;
List<GuestDTO> guestList=new ArrayList<>();
try {
con=getConnection();
String sql="select * from guest order by num desc";
pstmt=con.prepareStatement(sql);
rs=pstmt.executeQuery();
while(rs.next()) {
GuestDTO guest=new GuestDTO();
guest.setNum(rs.getInt("num"));
guest.setWriter(rs.getString("writer"));
guest.setSubject(rs.getString("subject"));
guest.setContent(rs.getString("content"));
guest.setRegdate(rs.getString("regdate"));
guestList.add(guest);
}
} catch (SQLException e) {
System.out.println("[에러]selectGuestList() 메소드의 SQL 오류 = "+e.getMessage());
} finally {
close(con, pstmt, rs);
}
return guestList;
}
}
GUEST 테이블에 저장된 모든 행을 검색하여 클라이언트에게 전달하여 응답하는 GuestSelectServlet 생성
→ [글쓰기]를 클릭한 경우 방명록 입력페이지(/guest/insertForm.itwill)로 이동하도록 처리
→ 방명록 게시글의 [변경] 태그를 클릭한 경우 방명록 게시글의 입력페이지(/guest/modifyForm.itwill)로 이동 - 글번호 전달
→ 방명록 게시글의 [삭제] 태그를 클릭한 경우 방명록 게시글 삭제페이지(/guest/remove.itwill)로 이동 - 글번호 전달
package xyz.itwill.guest;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
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 xyz.itwill.dao.GuestDAO;
import xyz.itwill.dto.GuestDTO;
@WebServlet("/guest/list.itwill")
public class GuestSelectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//GUEST 테이블에 저장된 모든 행을 검색하여 List 객체로 반환하는 DAO 클래스의 메소드 호출
List<GuestDTO> guestList=GuestDAO.getDAO().selectGuestList();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>방명록 글목록</h1>");
out.println("<hr>");
out.println("<table width='1000'>");
out.println("<tr>");
out.println("<td align='right'>");
out.println("<button type='button' onclick='location.href=\"writeForm.itwill\";'>글쓰기</button>");
out.println("</td>");
out.println("</tr>");
if(guestList.isEmpty()) {//List 객체에 요소가 없는 경우 - 검색행이 없는 경우
out.println("<tr>");
out.println("<td>");
out.println("<table border='1' cellspacing='0' width='100%'>");
out.println("<tr>");
out.println("<td align='center'>검색된 방명록 게시글이 하나도 없습니다.</td>");
out.println("</tr>");
out.println("</table>");
out.println("</td>");
out.println("</tr>");
} else {//List 객체에 요소가 있는 경우 - 검색행이 있는 경우
for(GuestDTO guest : guestList) {
out.println("<tr>");
out.println("<td align='center'>");
out.println("<table border='1' cellspacing='0' width='100%'>");
out.println("<tr>");
out.println("<th width='150'>작성자</th>");
out.println("<td width='200' align='center'>"+guest.getWriter()+"</td>");
out.println("<th width='150'>작성일자</th>");
out.println("<td width='500' align='center'>"+guest.getRegdate()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<th width='150'>제목</th>");
out.println("<td width='650' colspan='3'>"+guest.getSubject()+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<th width='150'>내용</th>");
out.println("<td width='650' colspan='3'>"+guest.getContent().replace("\n", "<br>")+"</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td align='right' colspan='4'>");
out.println("<button type='button' onclick='location.href=\"modifyForm.itwill?num="+guest.getNum()+"\";'>변경</button>");
out.println("<button type='button' onclick='location.href=\"remove.itwill?num="+guest.getNum()+"\";'>삭제</button>");
out.println("</td");
out.println("</tr>");
out.println("</table>");
out.println("</td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td> </td>");
out.println("</tr>");
}
}
out.println("</table>");
out.println("</body>");
out.println("</html>");
}
}
사용자로부터 방명록 게시물을 입력받기 위한 GuestInsertFormServlet 생성
→ [글저장] 태그를 클릭한 경우 방명록 게시글 삽입페이지(/guest.write.itwil)로 이동
→ [글목록] 태그를 클릭한 경우 방명록 게시글 목록페이지(/guest.list.itwill)로 이동
package xyz.itwill.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/guest/writeForm.itwill")
public class GuestInsertFormServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>방명록 글쓰기</h1>");
out.println("<hr>");
out.println("<form action='write.itwill' method='post' name='insertForm'>");
out.println("<table>");
out.println("<tr>");
out.println("<td>작성자</td>");
out.println("<td><input type='text' name='writer'></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>제목</td>");
out.println("<td><input type='text' name='subject'></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>내용</td>");
out.println("<td><textarea rows='4' cols='60' name='content'></textarea></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td colspan='2'>");
out.println("<button type='button' id='saveBtn'>글저장</button>");
out.println("<button type='reset'>다시쓰기</button>");
out.println("<button type='button' onclick='location.href=\"list.itwill\";'>글목록</button>");
out.println("</td>");
out.println("</tr>");
out.println("</table>");
out.println("</form>");
out.println("<script type='text/javascript'>");
out.println("insertForm.writer.focus();");
out.println("document.getElementById('saveBtn').onclick=function() {");
out.println("if(insertForm.writer.value=='') {");
out.println("alert('작성자를 입력해 주세요.');");
out.println("insertForm.writer.focus();");
out.println("return;");
out.println("}");
out.println("if(insertForm.subject.value=='') {");
out.println("alert('제목을 입력해 주세요.');");
out.println("insertForm.subject.focus();");
out.println("return;");
out.println("}");
out.println("if(insertForm.content.value=='') {");
out.println("alert('내용을 입력해 주세요.');");
out.println("insertForm.content.focus();");
out.println("return;");
out.println("}");
out.println("insertForm.submit();");
out.println("}");
out.println("</script>");
out.println("</body>");
out.println("</html>");
}
}
방명록 게시글을 전달받아 GUEST 테이블에 삽입하고 방명록 게시글 목록페이지(/guest/list.itwill)로 이동하기 위한 URL 주소를 클라이언트에게 전달하여 응답하는 GuestInsertServlet 생성
→ 방명록 게시글 입력페이지(guest/writeForm.itwill)에서 form 태그를 사용해 post 방식으로 요청하는 서블릿
package xyz.itwill.guest;
import java.io.IOException;
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 xyz.itwill.dao.GuestDAO;
import xyz.itwill.dto.GuestDTO;
@WebServlet("/guest/write.itwill")
public class GuestInertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//서블릿을 GET 방식으로 요청한 경우 - 비정상적 요청
if(request.getMethod().equals("GET")) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
return;
}
//리퀘스트 메세지 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경
request.setCharacterEncoding("utf-8");
//전달값을 반환받아 저장
String writer=request.getParameter("writer");
String subject=request.getParameter("subject");
String content=request.getParameter("content");
//DTO 객체를 생성하여 전달값으로 필드값 변경
GuestDTO guest=new GuestDTO();
guest.setWriter(writer);
guest.setSubject(subject);
guest.setContent(content);
//DTO 객체를 전달받아 GUEST 테이블에 행을 삽입하는 DAO 클래스의 메소드 호출
GuestDAO.getDAO().insertGuest(guest);
//클라이언트에게 URL 주소를 전달하여 응답 처리
// => 클라이언트는 전달받은 URL 주소의 서블릿을 요청하여 실행결과를 응답받아 출력 - 리다이렉트 이동
response.sendRedirect("list.itwill");
}
}
글번호를 전달받아 GUEST 테이블에 저장된 방명록 게시글을 검색하여 입력태그의 초기값으로 설정하고 사용자로부터 방명록 게시글(변경값)을 입력받기 위한 GuestUpdateFormServlet 생성
→ [글변경] 태그를 클릭한 경우 방명록 게시글 변경페이지(/guest/modify.itwill)로 이동 - 입력값 전달
→ [글목록] 태그를 클릭한 경우 방명록 게시글 목록페이지(/guest/list.itwill)로 이동
package xyz.itwill.guest;
import java.io.IOException;
import java.io.PrintWriter;
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 xyz.itwill.dao.GuestDAO;
import xyz.itwill.dto.GuestDTO;
@WebServlet("/guest/modifyForm.itwill")
public class GuestUpdateFormServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//전달값이 없는 경우 - 비정상적인 요청
if(request.getParameter("num")==null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
//전달값을 반환받아 정수값으로 변환하여 저장
int num=Integer.parseInt(request.getParameter("num"));
//글번호를 전달받아 GUEST 테이블에 저장된 해당 글번호의 방명록 게시글을 검색하여
//DTO 객체를 반환하는 DAO 클래스의 메소드 호출
GuestDTO guest=GuestDAO.getDAO().selectGuest(num);
//검색된 방명록 게시글이 없는 경우 - 비정상적인 요청
if(guest==null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='UTF-8'>");
out.println("<title>Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>방명록 글변경</h1>");
out.println("<hr>");
out.println("<form action='modify.itwill' method='post' name='modifyForm'>");
//방명록 게시글을 구분하기 위한 글번호를 반드시 전달
out.println("<input type='hidden' name='num' value='"+guest.getNum()+"'>");
out.println("<table>");
out.println("<tr>");
out.println("<td>작성자</td>");
out.println("<td><input type='text' name='writer' value='"+guest.getWriter()+"'></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>제목</td>");
out.println("<td><input type='text' name='subject' value='"+guest.getSubject()+"'></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td>내용</td>");
out.println("<td><textarea rows='4' cols='60' name='content'>"+guest.getContent()+"</textarea></td>");
out.println("</tr>");
out.println("<tr>");
out.println("<td colspan='2'>");
out.println("<button type='button' id='modifyBtn'>글변경</button>");
out.println("<button type='reset'>다시쓰기</button>");
out.println("<button type='button' onclick='location.href=\"list.itwill\";'>글목록</button>");
out.println("</td>");
out.println("</tr>");
out.println("</table>");
out.println("</form>");
out.println("<script type='text/javascript'>");
out.println("modifyForm.writer.focus();");
out.println("document.getElementById('modifyBtn').onclick=function() {");
out.println("if(modifyForm.writer.value=='') {");
out.println("alert('작성자를 입력해 주세요.');");
out.println("modifyForm.writer.focus();");
out.println("return;");
out.println("}");
out.println("if(modifyForm.subject.value=='') {");
out.println("alert('제목을 입력해 주세요.');");
out.println("modifyForm.subject.focus();");
out.println("return;");
out.println("}");
out.println("if(modifyForm.content.value=='') {");
out.println("alert('내용을 입력해 주세요.');");
out.println("modifyForm.content.focus();");
out.println("return;");
out.println("}");
out.println("modifyForm.submit();");
out.println("}");
out.println("</script>");
out.println("</body>");
out.println("</html>");
}
}
방명록 게시글을 전달받아 GUEST 테이블에 삽입하고 방명록 게시글 목록페이지(/guest/list.itwill)로 이동하기 위한 URL 주소를 클라이언트에게 전달하여 응답하는 GuestUpdateServlet 생성
→ 방명록 게시글 입력페이지(guest/modifyForm.itwill)에서 form 태그를 사용해 post 방식으로 요청하는 서블릿
package xyz.itwill.guest;
import java.io.IOException;
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 xyz.itwill.dao.GuestDAO;
import xyz.itwill.dto.GuestDTO;
@WebServlet("/guest/modify.itwill")
public class GuestUpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//서블릿을 GET 방식으로 요청한 경우 - 비정상적 요청
if(request.getMethod().equals("GET")) {
response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
return;
}
//리퀘스트 메세지 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경
request.setCharacterEncoding("utf-8");
//전달값을 반환받아 저장
//String numParam=request.getParameter("num");
//Integer num = Integer.valueOf(numParam);
int num=Integer.parseInt(request.getParameter("num"));
String writer=request.getParameter("writer");
String subject=request.getParameter("subject");
String content=request.getParameter("content");
//DTO 객체를 생성하여 전달값으로 필드값 변경
GuestDTO guest=new GuestDTO();
guest.setNum(num);
guest.setWriter(writer);
guest.setSubject(subject);
guest.setContent(content);
//DTO 객체를 전달받아 GUEST 테이블에 저장된 행을 변경하는 DAO 클래스의 메소드 호출
GuestDAO.getDAO().updateGuest(guest);
//클라이언트에게 URL 주소를 전달하여 응답 처리
// => 클라이언트는 전달받은 URL 주소의 서블릿을 요청하여 실행결과를 응답받아 출력 - 리다이렉트 이동
response.sendRedirect("list.itwill");
}
}
글번호를 전달받아 GUEST 테이블에 저장된 행을 삭제하고 방명록 게시글 목록페이지(/guest/list.itwill)로 이동하기 위한 URL 주소를 클라이언트에게 전달하여 응답하는 GuestDeleteServlet 생성
package xyz.itwill.guest;
import java.io.IOException;
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 xyz.itwill.dao.GuestDAO;
import xyz.itwill.dto.GuestDTO;
@WebServlet("/guest/remove.itwill")
public class GuestDeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//전달값이 없는 경우 - 비정상적 요청
if(request.getParameter("num")==null) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
return;
}
//전달값을 반환받아 정수값으로 변환하여 저장
int num=Integer.parseInt(request.getParameter("num"));
//글번호를 전달받아 GUEST 테이블에 저장된 행을 삭제하는 DAO 클래스의 메소드 호출
int rows=GuestDAO.getDAO().deleteGuest(num);
if(rows>0) {//삭제된 행이 있는 경우
response.sendRedirect("list.itwill");
} else {//삭제된 행이 없는 경우 - 비정상적인 요청
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
}
}
'학원 > 복기' 카테고리의 다른 글
[JSP] 스크립트 요소(Script Element) (0) | 2023.06.20 |
---|---|
[JSP] JSP란? (0) | 2023.06.20 |
[Servlet] Servelet과 JDBC 연동 (DAO 사용한 예제와 JNDI) (0) | 2023.06.19 |
[Servlet] 세션(Session) (0) | 2023.06.18 |
[Servlet] 쿠키(Cookie) (0) | 2023.06.18 |