boardList.jsp 가져오기
main.jsp도 간단하게 만들자
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<body>
<h1>Board Main</h1>
</body>
이제 등록해야함
resgist랑 딸린 js 들 가젹오기
이제 익셉션 throw 가능
서블ㅇ렛에 io랑 어쩌구익셉션밖에업는데 핸들러에서 익셉션쓰루하면 서블렛에서 트라이캐치로 다 묶어야하는이이 생김
컨트롤러에서 throw도ㅣ는 익셉션들을 잡아채는 advice가 잇는데 이는 어댑터가 연계해줌
핸들러어댑터가 컨트롤러 인보크하는건데,
터지면 핸들러어댑터가 읻셉션 채서 컨트롤러어드바이스에게 줌
컨트롤러어드바이스엔 익셉션 종류별로 매핑됨
컨트롤러들에서는 이제 굳이트라이캐치안해도됨. success.jsp같은거안해도됨
@RequestMapping("/regist")
public String regist(BoardVO board, HttpServletRequest request, HttpServletResponse response) throws Exception{
String url = "board/regist_success";
try {
service.regist(board);
}catch (SQLException e) {
e.printStackTrace();
url="board/regist_fail";
throw e;
}
return url;
}
실제로 등록되는지
미리데이터 정해두고 그게 제대로되는지 확인 > 통합테스트 ( 전체로직한꺼번에 평가)
통합테스트하려면 단위테스트 결과가 백데이터로잇어야함
단위테스트에서 문제가없을떄 통합테스트하는거임
밑에 스크립트도 삭제
글이 등록된다
서머노트 컨트롤러
보드컨트롤러에 넣는게 부적절하기떄문에 컨트롤러패키지따로만들거임
시나리오:
해당이미지를 폼데이터의 파일이라는 속성명으로 이미지파일로 넘김 enc 멀티파트폼데이터로오는데 받으려면 멀티파ㄹ트리졸버 걸어야하고 커먼즈 파일업로드자르잇어야함
넘어노는게 이미지라는가정하에 멀티파트파일로 받아서 저장하고 파일명주기
서머노트는 파일명 받아서 이미지태그로 처리하기떄문에 파일명뿐만아니라 유알엘을 같이 줘야함
@Resource(name="imgPath")
private String imgPath; //application-context에 잇다
@RequestMapping("/uploadImg")
public ResponseEntity<String> uploadImg(MultipartFile file, HttpServletRequest request)throws Exception{
//받아서 저장한다음 url경로를 줘야함
ResponseEntity<String> result = null;
int fileSize = 5*1024*1024;//5mb제한
if(file.getSize()>fileSize) {
return new ResponseEntity<String>("용량초과입니다.",HttpStatus.BAD_REQUEST);
}
String savePath = imgPath.replace("/", File.separator);
String fileName = UUID.randomUUID().toString().replace("-", "");
String fileFormat = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
fileName = fileName +fileFormat;
File saveFile = new File(savePath, fileName);
return null;
}
저장하려는게아니고 이미지가 보이기만하면되니까 파일명은 UUID로
배드리퀘스트 : 400
파일저장해야됨
saveFile.mkdirs();//경로를미리만들어줌
file.transferTo(saveFile);
저장햇으니
유알엘줘야함
file.transferTo(saveFile);
result = new ResponseEntity<String>(request.getContextPath()+"/getImg.do?fileName="+fileName, HttpStatus.OK);
근데 저장하다터질수도잇음 >에러내보내자
try {
file.transferTo(saveFile);
file.transferTo(saveFile);
result = new ResponseEntity<String>(request.getContextPath()+"/getImg.do?fileName="+fileName, HttpStatus.OK);
}catch (IOException e) {
result = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
return result;
@RequestMapping("/getImg")
public ResponseEntity<byte[]> getImg(String fileName, HttpServletRequest request) throws Exception{
ResponseEntity<byte[]> entity=null;
String savePath = imgPath.replace("/", File.separator);
File sendFile = new File(savePath,fileName);
InputStream in = null;
try {
in = new FileInputStream(sendFile);
entity = new ResponseEntity<byte[]>(IOUtils.toByteArray(in),HttpStatus.CREATED);
}catch (IOException e) {
e.printStackTrace();
entity = new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
}finally {
in.close();
}
return entity;
}
보낼떄 json stringify 로 보내면 받을떄 @requestbody로 받아야함 이게 잭슨데이터호출해서 ..맵에서꺼낼거임 타입은 Map<STring STring>
json 안에 json 이 있었따? map<String , Map> 일것임. json 은 무조건 Map이 되니까
@RequestMapping("/deleteImg")
public ResponseEntity<String> deleteImg(@RequestBody Map<String,String> data) throws Exception{
ResponseEntity<String> result = null;
String savePath = imgPath.replace("/", File.separator);
File target = new File(savePath,data.get("fileName"));
if(!target.exists()) {
result = new ResponseEntity<String>(HttpStatus.BAD_REQUEST);
}else {
try {
target.delete();
result = new ResponseEntity<String>("SUCCESS",HttpStatus.OK);
}catch (Exception e) {
result = new ResponseEntity<String>("Fail",HttpStatus.INTERNAL_SERVER_ERROR);
}
}
return result;
}
수정
summernotecontroller
@RestController
@RequestMapping("/common/summernote/")
common.js
//file sending
for (var i = files.length - 1; i >= 0; i--) {
sendImg(files[i], this,contextPath+'/common/summernote/uploadImg.do');
}
},
onMediaDelete : function(target) {
//alert(target[0].src);
var answer=confirm("정말 이미지를 삭제하시겠습니다.");
if(answer){
deleteImg(target[0].src,contextPath+'/common/summernote/deleteImg.do');
}
resist.jsp
function summernote_start(content,contextPath){
window.onload=function(){
summernote_start($('#content'),<%=request.getContextPath()%>);
}
서머노트컨트롤러
result = new ResponseEntity<String>(request.getContextPath()+"/common/summernote/getImg.do?fileName="+fileName, HttpStatus.OK);
오류
indexpage.jsp
window.onload=function(){
goPage('<%=request.getContextPath()%>{menu.murl}','${menu.mcode}');
subMenu('${menu.mcode}'.substring(0,3)+"0000",'<%=request.getContextPath()%>');
}
싱글쿼트안넣어서