학원/Servlet
13. WriterBoardCon.java / Board.java(DTO) / BoardMapper.xml / BoardDAO.java(DAO)
주먀
2023. 5. 3. 14:41
기능구현 -> DB 구성부터 잡고 가기
1. views 안에 있는 file -> webapp 폴더로 옮기기 ( 에러시 -> 톰캣 우클릭 클린 -> 프로젝트 클린 )
2. request.getServletContext() -> webapp 기준이다라는 말
3. WriterBoardCon
package kr.smhrd.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import kr.smhrd.dao.BoardDAO;
import kr.smhrd.entity.Board;
public class WriterBoardCon implements Controller {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1) 데이터 수집
// post 방식 인코딩
request.setCharacterEncoding("UTF-8");
// 1. 모든 요청 정보가 들어있는 request 객체
// 2. 업로드 된 파일 (이미지)을 저장할 경로(DB에 이미지를 저장하지 않고 경로만 저장)
String path = request.getServletContext().getRealPath("file");
// 3. 파일의 max size (byte)
int maxSize = 10 * 1024 * 1024; // 10MB
// 4. 인코딩 방식
String encoding = "UTF-8";
// 5. 파일이름 중복 제거 -> 파일명 뒤에 숫자를 붙여주는 객체
DefaultFileRenamePolicy rename = new DefaultFileRenamePolicy();
// 파일 업로드 --> MultipartRequest 객체 필요 : 라이브러리 추가해줘야 함 -> cos.jar 라이브러리 (pom.xml에
// 넣기)
MultipartRequest multi = new MultipartRequest(request, path, maxSize, encoding, rename);
// 2. DB에 저장하기 위해서 게시글 정보 가져오기 -> title, writer, filename, content
String title = multi.getParameter("title");
String writer = multi.getParameter("writer");
String content = multi.getParameter("content");
// 우리가 파일의 이름을 가져올 떄 save
String filename = multi.getFilesystemName("filename");
System.out.println("title" + title);
System.out.println("writer" + writer);
System.out.println("filename" + filename);
System.out.println("content" + content);
// 데이터 갯수가 2개 이상이면 묶기
Board dto = new Board();
dto.setTitle(title);
dto.setWriter(writer);
dto.setFilename(filename);
dto.setContent(content);
// 2. 기능구현
// 게시글 작성 --> web_board 테이블에 게시글 데이터를 저장하겠다.
// 1) DTO/VO 한개
// 2) 테이블 별 DAO /Mapper
BoardDAO dao = new BoardDAO();
dao.write(dto);
// 3. View 선택
// 게시글 목록을 보여주기
// C --> C : redirect
return "redirect:/goBoardMain.do";
}
}
4. Board.java(DTO)
4-1. kr.smhrd.entity -> Board -> 클래스 만들기 ( 인터페이스X )
package kr.smhrd.entity;
public class Board {
// 1. Table 컬럼명 == 필드 변수 명
private int num;
private String title;
private String writer;
private String filename;
private String content;
// java.util.Date
private String b_date;
// 3. 기본생성자
public Board() {
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getB_date() {
return b_date;
}
public void setB_date(String b_date) {
this.b_date = b_date;
}
// 2. Getter / Setter
}
5. BoardMapper.xml -> sql문 작성 ( 사용자가 입력한 값은 # { }로 감싸주기 )
5-1. kr.smhrd.dao -> Other -> XML 만들기
5-2. 방금 만든 xml 파일 이름 변경하기 -> BoardDAO
5-3. mybatis -> 한줄추가해서 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="kr.smhrd.dao.BoardDAO">
<!-- 게시글 저장 -->
<insert id="write" parameterType="kr.smhrd.entity.Board">
insert into web_board
values(
num_board.nextval,
#{title},
#{writer},
#{filename},
#{content},
sysdate
)
</insert>
<!-- 전체 게시물 조회 -->
<select id="list" resultType="kr.smhrd.entity.Board">
select * from web_board
order by
b_date desc
</select>
<!-- 하나의 게시물 조회 -->
<select id="view" resultType="kr.smhrd.entity.Board">
select * from web_board
where num =
#{num}
</select>
</mapper>
6. BoardDAO.java
6-1. kr.smhrd.dao -> BoardDAO -> 클래스 만들기
package kr.smhrd.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import kr.smhrd.entity.Board;
import kr.smhrd.entity.Member;
public class BoardDAO {
// 1. DB와 연견들 가져오기
private SqlSessionFactory factory = SqlSessionManager.getSqlSessionFactory();
// 2. 기능 구현
public int write(Board dto) {
SqlSession session = factory.openSession(true);
int row = session.insert("write", dto);
session.close();
return row;
}
public List<Board> list() {
SqlSession session = factory.openSession(true);
List<Board> list = session.selectList("list");
session.close();
return list;
}
public Board view(int num) {
SqlSession session = factory.openSession(true);
Board dto = session.selectOne("view", num);
session.close();
return dto;
}
}