MVC 기초
web.xml
스프링 MVC 구조
설정 파일에서 어노테이션 컨트롤러를 찾아감
톰캣을 설정하고 HomeController를 실행하면 home.jsp의 내용을 출력한다.
매핑 값이 /일 때 홈 컨트롤러에서 home을 리턴한다고 되어 있으며, 여기에 jsp를 자동으로 붙여서 페이지를 찾아감
이렇게 실행하면 home.jsp 페이지가 출력됨
컨트롤러
home.jsp 한글처리(web.xml에 필터 추가해서 한글 처리 가능)
페이지 지시자에서 페이지 인코딩으로 한글처리 해도 됨
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
web.xml에 위의 필터를 넣어줘도 한글 처리가 됨
- 한글 처리 안했을 때
- 한글 처리 이후
- 컨트롤러
데이터를 home으로 넘겨줌
- 뷰
홈에서는 넘겨받은 데이터를 불러와서 시간 출력
컨트롤러 클래스 제작
요청 처리 메서드 제작
여기서는 반환 값이 home이 되고, suffix가 .jsp가 됨.
prefix는 앞에 경로
그래서 다른건 설정 파일에 세팅해 두고, 알맹이인 home같은 이름만 컨트롤러에서 세팅해서 페이지 열도록 함
/board/view 경로를 받으면 board(폴더)/view(파일이름)을 리턴하고, 이 값이 설정파일을 찾아가 앞, 뒤 내용을 설정한 것을 붙여서 board폴더 안에 있는 view.jsp 페이지를 찾아가는 것
위의 예제처럼 설정하고 실행한 다음
경로를 위와 같이 주면 view.jsp에서 설정한 내용이 출력됨
뷰에 데이터 전달
뷰에 데이터를 전달할 때는 모델을 사용
메서드의 매개변수로 모델 타입의 모델 객체를 생성하고, 여기에 addAttribute를 사용해서 정보를 담은 다음 원하는 페이지 이름을 리턴
해당 페이지에서 참조값을 받아오면 설정한 데이터가 출력됨
예제 1 - 모델 객체 사용
컨트롤러에 위와 같이 설정
모델 객체에 id 참조값에 30이라는 값을 설정
요청된 페이지인 title.jsp에서는 참조값 아이디를 가져와서 출력함
경로를 맞춰주면 컨트롤러에서 설정한 데이터 값을 모델 객체에서 담아 넘긴 후 jsp페이지에서 받아 출력하는 것을 확인할 수 있음
예제 2 - 모델 앤 뷰 사용
컨트롤러 파일에 위와 같이 설정
jsp 파일에서는 위의 예제처럼 세팅한 후 실행하면
이렇게 model 객체를 사용했을 때와 동일한 결과가 출력되는 것을 확인할 수 있음
예제 3 - 패키지에 별도의 자바 파일 만들어서 컨트롤러 사용
컨트롤러 클래스 파일 생성
servlet-context.xml에 있는 위의 부분이 컨트롤러가 실행됐을 때 오토 스캔하여 파일을 찾는 부분이기 때문에 컨트롤러를 만들 때는 어노테이션으로 컨트롤러 붙여줘야 함
생성한 shopping2.jsp파일을 찾아서 설정한 내용을 출력하게 됨
클래스에 @RequestMapping 적용
이때까지는 메서드에 사용했지만 클래스에도 사용할 수 있음
클래스에서 폴더를 설정하고, 메서드에서는 파일 이름만 설정하여 트리구조로 설정할 수 있음
경로는 합쳐짐
예제
이렇게 클래스와 메서드에 각각 리퀘스트매핑 어노테이션을 주고, 메서드에서 모델 객체에 값을 담는다. 그리고 리턴은 클래스의 매핑 어노테이션과 메서드의 매핑 어노테이션을 합한 board/write로 설정한다.
경로를 주고 실행하면 위와 같이 제대로 값이 출력되는 것을 확인할 수 있다.
문제
스프링 설정 파일인 서블릿컨텍스트에서 기존 리소시스 매핑 외에 새로운 경로를 하나 설정하면 저기서도 데이터를 가져갈 수 있음
그리고 jsp파일에서 이미지 경로는 위와 같이 설정
원래는 프로젝트 이름으로 찾아가야 하는데 안먹어서 ../으로 경로를 설정해야 되더라
문제
문제
------
문제
매핑 이름은 actor로 두고, 리턴하는 경로에 폴더와 파일 이름을 넣어주면 저렇게 검색 가능
HttpServletRequest 클래스 (url 파라미터 큰따옴표 제거)
파라미터 값은 url에서 가져오는 것(쿼리스트링에 값 적어주면 그걸 가져온다)
@RequestParam 어노테이션(파라미터 큰따옴표 제거)
쿼리스트링의 id와 pw를 받아 변수로 만들고 이들을 모델 객체에 다른 속성 값으로 집어 넣은 다음 뷰에서 출력
쿼리스트링을 붙이지 않으면 400에러가 발생하는데 @RequestParam은 값이 없으면 오류가 발생함.
HttpServletRequest과의 차이점이 여기에 있음(오류는 발생하지 않고 값이 없는 상태로 출력됨)
데이터(커맨드) 객체
기존의 각각 값을 받는 방식 대신에 매개변수에 Member 객체를 바로 적으면 자동으로 값이 들어오게 된다.
아래에 세터/게터 생략
예제 - 기존 방식
- 컨트롤러
- jsp
예제 - 개선 방식
위의 url과 동일하게 입력하면 동일한 결과가 출력됨
@PathVariable
쿼리 스트링에 있는 변수를 바로 받는 어노테이션
리퀘스트 매핑의 {}에 있는 참조값을 바로 @PathVariable로 설정한 변수로 받은 다음 모델 객체에 설정하고, 뷰에서 출력
@RequestMapping 파라미터
@RequestMapping에서 get 방식과 post 방식
뷰에서 메서드를 get 방식으로 설정하고, 컨트롤러에서 get방식으로 받음
컨트롤러를 get방식으로 설정했는데 뷰에서 post로 메서드를 보내면 찾지 못해서 에러
폼에서는 jsp와 다르게 action에서 student.jsp와 같이 작성하는 것이 아니라 그냥 파일의 이름만 적어준다. student와 같이
아래에서 페이지가 이동하는 경로를 보면 c - v - c - v의 경로를 거쳐서 이동하는 것을 확인할 수 있다.
(컨트롤러 - 인덱스 - 컨트롤러 - 스튜던트아이디)
- 컨트롤러
메서드는 get 방식으로 받고, 액션 값은 폼에서 넘어오는 값인 /student로 받는다고 매핑 설정
- 인덱스
- 뷰
폼에 100을 입력하면 위의 경로들을 거쳐서 뷰에 값이 출력됨
폼에서 넘기는 방식과 컨트롤러에서 받는 방식은 동일하게 설정해 줘야 한다.
이렇게 설정하면 뷰에서 get이나 post 중 어떤 방식으로 넘기더라도 모두 받을 수 있도록 컨트롤러를 설정할 수 있다.
@ModelAttribute
변수에 해당하는 studentInformation이 길기 때문에 이를 짧게 줄이기 위해서 이름을 다시 설정해 주는 기능을 한다.
리다이렉트(redirect: 키워드)
넘어온 데이터와 비교해서 참 거짓을 판별한 후 다른 페이지로 연결시킴
url경로와 쿼리스트링을 설정하면 그 결과에 따라서 어느 페이지로 갈지 분기처리된 대로 이동하게 됨
폼 데이터 값 검증
Validator를 이용한 검증
컨트롤러에 있는 Validator 객체를 사용해서 검증할 수 있음
-----
-----
ValidationUtils 클래스
위의 주석된 내용 대신 아래처럼 나타내면 더 간단하게 에러를 잡아낼 수 있음
@Valid와 @InitBinder
@valid 오류가 발생하면
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
위의 내용을 pom.xml에 넣으면 됨
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
이 내용도 넣어줘야 함
@Valid와 @InitBinder를사용해서 Validation 체크 - 결과는 다른 방식과 동일