카테고리 없음

0308 오후수업

logloglog 2021. 3. 8. 16:39

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;
	}
	

 

 

실제로 등록되는지

미리데이터 정해두고 그게 제대로되는지 확인 > 통합테스트 ( 전체로직한꺼번에 평가)

통합테스트하려면 단위테스트 결과가 백데이터로잇어야함

단위테스트에서 문제가없을떄 통합테스트하는거임

밑에 스크립트도 삭제

 

글이 등록된다

 


 

서머노트 컨트롤러

 

보드컨트롤러에 넣는게 부적절하기떄문에 컨트롤러패키지따로만들거임

 

이 컨트롤러안의 메서드들은 무조건 response body가 적용됨.= 뷰리졸버로 건네는 리다이렉트와 포워드를 못하게됨 대신 각 메서드마다 리스펀스바디안붙여도됨. 컨트롤러의 리턴타입이 스트링이 아니다는말

시나리오:

해당이미지를 폼데이터의 파일이라는 속성명으로 이미지파일로 넘김 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으로던지게해둿다
여기 딜리트에서
근데이걸 스트링지파이하니까 1depts의 제이슨이지만 파라미터로 받지못해서 젝슨데이터바인드를 불러야함
이녀석이 잭슨데이터바인더를 자동으로 후출함.. 잇는 스트링 그대로 ㅇ리퀘스트에잇는거꺼내온다는말임 근데 맵으로옴 > 어댑터가 잭슨에게넘김. 그럼 잭슨데이터바인더가 해석해서 키밸류키밸류 ㄴ맵에 알아서넣어줌

보낼떄 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()%>');
}

싱글쿼트안넣어서