'Back-End'에 해당되는 글 287건

  1. 2019.08.22 Spring 관리자 로그인, 회원 강제 탈퇴 기능 구현 (내 프로젝트에 적용) 2
  2. 2019.08.21 스프링 에러 - url로 자료 전송시 발생 (HTTP Status 500 - The server encountered an unexpected condition that prevented it from fulfilling the request.))
  3. 2019.08.21 Spring 게시판 게시글 추천 기능 구현 (내 프로젝트에 적용) 2
  4. 2019.08.21 Spring 게시판 댓글 관련 기능 구현 - 댓글 작성, 수정, 삭제 (내 프로젝트에 적용)
  5. 2019.08.20 스프링 에러 - Request method 'POST' not supported 3
  6. 2019.08.19 getter for property named 에러 해결 방법
  7. 2019.08.16 JSTL - 조건문 처리
  8. 2019.08.14 ajax로 데이터 넘기기

Spring 관리자 로그인, 회원 강제 탈퇴 기능 구현 (내 프로젝트에 적용)

Back-End/Spring 2019. 8. 22. 14:20

관리자 로그인 및 관리자 권한중 하나인 회원 강제 탈퇴 기능 구현

 

관리자 권한 : 모든 게시글 삭제 가능, 모든 댓글 삭제 가능, 공지사항에 글쓰기 가능, 회원 강제 탈퇴 가능

 

 

 

- 기본 구조 -

 



  
  메인페이지에서 관리자 로그인 페이지로 접속후 admin 테이블에 저장된 관리자의 아이디와 비밀번호가 일치하면 로그인을 하도록함.


  관리자로 로그인한 상태에서만 출력되는 숨겨진 기능인 회원 강제 탈퇴 메뉴가 출력되도록 함.


  회원 강제 탈퇴 메뉴를 클릭하면 강제 탈퇴 시킬 회원의 아이디를 입력하게 한 후에 해당 회원의 아이디가 member 테이블안에 있는 id일때


  메시지를 출력하고 해당 회원을 강제 탈퇴 시킨다.

 

 



  view
  ㄴadmin_login.jsp (관리자 로그인 관련)
  ㄴadmin_member_forced_eviction_view.jsp (회원 강제 탈퇴 기능 관련)




  Controller
  ㄴAdminController.java (관리자 로그인 및 기능 관련 컨트롤러)




  Service
  ㄴAdminService.java (관리자 관련 서비스 인터페이스)
  ㄴAdminServiceImpl.java (관리자 관련 서비스 구현 클래스)




  model
  ㄴAdminDAO.java (관리자 관련 DAO 인터페이스)
  ㄴAdminDAOImpl.java (관리자 관련 DAO 구현 클래스)
  ㄴAdminDTO (계층별 자료 전송)




  adminMapper.xml (쿼리 작성 mapper.xml)

 

 

 

admin_login.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="576736845363-o0474pib5q69qlcv6lm7o42hs6lu5u59.apps.googleusercontent.com">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name = "viewport" content = "user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,
width=device-width" />
 
<title>Insert title here</title>
 
</head>
<%@ include file="../include/header.jsp" %>
<%@ include file="../include/menu.jsp" %>
 
 
<br>
<br>
<br>
<br>
<br>
 
<center>
<table border="1" width="400">
 
<tr>
<td>
<br>
<center>
<span style="color:green; font-weight : bold;">관리자 로그인</span>
</center>
 
<center>
<!-- 로그인창 -->
<form action ="admin_login.do" method = "post">
<center>
<br>
-관리자 아이디- <input type = "text" name="admin_id" placeholder="  ID를 입력하세요 "><br><br>
-관리자 비밀번호- <input type = "password" name="admin_pass" placeholder="  비밀번호를 입력하세요 "><br><br>
<button type = "submit" name = "submit" >로그인</button>
 
<br>
<br>
<div class = "row">
    <div class="col-xs-8">
        <div class="checkbox icheck">
        <label>
            <input type = "checkbox" name = "useCookie"> 로그인유지
        </label>
        </div>
    </div>
</div>
</center>
 
<center>
 
 
</form>
 
</center>
</td>
</tr>
</table>
</center>
</body>
 
 
<!-- 로그인 실패나 성공시 메시지를 받아서 출력하는 자바스크립트 구문 -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(function(){
        var responseMessage = "<c:out value="${message}" />";
        if (responseMessage != ""){
            alert(responseMessage)
        }
    })
</script>
 
 
 
</html>
cs

 

 

admin_member_forced_eviction_view.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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="576736845363-o0474pib5q69qlcv6lm7o42hs6lu5u59.apps.googleusercontent.com">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name = "viewport" content = "user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0,
width=device-width" />
 
<title>Insert title here</title>
 
</head>
<%@ include file="../include/header.jsp" %>
<%@ include file="../include/menu.jsp" %>
 
 
<br>
<br>
<br>
<br>
<br>
 
<center>
<table border="1" width="200">
 
<tr>
<td>
<br>
<center>
<span style="color:green; font-weight : bold;">회원 강제 탈퇴</span>
</center>
 
<center>
<!-- 로그인창 -->
<form action ="admin_member_forced_eviction.do" method = "post">
<center>
<br>
-회원 아이디- <input type = "text" name="user_id" placeholder="  탈퇴시킬 회원의 아이디를 입력하세요. "><br><br>
<button type = "submit" name = "submit" > 회원 강제 탈퇴</button>
 
<br>
<br>
 
 
</center>
</form>
 
</center>
</td>
</tr>
</table>
</center>
</body>
 
<!-- 로그인 실패나 성공시 메시지를 받아서 출력하는 자바스크립트 구문 -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
    $(function(){
        var responseMessage = "<c:out value="${message}" />";
        if (responseMessage != ""){
            alert(responseMessage)
        }
    })
</script>
 
 
 
</html>
cs

 

 

 

AdminController.java (관리자 로그인 및 기능 관련 컨트롤러)

 

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.example.hansub_project.controller.admin;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.hansub_project.controller.member.MemberController;
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
import com.example.hansub_project.service.admin.AdminService;
 
 
@Controller //관리자 관련 컨트롤러 빈 선언
public class AdminController {
    
    @Inject    //서비스를 호출하기 위해서 의존성을 주입
    AdminService adminservice;
 
    
        private static final Logger logger= 
        LoggerFactory.getLogger(MemberController.class);  //로깅을 위한 변수
        
        
    //메뉴 페이지에서 관리자 로그인 버튼을 클릭하면 맵핑되는 메소드
    //관리자 로그인 페이지로 이동시킨다.
    @RequestMapping("/admin/admin_login_view.do")
    public String admin_login_view() {
        
        return "admin/admin_login";
    }
    
    
    //관리자 로그인 페이지에서 관리자 아이디와 패스워드를 입력후 로그인 버튼을 누를시에 맵핑되는 메소드
    //관리자 로그인을 할 수 있도록 한다.
    @RequestMapping("/admin/admin_login.do")
    public ModelAndView admin_login(String admin_id, String admin_pass,HttpSession session) throws Exception    {
        
        //로그인 체크도 같이 함
        //dto에 값들을 넣기 위해 객체를 생성한다.
        AdminDTO dto = new AdminDTO();
        
        
        dto.setAdmin_id(admin_id);
        dto.setAdmin_pass(admin_pass);
        
        //로그인 체크를 하기위한 메소드, 로그인 체크후 결과를 result 변수에 넣는다.
        boolean result = adminservice.loginCheck(dto, session);
        ModelAndView mav = new ModelAndView();
        
        
        if(result)    {//로그인이 성공했을시 출력되는 구문
            mav.setViewName("home");    //로그인이 성공했을시 이동하게되는 뷰의 이름
            mav.addObject("admin_id", session.getAttribute(admin_id));
            
            }else if(session.getAttribute(admin_id) == null) {    //로그인 실패 했을시 출력
                
                //로그인이 실패했을 시에 다시 관리자 로그인 페이지로 이동함
                
                mav.setViewName("admin/admin_login");
                
                //뷰에 전달할 값
                
                mav.addObject("message""관리자의 아이디 혹은 비밀번호가 일치하지 않습니다.");
            
            }
        
                return mav;
        }
    
    
    //관리자로 로그인 후에 회원을 강제 탈퇴시키는 페이지로 연결시키는 메소드
    @RequestMapping("/admin/admin_member_forced_eviction_view.do")
    public String admin_member_forced_evction_view() {
        
    
        return "admin/admin_member_forced_eviction_view";
    }
    
    
    //관리자로 로그인 후에 강제 탈퇴시킬 회원의 아이디를 입력후 강제탈퇴 버튼을 누르면 연결되는 메소드
    @RequestMapping("/admin/admin_member_forced_eviction.do")
    public ModelAndView admin_member_forced_eviction(String user_id) throws Exception {
        
        //유저의 아이디를 삭제 (강제탈퇴) 시키기위해서 dto에 담는다.
        MemberDTO dto = new MemberDTO();
        dto.setUser_id(user_id);
        
        //회원탈퇴 체크를 하기위한 메소드, 탈퇴 시키려는 회원의 아이디가 있는지 검사한후에 result 변수에 저장한다.
        adminservice.admin_member_forced_evictionCheck(dto);
        
 
        ModelAndView mav = new ModelAndView();
        
        if(dto.getUser_id() != null) {    //회원 강제탈퇴가 성공했을시 출력되는 뷰
            
            mav.setViewName("home");
            
            mav.addObject("message""회원이 정상적으로 강제탈퇴 처리 되었습니다.");
            
        }else {
            
            mav.setViewName("admin/admin_member_forced_eviction_view");
            
            mav.addObject("message""회원 목록에 없는 회원입니다. 다시 확인해주세요.");
        }
        
        
        return mav;
                
    }
    
}
 
cs

 

 

 

AdminService.java (관리자 관련 서비스 인터페이스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.hansub_project.service.admin;
 
import javax.servlet.http.HttpSession;
 
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
public interface AdminService {
 
    boolean loginCheck(AdminDTO dto, HttpSession session) throws Exception;    //관리자 로그인을 체크하는 메소드
 
    
    void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception; //강제탈퇴 시킬때 해당 회원이 있는지 체크하는 메소드
 
    
}
 
cs

 

 

 

AdminServiceImpl.java (관리자 관련 서비스 구현 클래스)

 

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
package com.example.hansub_project.service.admin;
 
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Service;
 
import com.example.hansub_project.model.admin.dao.AdminDAO;
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
@Service    //서비스 빈으로 설정함
public class AdminServiceImpl implements AdminService {
 
    
    @Inject    //dao를 호출하기때문에 의존성을 주입한다.
    AdminDAO admindao;
    
    
    
    @Override    //로그인 체크 관련 메소드 (세션에 아이디와 비밀번호를 저장함)
    public boolean loginCheck(AdminDTO dto, HttpSession session) throws Exception {
        
        boolean result = admindao.loginCheck(dto);
        
        if(result) {    //로그인 성공
            
            session.setAttribute("admin_id", dto.getAdmin_id());
            session.setAttribute("admin_pass", dto.getAdmin_pass());
            
        }
        
        return result;
    }
 
 
    //회원 강제탈퇴 관련 메소드
    @Override
    public void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception{
 
        admindao.admin_member_forced_evictionCheck(dto);
        
    }
 
}
 
cs

 

 

 

AdminDAO.java (관리자 관련 DAO 인터페이스)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.hansub_project.model.admin.dao;
 
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
public interface AdminDAO {
 
    boolean loginCheck(AdminDTO dto) throws Exception;    //로그인을 체크하는 메소드
 
 
    void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception;    //회원 강제탈퇴 관련 메소드
 
}
 
cs

 

 

 

AdminDAOImpl.java (관리자 관련 DAO 구현 클래스)

 

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
package com.example.hansub_project.model.admin.dao;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.hansub_project.model.admin.dto.AdminDTO;
import com.example.hansub_project.model.member.dto.MemberDTO;
 
 
@Repository    //dao 관련 빈
public class AdminDAOImpl implements AdminDAO {
 
    
    @Inject        //sql쿼리를 사용하기 위해서 의존성을 주입함
    SqlSession sqlSession;
    
    
    //로그인 체크
    //id가 null이면 false를 리턴하고 값이 있으면 true를 리턴한다.
    @Override
    public boolean loginCheck(AdminDTO dto) throws Exception{
        
        String name = sqlSession.selectOne("admin.login_check", dto);
        
        //조건식 ? true일때의 값 : false일때의 값
        return (name==null) ? false : true;
        
    }
 
    
    //회원 강제탈퇴 관련 메소드 구현
    @Override
    public void admin_member_forced_evictionCheck(MemberDTO dto) throws Exception{
        
            sqlSession.delete("admin.admin_member_forced_evictionCheck", dto);
 
    }
 
 
    
}
 
cs

 

 

 

AdminDTO (계층별 자료 전송)

 

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
package com.example.hansub_project.model.admin.dto;
 
import java.util.Date;
 
public class AdminDTO {
    
    
    private String admin_id;    //아이디
    private String admin_pass;    //비밀번호
    private String e_mail;    //이메일
    private Date reg_date;    //등록일자
    
    
    public String getAdmin_id() {
        return admin_id;
    }
    public void setAdmin_id(String admin_id) {
        this.admin_id = admin_id;
    }
    public String getAdmin_pass() {
        return admin_pass;
    }
    public void setAdmin_pass(String admin_pass) {
        this.admin_pass = admin_pass;
    }
    public String getE_mail() {
        return e_mail;
    }
    public void setE_mail(String e_mail) {
        this.e_mail = e_mail;
    }
    public Date getReg_date() {
        return reg_date;
    }
    public void setReg_date(Date reg_date) {
        this.reg_date = reg_date;
    }
        
    @Override
    public String toString() {
        return "AdminDTO [admin_id=" + admin_id + ", admin_pass=" + admin_pass + ", e_mail=" + e_mail + ", reg_date="
                + reg_date + "]";
    }
    
 
}
 
cs

 

 

 

adminMapper.xml (쿼리 작성 mapper.xml)

 

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
<?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와 중복되지 않도록 네임스페이스 기재 -->
<!-- 회원가입 -->
<mapper namespace="admin">
    
    
    <!-- 로그인 관련 mapper-->
    <select id = "login_check" parameterType=
    "com.example.hansub_project.model.admin.dto.AdminDTO"
    resultType="String">
        select admin_id from admin
        where admin_id=#{admin_id} and admin_pass=#{admin_pass}
    </select>    
 
 
    <!-- 회원 강제탈퇴관련 mapper -->
    <delete id="admin_member_forced_evictionCheck">
    delete from member
    where user_id=#{user_id}
    </delete>
    
 
</mapper>
 
cs

 

 

 

 

 

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

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

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

:

스프링 에러 - url로 자료 전송시 발생 (HTTP Status 500 - The server encountered an unexpected condition that prevented it from fulfilling the request.))

Back-End/Spring 2019. 8. 21. 16:17

HTTP Status 500 – Internal Server Error


Type Exception Report

Message Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException:

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: 
### Error updating database.  Cause: java.sql.SQLException: ORA-01407: cannot update ("SPRING"."MEMBER_REPLY"."R_CONTENT") to NULL

### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: update member_reply set r_content = ? where rno = ?
### Cause: java.sql.SQLException: ORA-01407: cannot update ("SPRING"."MEMBER_REPLY"."R_CONTENT") to NULL

; uncategorized SQLException; SQL state [72000]; error code [1407]; ORA-01407: cannot update ("SPRING"."MEMBER_REPLY"."R_CONTENT") to NULL
; nested exception is java.sql.SQLException: ORA-01407: cannot update ("SPRING"."MEMBER_REPLY"."R_CONTENT") to NULL

	org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1013)
	org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
	org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

스프링에서 url로 자료를 전송할 시에 크롬이나 파이어폭스 같은 경우에는 한글로 된자료를 전송할때 자동으로 문자셋이 변환되지만 


인터넷 익스플로러에서는 자동으로 변환되지 않기 때문에 encodeURI로 값을 감싸주어야 한다.




하지만 이렇게 했을 경우에 똑같은 코드를 크롬브라우저에서 실행했을 시에는 encodeURI를 인식하지 못해서 에러가 발생하게 되므로


인터넷 익스플로러 말고 크롬에서 실행할 때에는 encodeURI를 제거한 후에 실행해야 한다.


1
2
document.form1.action="reply_update.do?rno="+rno+"&r_content="+encodeURI(r_content)+"&user_id="+user_id+"&member_bno="+member_bno+"&curPage="+curPage+"&search_option="+search_option+"&keyword="+keyword;
        document.form1.submit();
cs




변경후


1
2
document.form1.action="reply_update.do?rno="+rno+"&r_content="+r_content+"&user_id="+user_id+"&member_bno="+member_bno+"&curPage="+curPage+"&search_option="+search_option+"&keyword="+keyword;
        document.form1.submit();
cs


:

Spring 게시판 게시글 추천 기능 구현 (내 프로젝트에 적용)

Back-End/Spring 2019. 8. 21. 15:51

게시글을 추천할 수 있는 버튼을 만들고 자신의 글이 아닌 글에만 추천을 할 수 있게끔 구현 


("추천" 버튼이 자신의 글이 아닌경우에만 출력되게 함)


나중에 코드를 추가해서 하루에 한번씩만 추천할 수 있도록 수정할 예정


지금은 테스트용도라 추천을 계속 할 수 있음




memberboardview.jsp (게시글 세부내용 관련 페이지) 중 일부


1
2
3
4
5
6
7
8
9
    <!-- 로그인이 되어있고, 본인 글이 아닐경우에만 추천할 수 있도록 버튼을 출력 -->
 
    <c:if test = "${sessionScope.user_id != null and sessionScope.user_id != dto.user_id
    or sessionScope.navername != null and sessionScope.navername != dto.user_id
    or sessionScope.kakaonickname != null and sessionScope.kakaonickname != dto.user_id
    or sessionScope.facebookname != null and sessionScope.facebookname != dto.user_id}">
            
<button type = "button" id = "btnRecommend">추천하기</button>
    
    </c:if>
cs


1
2
3
4
5
6
7
8
9
10
//추천하기 버튼

$("#btnRecommend").click(function(){
    if(confirm("해당 글을 추천하시겠습니까?")){
        document.form1.action="recommend.do";
        document.form1.submit();
        
        alert("해당 글을 추천하였습니다.")
        
        }
    });

cs




MemberBoardController.java (게시글 관련 컨트롤러) 중 일부


1
2
3
4
5
6
7
8
//게시물 추천 관련 메소드
    @RequestMapping("/board/recommend.do")
    public String recommend (@RequestParam int member_bno) throws Exception {
        
        memberboardservice.recommend(member_bno);
    
        return "forward:/board/list.do"; //페이지값을 그대로 넘겨받기위해서 포워딩을 사용해 컨트롤러로 리턴시킨다.
    }
cs




MemberBoardService.java (게시글 관련 서비스 인터페이스) 중 일부


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.hansub_project.service.board;
 
import java.util.List;
import java.util.Map;
 
import javax.servlet.http.HttpSession;
 
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
 
 
public interface MemberBoardService {
 
    
    public void recommend(int member_bno) throws Exception;    //게시글 추천관련
    
}
 
cs




MemberBoardServiceImpl.java (게시글 관련 서비스 인터페이스 구현 클래스) 중 일부


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
package com.example.hansub_project.service.board;
 
import java.util.List;
import java.util.Map;
 
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
 
import org.springframework.stereotype.Service;
 
import com.example.hansub_project.model.board.dao.MemberBoardDAO;
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
 
@Service    //서비스 빈으로 설정함
public class MemberBoardServiceImpl implements MemberBoardService {
    
    @Inject    //dao를 호출하기 때문에 의존성을 주입한다.
    MemberBoardDAO memberboarddao;
 
 
    //게시글 추천관련 메소드 구현
    @Override
    public void recommend(int member_bno) throws Exception {
        
        memberboarddao.recommend(member_bno);
        
        }
 
    }
 
 
 
cs




MemberBoardDAO.java (게시글 관련 DAO 인터페이스) 중 일부


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.hansub_project.model.board.dao;
 
import java.util.List;
 
 
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
 
//DAO 클래스
public interface MemberBoardDAO {
    
    public void recommend(int member_bno) throws Exception;  //추천하기 메소드
    
}
 
cs




MemberBoardDAOImpl.java (게시글 관련 DAO 인터페이스 구현 클래스) 중 일부


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
package com.example.hansub_project.model.board.dao;
 
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.hansub_project.model.board.dto.MemberBoardDTO;
import com.example.hansub_project.model.member.dao.MemberDAO;
 
 
@Repository     //dao 선언
public class MemberBoardDAOImpl implements MemberBoardDAO {
 
    @Inject    //db에 접속하기 위해 의존관계를 주입
    SqlSession sqlSession; 
    
    
    //추천수 증가처리 메소드
    @Override
    public void recommend(int member_bno) throws Exception {
        
        sqlSession.update("memberboard.recommend", member_bno);
    }
 
 
    
}
    
    
cs




boardMapper.xml (게시글 관련 mapper) 중 일부


추천 버튼을 한번 누를때마다 추천수가 1씩 증가함


1
2
3
4
5
6
7
8
<!-- 게시글 추천 관련 쿼리 -->
 
<update id = "recommend">
update member_board
set recommend = recommend+1 
where member_bno = #{member_bno} 
 
</update>
cs





:

Spring 게시판 댓글 관련 기능 구현 - 댓글 작성, 수정, 삭제 (내 프로젝트에 적용)

Back-End/Spring 2019. 8. 21. 15:31

댓글 작성, 댓글 삭제, 댓글 수정 기능 구현 (대댓글은 구현 안함)



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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<%@ 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>
 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
$(function(){
    
 
    //댓글쓰기 버튼 (버튼을 눌러서 id값이 넘어와서 실행되는 자바스크립트 구문)
    listReply();
 
        
    $("#btnReply").click(function(){
        
    var r_content = $("#r_content").val();    //댓글의 내용
    var member_bno =  "${dto.member_bno}";
    var params = {"r_content" : r_content, "member_bno" : member_bno};
    
    
    $.ajax({
        type: "post"//데이터를 보낼 방식
        url: "reply_insert.do"//데이터를 보낼 url
        data: params, //보낼 데이터
    
        
        success: function(data){//데이터를 보내는 것이 성공했을 시 출력되는 메시지
            alert("댓글이 등록되었습니다.");
            listReply2();
                }
            });
        });
    
    
 
    
//댓글 목록을 출력하는 함수
function listReply(){
    $.ajax({
        type: "get",    //get방식으로 자료를 전달
        url: "reply_list.do?member_bno=${dto.member_bno}&curPage=${curPage}&search_option=${search_option}&keyword=${keyword}",    //컨트롤러에 있는 list.do로 맵핑되고 게시글 번호도 같이 보낸다.
        success: function(result){    //자료를 보내는것이 성공했을때 출력되는 메시지
            
            //댓글목록을 실행한 결과를 가져온다.
        $("#listReply").html(result);
            }
        });
}
 
 
 
 
function listReply2(){
    $.ajax({
        type: "get",
        contentType: "application/json",
        url: "reply_list_json.do?member_bno=${dto.member_bno}",
        success: function(result){
            console.log(result);
            var output="<table>";
            for(var i in result){
                var repl=result[i].replytext;
                repl = repl.replace(/  /gi,"&nbsp;&nbsp;");//공백처리
                repl = repl.replace(/</gi,"&lt;"); //태그문자 처리
                repl = repl.replace(/>/gi,"&gt;");
                repl = repl.replace(/\n/gi,"<br>"); //줄바꿈 처리
                
                output += "<tr><td>"+result[i].name;
                date = changeDate(result[i].regdate);
                output += "("+date+")";
                output += "<br>"+repl+"</td></tr>";
            }
                output+="</table>";
                $("#listReply").html(output);
        }
    });
}
    
    
});
 
 
</script>
 
    //세션에 아이디가 저장되었을 경우 (로그인한 경우)에만 댓글 작성 창이 출력되도록 코드를 작성함
    <c:if test = "${sessionScope.user_id != null or sessionScope.navername != null 
    or sessionScope.kakaonickname != null or sessionScope.facebookname != null}">
    
    <textarea rows = "5" cols = "80" id = "r_content" name = "r_content"></textarea>
    <br>
    
    
    <!-- 댓글쓰기 버튼을 클릭하면 위쪽에 있는 자바스크립트 구문이 실행되어서 컨트롤러로 맵핑됨 --><br><br>
    
    <button type = "button" id = "btnReply">댓글쓰기</button>
    </c:if>
    
    <!-- 댓글 목록 -->
    <!-- 댓글이 등록이 되면 listReply에 댓글이 쌓이게 된다. -->
    <div id = "listReply"></div>
    
<body>
 
</body>
</html>
cs




memberboardreply_list.jsp (댓글 수정, 삭제, 리스트를 출력하는 view)

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<%@ 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"%>
 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
 
$(function(){
 
    //댓글 수정 버튼
    $("#btn_reply_Update").click(function(){
    if(confirm("수정 하시겠습니까?")){
        
    //수정하는데 필요한 정보들, 댓글 번호, 글 내용, 작성자 아이디, 게시글 번호를 변수에 저장한다.
        var rno = $("#rno").val();
        var r_content = $("textarea#r_content").text();
        var user_id = $("#user_id").val();
        var member_bno = $("#member_bno").val();
        
    //게시글 세부 페이지로 포워딩을 하기위해 페이지 관련 값들을 변수에 저장해서 컨트롤러로 보낸다.
        var curPage = $("#curPage").val();
        var search_option = $("#search_option").val();
        var keyword = $("#keyword").val();
        
        //페이지 관련 값들과 댓글 수정에 필요한 값들을 url로 전송한다.
        document.form1.action="reply_update.do?rno="+rno+"&r_content="+encodeURI(r_content)+"&user_id="+user_id+"&member_bno="+member_bno+"&curPage="+curPage+"&search_option="+search_option+"&keyword="+keyword;
        document.form1.submit();
        
        
        alert("댓글이 수정되었습니다.")
                }
        });
 
    
    //댓글 삭제 버튼
    $("#btn_reply_Delete").click(function(){
        
        if(confirm("삭제 하시겠습니까?")){
        
        //댓글 삭제를 하기위해 댓글 번호, 글 번호, 댓글 내용, 그리고 게시글 세부 페이지로 포워딩 하기 위해 페이지 관련 값들을 변수에 저장한다.
            var rno = $("#rno").val();
            var member_bno = $("#member_bno").val();
            var content = $("textarea#r_content").text();
            var curPage = $("#curPage").val();
            var search_option = $("#search_option").val();
            var keyword = $("#keyword").val();
            
            
            //url로 삭제에 필요한 변수들을 보낸다.
            document.form1.action="reply_delete.do?rno="+rno+"&member_bno="+member_bno+"&curPage="+curPage+"&search_option="+search_option+"&keyword="+keyword;
            
            document.form1.submit();
            
            alert("댓글이 삭제되었습니다.")
            
        }
    });
});
 
</script>
 
 
 
<body>
<!-- 배열이 비어있지 않으면 참을 출력함. (다시말해서 배열에 값들이 있으면 댓글 리스트를 출력한다.) -->
 
 
 
<c:if test = "${not empty map.list}">
<h2>댓글 리스트</h2>
<table border = "1" width = "800px" align = "left">
 
<c:forEach var = "row" items = "${map.list}">
 
 
<tr>
<td><br><br>
 
닉네임 : ${row.user_id}    작성일자 : ${row.reg_date}   댓글번호 : ${row.rno }<br><br><br>
 
${row.r_content}
 
<!-- 폼태그 안에 위쪽에 있는 자바스크립트 구문에 필요한 값들을 노출시키지 않게 하기 위해 hidden타입으로 값들을 전달한다. -->
<form method = "POST" id = "form1">
 
<input type = "hidden" id = "rno" name = "rno" value = "${row.rno}">
<input type = "hidden" id = "user_id" name = "user_id" value = "${row.user_id}">
<input type = "hidden" id = "member_bno" name = "member_bno" value = "${row.member_bno}">
<input type = "hidden" id = "curPage" name = "curPage" value = "${curPage}">
<input type = "hidden" id = "search_option" name = "search_option" value = "${search_option}">
<input type = "hidden" id = "keyword" name = "keyword" value = "${keyword}">
 
<div style = "width : 800px;">
<textarea id = "r_content" name = "r_content" rows = "3" cols = "80"></textarea></div><br><br>
</form>    
    
 
 
 
 
 
<!-- 본인일 경우에만 댓글 수정버튼과 댓글 삭제 버튼이 출력되도록 설정함 -->
 
<div style = "width:700px; text-align:right;">
 
<c:if test = "${sessionScope.user_id == row.user_id or sessionScope.navername == row.user_id or sessionScope.kakaonickname == row.user_id or sessionScope.facebookname == row.user_id}">
 
<button type = "button" id = "btn_reply_Update" >댓글 수정</button>
<button type = "button" id = "btn_reply_Delete" >댓글 삭제</button>
 
 
</c:if>
</div>
 
 
<br><br>
</td>
</tr>
 
 
 
</c:forEach>
</table>
</c:if>
 
 
</body>
</html>
cs




MemberBoardReplyController.java (게시판 댓글 관련 컨트롤러)

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package com.example.hansub_project.controller.board;
 
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
 
import com.example.hansub_project.model.board.dto.MemberBoardReplyDTO;
import com.example.hansub_project.service.board.MemberBoardReplyService;
 
 
//@ResponseBody를 붙이지 않아도 뷰가 아닌 데이터를 리턴할 수 있다
//하지만 @RestController을 사용할때 리턴값으로 바로 주소를 입력해버리면 그 주소 자체가 화면에 떠버리니 주의!
@Controller
public class MemberBoardReplyController {
 
    @Inject
    MemberBoardReplyService memberboardreplyService;    //서비스를 호출하기 위해서 의존성을 주입함
    
    
    //로깅을 위한 변수
            private static final Logger logger=
            LoggerFactory.getLogger(MemberBoardReplyController.class);
    
    
    //댓글 리스트를 호출할때 맵핑되는 메소드
    @RequestMapping("/board/reply_list.do")
    public ModelAndView list(int member_bno, ModelAndView mav, MemberBoardReplyDTO dto,
            @RequestParam(value="curPage")int curPage,
            @RequestParam(value="search_option"String search_option,
            @RequestParam(value="keyword"String keyword
            ) {
        List<MemberBoardReplyDTO> list = memberboardreplyService.list(member_bno);
 
        System.out.println("뷰에 전달할 데이터"+list);
        
        Map<String,Object> map = new HashMap<>();    //리스트의 값을 저장하기 위해 map객체를 생성하고 그 안에 리스트를 저장
        
        map.put("list", list);
        
        System.out.println("뷰에 전달할 데이터"+map);
        
        mav.addObject("map", map);    //뷰에 전달할 데이터 저장
        
    
        mav.setViewName("board/memberboardreply_list");    //뷰의 이름
        
        mav.addObject("curPage", curPage);
        mav.addObject("search_option", search_option);
        mav.addObject("keyword", keyword);
 
        
        return mav;
    }
    
    
    //댓글 목록을 ArrayList로 리턴함
    @RequestMapping("/board/reply_list_json.do")
    public List<MemberBoardReplyDTO> list_json(int member_bno){
        
        return memberboardreplyService.list(member_bno);
        
    }
    
    //댓글 생성
    @RequestMapping("/board/reply_insert.do")    //세부적인 url pattern
    public void insert (MemberBoardReplyDTO dto, HttpSession session,
             @RequestParam(value="r_content"String r_content,
             @RequestParam(value="member_bno"int member_bno) {
        
        //댓글 작성자 아이디
        //현재 접속중인 사용자의 아이디
        
        if (session.getAttribute("user_id"!= null) {
            
        String user_id = (String)session.getAttribute("user_id");
        dto.setUser_id(user_id);
        
        }
        
        
        //소셜로그인한 아이디도 받아와야 하기때문에 세션에 저장된 아이디값들을 추가함
        
        if (session.getAttribute("navername"!= null) {
            
            String user_id = (String)session.getAttribute("navername");
            dto.setUser_id(user_id);
            
        }
        
        
        if (session.getAttribute("kakaonickname"!= null) {
            
            String user_id = (String)session.getAttribute("kakaonickname");
            dto.setUser_id(user_id);
            
        }
        
        
        if (session.getAttribute("facebookname"!= null) {
            
            String user_id = (String)session.getAttribute("facebookname");
            dto.setUser_id(user_id);
            
        }
        
        
        dto.setR_content(r_content);
        dto.setMember_bno(member_bno);
        
        
        //댓글이 테이블에 저장된다
        memberboardreplyService.create(dto);
        
    }
    
    
    //댓글 수정
    @RequestMapping("/board/reply_update.do")    //세부적인 url pattern
    public String reply_update (@RequestParam(value="rno"int rno, @RequestParam(value="r_content"String r_content, @RequestParam(value="user_id"String user_id,
            @RequestParam(value="curPage")int curPage, @RequestParam(value="search_option")String search_option, @RequestParam(value="keyword")String keyword,
            @RequestParam(value="member_bno")int member_bno, MemberBoardReplyDTO dto) throws Exception{
        
        dto.setRno(rno);
        dto.setR_content(r_content);
        dto.setUser_id(user_id);
        
        System.out.println("dto에 있는값들 출력함"+dto);
 
        memberboardreplyService.reply_update(dto);
        
        
        return "forward:/board/list.do";
    }
    
    
    //댓글 삭제
    @RequestMapping(value = "/board/reply_delete.do" , method = {RequestMethod.GET, RequestMethod.POST} )    //세부적인 url pattern
    public String reply_delete (@RequestParam(value="rno"int rno, MemberBoardReplyDTO dto, @RequestParam(value="member_bno"int member_bno,
            @RequestParam(value="curPage")int curPage, @RequestParam(value="search_option")String search_option, @RequestParam(value="keyword")String keyword) throws Exception{
        
        
        //파라미터로 받는 값은 자동적으로 String타입으로 변환되기 때문에 int타입으로 변환해주어야 한다.
 
        memberboardreplyService.delete(rno);
        
        
        return "forward:/board/view.do";
        
    }
    
    
    
}
 
cs




MemberBoardReplyService.java (댓글 관련 서비스 인터페이스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.hansub_project.service.board;
 
import java.util.List;
 
import com.example.hansub_project.model.board.dto.MemberBoardReplyDTO;
 
public interface MemberBoardReplyService {
    
    public List<MemberBoardReplyDTO> list(int member_bno);    //댓글의 리스트
 
    public void create(MemberBoardReplyDTO dto);    //댓글 생성
 
    public int count(int member_bno);    //댓글 갯수
 
    public void reply_update(MemberBoardReplyDTO dto);    //댓글 수정
 
    public void delete(int rno);    //댓글을 삭제
    
 
}
 
cs




MemberBoardReplyServiceImpl.java (댓글 관련 서비스 구현 클래스)

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
package com.example.hansub_project.service.board;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.springframework.stereotype.Service;
 
import com.example.hansub_project.model.board.dao.MemberBoardReplyDAO;
import com.example.hansub_project.model.board.dto.MemberBoardReplyDTO;
 
 
@Service    //서비스 빈 생성
public class MemberBoardReplyServiceImpl implements MemberBoardReplyService {
 
    
    @Inject
    MemberBoardReplyDAO memberboardreplydao;    //dao를 호출하기 위해 의존성을 주입
    
    
    //댓글의 목록
    @Override
    public List<MemberBoardReplyDTO> list(int member_bno) {
        return memberboardreplydao.list(member_bno);
    }
 
    //댓글 생성
    @Override
    public void create(MemberBoardReplyDTO dto) {
        memberboardreplydao.create(dto);
 
    }
    
    //댓글 갯수
    @Override
    public int count(int member_bno) {
        return 0;
    }
 
    //댓글 수정
    @Override
    public void reply_update(MemberBoardReplyDTO dto) {
        memberboardreplydao.reply_update(dto);        
    }
 
    //댓글 삭제
    @Override
    public void delete(int rno) {
        memberboardreplydao.reply_delete(rno);
        
    }
 
}
 
cs




MemberBoardReplyDAO.java (게시판 댓글 관련 DAO 인터페이스)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.example.hansub_project.model.board.dao;
 
import java.util.List;
 
import com.example.hansub_project.model.board.dto.MemberBoardReplyDTO;
 
public interface MemberBoardReplyDAO {
    
    public List<MemberBoardReplyDTO> list(int member_bno);    //댓글의 목록
    
    public int count(int member_bno);            //댓글의 갯수
    
    public void create(MemberBoardReplyDTO dto);        //댓글의 작성
 
    public void reply_update(MemberBoardReplyDTO dto);        //댓글의 수정
 
    public void reply_delete(int rno);        //댓글의 삭제
 
 
}
 
cs




MemberBoardReplyDAOImpl.java (게시판 댓글 관련 DAO 인터페이스 구현 클래스)

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
package com.example.hansub_project.model.board.dao;
 
import java.util.List;
 
import javax.inject.Inject;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
 
import com.example.hansub_project.model.board.dto.MemberBoardReplyDTO;
 
@Repository        //dao 빈 설정
public class MemberBoardReplyDAOImpl implements MemberBoardReplyDAO {
 
    
    @Inject        //의존관계를 주입함
    SqlSession sqlSession;
    
    
    //댓글 목록
    @Override
    public List<MemberBoardReplyDTO> list(int member_bno) {
        System.out.println(member_bno);
        return sqlSession.selectList("reply.listReply", member_bno);
        
    }
 
    //댓글의 갯수
    @Override
    public int count(int member_bno) {
        return 0;
    }
    
    //댓글을 추가
    @Override
    public void create(MemberBoardReplyDTO dto) {
        sqlSession.insert("reply.insertReply", dto);
        
    }
 
    //댓글의 수정
    @Override
    public void reply_update(MemberBoardReplyDTO dto) {
        sqlSession.update("reply.updateReply", dto);
        
    }
    
 
    //댓글의 삭제
    @Override
    public void reply_delete(int rno) {
        sqlSession.delete("reply.deleteReply", rno);
    }
 
}
 
cs




MemberBoardReplyDTO (게시판 댓글 관련 DTO 클래스)

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
package com.example.hansub_project.model.board.dto;
 
import java.sql.Date;
 
public class MemberBoardReplyDTO {
    
    private int rno;        //댓글 번호
    private int member_bno;    //게시글의 번호
    private String r_content; //댓글 내용
    private String user_id; //댓글 작성자 id
    private Date reg_date; //java.util.Date, 작성일자
    private Date join_date;    //회원의 가입 일자
    private int recommend;    //추천수 
    
    
    public int getRno() {
        return rno;
    }
    
    public void setRno(int rno) {
        this.rno = rno;
    }
    public int getMember_bno() {
        return member_bno;
    }
    public void setMember_bno(int member_bno) {
        this.member_bno = member_bno;
    }
    public String getR_content() {
        return r_content;
    }
    public void setR_content(String r_content) {
        this.r_content = r_content;
    }
    public String getUser_id() {
        return user_id;
    }
    public void setUser_id(String user_id) {
        this.user_id = user_id;
    }
    public Date getReg_date() {
        return reg_date;
    }
    public void setReg_date(Date reg_date) {
        this.reg_date = reg_date;
    }
    public Date getJoin_date() {
        return join_date;
    }
    public void setJoin_date(Date join_date) {
        this.join_date = join_date;
    }
    public int getRecommend() {
        return recommend;
    }
    public void setRecommend(int recommend) {
        this.recommend = recommend;
    }
    
 
    @Override
    public String toString() {
        return "MemberBoardReplyDTO [rno=" + rno + ", member_bno=" + member_bno + ", r_content=" + r_content
                + ", user_id=" + user_id + ", reg_date=" + reg_date + ", join_date=" + join_date + ", recommend="
                + recommend + "]";
    }
    
}
 
cs




replyMapper.xml (댓글 관련 mapper.xml 파일)

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
<?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와 중복되지 않도록 네임스페이스 기재 -->
 
<mapper namespace="reply">
 
 
 
    <insert id = "insertReply">
    <!-- 댓글을 추가 -->
    insert into member_reply (rno, member_bno, r_content, user_id) values
    (member_reply_bno.nextval, #{member_bno}, #{r_content}, #{user_id})
    
    </insert>
    
    
    <select id = "listReply"
    resultType = "com.example.hansub_project.model.board.dto.MemberBoardReplyDTO">
    <!-- 댓글의 작성자와 회원의 아이디가 같고, 글번호가 같을 경우에 댓글 리스트를 내림차순으로 검색함 -->
    select rno, r.member_bno, r.user_id, r.reg_date, r.r_content
    from member_reply r
    where r.member_bno = #{member_bno}
    order by rno
    </select>
    
    
    <update id = "updateReply">
    <!-- 댓글의 번호와 회원의 아이디가 모두다 같을경우에만 수정할 수 있도록 쿼리를 설정 -->    
    update member_reply set r_content = #{r_content} where rno = #{rno}
    </update>
 
 
    
    <delete id="deleteReply">
    <!-- 댓글의 번호가 같을 경우에 삭제할 수 있도록 설정 (아이디는 앞에서 같지않으면 버튼조차 뜨지 않기때문에 따로 쿼리를 추가할 필요 없다.) -->
    delete from member_reply where rno = #{rno}
    </delete>
 
 
</mapper>
 
cs





:

스프링 에러 - Request method 'POST' not supported

Back-End/Problems 2019. 8. 20. 11:29

에러 내용

 

11:20:35.291 [http-nio-8090-exec-8] WARN [org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.logException:194]-

 

Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]

 

 

 

스프링에서 컨트롤러로 맵핑할때 컨트롤러에 method방식을 명시해놓고, 그 방식으로 자료를 보내지 않으면 해당 에러를 발생시킨다.

 

이런 에러가 발생했을시에는 아래와 같이 post방식을 지원할 수 있도록 컨트롤러에 해당 메소드에 RequestMethod.POST 방식을 추가해주면 된다.

 

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, RequestMethod.POST}) //POST방식으로도 맵핑할 수 있도록 코드를 추가하였다.
    public ModelAndView view(@RequestParam int member_bno,
            @RequestParam int curPage,
            @RequestParam String search_option,
            @RequestParam String keyword,
            HttpSession session) throws Exception{
        
        //조회수 증가 쿼리
        memberboardservice.increaseViewcnt(member_bno, session);
        
        ModelAndView mav = new ModelAndView();
        mav.setViewName("board/memberboardview");
        
        //view로 자료를 넘기기위해서 mav에 값들을 저장해서 view.jsp로 리턴시킨다.
        mav.addObject("dto", memberboardservice.read(member_bno)); //상세보기를 한번 클릭하면 조회수를 1증가시킨다.
        mav.addObject("curPage", curPage);
        mav.addObject("search_option", search_option);
        mav.addObject("keyword", keyword);
        
        return mav;     //view로 넘어가서 출력이 된다.
    }
cs

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

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

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

 

:

getter for property named 에러 해결 방법

Back-End/Problems 2019. 8. 19. 17:21

에러 코드

 

There is no getter for property named 'rno' in 'class java.lang.Integer'] with root cause

org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'rno' in 'class java.lang.Integer'

 

 

해결 방법

 

mybatis 관련된 쿼리에 오류가 발생되었을 경우에 발생하는 오류이고, 맞춤법이나 대소문자를 다시한번 확인해본다.

 

mapper에 적힌 쿼리에 오타나 대소문자를 다시한번 확인해보고 수정하면 해결 된다.

 

UPDATE EASY_COMMON.CM_FLOOR_INFO
        SET 
            FLOOR_NAME = #{FLOOR_NAME},
            FLOOR_PEOPLE = #{FLOOR_people}
        WHERE FLOOR_ID = #{FLOOR_ID}



출처: https://yamea-guide.tistory.com/162 [기타치는 개발자의 야매 가이드]

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

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

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

:

JSTL - 조건문 처리

Back-End/Spring 2019. 8. 16. 13:53

1. <c:if> 태그


test 속성내의 EL의 결과가 참이면 실행됩니다. else 구문은 없습니다.


name의 값이 홍길동이면 출력하는 구문


  

  <c:set var = "name" value = "홍길동" />


  <c:if test = "${name eq '홍길동'}" >


      <c:out value = "${str}" />


  </c:if>




<c:if> 태그에 사용될 수 있는 속성은 다음 세 가지 입니다.


- test : 필수 속성으로 속성값으로 EL 비교식을 가집니다.


- var : 조건 결과를 저장할 변수를 지정합니다.


- scope : 조건 결과를 저장할 변수의 저장 scope을 지정합니다.



 

  <c:if test = "${name eq '홍길동'}" var = "nameHong" scope = "session" >


  </c:if>




위의 코드는 test 속성의 결과를 nameHong라는 변수의 이름으로 session에 저장합니다.


이렇게 되면 동일 세션의 다른 페이지에서 결과를 출력할 수 있습니다.




2. test 속성에 사용될 비교 연산자



 

  ㄱ. eq (==) : 문자열 또는 숫자가 같으면 참입니다. null 또는 빈 문자열인지도 확인할 수 있습니다.


  - <c:if test="${name == '홍길동'}">

  - <c:if test="${name eq '홍길동'}">

  - <c:if test="${name == null}">

  - <c:if test="${name eq null}">

  - <c:if test="${num == 5}">

  - <c:if test="${num eq 5}">



  ㄴ. ne (!=) : 문자열 또는 숫자가 다르면 참입니다.


  - <c:if test="${name != '홍길동'}">

  - <c:if test="${name ne '홍길동'}">

  - <c:if test="${num != 5}">

  - <c:if test="${num ne 5}">



  ㄷ. empty : List 또는 배열이 비어있거나, 문자열이 null 또는 빈 문자열이면 참을 반환합니다.  

       숫자 0은 eq (==)로 비교해야 합니다.


  - <c:if test="${empty name}">


  ㄹ. not empty : List 또는 배열이 비어 있지 않을 경우, 문자열 값이 있을 경우 참을 반환합니다.


  - <c:if test="${not empty name}">




3. 논리연산자


비교연산자의 조합으로 논리 연산을 할 수 있는 논리연산자 입니다.



 

  

  ㄱ. and (&&) : 모두 참일때 참이 됩니다.


  - <c:if test="${a > b and c < d}">

  - <c:if test="${a > b && c < d}">


  ㄴ. or ( | | ) : 둘 중 하나라도 참이면 참이 됩니다.


  - <c:if test="${a > b or c < d}">

  - <c:if test="${a > b || c < d}">


  ㄷ. not (!) : 논리를 반전합니다.


  - <c:if test="${not a == ''}">

  - <c:if test="${! a == ''}">





4. <c:choose> 태그


<c:choose> 태그는 조건에 따른 여러곳으로 분기 가능하고, 조건이 맞은 것이 없을 경우 기본 분기를 제공할 수 있습니다.

<c:choose>

<c:when test="${name eq '김철수'}"> ... </c:when>

<c:when test="${name eq '박영희'}"> ... </c:when>

<c:otherwise> ... </c:otherwise>

</c:choose>

위 코드는 이름이 "김철수", "박영희" 일 경우 분기 하고 그 외의 경우에는 <c:otherwise> 로 분기 합니다.




출처

https://offbyone.tistory.com/367 [쉬고 싶은 개발자]

:

ajax로 데이터 넘기기

Back-End/Spring 2019. 8. 14. 16:31

HTML부분

 

1
2
3
4
<input type="hidden" id="userId" value="abcd">
<input type="checkbox" name="hobby" value="독서">
<input type="checkbox" name="hobby" value="운동">
<input type="checkbox" name="hobby" value="전시관람">
cs

 

 

 

이제 javascript단에서 데이터를 불러와서 ajax 방식으로 넘긴다.

 

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
function ajaxExample(){
    // 사용자 ID를 갖고 온다.
    var userId = $("#userId").val();
 
    // name이 같은 체크박스의 값들을 배열에 담는다.
    var checkboxValues = [];
    $("input[name='hobby']:checked").each(function(i) {
        checkboxValues.push($(this).val());
    });
     
    // 사용자 ID(문자열)와 체크박스 값들(배열)을 name/value 형태로 담는다.
    var allData = { "userId": userId, "checkArray": checkboxValues };
     
    $.ajax({
        url:"goUrl.do",
        type:'GET',
        data: allData,
 
 
//데이터 전송이 완료되면 출력되는 메시지
 
        success:function(data){
            alert("완료!");
            window.opener.location.reload();
            self.close();
        },
 
//에러가 발생되면 출력되는 메시지
 
        error:function(jqXHR, textStatus, errorThrown){
            alert("에러 발생~~ \n" + textStatus + " : " + errorThrown);
            self.close();
        }
    });
}
cs

 

 

Spring Controller에서 데이터를 받을때는 배열은 배열로, String 타입은 String 타입으로 받으면 된다.

 

@RequestParam(value="checkArray[]") List<string> arrayParams, 

 

@RequestParam(value="userId") String userId

 

 

만약 @RequestParam HashMap param으로 받을 경우, 배열은 첫번째 값만 넘어간다. 

 

그러니 배열은 반드시 List로 넘겨야한다.

 

 

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

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

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

출처

https://zero-gravity.tistory.com/241

: