KDT/WEB

240115 WEB - JSP23(MVC, JSTL)

001cloudid 2024. 1. 15. 17:40
728x90

MVC

public class BoardDAO {

Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;

public Connection getConnection() {
try {
// Class.forName("com.mysql.cj.jdbc.Driver");
// String dbUrl = "jdbc:mysql://localhost:3306/jspdb?serverTimezone=Asia/Seoul";
// String dbUser = "root";
// String dbPw = "1234";
// con = DriverManager.getConnection(dbUrl, dbUser, dbPw);
//커넥션 풀(Connenction Pool(CP) : 서버단에서 연결정보를 저장)
//데이터베이스와 연결된 Connection 객체를 미리 생성하여 풀(Pool) 기억공간에 저장
//→ 필요할 때 마다 풀에 접근해서 Connection객체를 사용하고 끝나면 반환
// 장점 : 속도 향상, DB연결정보를 한 번만 수정해서 사용
// 톰캣에서 제공하는 DBCP(Database Connection Pool) 사용
//1) META-INF 폴더에 context.xml 파일을 만들고 커넥션 풀 디비연결정보 정의
//2) DAO에서 디비연결자원의 이름을 불러서 사용
// import javax.naming.Context;
// import javax.naming.InitialContext;
Context init = new InitialContext();
//init.lookup("자원이름/자원이름");
//자원위치 : java:comp/env
//자원이름 : jdbc/Mysql
// import javax.sql.DataSource;
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/MysqlDB");
con = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return con;
}

// 내장객체 기억장소 해제 메소드
// finally
public void dbClose() {
if(rs!=null) {
try {
rs.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
if(con!=null) {
try {
con.close();
} catch (Exception e3) {
e3.printStackTrace();
}
}
}

public void insertBoard(BoardDTO boardDTO) {
// System.out.println(boardDTO.getName());
// System.out.println(boardDTO.getSubject());
// System.out.println(boardDTO.getContent());
// System.out.println(boardDTO.getNum());
// System.out.println(boardDTO.getReadcount());
// System.out.println(boardDTO.getDate());
try {
con = getConnection();
String sql = "insert into board(name,subject,content,num,readcount,date) values(?,?,?,?,?,?)";
ps = con.prepareStatement(sql);
ps.setString(1, boardDTO.getId());
ps.setString(2, boardDTO.getSubject());
ps.setString(3, boardDTO.getContent());
ps.setInt(4, boardDTO.getNum());
ps.setInt(5, boardDTO.getReadcount());
ps.setTimestamp(6, boardDTO.getDate());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
//마무리 작업 사용한 내장객체 기억장소 삭제(해제)
//con ps 마지막에 생성된 것부터 close
dbClose();
}
}

//231226
public int getMaxNum() {
int num = 0;
try {
con = getConnection();
String sql = "select max(num) from board";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()) {
num = rs.getInt("max(num)");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
return num;
}

//231226
public ArrayList<BoardDTO> getBoardList(){
System.out.println("BoardDAO getBoardList()");
ArrayList<BoardDTO> boardList = new ArrayList<BoardDTO>();
try {
con = getConnection();
String sql = "select * from board order by num desc";
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
while(rs.next()) {
//num, name, subject, readCount, date를 boardList에 대입
BoardDTO boardDTO = new BoardDTO();
boardDTO.setNum(rs.getInt("num"));
boardDTO.setId(rs.getString("id"));
boardDTO.setSubject(rs.getString("subject"));
boardDTO.setReadcount(rs.getInt("readCount"));
boardDTO.setContent(rs.getString("content"));
boardDTO.setDate(rs.getTimestamp("date"));
boardList.add(boardDTO);
}
} catch (Exception e) {
e.printStackTrace();
} finally {

}
return boardList;
}

//231226
//요청 주소 : content.jsp?num=1
//서버에 request에 "num"요청 파라미터값을 저장 → 가져와서 변수 int num에 저장
//BoardDTO 리턴할 형, getBoard()(int num) 메소드 정의
//BoardDTO boardDTO = BoardDTO getBoard(num값) 메소드 호출
public BoardDTO getBoard(int num) {
System.out.println("BoardDAO getBoard()");
BoardDTO boardDTO = new BoardDTO();
try {
con = getConnection();
String sql = "select * from board where num=?";
ps = con.prepareStatement(sql);
ps.setInt(1, num);
rs = ps.executeQuery();
if(rs.next()) {
boardDTO.setNum(rs.getInt("num"));
boardDTO.setId(rs.getString("id"));
boardDTO.setReadcount(rs.getInt("readCount"));
boardDTO.setDate(rs.getTimestamp("date"));
boardDTO.setSubject(rs.getString("subject"));
boardDTO.setContent(rs.getString("content"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
return boardDTO;
}

//231228
public void updateReadcount(int num) {
System.out.println("BoardDAO updateReadcount()");
BoardDTO boardDTO = new BoardDTO();
try {
con = getConnection();
String sql = "update board set readcount = readcount+1 where num = ?";
ps = con.prepareStatement(sql);
ps.setInt(1, num);
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
}

//231228
//리턴할 형 없음. updateBoard(BoardDTO 변수) 메소드 정의
public void updateBoard(BoardDTO boardDTO) {
System.out.println("BoardDAO updateBoard()");
try {
con = getConnection();
String sql = "update board set subject=?, content=? where num = ?";
ps = con.prepareStatement(sql);
ps.setString(1, boardDTO.getSubject());
ps.setString(2, boardDTO.getContent());
ps.setInt(3, boardDTO.getNum());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
}

//231228
public void deleteBoard(BoardDTO boardDTO) {
System.out.println("deleteBoard()");
try {
con = getConnection();
String sql = "delete from board where num=?";
ps = con.prepareCall(sql);
ps.setInt(1, boardDTO.getNum());
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
}
}

 

public class BoardController extends HttpServlet{

RequestDispatcher dispatcher = null;
BoardService boardService = null;

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BoardController doGet()");
doProcess(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BoardController doPost()");
doProcess(request, response);
}

//주소 매핑을 위한 메소드 정의
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BoardController doProcess()");
//가상 주소 http://localhost:8080/MVCProject/write.bo
String sPath = request.getServletPath();
System.out.println("가상 주소 뽑기 : " + sPath);

if(sPath.equals("/write.bo")) {
System.out.println("가상주소 비교 /write.bo 일치");
//1) 실제페이지 board/write.jsp 주소 변경 없이 이동(특이한 이동방식) → 화면만 바뀜.
//액션태그 <jsp:forward> 같은 이동 방식
//2) 이동할 때 request, response 값을 들고 이동
dispatcher = request.getRequestDispatcher("board/write.jsp");
dispatcher.forward(request, response);
}

if(sPath.equals("/writePro.bo")) {
System.out.println("가상주소 비교 /writePro.bo 일치");
//BoardService 객체 생성
//리턴할 형 없음 insertBoard(request) 메소드 호출
//list.bo 글목록 이동(주소 변경하면서 이동)
boardService = new BoardService();
boardService.insertBoard(request);
response.sendRedirect("list.bo");
}

if(sPath.equals("/list.bo")) {
System.out.println("가상주소 비교 /list.bo 일치");
request.setCharacterEncoding("utf-8");
//BoardService 객체 생성
boardService = new BoardService();
//ArrayList<BoardDTO> boardList = getBoardList() 메소드 호출
ArrayList<BoardDTO> boardList = boardService.getBoardList();
//request에 "boradList",boardList 담아서 board/list.jsp로 이동(주소 변경없이)
request.setAttribute("boardList", boardList);
dispatcher = request.getRequestDispatcher("board/list.jsp");
dispatcher.forward(request, response);
}
}//doProcess()
} //닫는 괄호

 

public class BoardService {

BoardDAO boardDAO = null;

//리턴할 형 없음 insertBoard(request)
public void insertBoard(HttpServletRequest request) {
System.out.println("BoardService insertBoard()");
try {
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
//Board DAO 객체생성
boardDAO = new BoardDAO();
//int형 리턴할 형 getMaxNum()메소드 정의
//max(num)+1
int num = boardDAO.getMaxNum()+1;
//조회수(readcount) 초기값은 0
int readcount = 0;
//날짜(date) 현 시스템 날짜 설정
Timestamp date = new Timestamp(System.currentTimeMillis());
BoardDTO boardDTO = new BoardDTO();
boardDTO.setId(id);
boardDTO.setSubject(subject);
boardDTO.setContent(content);
boardDTO.setDate(date);
boardDTO.setNum(num);
boardDTO.setReadcount(readcount);
boardDTO.setDate(date);
BoardDAO boardDAO= new BoardDAO();
boardDAO.insertBoard(boardDTO);
} catch (Exception e) {
e.printStackTrace();
}
}

//ArrayList<BoardDTO> boardList = getBoardList() 메소드 정의
public ArrayList<BoardDTO> getBoardList() {
System.out.println("ArrayList<BoradDTO> getBoardList()");
ArrayList<BoardDTO> boardList = null;
try {
//BoardDAO 객체 생성
boardDAO = new BoardDAO();
//getBoardList() 메소드 호출
boardList = boardDAO.getBoardList();
} catch (Exception e) {
e.printStackTrace();
}
return boardList;
}
}//닫는 괄호

 

<%@ 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>
<meta charset="UTF-8">
<title>board/content.jsp</title>
</head>
<body>
<%
//요청주소 content.jsp?num=1
// 서버에 request에 "num" 요청 파라미터값을 저장 => 가져와서 변수 int num 저장
// String snum = request.getParameter("num");
// int num = Integer.parseInt(request.getParameter("num"));
// BoardDAO 객체생성
// BoardDAO boardDAO = new BoardDAO();
//조회수 증가
// 리턴할형없음 updateReadcount(int num)메서드 정의
// updateReadcount(num) 메서드 호출
// boardDAO.updateReadcount(num);
// BoardDTO 리턴할형 getBoard(int num) 메서드 정의
// BoardDTO boardDTO = getBoard(num) 메서드 호출
// BoardDTO boardDTO = boardDAO.getBoard(num);
//로그인 표시값 세션에서 가져오기
// String id = (String)session.getAttribute("id");
%>
<c:set var="boardDTO" value="${requestScope.boardDTO }"/>
<h1>board/content.jsp</h1>
<h1>글내용 보기[로그인 : ${sessionScope.id}]</h1>
<table border="1">
<tr><td>글번호</td><td>${boardDTO.num}</td></tr>
<tr><td>글쓴이</td><td>${boardDTO.name}</td></tr>
<tr><td>조회수</td><td>${boardDTO.readcount}</td></tr>
<tr><td>글쓴날짜</td><td>${boardDTO.date}</td></tr>
<tr><td>제목</td><td>${boardDTO.subject}</td></tr>
<tr><td>내용</td><td>${boardDTO.content}</td></tr>
<tr><td colspan="2">
<%
// 로그인 표시값 있으면
// if(id != null){
// 로그인 표시값, 글쓴이 => 일치하면 글수정,글삭제 보이기
// if(id.equals(boardDTO.getName())){
%>
<%-- <a href="update.jsp?num=<%=boardDTO.getNum()%>">글수정</a> --%>
<%-- <a href="delete.jsp?num=<%=boardDTO.getNum()%>">글삭제</a> --%>
<%
// }
// }
%>
<c:if test="${ ! empty sessionScope.id}">
<c:if test="${sessionScope.id eq boardDTO.name}">
<a href="update.bo?num=${boardDTO.num}">글수정</a>
<a href="delete.bo?num=${boardDTO.num}">글삭제</a>
</c:if>
</c:if>
<a href="list.bo">글목록</a></td></tr>
</table>
</body>
</html>

 

public class BoardController extends HttpServlet{

RequestDispatcher dispatcher = null;
BoardService boardService = null;

(...생략...)


protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BoardController doProcess()");
(...생략...)
if(sPath.equals("/content.bo")) {
System.out.println("가상주소 비교 /content.bo 일치");
//content.jsp?num=
//request에서 "num"가져오기
int num = Integer.parseInt(request.getParameter("num"));
//BoardService 객체 생성
boardService = new BoardService();
//조회수 1증가
// 리턴할형없음 updateReadcount(num)메소드 호출
boardService.updateReadcount(num);
//num에 대한 글 가져오기
//BoardDTO 리턴할 형 getBoard(num) 메소드 호출
BoardDTO boardDTO = boardService.getBoard(num);
//request에 "boardDTO" boardDTO 값 가져오기
request.setAttribute("boardDTO", boardDTO);
//board/content.jsp 주소변경 없이 이동
dispatcher = request.getRequestDispatcher("board/content.jsp");
dispatcher.forward(request, response);
}
}
}

 

public class BoardService {

BoardDAO boardDAO = null;

(...생략...)

//BoardDTO 리턴할 형 getBoard(num) 메소드 호출
public BoardDTO getBoard(int num) {
System.out.println("BoardService getBoard()");
BoardDTO boardDTO = null;
try {
//BoardDAO 객체 생성
boardDAO = new BoardDAO();
//getBoard()메소드 호출
boardDTO = boardDAO.getBoard(num);
} catch (Exception e) {
e.printStackTrace();
}
return boardDTO;
}
}//BoardService클래스

 

<%@ 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>
<meta charset="UTF-8">
<title>board/update.jsp</title>
</head>
<body>
<h1>board/update.jsp</h1>
<h1>게시판 글수정</h1>
<%
// // update.jsp?num=1
// // 서버에 request에 "num" 요청 파라미터값을 저장 => 가져와서 변수 int num 저장
// int num = Integer.parseInt(request.getParameter("num"));
// // BoardDAO 객체생성
// BoardDAO boardDAO = new BoardDAO();
// // BoardDTO boardDTO = getBoard(num) 메서드 호출
// BoardDTO boardDTO = boardDAO.getBoard(num);
%>
<c:set var="boardDTO" value="${requestScope.boardDTO }"/>
<form action="updatePro.bo" method="post">
<input type="hidden" name="num" value="${boardDTO.num}">
<table border="1">
<tr><td>글쓴이</td>
<td><input type="text" name="name" value="${boardDTO.name }" readonly></td></tr>
<tr><td>글제목</td>
<td><input type="text" name="subject" value="${boardDTO.subject}"></td></tr>
<tr><td>글내용</td>
<td><textarea name="content" rows="10" cols="20">${boardDTO.content}</textarea></td></tr>
<tr><td colspan="2"><input type="submit" value="글수정"></td></tr>
</table>
</form>
</body>
</html>

 

public class BoardController extends HttpServlet{

(...생략...)

if(sPath.equals("/update.bo")) {
System.out.println("가상주소 비교 /update.bo 일치");
//update.bo?num=
//request에서 "num" 가져오기
int num = Integer.parseInt(request.getParameter("num"));
//BoardService 객체생성
boardService = new BoardService();
//num에 대한 글 가져오기
//BoardDTO getBoard(num) 메소드 호출
BoardDTO boardDTO = boardService.getBoard(num);
//request에 "boardDTO", boardDTO 값 가져오기
request.setAttribute("boardDTO", boardDTO);
//board/update.jsp 주소변경없이 이동
dispatcher =request.getRequestDispatcher("board/update.jsp");
dispatcher.forward(request, response);
}
}

 

public class BoardController extends HttpServlet{

(...생략...)

if(sPath.equals("/updatePro.bo")) {
request.setCharacterEncoding("utf-8");
System.out.println("가상주소 비교 /updatePro.bo 일치");
// BoardService 객체생성
boardService = new BoardService();
// 리턴할형없음 updateBoard(request) 메서드 호출
boardService.updateBoard(request);
// list.bo 글목록 주소변경하면서 이동(웹이동, 하이퍼링크)
response.sendRedirect("list.bo");
}
}
}

 

public class BoardService {

(...생략...)

public void updateBoard(HttpServletRequest request) {
System.out.println("BoardService updateBoard()");
try {
request.setCharacterEncoding("utf-8");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
int num = Integer.parseInt(request.getParameter("num"));
BoardDTO boardDTO = new BoardDTO();
boardDTO.setSubject(subject);
boardDTO.setContent(content);
boardDTO.setNum(num);
boardDAO = new BoardDAO();
boardDAO.updateBoard(boardDTO);
} catch (Exception e) {
e.printStackTrace();
}
}
}//BoardService클래스

 

728x90