흐음.. RESTful 서비스의 URI 형태가 이런거였구나.

즉.xxxx/xxxx/info?user=id  형태의 url이 있다면
-->
xxxx/xxxx/info/user/id .. 뭐 이런것 처럼 파라미터가 uri에 포함되도록 하는 형태란다.

이걸 스프링3 에서 흉내?? 낼수 있는데 URI 템플릿 기능이란다.

1. 설정방법
방법은
@RequestMapping 어노테이션값으로 { 템플릿변수 } 를 사용한다. 
@PathVariable 어노테이션을 이용해서 { 템플릿 변수 } 와 동일한 이름을 갖는 파라미터를 추가한다. 

@Controller
public class CharacterInfoController {
    @RequestMapping( "/game/users/{userId}/characters/{characterId}" )
    public String characterInfo(@PathVariable String userId, @PathVariable int characterId,ModelMap model) {
        model.addAttribute("userId",userId);
        model.addAttribute("characterId",characterId);
        ....
    }

RequestMapping 어노테이션에 변수를 포함하고 있다.
이들변수는 @PathVariable 어노테이션이 적용된 동일한 이름을 갖는 파라미터에 매칭된다. 



/game/users/ezsnotes/characters/sorcerer

하면 userId / characterId에 ezsnotes , sorcerer 가 들어간다.

만약 @PathVariable 어노테이션에 값을 주면 변수이름을 동일하게 하지 않고 지정할 수 있게 된다.


2. 추가 설정방법
 @Controller

@RequestMapping("/game/users/{userId}")
public class CharacterInfoController {

@RequestMapping("/characters/{characterId}")
public String characterInfo(@PathVariable String userId,
@PathVariable int characterId, ModelMap model) {
model.addAttribute("userId", userId);
model.addAttribute("characterId", characterId);
return "game/character/info";
}
}

위의 코드처럼 클래스와 메소드에 각각 RequestMapping을 걸어놓게 되면?
메소드에 적용한 @RequestMapping 어노테이션의 값은 클래스에 적용한 @RequestMapping 어노테이션의 값을 기본경로로 쓰게 된다.


메소드에 적용된 어노테이션의 값은 /characters/{characterId} 인데 실제 매칭되는 값은 클래스에 적용된 어노테이션의 값을 포함한
/game/users/{userId}/characters/{characterId} 가 된다.






















'IT > 스프링' 카테고리의 다른 글

Validator / Error interface .... in Spring  (0) 2012.01.16
Ant 경로 패턴 in @RequestMapping  (0) 2012.01.16
URI 매칭.. (서블릿 맵핑)  (0) 2012.01.13
@ModelAttribute  (2) 2012.01.13
모델 생성.... (Model )  (0) 2012.01.13


DispatcherServlet은 DefaultAnnotationHandlerMapping 클래스를 기본 HandlerMapping 구현체로 사용한다.

 @RequestMapping 의 주의사항..

@RequestMapping("/search/game.do")
public String search(...) {
...


@RequestMapping("/game/info")
public String info(...) {
...


코드를 보면 /search/game.do 는 search에서 처리하고, /game/info 는 info에서 처리할듯 하지만...
첫번째것은 맞고 두번째는 틀렸다.

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
<url-pattern>/game/*</url-pattern>
</servlet-mapping>

url-pattern 에서 /game/* 로 설정했기 때문이라네?
url-pattern값으로 디렉토리를 포함한 패턴을 지정하게 되면 서블릿 경로는 /game 이 되며, 
서블릿 경로를 제외한 나머지 경로를 이용해서 @RequestMapping 어노테이션의 값과 매칭여부를 판단한단다.

해서 game/info 의 요청이 오면 실제 요청 URI 는 /info가 된다. 
허나 RequestMapping 에는 /game/info라고 했으므로 /info와 맞지 않게 된다.


이런 이유는 DispatcherServlet 이 기본적으로 사용하는 HandlerMapping 구현체와 HandlerAdapter 구현체가 전체 경로를 사용하지 않도록 설정되어있기 때문이란다.

해서 사용하게 설정하면... 위의 경우 잘 되겠지?
즉, 서블릿 경로를 포함한 전체 경로를 이용해서 매칭 여부를 판단하도록 설정하려면, 
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" p:alaywaUseFullPath="true"/>
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerAdapter" p:alwaysUseFullPath ="true"/>
 


 










 



'IT > 스프링' 카테고리의 다른 글

Ant 경로 패턴 in @RequestMapping  (0) 2012.01.16
PathVariable 어노테이션을 이용한 URI 템플릿...  (0) 2012.01.16
@ModelAttribute  (2) 2012.01.13
모델 생성.... (Model )  (0) 2012.01.13
@Controller 어노테이션... - 1 -  (0) 2012.01.10


@ModelAttribute 를 이용하면 2가지 작업이 가능

ㄱ. @RequestMapping 어노테이션이 적용되지 않은 별도 메소드로 모델에 추가될 객체를 생성가능
ㄴ. 커맨드 객체의 초기화 작업을 수행

두개의 RequestMapping 된 메소드가 같은 내용의 모델을 필요로 한다고 할때, 보통 그냥 별도의 메소드로 빼서 그것을 참조하게
한다. 

단 이렇게 하면 공통 메소드에 추가 조건절이 들어갈 수 도 있고 리턴에 대해서도 사용하는 측에서 맞춰야한다.

이때 @ModelAttribute를 사용할 수 있다.

 @ModelAttribute 를 메소드에 적용하면 해당 메소드가 생성한 객체가 뷰에 전달된다!!!!


아하.. 그래서 return 에 없는 객체들을 jsp 에서 참조가능했구나!!!!!!

즉 이 어노테이션은 ModelAttribute , 모델속성!! 이라는 의미의 단어를 그대로 뜻하는 것이다!!! 


@Controller
public class GameSearchController {
@Autowired
private SearchService searchService;

@ModelAttribute("searchTypeList")
public List<SearchType> referenceSearchTypeList() {
List<SearchType> options = new ArrayList<SearchType>();
options.add(new SearchType(1, "전체"));
options.add(new SearchType(2, "아이템"));
options.add(new SearchType(3, "캐릭터"));
return options;
}

@ModelAttribute("popularQueryList")
public String[] getPopularQueryList() {
return new String[] { "게임", "창천2", "위메이드" };
}

@RequestMapping("/search/main.do")
public String main() {
return "search/main";
}

@RequestMapping("/search/game.do")
public ModelAndView search(@ModelAttribute("command") SearchCommand command) {
ModelAndView mav = new ModelAndView("search/game");
System.out.println("검색어 = " + command.getQuery().toUpperCase());
SearchResult result = searchService.search(command);
mav.addObject("searchResult", result);
return mav;
}


해서 위의 콘트롤러를 보면 리턴해줄 모델의 값은 단지 mav일뿐이다. 허나 @ModelAttribute 어노테이션을 다른 메소드에 붙이므로써
모델에 속성을 추가하게 되는것이다!



다른 용도는 커맨드 객체 초기화 부분이다.
@ModelAttribute 어노테이션을 사용하면, 커맨드 객체의 초기화 작업을 수행할 수도 있다.
그럴수 밖에... 
@Controller
@RequestMapping("/account/create.do")
public class CreateAccountController {

@ModelAttribute("command")
public MemberInfo formBacking(HttpServletRequest request) {
if (request.getMethod().equalsIgnoreCase("GET")) {
MemberInfo mi = new MemberInfo();
Address address = new Address();
address.setZipcode(autoDetectZipcode(request.getRemoteAddr()));
mi.setAddress(address);
return mi;
} else {
return new MemberInfo();
}
}

private String autoDetectZipcode(String remoteAddr) {
return "000000";
}

@RequestMapping(method = RequestMethod.GET)
public String form() {
return "account/creationForm";
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@ModelAttribute("command") MemberInfo memberInfo,
BindingResult result) {
new MemberInfoValidator().validate(memberInfo, result);
if (result.hasErrors()) {
return "account/creationForm";
}
return "account/created";
}
}

GET/POST 각각의 요청에 따라 객체 초기화가 가능하다.
위에서보면 submit 시의 command 가 바로 @ModelAttribute("command") 의 객체를 가르키게 된다.
왜냐면 @ModelAttribute 어노테이션이 적용된 메소드가 @RequestMapping 어노테이션이 적용된 메소드보다 먼저 호출되므로,
초기화 작업처럼 되는것이다.

그리고 ModelAttribute 어노테이션이 적용된 메소드는 RequestMapping 어노테이션이 적용된 메소드와 동일한 타입의 파라미터를 가질 수 있다.
 @ModelAttribute("command")
public MemberInfo formBacking(HttpServletRequest request) {

HttpServletRequest 말고도 Locale, @RequestParam 어노테이션 적용, @PathVariable 어노테이션등을 적용가능하다. 
 



'IT > 스프링' 카테고리의 다른 글

PathVariable 어노테이션을 이용한 URI 템플릿...  (0) 2012.01.16
URI 매칭.. (서블릿 맵핑)  (0) 2012.01.13
모델 생성.... (Model )  (0) 2012.01.13
@Controller 어노테이션... - 1 -  (0) 2012.01.10
filter....  (0) 2012.01.10
@RequestMapping 어노테이션이 적용된 메소드의 파라미터나 리턴타입으로 ModelAndView, Model, ModelMap, Map, 커맨드 객체 등을 이용해서 모델을 뷰에 전달하게 된다.

컨트롤러가 모델을 어떻게 뷰에 전달하는 지 살펴보도록 하자.

1.1 뷰에 전달되는 모델 데이터

        @RequestMapping("/search/game.do")
public ModelAndView search(@ModelAttribute("command") SearchCommand command, ModelMap model) {
                String[] queryList = getPopularQueryList();
                model.addAttribute("popularQueryList", queryList);
                 
ModelAndView mav = new ModelAndView("search/game");
SearchResult result = searchService.search(command);
mav.addObject("searchResult", result);
return mav;
}
 
근데 이상하다... model 자체를 리턴하지 않는데도 이게 뷰까지 간단 말야..
그리고 mav 도 별도로 또 가고 -ㅅ- 뭐야 이거

-->
 @ModelAttribute 를 메소드에 적용하면 해당 메소드가 생성한 객체가 뷰에 전달된다!!!!
아하.. 그래서 return 에 없는 객체들을 jsp 에서 참조가능했구나!!!!!!



즉.. JSP 에서 호출할때
${searchResult}, ${command.query} , ${popularQueryList} 로 접근된다.... ;;


1.2 Map, Model, ModelMap 을 통한 모델설정.. 

모델의 메소드에 대해서 잠깐 언급하자면,
Model, ModelMap 의 경우는 addAttribute 로 값을 설정하고, Map 이야.. put
그리고 Model은 인터페이스이다.   ExtendedModelMap 으로 할당해서 보통 쓴다.

1.3 ModelAndView 
 ModelAndView야 .. 뭐
    -setViewName() 을 통한 뷰 이름 설정
    -addObject(xxx,xxx) 를 이용한 전달값 추가
    -ModelAndView(뷰이름,맵) 생성자를 통한 뷰이름,Map 데이터 전달 






















 




'IT > 스프링' 카테고리의 다른 글

URI 매칭.. (서블릿 맵핑)  (0) 2012.01.13
@ModelAttribute  (2) 2012.01.13
@Controller 어노테이션... - 1 -  (0) 2012.01.10
filter....  (0) 2012.01.10
DispatcherServlet... more  (0) 2012.01.10
흐음... 
우선.. 리다이렉트 302(http)  는 리다이렉트의 내용을 의미한다.
즉, 그 내용은 브라우저의 history에 남지 않는다. (여기서 리다이렉트는 html 레벨이 아닌 서블릿이나.. 그런 레벨의 redirect 임)

http 200 이 브라우저의 history로 남더라.



즉 구매페이지는 200 으로 보여졌고 history에 쌓였고,
중간 구매액션페이지에서 리다이렉트로 완료페이지로 보냈다면,  구매액션페이지는 302
완료페이지는 200 으로 떨어진다.

실제 확인해보면 history.length 는 구매페이지, 구매완료페이지 해서 2로 나온다.

물론 패킷캡쳐해보면 중간 구매액션페이지는 302로 잡히긴한다. 


=============================

추가로 

jsp 에서 response.sendredirect 를 기술해놓으면 
해당페이지는 302 처리되어 history에 쌓이지 않는다.(redirect.jsp 가 302로 안남음)

다만 이동 목표 b.html 은 히스트로에 쌓인다.

목표url이 주소로 바뀌어있다. (즉 주소가 바뀜)


jsp 에서
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
위와같이 forward 로 history에도 쌓이지 않는다. 
브라우저 상의 주소는 바뀌지 않는다. 
(패킷에 forward.jsp 403 만 남음)
목표 페이지가 히스토리에 남지 않는다. (왜냐면 주소변화가 없으니까)


최범균의 스프링책과 인터넷 검색 결과를 바탕으로 만든 자료입니다.

스프링 MVC는 html form 안의 데이터를 자바빈 객체로 전달받을 수 있다.
기본빈이다. 말그대로 get/set을  정의한 표준빈 형태...

방법은 간단하다.

1. 폼 데이터 받기
HTML폼의 데이터를 자바빈으로 가져오려면, 
@RequestMapping 어노테이션을 적용한 메소드의 파라미터에 자비빈 타입을 추가하기만 하면된다. (이를 커맨드객체라고 하는건가??? )

그게... 만약 html의 form 에 input 의 name에 맞는 set/get 을 가진 빈을 만들어 넣으면 거기에 값이 들어가있는것...

@RequestMapping(method = RequestMethod.POST)
public String submit(폼에맞춘빈클래스 command) {
command.getXxx();
        .... 
}

2. 뷰에서 데이터 접근
위의 내용을 view 에서 접근할 수 있는데 JSTL EL로 접근한다.

예로, NewArticleCommand 타입의 커맨드객체를 전달받았다면...
@RequestMapping(method = RequestMethod.POST)
public String submit(NewArticleCommand command) {
    ....
}

이런경우, view 에서는 클래스이름을 이용해서 객체에 접근할 수 있다.

<body>
....
제목 : ${newArticleCommand.title}
....

근데 이건 좀 아니지; 클래스명을 쓰긴 뭐하잖아? 바꿀 수 있다.


@RequestMapping(method = RequestMethod.POST)
public String submit(@ModelAttribute("command") NewArticleCommand command) {
articleService.writeArticle(command);
return "article/newArticleSubmitted";
}


<body>
....
제목 : ${command.title}
....
 

3. 뷰에서 콜렉션 타입 받기 
특별한것도 없고 List 타입의 값을 받으면된다.
다음엔 xxx[i].변수
로.. [인덱스] .. 배열처럼 접근하면된다.


4. 컨트롤러가 있는 RequestMapping된 메서드의 파라미터 종류
@RequestMapping 이 적용된 메소드에는 커맨드클래스 말고도 HttpServletRequest, HttpSession, Locale 등 웹 어플리케이션 관련 다양한 타입의 파라미터를 가질 수 있다.

종류...
 파라미터 타입설명 
 HttpServletRequest, HttpServletResponse HttpSession 서블릿
 java.util.Locale 현재 요청에 대한 Locale
 InputStream, Reader 요청 컨텐츠에 직접 접근할 때 사용
 OutputStream, Writer 응답 컨텐츠를 생성할 때 사용
 @PathVariable 어노테이션적용 파라미터 URI 템플릿 변수에 접근할 때 사용
 @RequestParam 어노테이션 적용 파라미터 HTTP 요청 파라미터를 매핑
 @RequestHeader 어노테이션 적용 파라미터HTTP 요청 헤더를 매핑 
@CookieValue 어노테이션 적용 파라미터 HTTP 쿠키 매핑 
@RequestBody 어노테이션 적용 파라미터 HTTP 요청의 몸체 내용에 접근할 때 사용. 
HttpMessageConverter를 이용해서 HTTP 요청 데이터를 해당 타입으로 변환한다. 
 Map,Model,ModelMap 뷰에 전달할 모델 데이터를 설정할때 사용
커맨드 객체 HTTP 요청 파라미터를 저장한 객체. 기본적으로 클래스이름을 모델명으로 사용. @ModelAttribute 어노테이션을 사용하여 모델명을 설정할 수 있다.
 Errors,BindingResult HTTP 요청 파라미터를 커맨드 객체에 저장한 결과, 커맨드 객체를 위한 파라미터 바로 다음에 위치
 SessionStatus폼 처리를 완료 했음을 처리하기 위해 사용. @SessionAttribute 어노테이션을 명시한 session 속성을 제거하도록 이벤트를 발생시킨다. 


Errors와 BindingResult는 연관된 커맨드 객체 바로 다움에 와야한다. (메소드의 파라미터 위치에 말야) 이 두 타입을 제외한 나머지 타입은 순서에 상관없다.



4.1 @RequestParam

컨트롤러 구현시 가장 많이 쓴단다.
HTTP 요청 파라미터를 메소드의 파라미터로 전달받을때 사용.

즉 html로 요청을 받을때 존재하는 파라미터를 바로 어떤 변수와 매핑시키는 역할이다.
사실 이건 그냥 꺼내와서 변수에 넣으면 ... 이게 바로 @RequestParam 어노테이션이 하는 내용과 같아진다.


ex)
.../search/internal.do?query=spring&p=3

@RequestMapping("/search/internal.do")
public ModelAndView searchInternal(@RequestParam("query") String query,
                               @RequestParam(value = "p", defaultValue = "1") int pageNumber) {
        ...
}

딱보니 뭔지 알겠지?

만약 위에서 p 값에 숫자가 아닌 값이 오게 되면 400 에러를 웹 브라우저에 보낸다. (Bad Request)
@RequestParam이 오면 필수 파라미터가 된다. 이를 필수가 아니게 하고 싶다면...?

required=false 이다.

@RequestMapping("/search/external.do")
public ModelAndView searchExternal(@RequestParam(value="query", required=false) String query,
                                                @RequestParam(value = "p", defaultValue = "1") int pageNumber) {
 
만약 필수 파라미터인데 html에서 오지 않았다면? null을 할당한다.
허나.. 그 타입이 null을 할당할 수 없다면? 에러를 발생한다;; 이를 피하기 위해서 defaultValue를 이용한다.



4.2 @CookieValue 어노테이션

쿠키값을 전달받을 수 있다.

@RequestMapping("/cookie/view.do")
public String view( @CookieValue( "auth" ) String auth) {

위의 경우 auth 라는 쿠키를 찾는데 없으면 500 에러가 나온다.
이때 required=false 하면, null을 전달 받는다.

@RequestMapping("/cookie/view.do")
public String view( @CookieValue(value="auth" , required=false ) String auth) {


defaultValue를 통한 값 설정도 가능하다.
@RequestMapping("/cookie/view.do")
public String view( @CookieValue(value = "auth", defaultValue = "0") String auth) {
 

4.3 @RequestHeader 어노테이션을 이용한 헤더 매핑
HTTP 요청 헤더의 값을 메소드 파라미터로 전달한다.
(즉... UA 값등...)


@RequestMapping("/header/check.do")
public String check(@RequestHeader("Accept-Language") String languageHeader) {
...
}

역시 헤더에 값이 존재 하지 않으면 500리턴한다. 역시 required 및 defaultValue 값을 설정할 수 있다.

4.4 서블릿 API 사용 (HttpServletRequest, HttpServletResponse , HttpSession)

보통은 안쓰지만, 사용하게 되는 경우는...
ㄱ. HttpSession의 생성을 직접 제어해야하는 경우
ㄴ. 컨트롤러에서 쿠키를 생성해야 하는 경우
ㄷ. 서블릿 API 사용을 선호하는 경우

HttpSession 타입의 파라미터를 가질경우,  
기존의 세션이 존재하면 그게오고, 없다면 새로 세션이 생성되어서 온다.
하여 null일 수 없다.


 

5. 뷰 이름 지정
5.1 뷰 이름 명시적 지정


뷰이름을 명시적으로 지정하려면 ModelAndView 나 String을 리턴하면된다.

@RequestMapping("/index.do")
public ModelAndView index() {
ModelAndView mav = new ModelAndView("index");
            ....
            return mav;
}

위처럼 생성자를 통해서나 serViewName() 을 통해서 지정할 수 있다.

아니면 리턴타입을 String으로 해서

public String index() {
    return "index";
}

로 할수도 있다.

5.2 뷰 이름 자동 지정

ㄱ. 리턴타입이 Model 이나 Map 인경우
ㄴ. 리턴 타입이 void 이면서 ServletResponse 나 HttpServletResponse 타입의 파라미터가 없는 경우.

위의 경우는 RequestToViewNameTranslator를 이용해서 URL로 부터 뷰 이름을 구한다.

.xml 설정파일에 RequestToViewNameTranslator 빈이 존재하지 않을 경우는 DefaultRequestToViewNameTranslator가 사용된다.

DeafultRequestToViewNameTranslator 는 요청 URI로부터 맨 앞의 슬래시와 확장자를 제외한 나머지 부분을 뷰 이름으로 사용한다.
(즉, 전체경로를 사용하지 않도록 설정한 경우 서블리 경로를 제외한 나머지 경로가 사용된다)

@RequestMapping("/search/game2.do")
public Map<String,Object> search() {
    HashMap<String,Object> model = new HashMap<String,Object>();
    ....
    return model;
}

위예제에서는 뷰에서 쓸 데이터모델을 Map을 이용한 모델로 리턴하고 있다. 이 경우 RequestToViewNameTranslator 를 이용해서 
결과를 보여줄 뷰 이름을 결정하게 된다. DefaultRequestToViewNameTranslator가 사용될 경우

ex) /search/game2.do --> search/game2


5.3 리다이렉트 뷰 

뷰 이름에 redirect: 접두어를 붙이면 해당 페이지로 리다이렉트된다.

- redirect: /bbs/list  --> 현재 서블릿 컨텍스트에 대한 상대적인 경로로 리다이렉트
- redirect: http://host/bbs/list --> 지정한 절대  URL로 리다이렉트













3.0 에서는 Controller 어노테이션을 이용해서 컨트롤러 클래스를 구현한단다. (과거에는 AbstractController 등을 썼음)

1. 기본구현
@Controller , @RequestMapping 어노테이션을 이용하면된다.

@Controller
public class HelloController {
@RequestMapping("/hello.do")
public String hello() {
            return "hello";
        }

@RequestMapping 어노테이션의 값에는 해당 메소드에서 처리할 URI가 무엇인지를 정의한다.
위의 경우 리턴값이 ModelAndView 가 아니라 String인데 이는 바로 이값이 ViewName이 된다.
이 뷰이름으로 ViewResolver 를 통해서 실제 view 파일을 가져와서 보여주겠지..


2. 전송방식... GET/POST
어차피... 이건 웹 어플리케이션이다. 전송하는 방식은 GET/POST 겠지.
같은 URL 이고 get/ post 의 다른 방식의 전송을 할때 다르게 처리가능하다.

@Controller
public class NewArticleController {
 
@RequestMapping(value="/article/newArticle.do", method = RequestMethod.GET)
public String form() {
return "article/newArticleForm";
}

@RequestMapping(value="/article/newArticle.do", method = RequestMethod.POST)
public String submit(@ModelAttribute("command") NewArticleCommand command) {
return "article/newArticleSubmitted";
}

public void setArticleService(ArticleService articleService) {
this.articleService = articleService;
}

}

만약 위처럼 처리하는 메소드가 동일한 URI에 대해서 처리하는것이라면 기본 URI를 지정할 수 도 있다.

@Controller
@RequestMapping("/article/newArticle.do")
public class NewArticleController {
 
@RequestMapping(method = RequestMethod.GET)
public String form() {
...
}

@RequestMapping(method = RequestMethod.POST)
public String submit(@ModelAttribute("command") NewArticleCommand command) {
...
}
...
}

만약 RequestMapping 어노테이션에 method 설정은 안하면 ,GET/POST 등 모든 HTTP 전송방식을 처리한다.



RequestMapping 에 대한 어노테이션 기능은 별도의 문서에 정리했다. 참고바란다.

3. 컨트롤러 메소드의 리턴타입?

매핑된 컨트롤러의 메소드가 해야할 일을 처리한다음... 뭔가를 리턴할것이다.
그 타입에 대한 설명이다.
@RequestMapping 메소드의 리턴타입
리턴타입 설명
ModelAndView 뷰 정보 및 모델정보를 담고 있는 ModelAndView 객체
Model 뷰에 전달할 객체 정보를 담고 있는 Model을 리턴한다. 이때 뷰 이름은 요청 URL로부터 결정된다.(RequestToViewNameTranslator 를 통해 뷰 결정)
 Map 뷰에 전달할 객체 정보를 담고 있는 Model을 리턴한다. 이때 뷰 이름은 요청 URL로부터 결정된다.(RequestToViewNameTranslator 를 통해 뷰 결정)
 String 뷰 이름을 리턴한다.
 View 객체View 객체를 직접 리턴, 해당 View 객체를 이용해서 뷰를 생성한다. 
 void메소드가 ServletResponse나, HttpServletResponse 타입의 파라미터를 갖는 경우 메소드가 직접 응답을 처리한다고 가정한다. 그렇지 않을 경우 요청 URL로 부터 결정된 뷰를 보여준다.(RequestToViewNameTranslator를 통해 뷰 결정) 
 @ResponseBody 어노테이션적용
메소드에서 @ResponseBody 어노테이션이 적용된 경우, 리턴객체를 HTTP응답으로 전송한다. HttpMessageConverter를 이용해서 객체를 HTTP 응답 스트림으로 변환한다. 


4. 컨트롤러 클래스 자동스캔
@Controller 어노테이션은 @Component 어노테이션과 마찬가지로 컴포넌트 스캔대상이다. 
<context:component-scan> 태그를 이용해서 아래처럼 선언해서 (xml) 어노테이션이 적용된 컨트롤러를 자동으로 로딩할 수 있다.

<context:component-scan base-package="madvirus.spring.chap06.controller" />


 



'IT > 스프링' 카테고리의 다른 글

@ModelAttribute  (2) 2012.01.13
모델 생성.... (Model )  (0) 2012.01.13
filter....  (0) 2012.01.10
DispatcherServlet... more  (0) 2012.01.10
Spring 3.0 MVC 정리  (0) 2012.01.10


스프링은 요청 파라미터의 캐릭터 인코딩을 설정할 수 있는 필터클래스인 CharacterEncodingFilter 클래스를 제공한단다...

         <filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>  // encoding을 통해서 지정
<param-value>EUC-KR</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>











'IT > 스프링' 카테고리의 다른 글

모델 생성.... (Model )  (0) 2012.01.13
@Controller 어노테이션... - 1 -  (0) 2012.01.10
DispatcherServlet... more  (0) 2012.01.10
Spring 3.0 MVC 정리  (0) 2012.01.10
AspectJ in Spring?  (0) 2012.01.09

+ Recent posts