기록
JAVA sping BOOK 테이블 Create 본문
컨트롤러/create 메서드
public ModelAndView create() {
/* ModelAndView
* 1) Model : Controller가 반환할 데이터(String,int,List,Map,VO..)를 담당.
* 2) View : 화면을 담당(뷰(View:jsp)의 경로). jsp파일의 위치
*/
ModelAndView mav = new ModelAndView();
// WEB-INF\views\book\create.jsp 의 주소인데
// <beans:property name="prefix" value="/WEB-INF/views/" />
// <beans:property name="suffix" value=".jsp" />
// servlet-context에 저장된 경로를 제외하고 써줌
//forwarding
mav.setViewName("book/create");
return mav;
}
/create.jsp (+파일 이미지 미리보기)
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>책 등록하기</title>
<script type="text/javascript" src="/resources/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/resources/js/jquery-3.6.0.js"></script>
<script type="text/javascript">
$(function(){
//이미지 미리보기
$('#input_imgs').on('change',handleImgFileSelect); //이미지 파일을 선택하면 handleImgFileSelect 함수가 실행됨.
function handleImgFileSelect(e){ //e -> 이벤트
//파일 객체에 파일들
let files = e.target.files; //e.target => <input type="file" 태그>
let fileArr = Array.prototype.slice.call(files);
//fileArr에서 하나 꺼내면 f(파일객체1개)
fileArr.forEach(function(f){
if(!f.type.match("image.*")){
alert("이미지 확장자만 가능합니다.");
return;
}
//이미지를 읽을 객체
let reader = new FileReader();
//reader.readAsDataURL(f);의 이벤트
reader.onload = function(e){
let img_html = "<img src=\""+e.target.result+"\" style='width:30%'/>";
$(".imgs_wrap").append(img_html);
}
//이미지를 읽자
reader.readAsDataURL(f);
});
}
});
</script>
</head>
<body>
<h1>책 등록</h1>
<!-- 폼페이지 -->
<!--
요청URI : /crate?title=냠냠쿨쿨&category=동화&price=10000
요청파라미터 : title=냠냠쿨쿨&category=동화&price=10000
요청방식 : post
-->
<form action="/create" method="post" enctype="multipart/form-data">
<!-- 폼데이터 -->
<div class="imgs_wrap" style="width:30%"></div>
<p>제목 : <input type="text" name="title" required/></p>
<p>카테고리 : <input type="text" name="category" required/></p>
<p>가격 : <input type="number" name="price" required/></p>
<p>내용 : <textarea name="cont" rows="5" cols="30"></textarea>
<p>
책표지 : <input type="file" name="uploadfile" id="input_imgs" multiple>
</p>
<p>
<input type="submit" value="저장" />
<input type="button" value="목록" />
</p>
</form>
<script type="text/javascript">
CKEDITOR.replace('cont');
</script>
</body>
</html>
저장-->> 클릭
컨트롤러 create(post) 메서드
@RequestMapping(value="/create", method=RequestMethod.POST)
public ModelAndView createPost(BookVO bookVO,ModelAndView mav) {
//<selectKey resultType="int" order="BEFORE" keyProperty="bookId">
// 1 증가된 기본키 값을 받음
int bookId = bookService.createPost(bookVO);
log.info("bookVO:"+bookVO.toString());
if(bookId < 1) { // 등록 실패
// /create 로 요청을 다시 함 => uri 주소가 바뀜
mav.setViewName("redirect:/create");
}else { // 등록 성공 : 상세 페이지로 이동
mav.setViewName("redirect:/detail?bookId=" + bookId);
}
return mav;
}
서비스 create(post)메서드 - 여기서 등록 + 파일이미지등록 두 메소드가 실행됨
//도서테이블(book)에 입력
//<insert id="createPost" parameterType="bookVO">
@Override
public int createPost(BookVO bookVO) {
//1)BOOK 테이블에 insert. bookId를 리턴받음
// bookVO의 bookId 의 멤버변수에 새로운 값이 들어있다.
int result = bookDao.createPost(bookVO);
bookVO.setContent(bookVO.getCont());
String uploadFolder = "C:\\eclipse_202006\\workspace\\springProj\\src\\main\\webapp\\resources\\upload";
//make Folder 시작
File uploadPath = new File(uploadFolder,LprodController.getFolder());
log.info("upload Path : "+uploadPath);
//만약 년 월 일 폴더가 없다면 생성
if(uploadPath.exists()==false) {
uploadPath.mkdir();
}
//make Folder 끝
//bookVO : AttachVO = 1 : N
// List<AttachVO> attachVOList; 에 데이터 넣기 시작
List<AttachVO> voList = new ArrayList<AttachVO>();
MultipartFile[] mulripartFiles = bookVO.getUploadfile();
//multipartFile : 파일객체1개
for(MultipartFile mulripartFile : mulripartFiles) {
AttachVO vo = new AttachVO();
//실제 파일명
String uploadFileName = mulripartFile.getOriginalFilename();
log.info("--------------------");
log.info("filename : "+mulripartFile.getOriginalFilename());
log.info("filesize : "+mulripartFile.getSize());
log.info("contentType : "+mulripartFile.getContentType());
//UUID처리 시작 (파일이름)
UUID uuid = UUID.randomUUID();
uploadFileName = uuid.toString() + "_" + uploadFileName;
//UUID처리 끝
//File객체 설계(복사할 경로, 파일명)
File savaFile = new File(uploadPath,uploadFileName);
try {
//파일 복사, 파일 객체를 복사한다(대상경로 및 파일명으로)
mulripartFile.transferTo(savaFile);
//이미지인가?
if(LprodController.checkImageType(savaFile)) {
FileOutputStream thumbnail = new FileOutputStream(
new File(uploadPath, "s_"+uploadFileName)
);
//썸네일 생성
Thumbnailator.createThumbnail(mulripartFile.getInputStream(),thumbnail,100,100);
thumbnail.close();
}
}catch(IllegalStateException e) {
log.error(e.getMessage());
}catch(IOException e) {
log.error(e.getMessage());
}
//2023/01/30/asdfa_개똥이.jpg
String filename= "/" + LprodController.getFolder().replace("\\","/")+"/"+uploadFileName;
vo.setFilename(filename);
Long l = mulripartFile.getSize();
vo.setFilesize(l.intValue());
//2023/01/30/s_asdfa_개똥이.jpg
String thumbFileName = "/" + LprodController.getFolder().replace("\\","/")+"/"+"s_"+uploadFileName;
vo.setThumbnail(thumbFileName);
//전사적 아이디
vo.setEtpId(bookVO.getBookId()+"");
voList.add(vo);
}
//ATTACH 테이블에 INSERT 하기위한 최종목적
bookVO.setAttachVOList(voList);
// List<AttachVO> attachVOList; 에 데이터 넣기 끝
//2)bookDAO의 createPostAttach(List<AttachVO> attachVOList)메소드 호출
this.bookDao.createPostAttach(bookVO.getAttachVOList());
return result;
}
DAO
public int createPost(BookVO bookVO) {
//.insert("namesapce값.id값",파라미터)
//book_SQL.xml 파일의 namespace가 book이고, id가 insert인
//태그를 찾아 그 안에 들어있는 sql을 실행함
//this : BookDao, 생략 가능
//insert, update, delete는 반영된 건수가 return함
//insert성공 : 1이상, 실패면 0
log.info("bookVO : "+bookVO.toString());
int result = this.sqlSessionTemplate.insert("book.createPost",bookVO);
int bookId = 0;
if(result>0) { //insert성공
bookId = bookVO.getBookId(); // 맨처음 ->1
}else { //insert실패
bookId = 0;
}
return bookId;
}
public int createPostAttach(List<AttachVO> attachVOList){
return this.sqlSessionTemplate.update("book.createPostAttach",attachVOList);
}
BOOK MAPPER
<resultMap type="bookVO" id="bookMap">
<result property="bookId" column="BOOK_ID"/>
<result property="title" column="TITLE"/>
<result property="category" column="CATEGORY"/>
<result property="price" column="PRICE"/>
<result property="insertDate" column="INSERT_DATE"/>
<result property="content" column="CONTENT"/>
<collection property="attachVOList" resultMap="attachMap"></collection>
</resultMap>
<resultMap type="attachVO" id="attachMap">
<result property="etpId" column="ETP_ID" />
<result property="seq" column="SEQ" />
<result property="filename" column="FILENAME" />
<result property="filesize" column="FILESIZE" />
<result property="thumbnail" column="THUMBNAIL" />
<result property="regdate" column="REGDATE" />
</resultMap>
<insert id="createPost" parameterType="bookVO">
<!-- key를 높이면 rok이 된다 ... -->
<selectKey resultType="int" order="BEFORE" keyProperty="bookId">
SELECT NVL(MAX(BOOK_ID),0)+1 FROM BOOK
</selectKey>
insert into book(BOOK_ID, TITLE, CATEGORY, PRICE, INSERT_DATE, CONTENT)
values ( #{bookId},#{title},#{category},#{price},sysdate,#{cont})
</insert>
<!-- 다중 insert시 update 태그를 사용
드루와 : List<AttachVO> attachVOList
가자 : insert, update, delete의 경우 resultType은 생략
-->
<update id="createPostAttach" parameterType="java.util.List">
<!-- index : 반복 시 index값. 0부터 시작 -->
<selectKey resultType="int" order="BEFORE" keyProperty="seq">
SELECT NVL(MAX(SEQ),0)+1 FROM ATTACH
</selectKey>
<foreach collection="list" item="attachVO"
open="INSERT ALL" close="SELECT * FROM DUAL" separator=" "
index="idx" >
INTO ATTACH(SEQ, FILENAME, FILESIZE, THUMBNAIL, REGDATE, ETP_ID)
VALUES(#{idx}+#{seq},#{attachVO.filename},#{attachVO.filesize},#{attachVO.thumbnail},sysdate,#{attachVO.etpId})
</foreach>
</update>
</update>
'JAVA' 카테고리의 다른 글
다음 카카오 주소검색 추가 (0) | 2023.02.03 |
---|---|
JAVA sping BOOK 테이블 list 띄우기 (0) | 2023.01.31 |
JAVA Spring 파일 업로드 예제 +미리보기 (0) | 2023.01.30 |
JAVA Spring 파일업로드 설정 및 업로드하기 (0) | 2023.01.27 |
JAVA Spring tiles 설정 (0) | 2023.01.26 |
Comments