본문 바로가기

Spring/Servlet

스프링 애너테이션

개발자가 만드는 빈은 클래스에서, 스프링이 하는 빈은 xml파일에서 

 

어노테이션 만드는 법

1단계

DefaultAnnotationHandlerMapping

클래스 레벨에서 @RequestMapping

 

AnnotationMethodHandlerAdapter

메서드 래벨에서 @RequestMapping

 

2단계 태그 선언

<context:component-scan base-package="패키지이름"/>

 

@Controller :  스프링 테이너가 component-scan에 의해 지정한 클래스를 컨트롤러 빈으로 자동 변환

@Service : 서비스 빈으로 자동 변환

@Repository : DAO 빈으로 자동 변환

@Component : 빈으로 자동 변환

 

MainController

//역할
//@Controller("mainController")애너테이션은 주로 Controller 클래스에 위치해 빈을 만든다.
//@RequestMapping("/test)는 URL 요청 시 첫번째 단계의 요청이 /test이면 mainController빈에게 요청을 전달한다
//@ReqeustMapping(value="/main1.do", method=RequestMethod.GET)을 메서드에 위치시킨 후 각 요청을 구분하여 메서드를 호출

 

XML파일

<bean id="mainController"
         class="com.spring.ex01.MainController"/>
Controller클래스 (같음)

@Controller("mainController")

public class MainController{       }

확인할 주소 : http://localhost:8090/pro26/test/main1.do

//main3,4 적으면 에러

 


 

Ex02

web.xml파일에 추가

 

 

요청은 http://localhost:8090/pro26/test/loginForm.do

loginForm.jsp

방법1

파라미터값 지역변수에서 받아 mav.addObject

 

방법2

파라미터 값 바로 매핑 후 mav.addObject() 

 

required속성을 추가한다면, true일 때 해당 인풋태그에 값을 입력하지 않으면 예외 발생

(아마 크롬에서 처리를 해줘 예외발생하지 않았음, null도 그냥 공백으로 처리해주고 있음)

 

 


Map으로 받아서 넣기

Map<String, String> info

get(key)에서 key는 input태그의 name값

mav.addObject("info", info)로 넘긴다면 view단에서 꺼낼 때 info.를 추가하여 꺼낸다


@ModelAttribute("info") LoginVO loginVo

[어노테이션 클래스명 변수명]

전달된 매개변수에 대해 LoginVO클래스 객체를 생성
이어서 매개변수 이름과 같은 속성에 매개변수 값을 설정한 후
info이름으로 바인딩한다.

 

예를 들면 로그인창에서 전달된 매개변수 이름이 userID이고
값이 hong인 경우 
@ModelAttribute로 LoginVO를 지정하면 (바인딩)
전달 시 LoginVO의 속성 userID에 전달된 값 hong을 자동으로 설정한다.

 

 

LoginVO를 만들고 LoginForm의 action="${context}/test/login4.do"일때

바인드 후 Setter호출되어 자동설정

input태그의 name과 view단의 속성 이름이 일치해야 함 그렇지 않으면 500번에러

 


Model객체

loginForm을 거치지 않고 http://localhost:8090/pro26/test/login5.do로 바로 요청

1.JSP로 값을 바로 전달 가능

2. Model클래스의 addAttribute()메소드는 ModelAndView의 addObject()메소드와 같은 기능

3. 용도 : 뷰 정보를 따로 전달할 필요가 없을 때 사용