Model 객체 (1)
web.xml
1)
값이 post 방식으로 전송될 때에는 자동 인코딩이 되지 않기 때문에
따로 인코딩을 할 수 있도록 신경써서 코드를 추가해주어야 한다.
이전에 서블릿을 공부하면서는 request 객체를 통하여 한글 인코딩을 설정해 주었지만,
스프링에서는 필터와 필터 매핑을 다음과 같은 내용을 추가해주는 것으로 해결한다.
2)
servlet-context.xml, root-context.xml은 자동으로 읽어올 수 없기 때문에
이 내용이 xml에 반드시 있어야만 애플리케이션 실행시 servlet-context와 root-context를 읽을 수 있다.
root-context에는 db연동 관련된 내용이 들어간다.
주로 setter DI, 어노테이션 방식으로 주입한다.
sevlet-context.xml
java 폴더 하위의 com.ch.hello 패키지를 기반으로 bean 객체를 설정하는 내용이다.
또, prefix의 value 값으로 지정된 /WEB-INF/views는 view 파일들이 저장되어 있는 디렉토리의
최상위 디렉토리 이고,
suffix의 value 값으로 지정된 .jsp 는 이 view 파일들의 확장자 이다.
index.jsp
url이라는 id값을 가진 select 객체의 값을 클릭할 때마다 onchange 이벤트 핸들러로 chk() 함수를 불러다.
이 chk() 함수는 url객체의 value 값을 받아오고,
location 객체의 요청값 url에 value 값을 받게 된다.
만약 브라우저에서 hello 를 선택하게 된다면 url에 hello라는 값을 담아 이동하게 된다.
이 값을 HomeController로 전달한다.
HomeController.java
사용자가 선택한 목록의 value 값은 HomeController로 전달되어
value 값에 따라 실행할 메소드를 requestMapping 어노테이션을 통해 찾아갈 수 있다.
스프링에서의 Model 객체란
[Spring] Model 객체
Controller의 메서드는 Model이라는 타입의 객체를 파라미터로 받을 수 있다.순수하게 JSP Servlet으로 웹 어플리케이션을 만들 때 보통 request나 session 내장객체에 정보를 담아 jsp에 넘겨주곤 했는데 Spr
velog.io
예시
request.setAttribute("time", new java.util.Date());
RequestDispatcher dispatcher = request.getRequestDispatcher("url");
dispatcher.forward(request, response);
// jsp에서 값을 공유할 때
public String home(Model model) {
model.addAttribute("time", new java.util.Date());
return "home";
}
// 스프링에서
home을 리턴받은 값은
WEB-INF 하위 폴더중 하나에 속한 home.jsp를 찾아간다.
model 객체에 저장한 name 값 serverTime을 EL로 화면에 출력하게 된다.
만약 index 페이지에서 배경색을 선택할 경우,
HomeController에서 value 값이 /color 인 요청을 받는다.
리턴값 또한 color이므로 web.xml의 환경설정에 따라
WEB-INF 하위 폴더의 .jsp확장자를 가진 color 파일을 찾아간다.
이 컬러값은 랜덤으로 실행된다.
index에서 구구단을 선택한 경우
index에서 회원가입을 선택한 경우
HomeController가 아닌 JoinController로 흘러들어간다.
사용자가 어느 파일이라고 지정하지 않아도
value 값인 joinForm을 어노테이션으로 찾아가게 된다.
그래서 joinForm값에 대한 내용이 없는 HomeController 대신 JoinController로 자동으로 흘러들어가게 되는 것이다.
컨트롤러의 리턴값에 의해 joinForm이라는 파일명을 가진 jsp 파일을 찾아간다.
이 파일은 회원가입 양식이다.
최상단에는 include 태그로 header.jsp를 불러오고 있다.
이 파일에는 공통으로 사용하는 내용이 들어있다.
여러가지 라이브러리 파일, 부트 스트랩 적용, 제이쿼리 라이브러리 등.
부트스트랩을 적용하고 있기 때문에 레이아웃을 편집할 때 class 속성을 사용한다.
각 항목에는 required로 유효성 검사를 하고 있고 name값을 부여했다.
이 값들을 DTO 객체에 저장하여 출력하기 때문에 DTO의 프로퍼티와 name값을 동일하게 설정했다.
action 값이 join으로 되어 있기 때문에 submit으로 값을 넘기면 join을 찾아가도록 되어 있다.
join에 대한 어노테이션은 JoinController 안에 들어 있으므로 자동으로 이 쪽을 찾아가게 된다.
/join 이라는 요청값이 들어오면 join 메소드를 실행하도록 되어 있는데,
DTO 객체에 저장된 값을 불러와 model 객체로 공유한다.
그것을 joinResult로 넘기게 된다.
joinResult 파일을 보면
model 객체로 공유된 값이 브라우저에 출력하는 내용이 작성되어 있다.
어노테이션 기반으로 처리를 하면 더 이상 객체를 따로 생성하고 그것을 공유 설정하고 넘기고 받고..
이런 작업을 길게 작성하지 않아도 된다.
그러나 name값, 프로퍼티 값이 같아야 자동으로 매핑이 설정된다.
추가로,
join 메소드에는 다음과 같은 @ModelAttribute 어노테이션이 생략되어 있다.