Spring 게시판 게시글 쓰기(ckeditor 사용), 게시글 상세보기 (내 프로젝트에 적용)

Back-End/Spring 2019. 8. 12. 17:07
728x90
반응형

- 게시판 게시글 쓰기 -

 

 

memberboard.jsp 페이지에서 "글쓰기" 버튼을 클릭하면 컨트롤러를 거쳐 memberboardwrite.jsp 페이지로 이동

 

memberboardwrite.jsp 페이지에서 글 내용과 제목을 작성후 "확인" 버튼을 누르면 컨트롤러->서비스->dao->mapper->컨트롤러

 

를 거쳐서 게시글이 insert되고, 게시글 리스트 페이지로 돌아온다.

 

 

 

memberboard.jsp 중 일부

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
<script>
 
//글쓰기 폼으로 이동하게 하는 함수
$(function(){    
        $("#btnWrite").click(function(){
            location.href="write.do";
        });
});
 
</script>
 
=============================================================
 
<button type = "button" id = "btnWrite" align = "right">글쓰기</button>
cs

 

 

MemberBoardController.java 중 일부

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//글쓰기 버튼을 눌렀을때 뷰에서 맵핑되는 메소드
    @RequestMapping("/board/write.do")
        public String write(HttpSession session, HttpServletResponse write) throws Exception{
        //글쓰기 폼 페이지로 이동함
        
        String user_id = (String)session.getAttribute("user_id");
        
//로그인 되어있는지 확인하는 if문, 로그인이 안되어있으면 경고메시지를 출력하고 홈으로 넘어간다.
        if (user_id == null) {
            
            write.setContentType("text/html; charset=UTF-8");
            PrintWriter out_write = write.getWriter();
            out_write.println("<script>alert('로그인이 되어있지 않습니다. 로그인을 먼저 해주세요.');</script>");
            out_write.flush();
            
            return "home";
            
        } else {
 
            //로그인이 되어있다면!
            return "board/memberboardwrite";    //회원게시판 글쓰기 폼으로 이동함
        }
        
    }
cs

 

 

memberboardwrite.jsp (ckeditor을 사용함)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%@ include file="../include/header.jsp"%>
<%@ include file="../include/menu.jsp"%><br><br>
<script src = "${path}/ckeditor/ckeditor.js"></script>
<!-- ckeditor 사용을 위해 js파일을 연결함 -->
<body>
<!-- 글쓰기 폼 작성 -->
<h2>글쓰기</h2>
<form method = "post" action = "insert.do">
 
<div>제목 : <input name = "title" id = "title" size = "80" placeholder = "제목을 입력하세요"></div><br><br>
 
내용 : <div style = "width:800px; height:100px;"> <textarea id = "content" name = "content" rows = "6" cols = "80" placeholder = "내용을 입력하세요"></textarea></div>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
 
 
<div style = "width:700px; text-align:right;" ><button type = "submit" name = "submit">확인</button></div>
 
<script>
//id가 description인 태그에 ckeditor을 적용시킴
//이미지 업로드 안됨
CKEDITOR.replace("content");
 
 
 
 
</script>
 
</form>
</body>
</html>
cs

 

 

글 내용을 작성한뒤 "확인" 버튼을 누르면 다시 컨트롤러로 들어와서 메소드에 맵핑된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
//write.jsp에서 입력한 내용들이 MemberBoardDTO에 저장됨
    @RequestMapping("/board/insert.do")
    public String insert (@ModelAttribute MemberBoardDTO dto, HttpSession session, HttpServletResponse insert) throws Exception{
        
        //로그인한 사용자의 아이디를 체크
//아이디를 체크해서 자신의 글에만 수정과 삭제가 가능하게 할 예정
        String user_id = (String)session.getAttribute("user_id");
        dto.setUser_id(user_id);
        
        
        insert.setContentType("text/html; charset=UTF-8");
        PrintWriter out_write = insert.getWriter();
        out_write.println("<script>alert('글이 작성되었습니다.');</script>");
        out_write.flush();
        
        
            //레코드를 저장함
              memberboardservice.create(dto);
        
        
        //게시물을 저장한 후에 게시물 목록페이지로 다시 이동함
        return "forward:/board/list.do";
        }
cs

 

 

MemberBoardServiceImpl.java 중 일부

 

1
2
3
4
5
@Override
    public void create(MemberBoardDTO dto) throws Exception {
        memberboarddao.create(dto);
        //dto를 매개값으로 dao를 호출한다.
    }
cs

 

 

 

MemberBoardDAOImpl.java 중 일부

 

1
2
3
4
5
@Override
    public void create(MemberBoardDTO dto) throws Exception {
        sqlSession.insert("memberboard.insert",dto);
        
    }
cs

 

 

boardMapper.xml 중 일부

 

1
2
3
4
5
6
7
8
<insert id = "insert">
 
<!-- 게시글 번호는 시퀀스로 하고 생성할때마다 숫자가 1씩 하도록 설정함 -->
<!-- 제목, 글내용, 작성자를 삽입함 -->
insert into member_board (member_bno, title, content, user_id) values
        ( seq_board.nextval, #{title}, #{content}, #{user_id} )
 
</insert>
cs

 

 

 

================================================================================

 

 

- 게시판 게시글 상세보기 -

 

게시글 목록 페이지에서 게시글 제목에 링크를 달아 링크를 클릭하면 게시글의 제목과 내용을 볼 수 있도록 한다.

 

게시글 수정과 삭제는 글을 작성한 당사자만 할 수 있고, 글 목록은 당사자가 아니라도 할 수 있도록 한다.

 

그리고 게시글을 한번 클릭할 때마다 조회수가 1씩 증가하도록 한다.

 

 

memberboard.jsp 중 일부

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- forEach var = "개별데이터" items = "집합데이터" -->
    <c:forEach var = "row" items = "${map.list}"<!-- 컨트롤러에서 map안에 list를 넣었기 때문에 이렇게 받는다. -->
    <tr>
        <td>${row.member_bno}</td>    <!-- 글번호 -->
        <!-- 클릭하면 컨트롤러의 view.do로 이동하고, 게시물번호, 페이지 번호, 검색옵션, 키워드를 같이 넘긴다 -->
<!-- 같이 넘겨야 값들이 초기화 되지 않기 때문에 -->
        <td>
        <a href="view.do?member_bno=${row.member_bno}      
&curPage=${map.pager.curPage}
&search_option=${map.search_option} 
&keyword=${map.keyword}">${row.title}</a></td>    <!-- 글제목 -->
        <td>${row.user_id}</td>    <!-- 작성자의 이름 -->
        <td>${row.content}</td>    <!-- 글의내용 -->
        <td>${row.reg_date}</td>    <!-- 날짜의 출력형식을 변경함 -->
        <td>${row.viewcnt}</td>    <!-- 조회수 -->
        <td>${row.recommend}</td>    <!-- 추천수 -->
    
    </tr>
    </c:forEach>
cs

 

 

MemberBoardController.java 중 일부

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@RequestMapping(value = "/board/view.do", method=RequestMethod.GET)
    public ModelAndView view(@RequestParam int member_bno,
            @RequestParam int curPage,
            @RequestParam String search_option,
            @RequestParam String keyword,
            HttpSession sessionthrows Exception{
 
        
        //조회수 증가 쿼리
        memberboardservice.increaseViewcnt(member_bno, session);
 
MemberBoardServiceImpl.java 중 일부
 
//조회수를 증가하게하는 쿼리
//조회수 처리를 할때 일정 시간이 지난후 다시 클릭할때만 조회수가 증가하도록 설정 @Override public void increaseViewcnt(int member_bno, HttpSession session) throws Exception { long update_time = 0; //null을 방지하기 위해 초기값을 null로 설정함 if(session.getAttribute("update_time_"+member_bno)!=null) { //최근에 조회수를 올린 시간이 null이 아니면 update_time = (long)session.getAttribute("update_time_"+member_bno); } long current_time = System.currentTimeMillis(); //일정 시간이 경과한 후에 조회수를 증가시킨다. if(current_time - update_time > 5 * 1000) { //조회수가 1증가했을때로부터 5000초 후에 다시 클릭을 해야 조회수가 다시 1 증가한다는 말이다. //조회수 증가 처리 memberboarddao.increateViewcnt(member_bno); //조회수를 올린 시간을 저장함 session.setAttribute("update_time_"+member_bno, current_time); } }
 
MemberBoardDAOImpl.java 중 일부
 
//조회수 증가처리를 하는 메소드 @Override public void increateViewcnt(int member_bno) throws Exception { sqlSession.update("memberboard.increaseViewcnt", member_bno); }
        
 
boardMapper.xml 중 일부
 
<!-- 조회수 증가처리를 하는 구문 --> <update id = "increaseViewcnt"> <!-- 글번호에 해당하는 조회수를 +1하는 쿼리문 --> update member_board set viewcnt=viewcnt+1 where member_bno=#{bno} </update>
 
 
//페이지를 이동하면서 자료를 같이 넘기기 위해서 modelandview를 사용한다.
        ModelAndView mav = new ModelAndView();
        mav.setViewName("board/memberboardview");
 
        
        //view로 자료를 넘기기위해서 mav에 값들을 저장해서 view.jsp로 리턴시킨다.
        mav.addObject("dto", memberboardservice.read(member_bno)); //상세보기를 한번 클릭하면 조회수를 1증가시킨다.
 
 
MemberBoardServiceImpl.java 중 일부
 
 
1
2
3
4
@Override
    public MemberBoardDTO read(int member_bno) throws Exception {
        return memberboarddao.read(member_bno);
    }
cs
 
 
MemberBoardDAOImpl.java 중 일부
 
1
2
3
4
5
6
//게시글 상세정보 
    @Override
    public MemberBoardDTO read(int member_bno) throws Exception {
        
        return sqlSession.selectOne("memberboard.read", member_bno);
    }
cs
 
 
 
boardMapper.xml 중 일부
 
1
2
3
4
5
6
7
8
9
10
11
12
<!-- 게시글 상세정보를 확인하는 쿼리문 -->
<select id = "read" 
resultType = "com.example.hansub_project.model.board.dto.MemberBoardDTO">
 
<!-- member_board테이블의 작성자와 member테이블의 아이디가 같고, 글번호가 클릭한 글번호와 같은 글번호와 같은
글번호, 제목, 조회수, 날짜, 내용, 이름, 작성자를 검색한다. -->
select member_bno, title, reg_date, content, viewcnt, user_id
from member_board
where member_bno=#{member_bno}
 
</select>
 
cs
 
mav.addObject("curPage", curPage);
        mav.addObject("search_option", search_option);
        mav.addObject("keyword", keyword);
 
        
        return mav;     //view로 넘어가서 출력이 된다.
    }
 
 
 
 
 
  cs

 

 

자료를 받을 view 페이지

 

memberboardview.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<%@ include file="../include/header.jsp" %>
<%@ include file="../include/menu.jsp" %>
<script src="${path}/include/js/common.js"></script>
 
<script src="${path}/ckeditor/ckeditor.js"></script> //ck에디터
 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
 
<script>
//목록 버튼
$(function(){
$("#btnList").click(function(){
    location.href="list.do";
    });
});
 
//수정 버튼
$(function(){$("#btnUpdate").click(function(){
    //첨부파일 이름들을 폼에 추가
    var str="";
    $("#uploadedList .file").each(function(i){
        str+=
            "<input type='hidden' name='files["+i+"]' value='"
            +$(this).val()+"'>";
    });
    $("#form1").append(str);
    document.form1.action="${path}/board/update.do";
    document.form1.submit();
    });
});
 
 
//삭제 버튼
$(function(){$("#btnDelete").click(function(){
    if(confirm("삭제하시겠습니까?")){
        document.form1.action="${path}/board/delete.do";
        document.form1.submit();
        }
    });
});
 
listAttach();
 
</script>
 
<h2>게시물 보기</h2>
 
<!-- 게시물을 작성하기 위해 컨트롤러의 insert.do로 맵핑 -->
<form id="form1" name="form1" method="post"
action="${path}/board/insert.do">
    <div>제목 <input name="title" id="title" size="80"
                    value="${dto.title}"
                    placeholder="제목을 입력하세요"><br><br>
 
<!-- placeholder은 제목을 입력할 수 있도록 도움말을 출력함 -->
    </div>
    <div>조회수 : ${dto.viewcnt}    </div><br><br>
    <div style="width:800px;">
        내용 <textarea id="content" name="content"
rows="3" cols="80" 
placeholder="내용을 입력하세요">${dto.content}</textarea><br><br>
 
<!-- 마찬가지로 내용을 입력하도록 도움말을 출력함 -->
<script>
 
 
// ckeditor 적용
//id가 content인 태그 (글의 내용을 입력하는 태그)를 ck에디터를 적용한다는 의미
CKEDITOR.replace("content",{
    filebrowserUploadUrl: "${path}/imageUpload.do",
    height: "300px"
});
</script>
 
<div style = "width:700px; text-align:center;">
 
<!-- 수정, 삭제에 필요한 글번호를 hidden 태그에 저장한다. -->
    <input type = "hidden" name = "member_bno" value = "${dto.member_bno }">
    
    <!-- 본인만 수정, 삭제 버튼을 표시한다. -->
    <c:if test = "${sessionScope.user_id == dto.user_id }">
            <button type = "button" id = "btnUpdate">수정</button>
            <button type = "button" id = "btnDelete">삭제</button>
    </c:if>
    
    <!-- 글목록은 본인이 아니어도 확인 가능하게 한다. -->
    <button type = "button" id = "btnList">목록</button>
 
<body>
 
</body>
</html>
cs

 

 

servlet-context.xml에 ckeditor관련 코드 추가

 

1
<resources location="/WEB-INF/views/ckeditor/" mapping="/ckeditor/**"></resources>
cs

 

 

 

 

 

아래 책은 제가 공부할때 활용했던 책으로 추천드리는 책이니 한번씩 읽어보시는것을 추천드립니다!! ㅎㅎ

토비의 스프링 3.1 세트:스프링의 이해와 원리 + 스프링의 기술과, 에이콘출판

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

728x90
반응형
: