본문 바로가기
JAVA/Spring

Spring - RESTful 예제

by 설총이 2018. 9. 13.

1. 처음 xml 설정을 잡아주자.


[web.xml]


1
2
3
4
5
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern>
    <url-pattern>/game/*</url-pattern>
</servlet-mapping>
cs


.do == 확장자 명으로 찾아가는 서블릿 url 패턴

/xxxx/* == 디렉토리명으로 찾아가는 서블릿 url패턴




2-1 


실행하려는 url경로를 


1
<a href="game/game/users/박세영/characters/7777">@PathVariable 예제</a>
cs


같이 잡아준다. 


game을 한번 더 잡아준 이유는, 

확장자명으로 찾아가는 .do는 상관이없지만 ,디렉토리명으로 찾아갈때에는

/game인부분인 Servlet 경로를 제외한 나머지 경로를 이용해서

@RequestMapping Annotation의 값과 매칭 여부를 판단하게 되므로,


실제 비교할 때 사용되는 요청 URI은


1
<a href="game/game/users/박세영/characters/7777">@PathVariable 예제</a>
cs


이렇게 된다.



2-2


또다른 방법으로는


dispatcher-servlet.xml에서


1
2
3
4
5
6
7
8
<bean
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="alwaysUseFullPath" value="true" />
</bean>
<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="alwaysUseFullPath" value="true" />
</bean>
cs



라고 경로를 잡아주고,


1
<a href="game/users/박세영/characters/7777">@PathVariable 예제</a>
cs


라고 요청을하면, 서블릿경로를 지우지않고 그대로 인식하게 만들 수 있다.

실제로 위의 useFullPath를 적용하면 노란색 줄이 그어지는데 신경쓰지말도록하자.

사용자가 편한 방식대로 사용하면 될 것이다.



[CharacterInfoController.java]



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package spring.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
@RequestMapping("/game/users/{id}")
public class CharacterInfoController {
//game/users/su/characters/1234
    @RequestMapping("/characters/{characterId}")
    public String characterInfo(@PathVariable("id"String userId,
@PathVariable int characterId, ModelMap model) {
        // {""} 와 변수 "" 가 이름이 다르면 @PathVariable("") 로 지정할 수 있다.
        // PathVariable의 이름을 임의로 저장한 것은, RequestMapping에서만 쓸 수 있고,
        model.addAttribute("userId", userId);
        model.addAttribute("characterId", characterId);
     // 실제로 jsp에서 뽑아내는 데이터는 add로 정한 key값으로 
뽑아야 함을 헷갈리지 말고 기억하자.
        return "character/info";
    }
}
 
cs



실제로 위에 url경로에서 보낼 데이터적은 '위치부분'을 

@RequestMapping("") 으로 받을때에 같은 '위치부분' 에서 { } 로 꺼낼 수 있다.

꺼냄과 동시에 @PathVariable() 뒤에 선언한 변수에 저장도 동시에 할 수 있다.


지정한 변수 userId와 {userId} 로 일치 한다면 따로 이름을 지정해줄 필요는 없지만

다른 이름으로 사용하고 싶다면, 위와같이 @PathVariable("id") == {id} 로 사용할 수 있음을 기억하자.

{id] 에 들어온 값이 바로 뒤에 선언한 변수 String userId에 저장되는 것이다.


그렇게 return에서 view페이지인 charater/info.jsp 페이지로 가게되면


1
${userId} 회원의 ${characterId} 캐릭터 정보 출력
cs


변수에 저장한 값을 model에 model.addAttribute로 저장한 String값으로 value값을 꺼낼 수 있게 됩니다.