ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JSP 게시판 만들기(3)
    프로그래밍/JSP 2022. 12. 3. 12:48
    728x90

     

     

    글 상세 보기 페이지와 조회수, 게시글 좋아요 기능을 구현해보자.

     

     

     

    글 상세 보기 페이지(view.jsp) 작성

    해당 페이지는 게시판 리스트에서 글 제목을 누를 경우 글 인덱스 번호가 담은 URL를 통해 이동한 페이지로 request.getParameter를 통해 URL에서 글 인덱스 번호를 전달 받아 해당 글 인덱스 번호에 맞는 게시글 데이터를 받아와 출력해줄 것이다.

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="com.koreait.db.Dbconn"%>
    <%
    	String userid = (String)session.getAttribute("userid");
    	if(userid == null){
    %>
    <script>
    	alert('로그인 후 이용하세요');
    	location.href='../login.jsp';
    </script>
    <%			
    	}else{
    	String b_idx = request.getParameter("b_idx");
    
    
    	Connection conn = null;
    	PreparedStatement pstmt = null;
    	ResultSet rs = null;
    	
    	String sql = "";
    	
    	String b_userid = "";
    	String b_title = "";
    	String b_content = "";
    	String b_regdate = "";
    	int b_like = 0;
    	int b_hit = 0;
    
    	
    	try{
    		conn = Dbconn.getConnection();
    		if(conn != null){
    			
    			sql = "update tb_board set b_hit = b_hit + 1 where b_idx=?";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setString(1, b_idx);
    			pstmt.executeUpdate();
    			
    			sql = "select b_idx, b_userid, b_title, b_content, b_regdate, b_like, b_hit from tb_board where b_idx=?";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setString(1, b_idx);
    			rs = pstmt.executeQuery();
    			
    			if(rs.next()){
    				b_userid=rs.getString("b_userid");
    				b_title=rs.getString("b_title");
    				b_content=rs.getString("b_content");
    				b_regdate=rs.getString("b_regdate");
    				b_like=rs.getInt("b_like");
    				b_hit=rs.getInt("b_hit");
    			}
    		}
    	}catch (Exception e) {
    		e.printStackTrace();
    	}	
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>커뮤니티 - 글보기</title>
    <script>
    	function like(){
    		const xhr = new XMLHttpRequest();
    		
    		xhr.open('GET', './like_ok.jsp?b_idx=<%=b_idx%>', true);
    		xhr.send();
    		
    		xhr.onreadystatechange = function(){
    			if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200){
    				document.getElementById('like').innerHTML = xhr.responseText;
    			}
    		}
    	}
    	function replyDelete(r_idx){
    		const yn = confirm('삭제하시겠습니까?');
    		
    		if(yn){
    			location.href="./reply_del_ok.jsp?r_idx="+r_idx+"&b_idx=<%=b_idx%>";
    		}
    	}
    </script>
    </head>
    <body>
    	<h2>커뮤니티 - 리스트</h2>
    	<table border="1" width="800">
    		<tr>
    			<td>제목</td><td><%=b_title%></td>
    		</tr>
    		<tr>
    			<td>날짜</td><td><%=b_regdate%></td>
    		</tr>
    		<tr>
    			<td>작성자</td><td><%=b_userid%></td>
    		</tr>
    		<tr>
    			<td>조회수</td><td><%=b_hit%></td>
    		</tr>
    		<tr>
    			<td>좋아요</td><td><span id="like"><%=b_like%></span></td>
    		</tr>
    		<tr>
    			<td>내용</td><td><%=b_content%></td>
    		</tr>
    		<tr>
    			<td colspan="2">
    <% 
    	if(b_userid.equals(userid)){
    %>			
    				<input type="button" value="수정" onclick="location.href='./edit.jsp?b_idx=<%=b_idx%>'"> 
    				<input type="button" value="삭제" onclick="location.href='./delete.jsp?b_idx=<%=b_idx%>'"> 
    <%
    	}
    %>
    				<input type="button" value="좋아요" onclick="like()"> 
    				<input type="button" value="리스트" onclick="location.href='./list.jsp'">
    			</td>
    		</tr>
    	</table>
    	<hr>
    	<form method="post" action="reply_ok.jsp">
    		<input type="hidden" name="b_idx" value="<%=b_idx%>">
    		<p><%=userid%> : <input type="text" size="40" name="r_content"> <input type="submit" value="확인"></p>
    	</form>
    	<hr>
    <% 
    	try{
    		conn = Dbconn.getConnection();
    		if(conn != null){
    			
    			sql = "select r_idx, r_userid, r_content, r_regdate from tb_reply where r_boardidx=? order by r_idx desc";
    			pstmt = conn.prepareStatement(sql);
    			pstmt.setString(1, b_idx);
    			rs = pstmt.executeQuery();
    		}
    	}catch (Exception e) {
    		e.printStackTrace();
    	}	
    	while(rs.next()){
    		int r_idx =rs.getInt("r_idx");
    		String r_userid=rs.getString("r_userid");
    		String r_content=rs.getString("r_content");
    		String r_regdate=rs.getString("r_regdate");
    
    %>	
    	<p><%=r_userid%> : <%=r_content%> (<%=r_regdate%>)
    <% 
    		if(r_userid.equals(userid)){
    %>		
    			<input type="button" value="삭제" onclick="replyDelete(<%=r_idx%>)">
    <% 
    		}
    %>	
    	</p>
    <% 
    	}
    %>
    </body>
    </html>
    <%
    }
    %>

     

     

     

     

     

    view.jsp 의 코드를 자세히 나눠 살펴보자.

     

    [조회수 & 글 데이터 가져오기]

    try{
        conn = Dbconn.getConnection();
        if(conn != null){
    
            sql = "update tb_board set b_hit = b_hit + 1 where b_idx=?";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, b_idx);
            pstmt.executeUpdate();
    
            sql = "select b_idx, b_userid, b_title, b_content, b_regdate, b_like, b_hit 
            from tb_board where b_idx=?";
            
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, b_idx);
            rs = pstmt.executeQuery();
    
            if(rs.next()){
                b_userid=rs.getString("b_userid");
                b_title=rs.getString("b_title");
                b_content=rs.getString("b_content");
                b_regdate=rs.getString("b_regdate");
                b_like=rs.getInt("b_like");
                b_hit=rs.getInt("b_hit");
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    위 코드는 글 인덱스 번호를 통해 글 상세보기 페이지에 입장할 때마다 조회수( hit )의 데이터를 +1 하는 조회수 기능과 글의 모든 데이터를 가져와 결과를 파라미터에 담아주고 JSP 페이지에 출력한다.

     

     

     

     

    [좋아요 기능]

    function like(){
        const xhr = new XMLHttpRequest();
    
        xhr.open('GET', './like_ok.jsp?b_idx=<%=b_idx%>', true);
        xhr.send();
    
        xhr.onreadystatechange = function(){
            if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200){
                document.getElementById('like').innerHTML = xhr.responseText;
            }
        }
    }

    위 코드는 좋아요 버튼을 누를시 Ajax를 통해 like_ok.jsp와 통신하여 좋아요( like )의 값을 +1씩 증가시키는 자바스크립트 함수이다.

     

     

     

     

    [게시글 삭제 기능]

    function replyDelete(r_idx){
        const yn = confirm('삭제하시겠습니까?');
    
        if(yn){
            location.href="./reply_del_ok.jsp?r_idx="+r_idx+"&b_idx=<%=b_idx%>";
        }
    }

    함수 호출시 reply_del_ok.jsp 페이지로 이동하여 게시글을 삭제하는 자바스크립트 함수이다.

     

     

     

     

    [글 작성자만 수정 및 삭제 버튼이 노출]

    <% 
    if(b_userid.equals(userid)){
    %>			
        <input type="button" value="수정" onclick="location.href='./edit.jsp?b_idx=<%=b_idx%>'"> 
        <input type="button" value="삭제" onclick="location.href='./delete.jsp?b_idx=<%=b_idx%>'"> 
    <%
    }
    %>

     

     

     

     

     

    [댓글 작성 Form]

    <form method="post" action="reply_ok.jsp">
        <input type="hidden" name="b_idx" value="<%=b_idx%>">
        <p><%=userid%> : <input type="text" size="40" name="r_content"> <input type="submit" value="확인"></p>
    </form>

    post 방식으로 댓글 내용(r_content)과 글 인덱스 번호(b_idx)를 댓글 작성 처리 페이지(reply_ok.jsp)로 전달한다.

     

     

     

     

    [작성 댓글 불러오기]

    <%
    try{
        conn = Dbconn.getConnection();
        if(conn != null){
    
            sql = "select r_idx, r_userid, r_content, r_regdate from tb_reply where r_boardidx=? order by r_idx desc";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, b_idx);
            rs = pstmt.executeQuery();
        }
    }catch (Exception e) {
        e.printStackTrace();
    }	
    while(rs.next()){
        int r_idx =rs.getInt("r_idx");
        String r_userid=rs.getString("r_userid");
        String r_content=rs.getString("r_content");
        String r_regdate=rs.getString("r_regdate");
    
    %>	
    	<p><%=r_userid%> : <%=r_content%> (<%=r_regdate%>)
    <% 
    	if(r_userid.equals(userid)){
    %>		
    		<input type="button" value="삭제" onclick="replyDelete(<%=r_idx%>)">
    <% 
    	}
    %>	
    	</p>
    <% 
    }
    %>

    글번호와 일치하는 댓글 데이터를 불러와 출력하고, 만약 댓글 작성자(r_userid)와 현재 로그인 유저(userid)가 동일하다면 댓글 삭제 버튼을 노출한다.

     

     

     


     

     

     

    좋아요 처리 페이지(like_ok.jsp) 작성

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="com.koreait.db.Dbconn"%>
    <%
    	String userid = (String)session.getAttribute("userid");
    	if(userid == null){
    %>
    	<script>
    	alert('로그인 후 이용하세요');
    	location.href='../login.jsp';
    	</script>
    <%			
    	}else{
    	
    		
    		String b_idx = request.getParameter("b_idx");
    		
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    		
    		int b_like = 0;
    		
    		String sql = "";
    		
    		try{
    			conn = Dbconn.getConnection();
    			if(conn != null){
    				sql = "update tb_board set b_like = b_like + 1 where b_idx=?";
    				pstmt = conn.prepareStatement(sql);
    				pstmt.setString(1, b_idx);
    				pstmt.executeUpdate();
    				
    				sql = "select b_like from tb_board where b_idx=?";
    				pstmt = conn.prepareStatement(sql);
    				pstmt.setString(1, b_idx);
    				rs = pstmt.executeQuery();
    				
    				if(rs.next()){
    					b_like = rs.getInt("b_like");
    					out.println(b_like);
    				}
    			}
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    %>

    글 인덱스 번호를 파라미터로 전달 받아 글 인덱스 번호에 해당되는 tb_board 테이블 내 데이터의 b_like의 값을 +1 처리한다.

    추가로 글번호를 이용해 b_like(+1 해준 값)를 다시 받아와 그 결과를 js로 반환하고 js에서는 innerHTML를 통해 결과를 view.jsp 페이지에 출력한다.

     

     

     


     

     

     

    게시글 삭제 처리 페이지(delete.jsp) 작성

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page import="java.sql.*"%>
    <%@ page import="com.koreait.db.Dbconn"%>
    <%
    	String userid = (String)session.getAttribute("userid");
    	if(userid == null){
    %>
    	<script>
    	alert('로그인 후 이용하세요');
    	location.href='../login.jsp';
    	</script>
    <%			
    	}else{
    		
    		String b_idx = request.getParameter("b_idx");
    		
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		ResultSet rs = null;
    
    		String sql = "";
    		
    		try{
    			conn = Dbconn.getConnection();
    			if(conn != null){
    				sql = "delete from tb_board where b_idx=?";
    				pstmt = conn.prepareStatement(sql);
    				pstmt.setString(1, b_idx);
    				pstmt.executeUpdate();
    			}
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
    	
    %>
    	<script>
    		alert('게시글이 삭제되었습니다.');
    		location.href='./list.jsp';
    	</script>
    <%
    }
    %>

    삭제 처리 페이지는 글 인덱스 번호를 파타미터로 전달 받아 tb_board 테이블에 글 인덱스 번호(b_idx)와 동일한 글 인덱스 번호가 있다면 삭제(delete) 처리를 수행 한다.

     

     

     

     

     

     

    글 상세 보기 페이지

     

     

    좋아요 클릭

     

     

    게시글 삭제 시 게시판 리스트 결과

     

    728x90

    '프로그래밍 > JSP' 카테고리의 다른 글

    JSP 게시판 만들기(5)  (0) 2022.12.08
    JSP 게시판 만들기(4)  (0) 2022.12.06
    JSP 게시판 만들기(2)  (0) 2022.12.02
    JSP 게시판 만들기(1)  (0) 2022.11.30
    Java Beans 활용하여 로그인 만들기(2)  (0) 2022.11.29

    댓글

Designed by Tistory.