MultipartHttpServletRequest 에러



[문제]


파일 업로드시 다음과 같은 에러 


nested exception is java.lang.IllegalStateException: Current request is not of type [org.springframework.web.multipart.MultipartHttpServletRequest]



[해결책]

MULTIPART RESOLVERS 를 빼먹었다. 넣어주자 


<!-- MULTIPART RESOLVERS -->  

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

<property name="maxUploadSize" value="1000000000" />

</bean>




RedirectAttrebutes 에러



[문제]


Spring redirect POST parameter 를 사용중에 다음과 같은 에러가 발생하였다.


nested exception is java.lang.IllegalStateException: 

Argument [RedirectAttributes] is of type Model or Map but is not assignable from the actual model.

You may need to switch newer MVC infrastructure classes to use this argument.] with root cause



[해결책]

xml 파일에 다음 코드를 추가한다.

해당 코드로 인해 스프링 3.1부터는 Spring Web MVC 를 위해 설정해야 하는 값들이 자동으로 추가 된다.


<mvc:annotation-driven />






JSP 페이지 이동 url 경로 


( url-pattern .do )

 WEB.INF

    - VIEW

       - index.jsp

 - notice

 - noticeList.jsp 

 - noticeInsert.jsp


- index.jsp 에서 


<a href="notice/noticeList.do">NOTICE</a>  http://localhost:8082/mogaco/notice/noticeList.do

<a href="/notice/noticeList.do">NOTICE</a>   http://localhost:8082/notice/noticeList.do

<a href="../notice/noticeList.do">NOTICE</a>  http://localhost:8082/notice/noticeList.do


- noticeList.jsp 에서 


<a href="notice/noticeList.do">NOTICE1</a> http://localhost:8082/mogaco/info/notice/notice.do

<a href="/notice/noticeList.do">NOTICE2</a>  http://localhost:8082/notice/noticeList.do

<a href="../notice/noticeList.do">NOTICE3</a> http://localhost:8082/mogaco/notice/noticeList.do 


- noticeInsert.jsp


<a href="../notice/noticeInsert.do">공지사항 인서트1</a>

<a href="noticeInsert.do">공지사항 인서트2 </a>

<a href="/notice/noticeInsert.do">공지사항 인서트3</a> http://localhost:8082/notice/noticeInsert.do  

<a href="notice/noticeInsert.do">공지사항 인서트4 </a> http://localhost:8082/mogaco/notice/notice/noticeInsert.do


※  아무것도 없으면 프로젝트부터 현재까지 내려옴 

※   / : 현재위치 부터,    ../ : 현재한칸위로 


<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 

${pageContext.request.contextPath}

절대경로 활용 


당최 서블릿 페이지 이동 에 대한 정리를 찾기 힘들어 

내가 직접 테스트 해보고 정리했다. ㅎㅎ 그래서 정확성은 보장 못함.



포워딩 방식 (return "viewname"; )


※ 주소는 viewResolver에서 /WEB-INF/view/ + " ~~~ " + .jsp  이런식으로 만들어짐.

※ 앞에 / 가 붙든 안붙든 상관없이 view/ 다음으로 간다 

※ view 밑으로 폴더 명부터 다 써주기 

※ jsp붙으니 .do아니다. 


return "notice/noticeList";  , return "/notice/noticeList";

컨테이너가 찾는 주소      /mogaco/WEB-INF/view/notice/noticeList.jsp

브라우저에 표시되는 주소 http://localhost:8082/mogaco/notice/noticeList.do


- URL 주소 유지, 즉 브라우저 모르게 컨테이너 내부에서 이동

request/response 객체 유지 

- 같은 웹 서버 내에 있는 파일들로만 이동 가능 

- 클라이언트 정보를 갖고 이동 

- 클라이언트와의 통신없이 서버에서만 처리되므로 효율이 더 좋다고함



리다이렉트 방식 ( return "redirect:/"; )


※ 주소는 컨트롤러에 재 요청하는 주소다.

※ / 가 안붙으면 안된다. 

※ 컨트롤러로 재요청하므로 url pattern 지켜줘야함 ".do"


return "redirect:/notice/noticeList.do";  

브라우저 주소  http://localhost:8082/mogaco/notice/noticeList.do  

return "redirect:/";   
브라우저 주소http://localhost:8082/mogaco/ 



- URL 주소 바뀜, 컨테이너로 재 요청(단순한 이동)

- request/response 객체 소멸 

- 같은 서버, 다른 서버 에 있는 페이지로 이동 가능 

- 잘못된 예시 


1. R 대문자 쓰면 안된다. 되돌아오면서 오류 
"Redirect:/";      

"Redirect:/notice/noticeList.do";  (http://localhost:8082/mogaco/notice/notice/noticeInsert.do ) 

2. /안붙였을때 > 폴더명 3번 붙여 찾는다. 왜지. 
"redirect:notice/noticeList.do"; ( /mogaco/WEB-INF/view/notice/notice/notice/noticeList.jsp )



ModelAndView
ModelAndView는 포워드냐 리다이렉트냐 가 아니라 
ModelAndView를 이용하여 포워드로도 리다이렉트로도 보낼 수 있는거다. 

포워드 
ModelAndView mv = new ModelAndView();
vm.setViewName("/notice/noticeList");
vm.addAttribute("message", msgService.getMessage());
return vm;
or 
req.setAttrebute("message", msgService.getMessage());
return new ModelAndView("/notice/noticeList");

리다이렉트
ModelAndView mv = new ModelAndView();
vm.setViewName("redirect:/notice/noticeList.do?noticeNumber=2");
return vm;
or
ModelAndView mv = new ModelAndView();
vm.setView(new RedirectView("/notice/noticeList.do?noticeNumber=2",true));
return vm;
 

테스트 하고 정리하느라 시간이 다 갔다. 
뭘 쓸지 여부는 response, request 유지 여부에 따라 나뉠까.? 
* 브라우저 표시되는 주소는 get,post 와 연결지어 봐서 정리해 줘야겠다.
왜냐!! 
그런데 여기서 브라우저 표시되는 주소가 현재 주소가 되니
링크가 꼬인다. 꼬리에 꼬리를 물고 모르는게 생긴다 ㅎㅎ

+redirect로 새로 요청해주어야 재 요청시 꼬이지 않는다.

그럼 리다이렉트를 쓰고, 파티쉐님께 배운 주소 지우는것도 적용해보자 

0. 하드웨어의 소프트웨어 화 

 ex) JVM


1. 객체지향 언어의 특징

   - 재사용성(클래스화) 

   - 유지보수(코드간의 관계) 

   - 신뢰성(제어자, 메서드, 중복제거) 


2. 클래스, 객체 

   - 객체 : 멤버들의 집합, 변수들의 집합, 인스턴스 변수의 집합 

   - 클래스 : 연관된 데이터와 함수들의 모임, 구조체+함수, 사용자 정의 타입

                 (변수 > 배열 > 구조체 > 클래스) 


3. 변수, 메서드 

   -  변수 (선언위치에 따른) 

       - 멤버변수(클래스영역)   

            - 클래스 변수(static변수, 공유변수, 안변하는 속성) 

                : ※같은클래스의 모든 객체들이 같은 값을 공유하는 변수. 그래서 변경도 가능 하나 모든 객체의 값이 변경된다.

                : 클래스가 메모리에 로딩시 생성

                : 언제든 사용 가능(클래스명.클래스변수명)  

            - 인스턴스 변수

                : 인스턴스마다 다른 값 저장 

                : 객체 생성시 생성

                : 객체 생성후 사용 가능(참조변수명.인스턴스변수명)

       - 지역변수(메서드영역)  


   - 메서드 

       - 명령문의 집합. 값을 입력받아 처리하고 결과를 반환함 (둘다 없을수도 있음) 

       - 주요 작업 단위로 작성하여 코드 관리가 용이 

       - 리턴타입 메서드이름 (매개변수){ } 로 정의  

 - 리턴문은 변수 처리를 하여 호출 횟수를 줄이는게 좋다. 


4. JVM의 메모리 구조 - 호출스택(동전통) 

   - 맨 위에 메서드가 현재 실행중인 메서드다.

   - 예외처리 시 잘 알아둬야함!!


5. 매개변수

   기본형(primitive)  매개변수 - 읽기만 

   참조형(reference) 매개변수 - 읽고 변경 가능 



 

기본형 매개변수 예제


(자바의 정석 남궁성님 객체지향 강의중 캡쳐)


6. 재귀호출 

   매서드 내에서 자기 자신을 반복적으로 호출하는 것

   반복문으로 바꿀 수 있으며 반복문 보다 성능이 나쁘나 이해하기 쉽고 간결한 코드를 작성할수 있다.

   팩토리얼, 제곱, 트리운행, 폴더목록 표시등에 사용 



+ 팩토리얼 알고리즘 이해하기


7. 클래스 매서드 인스턴스 매서드

  클래스 매서드는 인스턴스 메서드 사용 안하면 static붙여서 쓴다 . 인스턴스 변수나 인스턴스 메서드 사용 관련 없을때 

  

+ Recent posts