@Controller public class HelloController { //client가 hello.do라고 요청을 하면 hello()가 실행 된다. @RequestMapping("/hello.do") public String hello(){ System.out.println("HelloController.hello()"); return "response"; }
@RequestMapping("/greeting.do") public ModelAndView greeting(String name){ String greeting = name+"님 환영합니다."; System.out.println("greeting() : "+greeting); return new ModelAndView("response","greeting",greeting); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> response.jsp입니다<br> ${requestScope.greeting } </body> </html>
2. @RequestMapping - 요청 URL 등록, 처리할 요청방식 지정 - 구문 - RequestMapping("오청 url") - RequestMapping(value="요청URL" method=요청방식) - Controller 클래스에 등록 - Controller 메소드에 등록
3. Controller 클래스 스프링 설정파일에 등록 - <bean>을 이용해 등록 - 자동 스캔 - <context:component-scan base-package="package"/>
4. Controller 메소드에서 요청파라미터 처리 - DTO(Command) 이용 - 요청파라미터와 매칭되는 이름의 property를 가진 DTO - 요청파라미터 name을 이용한 매개 변수 사용 - 같은 이름으로 여러 개 값이 넘어올 경우 String[] 사용 - @RequestParam Annotation 사용 - 속성 - value : 요청파라미터 이름 설정 - required : 핑수 여부. 안넘어오면 400 오류 발생. 기본 : true - defaultValue : 값이 안넘어 올 경우 설정할 기본 값
5. Controller 메소드 이용가능 매개변수 타입 - HttpServletRequest - HttpServletResponse - HttpSession - 요청파라미터 연결 변수 - 요청파라미터를 설정할 DTO 객체 - @CookieValue 적용 매개변수 - 쿠키 값 매핑 - @CookieValue(value="name", required=false) - Map, Model, ModelMap - View에 전달할 모델 데이터 설정시 사용
6. Controller 메소드 설정 가능 return type - Controller 메소드 설정 가능 return type - ModelAndView : View 정보와 응답 데이터 설정 - View에 전달할 값 설정 - Map - Model - View는 요청 URL로 결정됨 - String : View의 이름 리턴 - View 객체 - void - Controller 메소드 내에서 응답을 직접처리 시 사용
public class CustomerController extends MultiActionController{ //id로 고객 조회 일반적으로 ModelAndView를 사용(void, MAP, ModelAndView) public ModelAndView getCustomerById(HttpServletRequest request, HttpServletResponse response)throws Exception{
//1. 요청 파라미터 조회 String id = request.getParameter("id"); //2. Business 로직 처리 - Model 호출(Business Service) CustomerDTO cto = new CustomerDTO(id, "홍길동", 20, new AddressDTO("111-222", "서울시 송파구 가락동")); return new ModelAndView("customer_info","cto",cto); }
public ModelAndView registerCustomer(HttpServletRequest request, HttpServletResponse response, CustomerDTO cto)throws Exception{ //1, 요청파라미터 조회 System.out.println("등록 정보 : "+cto); //비지니스 로직 return new ModelAndView("customer_info","cto",cto); } public ModelAndView login(HttpServletRequest request, HttpServletResponse response, HttpSession session)throws Exception{ //로그인 처리 //로그인 성공 session.setAttribute("login_info", new CustomerDTO("aaa", "홍길동", 20, new AddressDTO("111-222", "서울시 송파구 가락동"))); return new ModelAndView("login_success"); } }
package spring.mvc.dto;
public class AddressDTO {
private String zipcode; private String address; public AddressDTO() { super(); // TODO Auto-generated constructor stub } public AddressDTO(String zipcode, String address) { super(); this.zipcode = zipcode; this.address = address; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "AddressDTO [zipcode=" + zipcode + ", address=" + address + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((address == null) ? 0 : address.hashCode()); result = prime * result + ((zipcode == null) ? 0 : zipcode.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; AddressDTO other = (AddressDTO) obj; if (address == null) { if (other.address != null) return false; } else if (!address.equals(other.address)) return false; if (zipcode == null) { if (other.zipcode != null) return false; } else if (!zipcode.equals(other.zipcode)) return false; return true; }
}
package spring.mvc.dto;
public class CustomerDTO { private String id; private String name; private int age; private AddressDTO addressDTO; public CustomerDTO() { super(); // TODO Auto-generated constructor stub } public CustomerDTO(String id, String name, int age, AddressDTO addressDTO) { super(); this.id = id; this.name = name; this.age = age; this.addressDTO = addressDTO; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public AddressDTO getAddressDTO() { return addressDTO; } public void setAddressDTO(AddressDTO addressDTO) { this.addressDTO = addressDTO; } @Override public String toString() { return "CustomerDTO [id=" + id + ", name=" + name + ", age=" + age + ", addressDTO=" + addressDTO + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((addressDTO == null) ? 0 : addressDTO.hashCode()); result = prime * result + age; result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CustomerDTO other = (CustomerDTO) obj; if (addressDTO == null) { if (other.addressDTO != null) return false; } else if (!addressDTO.equals(other.addressDTO)) return false; if (age != other.age) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 조회정보<br> ID : ${requestScope.cto.id }<br> 이름 : ${requestScope.cto.name }<br> 나이 : ${requestScope.cto.age }<br> 우편번호 : ${requestScope.cto.addressDTO.zipcode }<br> 주소 : ${requestScope.cto.addressDTO.address } </body> </html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 로그인 성공<br> ${sessionScope.login_info } </body> </html>
1. Controller가 넘긴 view이름을 통해 알맞은 view를 찾는 역할 ① Controller는 ModelAndView 객체에 응답할 view 이름을 넣어 return ② DispatcherServlet은 viewResolver에게 응답할 view를 요청한다. ③ ViewResolver는 view 이름을 이용해 알 맞는 view 객체를 찾아 DispatcherServlet에게 전달.
2. ViewResolver - Spring 설정 파일에 등록한다.
3. ViewResolver
- InternalResourceViewResolver - JSP나 HTML등의 내부 자원을 이용해 뷰 생성 - InternalResourceView를 기본 뷰로 사용
- BeanNameViewResolver - 뷰의 이름과 동일한 이름을 가지는 빈을 View로 사용 - 사용자 정의 View 객체를 사용하는 경우 주로 사용
- XmlViewResolver - BeanNameViewResolver와 동일 하나 뷰객체를 Xml파일에 설정해 놓는 것이 차이. - Bean 등록시 location 프라퍼티에 xml 파일을 지정
1. Controller 종류 - Controller (interface) - AbstractController - MultiActionController
2. 위의 interface/class를 상속하여 Controller 작성한다.
* AbstractController
1. 가장 기본이 되는 Controller 2. 작성 - AbstractController 상속한다. - public ModelAndView handleRequestInternal(HttpServletReqiest request, HttpServletResponse response) throws Exception 오버라이딩 하여 코드 구현 - ModelAndView에 view가 사용할 객체와 view에 대한 id값을 넣어 생성 후 return
* MultiActionController
1. 하나의 Controller에서 여러 개의 요청 처리 지원 - 연관 된 request를 하나의 controller로 묶을 경우 사용,
2. 작성 - MultiActionController 상속 - client의 요청을 처리할 메소드 구현 public[ModelAndView|Map|void] 메소드이름( HttpServletRequest req, HttpServletResponse res[HttpSession|Command])[throws Exception]{}
- return type : ModelAndView, Map, void 중 하나 - argument : 1번 - HttpServletRequest 2번 - HttpServletResponse 3번 - 선택적이며 HttpSession 또는 Command or 3번 HttpSession 4번 - Command
3. MethodNameResolver 등록 - 역할 : 어떤 메소드가 클라이언트의 요청을 처리할 것인지 결정 - Spring 설정파일에 <bean>으로 등록 - controller에서는 property로 주입 받는다. - 종류 - parameterMethodNameResolver : parameter로 메소드 이름 전송 - InternalPathMethodNameResolver : url 마지막 경로 메소드 이름으로 사용 - PropertiesMethodNameResolver : URL과 메소드 이름 mapping을 property로 설정
1. Client요청을 처리할 Controller를 연결을 설정 2. 다양한 HandlerMapping클래스를 Springframework가 제공 하며 Spring 설정파일에 <bean> 으로 등록하여 설정한다. 3. BeanNameUrlHandlerMapping - bean의 이름과 url을 mapping 4. SimpleUrlHandlerMapping - url pattern들을 properties로 등록해 처리 5. DefaultAnnotationHandlerMapping - Annotation기반 Controller 처리
1. DispatcherServlet 설정 - web.xml에 등록 - 스프링 설정파일 : "<servlet-name>-servlet.xml" 이고 WEB-INF\아래 추가한다. - <url-pattern>은 DispatcherServlet이 처리하는 URL 매핑 패턴을 정의
2. Spring Container는 설정파일의 내용을 읽어 ApplicationContext 객체를 생성한다. 3. 설정 파일명 : dispatcher-servlet.xml - MVC 구성 요소(HandlerMapping, Controller, ViewResolver, View)설정과 bean, aop설정들을 한다. 4. Spring 설정파일 등록하기 - <servlet>의 하위태그인 <init-param>에 contextConfigLocation 이름으로 등록 - 경로는 Application Root부터 절대경로로 표시 - 여러 개의 경우, 또는 공백으로 구분
① DispatcherServlet이 요청을 수신 - 단일 Front Controller serlvet - 요청을 수신하여 처리를 다른 컴포넌트에 위임 - 어느 컨트롤러에 요청을 전송할지 결정 ② DispatcherServlet은 HandlerMapping에 어느 컨트롤러를 사용할 것인지 문의 ③ DispatcherServlet은 요청을 컨트롤러에게 전송하고 컨트롤러는 요청을 처리한 후 결과 리턴 - 비지니스 로직 수행 후 결과 정보(Model)가 생성되어 JSP아 같은 뷰에서 사용됨 ④ ModelAndView를 생성하여 DispatcherServlet에 리턴 ⑤ ModelAndView 정보를 바탕으로 ViewResolver 에게 View를 요청 ⑥ View는 결과 정보를 사용하여 화면을 표현함
3. Spring MVC 구현 Step
- Spring MVC를 이용한 어플리케이션 작성 스텝 ① web.xml에 DispacherServlet 등록 및 Spring설정 파일 등록 ② Spring 설정파일에 HandlerMapping 설정 ③ 컨트롤러 구현 및 Spring 설정파일에 등록 ④ 컨트롤러와 JSP의 연결 위해 View Resolver Spring설정 파일에 등록 ⑤ JSP(or View작성 후 설정) 코드 작성