서블릿(Servlet)을 이용한 게시판 만들기 1 - 게시판 목록/리스트 조회
국비 수업 중에 너무 어려워서 정리하고자 한다. MVC모델을 적용해 게시판을 만들어보자 (서블릿, JSP) DB에 있는 게시판 목록들을 웹브라우저에 출력하기. 일단 어떤식으로 코드가 진행되는지 알
kimdevel.tistory.com
서블릿(Servlet) 게시판 만들기 3 - 회원가입 / 로그인 / 로그아웃
서블릿(Servlet) 게시판 만들기 1 - 게시판 목록/리스트 조회 국비 수업 중에 너무 어려워서 정리하고자 한다. MVC모델을 적용해 게시판을 만들어보자 (서블릿, JSP) DB에 있는 게시판 목록들을 웹브라
kimdevel.tistory.com
DB에 있는 게시판 목록을 조회했으니 이제 게시글 상세보기를 구현해보자.
구현해야할 것들
- 게시글 제목 클릭시 게시글 본문내용 조회 (상세보기)
- 게시글 조회시 조회수 증가
일단 코드의 흐름을 알아보자
여기부분은 좀 헷갈리지만 리스트 조회 부분을 어느정도 이해했다면 충분히 할 수 있다.
우선 전에 작성했던 list.jsp를 조금 수정해주자.
<%@page import="dto.Board"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% List<Board> boardList = (List) request.getAttribute("boardList"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>게시판 목록 전체 조회</h1>
<hr>
<table>
<tr>
<th>번호</th>
<th>제목</th>
<th>아이디</th>
<th>조회수</th>
<th>작성일</th>
</tr>
<% for(int i=0; i<boardList.size(); i++) { %>
<tr>
<td><%=boardList.get(i).getBoardno() %></td>
<%-- <td><%=boardList.get(i).getTitle() %></td> --%>
<td><a href="/board/view?boardno=<%=boardList.get(i).getBoardno() %>"><%=boardList.get(i).getTitle() %></a></td>
<td><%=boardList.get(i).getUserid() %></td>
<td><%=boardList.get(i).getHit() %></td>
<td><%=boardList.get(i).getWriteDate() %></td>
</tr>
<% } %>
</table>
</body>
</html>
중요하게 볼 것은 Line 30. 이 코드를 이해 해야만 한다.
원래 코드 <td><%=boardList.get(i).getTitle() %></td>
수정 코드 <td><a href="/board/view?boardno=<%=boardList.get(i).getBoardno() %>"><%=boardList.get(i).getTitle() %></a></td>
둘의 차이점을 보자. 제목을 a href로 감싸주면서 "/board/view"(게시글 컨트롤러)로 보내주는 코드다. 단순히 게시글 컨트롤러로 보내주려면 <td><a href="/board/view"><%=boardList.get(i).getTitle() %></a></td> 이렇게 해주어도 상관 없다.
하지만 정확히 어떤 게시글을 보여줄지 알아야하므로 ?boardno=<%=boardList.get(i).getBoardno() %>를 붙여주면서 파라미터를 전달해준다. 해석해보자면 컨트롤러로 이동하긴 하는데 boardno를 같이 전달해준다. 이런 뜻이다.
잘 이동 되고 잘 넘겨주는지 확인해보자.
@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
//jsp로 forward
req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
}
}
제목에 링크가 걸리고 클릭시 번호를 전달해주면서 view.jsp로 forwarding해주는 것을 확인할 수 있다.
Controller 코드 작성하기
1. 전달파라미터를 Board DTO에 저장
Controller
@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
private static final long serialVersionUID = 1L;
BoardService boardService = new BoardServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
//1. 전달파라미터를 Board DTO에 저장
Board board = boardService.getBoardno(req);
//jsp로 forward
req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
}
}
Service interface
public interface BoardService {
List<Board> getList();
/**
* 전달파라미터를 board dto에 저장
*
* @param req
* @return
*/
Board getBoardno(HttpServletRequest req);
}
Service implement
public class BoardServiceImpl implements BoardService {
BoardDao boardDao = new BoardDaoImpl();
@Override
public List<Board> getList() {
List<Board> boardList = boardDao.selectList();
return boardList;
}
@Override
public Board getBoardno(HttpServletRequest req) {
//전달파라미터를 String 타입에 저장.
String param = req.getParameter("boardno");
//저장할 dto 생성
Board board = new Board();
if(param != null && !"".equals(param)) { //전달파라미터가 null값이 아니거나 빈문자가 아닐때
int boardno = Integer.parseInt(param); //String을 int로 변환
board.setBoardno(boardno); //dto객체에 boardno 저장
}
return board; //dto 반환
}
}
주석에 설명을 적어놨다.
전달받은 파라미터를 dto에 저장만 할 뿐, DB에서 가져오거나 수정하는 등의 일은 하지 않으므로 DAO는 사용하지 않는다.
2. 글번호에 맞는 게시글 조회
Controller
@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
private static final long serialVersionUID = 1L;
BoardService boardService = new BoardServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
//1. 전달파라미터를 Board DTO에 저장
Board board = boardService.getBoardno(req);
//2. 글번호에 맞는 게시글 조회
Board viewBoard = boardService.view(board);
//jsp로 forward
req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
}
}
Service interface
public interface BoardService {
List<Board> getList();
Board getBoardno(HttpServletRequest req);
Board view(Board board);
}
Service implement
public class BoardServiceImpl implements BoardService {
BoardDao boardDao = new BoardDaoImpl();
...
...
@Override
public Board view(Board board) {
//조회수 +1
//게시글 조회
return null;
}
}
먼저 조회수 +1 코드 작성
public class BoardServiceImpl implements BoardService {
BoardDao boardDao = new BoardDaoImpl();
...
...
@Override
public Board view(Board board) {
Connection conn = JDBCTemplate.getConnection();
//조회수 +1
if( boardDao.UpdateHit(conn, board) > 0 ) {
JDBCTemplate.commit(conn);
} else {
JDBCTemplate.rollback(conn);
}
//게시글 조회
return null;
}
}
DAO interface
public interface BoardDao {
public List<Board> selectList();
public int UpdateHit(Connection conn, Board board);
}
DAO implement
public class BoardDaoImpl implements BoardDao {
private PreparedStatement ps = null;
private ResultSet rs = null;
...
...
@Override
public int UpdateHit(Connection conn, Board board) {
String sql = "";
sql += "UPDATE board";
sql += " SET hit = hit+1";
sql += " WHERE boardno = ?";
int result = -1;
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, board.getBoardno());
result = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCTemplate.close(ps);
}
return result;
}
}
- update가 되면 1로 반환 후 commit하는 코드.
다음 게시글 조회 코드 작성
Service implement
public class BoardServiceImpl implements BoardService {
BoardDao boardDao = new BoardDaoImpl();
...
...
@Override
public Board view(Board board) {
Connection conn = JDBCTemplate.getConnection();
//조회수 +1
if( boardDao.UpdateHit(conn, board) > 0 ) {
JDBCTemplate.commit(conn);
} else {
JDBCTemplate.rollback(conn);
}
//게시글 조회
Board viewBoard = boardDao.getBoardByBoardno(conn, board);
return viewBoard;
}
}
DAO interface
public interface BoardDao {
public List<Board> selectList();
public int UpdateHit(Connection conn, Board board);
public Board getBoardByBoardno(Connection conn, Board board);
}
DAO implement
public class BoardDaoImpl implements BoardDao {
private PreparedStatement ps = null;
private ResultSet rs = null;
...
...
@Override
public int UpdateHit(Connection conn, Board board) {
...
...
return result;
}
@Override
public Board getBoardByBoardno(Connection conn, Board board) {
String sql = "";
sql += "SELECT * FROM board";
sql += " WHERE boardno = ?";
Board viewBoard = new Board();
try {
ps = conn.prepareStatement(sql);
ps.setInt(1, board.getBoardno());
rs = ps.executeQuery();
while(rs.next()) {
viewBoard.setBoardno(rs.getInt("boardno"));
viewBoard.setTitle(rs.getString("title"));
viewBoard.setUserid(rs.getString("userid"));
viewBoard.setContent(rs.getString("content"));
viewBoard.setHit(rs.getInt("hit"));
viewBoard.setWriteDate(rs.getDate("write_date"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCTemplate.close(rs);
JDBCTemplate.close(ps);
}
return viewBoard;
}
}
- 게시판 리스트 조회할 때와 비슷한 코드.
- ArrayList 대신 Board로 반환. (게시글 하나만 조회하므로)
3. 반환된 Board를 최종적으로 req 속성값으로 지정
@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
private static final long serialVersionUID = 1L;
BoardService boardService = new BoardServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
//1. 전달파라미터를 Board DTO에 저장
Board board = boardService.getBoardno(req);
//2. 글번호에 맞는 게시글 조회
Board viewBoard = boardService.view(board);
//3. 게시글을 req 속성에 저장
req.setAttribute("viewBoard", viewBoard);
//4. jsp로 forward
req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
}
}
4. jsp로 forward
<%@page import="dto.Board"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% Board b = (Board) request.getAttribute("viewBoard"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>게시글 상세보기</h1>
<hr>
<table>
<tr>
<td>글번호 : </td>
<td><%=b.getBoardno() %> |</td>
<td>제목 : </td>
<td><%=b.getTitle() %> |</td>
<td>아이디 : </td>
<td><%=b.getUserid() %> |</td>
<td>조회수 : </td>
<td><%=b.getHit() %> |</td>
<td>작성일 : </td>
<td><%=b.getWriteDate() %></td>
</tr>
<tr>
<td>본문</td>
<td><%=b.getContent() %></td>
</tr>
</table>
<button onclick='location.href="/board/list"'>게시판으로 돌아가기</button>
</body>
</html>
.
.
.
실행결과.
이렇게 게시판 상세보기가 끝났다.
확실히 글로 쓰면서 정리하니까 애매했던 부분들이 다시금 정리되는것 같다.
자바 국비 일주일 후기
[자바 국비 한달 후기] [자바 국비 50% 후기] 자바 국비지원을 다닌 지 일주일이 지났다. 진짜 많은 걸 배웠다. 자바, 이클립스 설치, 자바 프로그램 개발(실행) 과정(컴파일), 데이터 타입, 변수, 스
kimdevel.tistory.com
'개발 > 서블릿JSP' 카테고리의 다른 글
서블릿(Servlet) 게시판 만들기 3 - 회원가입 / 로그인 / 로그아웃 (2) | 2021.05.05 |
---|---|
서블릿(Servlet) 게시판 만들기 1 - 게시판 목록/리스트 조회 (2) | 2021.04.11 |
댓글