보라코딩

Day73_230411_ JSP, MyBatis 게시판 본문

코딩/Servlet, JSP, MyBatis

Day73_230411_ JSP, MyBatis 게시판

new 보라 2023. 4. 11. 18:18

write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 입력화면 만들고 저장버튼 클릭시 write_ok.jsp에 작성 데이터 전달 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글작성</title>
<script>
function list_go(){
location.href = "list.jsp";
}

function sendData(){
//alert("sendData() 함수호출");
let firstForm = document.forms[0];
for(let i = 0; i< firstForm.elements.length; i++){
if (firstForm.elements[i].value.trim() == ""){
if(i==3) continue;
alert(firstForm.elements[i].title + " 입력하세요");
firstForm.elements[i].focus();
return;
}
}
firstForm.submit();
}
</script>
</head>
<body>

<div id = "bbs">
<form action="write_ok.jsp" method="post" enctype="multipart/form-data">
<table>
<caption>게시판 글쓰기</caption>
<tbody>
<tr>
<th>제목</th>
<td>
<input type="text" name="subject" title="제목">
</td>
</tr>
<tr>
<th>작성자</th>
<td>
<input type="text" name="writer" title="작성자">
</td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea name="content" row="8" cols="50" title="내용"></textarea>
</td>
</tr>
<tr>
<th>첨부파일</th>
<td>
<input type="file" name="filename" title="첨부파일">
</td>
</tr>
<tr>
<th>패스워드</th>
<td>
<input type="password" name="pwd" title="암호">
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="2">
<input type="button" value="저장" onclick="sendData()">
<input type="reset" value="초기화"">
<input type="button" value="목록보기" onclick="list_go()">
</td>

</tr>
</tfoot>

</table>

</form>


</div>
</body>
</html>

 

 

mapper.xml

<!-- 전체 게시글 갯수 조회 -->
<select id="totalCount" resultType="int">
SELECT COUNT(*) AS CNT FROM BBS
</select>

<!-- 페이지에 해당하는 게시글 조회 -->
<select id="list" resultType="com.mystudy.bbs.vo.BbsVO"
parameterType="map">
SELECT *
FROM (SELECT ROWNUM R_NUM, B.*
      FROM (SELECT *
            FROM BBS
            ORDER BY BBS_IDX DESC
           ) B
     )
WHERE R_NUM BETWEEN #{begin} AND #{end}
</select>

<insert id="insert" parameterType="bbsVO">
INSERT INTO BBS
        (BBS_IDX, SUBJECT, WRITER, CONTENT, FILE_NAME, 
         ORI_NAME, PWD, WRITE_DATE, IP, HIT )
VALUES (BBS_SEQ.NEXTVAL, #{subject}, #{writer}, #{content}, #{fileName}, 
         #{oriName},  #{pwd}, SYSDATE, #{ip}, 0)
</insert>

 

 

write_ok.jsp

<%@page import="com.mystudy.bbs.dao.BbsDAO"%>
<%@page import="com.mystudy.bbs.vo.BbsVO"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 전달받은 데이터 값을 DB에 저장(INSERT)하고 list.jsp 이동 --%>

<%
// 0. Post 방식이기에 한글처리 필요
request.setCharacterEncoding("UTF-8");

//이렇게 안됨!!! 
//String subject = request.getParameter("subject");
//System.out.println("subject : " + subject);

//(주의) form 태그에 enctype="multipart/form-data" 설정하면
// request 객체를 통한 파라미터 값 조회 안됨(MultipartRequest 사용할 것)

//파일을 저장할 위치 지정
String path = "c:/Mystudy/temp";
//String path = this.getServletContext().getRealPath("/upload");
//System.out.println("> path : " + path);

MultipartRequest mr = new MultipartRequest(
request, //요청객체
path, //실제 파일을 저장할 경로(업로드 위치)
10 * 1024 * 1024, //업로드 파일의 최대크기 지정(byte 단위)
"UTF-8", //인코딩 형식
new DefaultFileRenamePolicy());

// 전달받은 데이터 VO에 저장 후 DB에 입력처리(DB 연동 작업)
BbsVO bvo = new BbsVO();
bvo.setSubject(mr.getParameter("subject"));
bvo.setWriter(mr.getParameter("writer"));
bvo.setContent(mr.getParameter("content"));
bvo.setPwd(mr.getParameter("pwd"));

bvo.setIp(request.getRemoteAddr());

// 첨부파일 데이터 처리
if (mr.getFile("filename") == null){
//System.out.println(">> 첨부파일 없음");
bvo.setFileName("");
bvo.setOriName("");
} else {
//System.out.println(">> 첨부파일 있음");
bvo.setFileName(mr.getFilesystemName("filename")); //물리적으로 저장되는 파일명
bvo.setOriName(mr.getOriginalFileName("filename")); //물리적으로 저장되는 파일명
}
System.out.println("bvo : "+ bvo);

// DB에 입력(저장) 처리
BbsDAO.insert(bvo);

// 화면 전환
response.sendRedirect("list.jsp");

%>

 

config.xml

<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>

<typeAliases>
<typeAlias type="com.mystudy.bbs.vo.BbsVO" alias="bbsVO" />
</typeAliases>

 

 

BbsDAO.java

package com.mystudy.bbs.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import com.mystudy.bbs.mybatis.DBService;
import com.mystudy.bbs.vo.BbsVO;

public class BbsDAO {

//게시글의 전체 데이터 건수 조회
public static int getTotalCount() {
SqlSession ss = DBService.getFactory().openSession();
int totalCount = ss.selectOne("BBS.totalCount");
ss.close();
return totalCount;
}

//페이지에 해당하는 글목록(게시글) 가져오기
public static List<BbsVO> getList(Map<String, Integer> map) {
SqlSession ss = DBService.getFactory().openSession();
List<BbsVO> list = ss.selectList("BBS.list", map);
ss.close();
return list;
}

public static List<BbsVO> getList(int begin, int end) {
Map<String, Integer> map = new HashMap<>();
map.put("begin", begin);
map.put("end", end);

SqlSession ss = DBService.getFactory().openSession();
List<BbsVO> list = ss.selectList("BBS.list", map);
ss.close();
return list;
}

// 게시글 입력처리
public static int insert(BbsVO bvo) {
 SqlSession ss = DBService.getFactory().openSession(true);
 int result = ss.insert("BBS.insert", bvo);
 ss.close();
 
 return result;
}

}

 

 


상세보기

<!-- 게시글 조회(1개) -->
<select id="one" parameterType="int" resultType="bbsVO">
SELECT BBS_IDX, SUBJECT, WRITER, CONTENT, FILE_NAME, 
         ORI_NAME, PWD, WRITE_DATE, IP, HIT
FROM BBS
WHERE BBS_IDX = #{bbsIdx}
</select>

<select id="selectComment" parameterType="int" resultType="co
m.mystudy.bbs.vo.CommentVO
">
SELECT * 
FROM COMMENTS
WHERE BBS_IDX = #{bbsIdx}
ORDER BY COMMENT_IDX DESC
</select>

 

// 게시글 한개 조회
public static BbsVO selectOne(int bbsIdx) {
 SqlSession ss = DBService.getFactory().openSession(true);
 BbsVO vo = ss.selectOne("BBS.one", bbsIdx);
 ss.close();
 
 return vo;
}

//================= 댓글 관련 기능 ======================
// comment 조회
public static List<CommentVO> getCommList(int bbsIdx) {
 SqlSession ss = DBService.getFactory().openSession(true);
 List<CommentVO> listComment = ss.selectList("BBS.selectComment", bbsIdx);
 ss.close();
 
 return listComment;
}

 

 

 

view.jsp

<%@page import="com.mystudy.bbs.vo.CommentVO"%>
<%@page import="java.util.List"%>
<%@page import="com.mystudy.bbs.vo.BbsVO"%>
<%@page import="com.mystudy.bbs.dao.BbsDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

    
<%-- 전달받은 데이터 사용해서 DB데이터 조회 후 화면에 표시 
 전달받은 파라미터값(bbsIdx, cPage)
 1. 게시글 조회수 1증가 (hit 증가)
 2. 게시글(bbsIdx) 데이터 조회 후 화면 표시
 3. 게시글(bbsIdx)에 연결된 댓글이 있으면 화면 표시 (DB데이터 조회)
--%>
<%
int bbsIdx = Integer.parseInt(request.getParameter("bbsIdx"));
String cPage = request.getParameter("cPage");

System.out.println("bbsIdx :" +bbsIdx + ", cPage : " + cPage);

//1. 게시글 조회수 1증가 (개인별 실습)


//2. 게시글(bbsIdx) 데이터 조회
BbsVO bvo = BbsDAO.selectOne(bbsIdx);
System.out.println(bvo);

// 3.게시글(bbsIdx)에 연결된 댓글이 있으면 DB 조회
List<CommentVO> listComment = BbsDAO.getCommList(bbsIdx);
System.out.println(listComment);

// EL, JSTL 사용을 위해 scope 상에 데이터 저장하기
session.setAttribute("bvo", bvo);
pageContext.setAttribute("c_list",listComment);

session.setAttribute("cPage", cPage);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>view</title>
</head>
<body>
<%-- ${bvo } --%>
<%-- ${c_list } --%>

<div id="bbs">
<%-- 게시글 내용 표시(출력) --%>
<table>
<caption>상세보기</caption>
<tbody>
<tr>
<th>제목</th>
<td>${bvo.subject}</td>
</tr>
<tr>
<th>작성자</th>
<td>${bvo.writer}</td>
</tr>
<tr>
<th>첨부파일</th>
<td>${bvo.fileName}</td>
</tr>
<tr>
<th>내용</th>
<td>${bvo.content}</td>
</tr>

</tbody>
<tfoot>
<tr>
<td colspan="2">
<input type="button" value="수정" onclick="modify_go()">
<input type="button" value="삭제" onclick="delete_go()">
<input type="button" value="목록보기" onclick="list_go()">
</td>
</tr>

</tfoot>
</table>

<%-- 게시글에 대한 댓글 입력 --%>
<form action="comm_write_ok.jsp" method="get">
<p>
작성자 : <input type="text" name="writer">
비밀번호 : <input type="password" name="pwd">
</p>
<p>내용 : <textarea name="content" rows="4" cols="50"></textarea></p>
<input type="submit" value="댓글저장">
<input type="hidden" name="bbsIdx" value="${bvo.bbsIdx }">
</form>


<%-- 게시글에 연결된 댓글 표시(출력) --%>
<c:forEach var="commVO" items="${c_list}">
<hr>
<div class="comment">
<form action="comm_delete.jsp" method="get">
<p>작성자 : ${commVO.writer } // 작성일 : ${commVO.writeDate }</p>
<p>내용 : ${commVO.content }</p>
<input type="submit" value="댓글삭제">
<input type="hidden" name="commentIdx" value="${commVO.commentIdx }">
</form>
</div>
</c:forEach>
</div>
</body>
</html>

 


댓글입력

 

 

 

<!-- 댓글 입력 : commInsert -->
<insert id="commInsert" parameterType="com.mystudy.bbs.vo.CommentVO">
INSERT INTO COMMENTS
VALUES (COMMENTS_SEQ.NEXTVAL, #{writer}, #{content}, #{pwd}, SYSDATE, 
#{ip}, #{bbsIdx})
</insert>

 

 

// 댓글 입력처리 insertComment()
public static int insertComment(CommentVO vo) {
SqlSession ss = DBService.getFactory().openSession(true);
int result = ss.insert("BBS.commInsert", vo);
ss.close();

return result;
}

 

 

comm_write_ok.jsp

<%@page import="com.mystudy.bbs.dao.BbsDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 

<%-- 전달받은 댓글 데이터 DB입력 후 화면이동 
입력 후 페이지전환 : 상세페이지(댓글 입력 결과 확인) --%>

<jsp:useBean id="comment" class="com.mystudy.bbs.vo.CommentVO" />
<jsp:setProperty property="*" name="comment" />

<%
System.out.println(comment);

//한글처리
request.setCharacterEncoding("UTF-8");

String cPage = (String)session.getAttribute("cPage"); 

comment.setIp(request.getRemoteAddr());

BbsDAO.insertComment(comment);
response.sendRedirect("view.jsp?bbsIdx="+comment.getBbsIdx()+"&cPage=" +cPage); 
%>