반응형
본 포스팅은 스프링 프레임워크를 이용하여 기본적인 게시판을 만드는 방법을 설명합니다.
기본적인 내용은 지난 포스팅을 참고해주시기 바랍니다.
2021.10.10 - [Java/Spring] - [스프링 프레임워크]게시판 만들기 #4 : 게시글 등록
저번 포스팅인 게시글 등록에 이어서 이번 포스팅에서는 게시물 조회를 구현해보도록 하겠습니다.
list.jsp
저번시간까지에 만들었던 list.jsp에서 제목을 클릭하면 게시글을 조회할 수 있도록 a태그를 추가하였습니다.
저는 제목링크보단 tr태그에 링크를 걸어주는 것을 좋아하는데 이번에는 언더라인을 통해 잘 보일 수 있도록 제목에 링크를 걸어주었습니다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="${path}/resources/css/test.css">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="${path}/resources/js/board.js"></script>
<title>Insert title here</title>
</head>
<body>
<form id="frm">
<input type="hidden" value="" name="seq" id="seq">
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>내용</th>
<th>작성자</th>
<th>날짜</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="list">
<tr>
<td>${list.seq}</td>
<td><a href="#" onclick="fn_goView(${list.seq})">${list.subject}</a></td>
<td>${list.content}</td>
<td>${list.name}</td>
<fmt:parseDate value="${list.reg_date}" var="dateValue" pattern="yyyyMMddHHmmss"/>
<td><fmt:formatDate value="${dateValue}" pattern="yyyy-MM-dd"/></td>
<td>${list.readCount}</td>
</tr>
</c:forEach>
</tbody>
</table>
<button type="button" onclick="location.href='/board/regiView'">글쓰기</button>
</form>
</body>
</html>
view.jsp
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="${path}/resources/js/board.js"></script>
<title>Insert title here</title>
</head>
<body>
<form id="frm">
<div>제목 : ${view.subject} 조회수 : ${view.readCount}</div>
<div>작성자 : ${view.name}</div>
<div>내용 : ${view.content} </div>
<button type="button" onclick='location.href="/board/list"'>목록</button>
</form>
</body>
</html>
다시 list.jsp로 돌아갈 수 있도록 버튼을 만들어 주었습니다.
Board.js
function fn_boardRegi(){
var subject = $("#subject").val();
var name = $("#name").val();
var content = $("#content").val();
$.ajax({
type : "POST",
url : "/board/regi",
data : {subject : subject, name : name, content : content},
success: function(data){
if(data == "Y"){
alert("글 등록이 완료되었습니다.");
location.href = "/board/list";
}else{
alert("글 등록이 실패되었습니다.");
}
},
error: function(data){
alert("실패");
console.log(data);
}
});
};
function fn_goView(seq){
$("#seq").val(seq);
var f = $("#frm");
f.attr("action", "/board/view");
f.attr("method", "POST");
f.submit();
};
BoardController.java
package com.board.controller;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.board.domain.BoardDTO;
import com.board.service.BoardService;
@Controller
@RequestMapping(value="/board/*")
public class BoardController {
@Inject
private BoardService service;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String list(Locale locale, Model model) throws Exception {
List list = service.list();
model.addAttribute("list", list);
return "/board/list";
}
@RequestMapping(value = "/regiView", method = RequestMethod.GET)
public String regiView(Locale locale, Model model) throws Exception {
return "/board/regi";
}
@ResponseBody
@RequestMapping(value = "/regi", method = RequestMethod.POST)
public String regi(Locale locale, Model model, HttpServletRequest request) throws Exception {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
BoardDTO dto = new BoardDTO();
dto.setName(request.getParameter("name"));
dto.setContent(request.getParameter("content"));
dto.setSubject(request.getParameter("subject"));
dto.setReg_date(format.format(date));
if(service.regi(dto) == 1) {
return "Y";
}else {
return "N";
}
}
@RequestMapping(value = "/view", method = RequestMethod.POST)
public String view(Locale locale, Model model, HttpServletRequest request) throws Exception {
BoardDTO dto = service.view(Integer.parseInt((String)request.getParameter("seq")));
model.addAttribute("view", dto);
return "/board/view";
}
}
BoardServiceImpl.java
게시글에 대한 객체를 리턴하기 전에 조회 수를 업데이트를 해주는 메서드를 추가하였습니다.
package com.board.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.board.dao.BoardDAO;
import com.board.domain.BoardDTO;
@Service
public class BoardServiceImpl implements BoardService {
@Inject
private BoardDAO dao;
@Override
public List list() throws Exception {
return dao.list();
}
@Override
public int regi(BoardDTO dto) throws Exception {
if (dao.getMaxSeq() == null) { // 게시글이 존재하지 않을 때
dto.setSeq(1); // SEQ는 1
} else { // 게시글이 존재할 때
dto.setSeq(dao.getMaxSeq() + 1); // 최대값에 +1
}
return dao.regi(dto);
}
@Override
public BoardDTO view(int seq) {
dao.updateReadCount(seq);
return dao.view(seq);
}
}
BoardDAOImpe.java
package com.board.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.board.domain.BoardDTO;
@Repository
public class BoardDAOImpl implements BoardDAO {
@Inject
private SqlSession sqlSession;
private static String namespace = "com.board.mappers.board";
@Override
public List list() throws Exception {
return sqlSession.selectList(namespace + ".list");
}
@Override
public Integer getMaxSeq() {
return sqlSession.selectOne(namespace+".maxSeq");
}
@Override
public int regi(BoardDTO dto) {
return sqlSession.insert(namespace+".regi", dto);
}
@Override
public BoardDTO view(int seq) {
return sqlSession.selectOne(namespace+".view", seq);
}
@Override
public void updateReadCount(int seq) {
sqlSession.update(namespace+".updateReadCount", seq);
}
}
boardMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.board.mappers.board">
<select id="list" resultType="com.board.domain.BoardDTO">
SELECT
SEQ,
SUBJECT,
CONTENT,
NAME,
REG_DATE,
READCOUNT
FROM
BOARD
</select>
<select id="maxSeq" resultType="java.lang.Integer">
select max(SEQ) from board
</select>
<insert id="regi">
INSERT INTO
BOARD(
SEQ,
SUBJECT,
CONTENT,
NAME,
REG_DATE,
READCOUNT
)
VALUES(
#{seq},
#{subject},
#{content},
#{name},
#{reg_date},
0
)
</insert>
<select id="view" resultType="com.board.domain.BoardDTO">
SELECT
SEQ,
SUBJECT,
CONTENT,
NAME,
REG_DATE,
READCOUNT
FROM
BOARD
WHERE
SEQ = #{seq}
</select>
<update id="updateReadCount">
UPDATE BOARD
SET
READCOUNT = READCOUNT + 1
WHERE
SEQ = #{seq}
</update>
</mapper>
반응형
'Programming > Spring' 카테고리의 다른 글
[스프링 프레임워크]게시판 만들기 #6 : 게시글 수정, 게시글 삭제 (9) | 2021.10.23 |
---|---|
[스프링 프레임워크]게시판 만들기 #4-1 : 게시글 등록(수정) (0) | 2021.10.23 |
[스프링 프레임워크]게시판 만들기 #4 : 게시글 등록 (13) | 2021.10.10 |
[스프링 프레임워크]게시판 만들기 #3 : DB 테이블 생성 및 게시판 목록 (6) | 2021.08.07 |
[스프링 프레임워크]게시판 만들기 #2 : Spring과 오라클 DB 연동 및 데이터 베이스 셋팅 (12) | 2021.07.10 |
댓글