spring 19강 Smart Editor(CKEditor, SummerNote)
WYSIWYG(위지윅 에디터, what you see is what you get)
- 사용자가 현재 화면에서 보고 있는 내용과 동일한 html code를 생성하는 에디터
- 네이버, 다음 에디터, CKEditor, SummerNote 등
CKEditor
- https://ckeditor.com/ckeditor-4/download/ (standard 버전 다운로드)
- 최신버전보다는 안정화된 버전인 4.11.2 버전으로 실습
- 이미지 업로드를 위해서는 별도의 작업 필요
다운로드 받은 ckeditor 파일의 압축을 풀고 ckeditor 디렉토리를 views에 붙임
view에 등록된 요소들은 모두 servlet으로 인식되므로 servlet-context에서 리소스 등록을 해야만 링크가된다.
servlet-context.xml
1 2 | <resources location="/WEB-INF/views/ckeditor/" mapping="/ckeditor/**"></resources> | cs |
1 | <script src="${path}/ckeditor/ckeditor.js"></script> | cs |
1 2 3 4 5 6 7 | <td>상품설명</td> <td><textarea rows="5" cols="60" name="description" id="description"></textarea> <script> //id가 description인 태그에 ckeditor를 적용시킴 CKEDITOR.replace("description"); //이미지 업로드 안됨 </script> |
1 2 3 4 5 6 7 8 9 10 | <td>상품설명</td> <td><textarea rows="5" cols="60" name="description" id="description"></textarea> <script> //id가 description인 태그에 ckeditor를 적용시킴 //CKEDITOR.replace("description"); //이미지 업로드 안됨 CKEDITOR.replace("description",{ filebrowserUploadUrl : "${path}/imageUpload.do" }); </script> |
upload. ImageUploadController.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 | package com.example.spring02.controller.upload; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.multipart.MultipartFile; @Controller public class ImageUploadController { private static final Logger logger= LoggerFactory.getLogger(ImageUploadController.class); @RequestMapping("imageUpload.do") public void imageUpload(HttpServletRequest request, HttpServletResponse response, MultipartFile upload) throws Exception { response.setCharacterEncoding("utf-8"); response.setContentType("text/html; charset=utf-8"); //업로드한 파일 이름 String fileName=upload.getOriginalFilename(); //파일을 바이트 배열로 변환 byte[] bytes=upload.getBytes(); //이미지를 업로드할 디렉토리(배포 디렉토리로 설정) String uploadPath= "D:\\work\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp1\\wtpwebapps\\spring02\\WEB-INF\\views\\images\\"; OutputStream out=new FileOutputStream( new File(uploadPath+fileName)); //서버로 업로드 out.write(bytes); //클라이언트에 결과 표시 String callback=request.getParameter("CKEditorFuncNum"); //서버=>클라이언트로 텍스트 전송(자바스크립트 실행) PrintWriter printWriter=response.getWriter(); String fileUrl= request.getContextPath()+"/images/"+fileName; printWriter.println( "<script>window.parent.CKEDITOR.tools.callFunction(" +callback+",'"+fileUrl+"','이미지가 업로드되었습니다.')" +"</script>"); printWriter.flush(); } } | cs |
이미지 업로드 에러 발생시 ckeditor/config.js 마지막에 코드 한줄 추가
config.filebrowserUploadMethod='form';
SummerNote
- http://summernote.org
- 이미지를 텍스트 형식으로 저장함
다운로드 받아 압축풀고 dist 디렉토리를 views에 붙인다. (summernote로 rename)
홈페이지의 getting tarted 페이지에 include js/css 참고
<!-- include libraries(jQuery, bootstrap) -->
<link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css" rel="stylesheet">
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.js"></script>
<!-- include summernote css/js -->
<link href="http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote.css" rel="stylesheet">
<script src="http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote.js"></script>
▼
product_write.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 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- views/shop/product_write.jsp --> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <%@ include file="../include/header.jsp" %> <!-- include libraries(jQuery, bootstrap) --> <link href="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css" rel="stylesheet"> <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.js"></script> <script src="http://netdna.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.js"></script> <!-- include summernote css/js --> <link href="http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote.css" rel="stylesheet"> <script src="http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote.js"></script> //주석처리 <!-- ckeditor 사용을 위해 js 파일 연결 --> //<script src="${path}/ckeditor/ckeditor.js"></script> </head> <body> <%@ include file="../include/admin_menu.jsp" %> <script> $(function(){ //id가 description인 태그에 summernote 적용 $("#description").summernote({ height : 300, width : 800 }); }); function product_write(){ // 태그를 name으로 조회할 경우 //var product_name=document.form1.product_name.value; // 태그를 id로 조회할 경우 var product_name=$("#product_name").val(); var price=$("#price").val(); var description=$("#description").val(); if(product_name==""){ //빈값이면 alert("상품이름을 입력하세요"); $("#product_name").focus(); //입력포커스 이동 return; //함수 종료, 폼 데이터를 제출하지 않음 } if(price==""){ alert("가격을 입력하세요"); $("#price").focus(); return; } /* if(description==""){ alert("상품 설명을 입력하세요"); $("#description").focus(); return; } */ //폼 데이터를 받을 주소 document.form1.action="${path}/shop/product/insert.do"; //폼 데이터를 서버에 전송 document.form1.submit(); } </script> <h2>상품 등록</h2> <form name="form1" method="post" enctype="multipart/form-data"> <table> <tr> <td>상품명</td> <td><input name="product_name" id="product_name"></td> </tr> <tr> <td>가격</td> <td><input name="price" id="price"></td> </tr> <tr> <td>상품설명</td> <td><textarea rows="5" cols="60" name="description" id="description"></textarea> <script> //summernote 쓰기위해 ckeditor 코드는 모두 주석처리 //id가 description인 태그에 ckeditor를 적용시킴 //CKEDITOR.replace("description"); //이미지 업로드 안됨 /* CKEDITOR.replace("description",{ filebrowserUploadUrl : "${path}/imageUpload.do" }); */ </script> </td> </tr> <tr> <td>상품이미지</td> <td> <input type="file" name="file1" id="file1"> </td> </tr> <tr> <td colspan="2" align="center"> <input type="button" value="등록" onclick="javascript:product_write()"> <input type="button" value="목록" onclick="location.href='${path}/shop/product/list.do'"> </td> </tr> </table> </form> </body> </html> | cs |
CKEditor : 이미지 파일은 디렉토리에 저장, 테이블에는 링크만 저장, 이미지 업로드 자바 코드를 따로 구현해줘야함.
Summernote : 이미지 업로드 코드를 구현해줄 필요가 없지만
이미지를 텍스트형식으로 테이블에 저장(DB가 무거워짐) //product 테이블
'Spring > study' 카테고리의 다른 글
spring 21강 게시판 만들기2( 페이지 나누기, 검색 기능 ) (0) | 2019.07.04 |
---|---|
spring 20강 게시판 만들기1(목록, 글쓰기) (0) | 2019.07.03 |
Spring Framework root-context.xml과 servlet-context.xml의 차이점 (0) | 2019.07.03 |
spring 17강 드래그앤드롭, ajax 방식의 파일업로드 (0) | 2019.07.01 |
REST API (이후에 다시 정리) (0) | 2019.07.01 |