Spring3 에서 추가된 기능중 하나인 @Pathvariable 어노테이션에 대하여 포스팅 하고자 합니다.
말그대로 URL 경로에 변수를 넣어주는 기능입니다.
컨트롤러에서 사용법은 다음과 같습니다.
/** * Pathvariable 예제 * @return */ @RequestMapping("/page/{var}") public String page(@PathVariable String var){ String returnUrl = ""; if(var.equals("one")) { returnUrl = "page1"; } else if(var.equals("two")) { returnUrl = "page2"; } return returnUrl; }
RequestMapping의 URL 정의 부분과 Method 내의 Parameter 부분에
정의를 하여 사용이 가능합니다.
연결관계는
처럼 관계를 가져야 합니다.
상단 코드에서 return값으로 정해준 url 페이지를 2개 생성 해보도록 하겠습니다.
<h2>PAGE1.JSP</h2>
<h2>PAGE2.JSP</h2>
그럼 각 페이지별 출력을 위하여 실행을 해보도록 하겠습니다.
실행결과 정상적으로 @pathvariable 어노테이션을 이용하여
변수로 구분된 경로에 따른 returnURL 페이지 출력이 나왔습니다.
이 어노테이션을 사용한다면 한페이지로 여러개의 동일한 화면을 구분하게끔 구현이 가능할 것입니다.
이어서 일반 GET 방식과의 차이점에 대해서 비교를 해보도록 하겠습니다.
이번코드에서는 별도의 RETURN 페이지를 생성하지 않고 콘솔에서 데이터를 받기만 하도록 하겠습니다.
2가지 방식의 컨트롤러를 만들어 봅니다.
/** * GET방식 컨트롤러 * @param key1 * @param key2 */ @RequestMapping("/resultByGet") public void resultByGet(String key1, String key2){ System.out.println("key1::"+key1); System.out.println("key2::"+key2); } /** * Pathvariable방식 컨트롤러 * @param key1 * @param key2 */ @RequestMapping("/resultByPath/{key1}/{key2}") public void resultByPath(@PathVariable String key1, @PathVariable String key2){ System.out.println("key1::"+key1); System.out.println("key2::"+key2); }
위 코드는 같은 결과를 출력시키는 코드입니다.
단, 호출방식만 다를뿐...
각각 실행을 해보도록 하겠습니다.
다른방식이지만 같은 결과값이 출력되었습니다.
원하는 방법에 따라 사용하시면 되겠습니다.
by 개발로짜
Spring3 인터셉터와 세션을이용하여 로그인 처리해보기 (2) | 2014.11.12 |
---|---|
Spring3 RedirectAttributes 사용한 redirect POST 전송법 (0) | 2014.11.11 |
Spring3 jackson JSON 라이브러리 + ResponseBody 이용하여 JSON 파싱하기 (0) | 2014.11.10 |
Spring3 RESTFUL 방식 리소스파일 및 favicon 인식할수 있게 설정하기 (3) | 2014.11.07 |
Spring3 파일전송을 위한 multipartResolver 설정하기 (2) | 2014.11.07 |
이번에는 JSON 값을 RESPONSE 해주기 관련 포스팅을 진행해보도록 하겠습니다.
Spring을 제외한 다른 포스팅에 보통 json-simple 라이브러리를 이용하여
json 구현을 했었습니다.
그러나 Spring3 에서 jackson 라이브러리와 Responsebody 어노테이션을 같이 사용하니
엄청나게 심플하게 구현이 되는군요.
보통 JSON 객체를 생성하는 방식은 클라이언트에 JSON API 를 제공할때 주로 사용됩니다.
2가지 방식을 예로 들수 있겠는대요
Map 형식으로 response 해주는 방식과
vo객체에 담아서 object형식으로 response해주는
2가지 방식을 들 수 있겠습니다.
각각의 예제에 들어가기전 jackson 라이브러리 사용을 위한 설정을 해주도록 합니다.
다음 dependency 코드를 pom.xml에 추가해줍니다.
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>
이어서 mvc-config.xml 설정파일에 하단 태그를 추가해주도록 합니다.
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
위 2가지 코드를 각각의 파일에 삽입을 해주셨다면
Jackson 라이브러리와 @ResponseBody 어노테이션을 이용하여
간단하게 JSON API를 제작해보도록 하겠습니다.
/** * Map방식을 이용한 JSON API 컨트롤러 * @return */ @RequestMapping(value="/getJsonByMap") public @ResponseBody Map<String , Object> getJsonByMap() { Map<String, Object> jsonObject = new HashMap<String, Object>(); Map<String, Object> jsonSubObject = null; ArrayList<Map<String, Object>> jsonList = new ArrayList<Map<String, Object>>(); //1번째 데이터 jsonSubObject = new HashMap<String, Object>(); jsonSubObject.put("idx", 1); jsonSubObject.put("title", "제목입니다"); jsonSubObject.put("create_date", new Date()); jsonList.add(jsonSubObject); //2번째 데이터 jsonSubObject = new HashMap<String, Object>(); jsonSubObject.put("idx", 2); jsonSubObject.put("title", "두번째제목입니다"); jsonSubObject.put("create_date", new Date()); jsonList.add(jsonSubObject); jsonObject.put("success", true); jsonObject.put("total_count", 10); jsonObject.put("result_list", jsonList); return jsonObject; }
최상단 루트 Map 객체에 다양한 종류의 map 객체들 및 list 객체들을 put 해주었습니다.
적용 후 실행을 해보도록 하겠습니다.
정상적으로 JSON 규격에 맞춰져서 API 데이터가 출력되었습니다.
이번에는 보통 말하는 VO 객체를 사용하여
JSON 객체를 클라이언트 페이지로
RESPONSE 해주도록 해보겠습니다.
vo 패키지에 다음과 같은 2개의 vo 클래스를 생성합니다.
VO 클래스에 들어가는 코드를 다음과 같이 작성해주세요
public class ListVo { private int idx; private String title; private String create_date; public int getIdx() { return idx; } public void setIdx(int idx) { this.idx = idx; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getCreate_date() { return create_date; } public void setCreate_date(String create_date) { this.create_date = create_date; } }
public class ObjectVo { private boolean success; private ArrayList<ListVo> list; private int total_count; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public ArrayList<ListVo> getList() { return list; } public void setList(ArrayList<ListVo> list) { this.list = list; } public int getTotal_count() { return total_count; } public void setTotal_count(int total_count) { this.total_count = total_count; } }
구조는 기존 Map 방식의 JSON 구조와 동일한 형식입니다.
마지막으로 Controller 부분 코드입니다.
/** * VO방식을 이용한 JSON API 컨트롤러 * @return */ @RequestMapping(value="/getJsonByVO") public @ResponseBody ObjectVo getJsonByVO() { Calendar cal = Calendar.getInstance( ); ArrayList<ListVo> list = new ArrayList<ListVo>(); ListVo vo = null; ObjectVo objectVO = new ObjectVo(); //1번째 데이터 vo = new ListVo(); vo.setIdx(1); vo.setTitle("VO방식의 제목입니다"); vo.setCreate_date(cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH) + 1)+"-"+cal.get(Calendar.DAY_OF_MONTH)); list.add(vo); //2번째 데이터 vo = new ListVo(); vo.setIdx(1); vo.setTitle("VO방식의 제목입니다2"); vo.setCreate_date(cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH) + 1)+"-"+cal.get(Calendar.DAY_OF_MONTH)); list.add(vo); objectVO.setList(list); objectVO.setSuccess(true); objectVO.setTotal_count(10); return objectVO; }
위 코드 역시 임의의 데이터를 담아서 RESPONSE 결과를
확인하기 위하여 SET을 해준것입니다.
만약 ibatis 혹은 mybatis를 사용하시게 된다면
해당 SET 코드를 하실 필요는 없겠죠?
실행을 해보도록 하겠습니다.
VO 결과 역시 정상적으로 JSON 결과값을 출력하였습니다.
Spring3 을 이용하여 JSON API 작업을 할때 사용하시면 좋을 거 같습니다.
by 개발로짜
Spring3 RedirectAttributes 사용한 redirect POST 전송법 (0) | 2014.11.11 |
---|---|
Spring3 Pathvariable 어노테이션을 이용하여 PARAMETER를 URL처럼 받아보기 (0) | 2014.11.11 |
Spring3 RESTFUL 방식 리소스파일 및 favicon 인식할수 있게 설정하기 (3) | 2014.11.07 |
Spring3 파일전송을 위한 multipartResolver 설정하기 (2) | 2014.11.07 |
Spring3 한글깨짐 방지를 위한 UTF-8 인코딩 설정하기 (6) | 2014.11.06 |
포스팅 진행방식이 restful 방식이라 확장자 없이 컨트롤러 호출이 가능합니다.
하지만 js/css/html/이미지 파일등을 컨트롤러로 인식을 한다는 문제점이 있습니다.
확인해보도록 하겠습니다.
webapp 디렉토리에 이미지 파일들을 아무거나 붙여넣기를 해봅니다.
그리고 webapp디렉토리에 index.jsp의 body태그에 하단 코드를 작성해봅니다.
<img width="200" height="200" alt="" src="/test.jpg">
위와같이 img 태그를 작성 후 실행을 해보았습니다.
실행결과 404 (not found) 결과가 출력되면서 이미지출력이 제대로 이루어지지 않습니다.
이미지 파일뿐 아니더라도 js파일,css파일등 모두 잘못된 페이지로 인식을 합니다.
이미지를 부분을 해결해야 하면 어떻게 해야 하나?
webapp 디렉토리 하단에 리소스파일들만 모아놓는 디렉토리를 추가합니다.
저같은 경우 resource 라고 디렉토리 생성을 하였습니다.
resource 디렉토리 생성후 방금전 오류가 났던 이미지파일을 resource 디렉토리 내에 이동시킵니다.
mvc-config.xml에 다음 코드를 추가합니다.
<mvc:resources mapping="/resource/**" location="/resource/" />
mvc:resources의 속성을 간단히 알아보자면
location : 실제 리소스파일들이 들어있는 디렉토리경로
mapping : 클라이언트 페이지(JSP)에서 지정해주는 리소스 디렉토리
mvc:resources 태그를 하단처럼 정의했다면
<mvc:resources mapping="/app/**" location="/resources/" />
실제 리소스 파일들이 존재하는 디렉토리는 resources이고
jsp페이지에 만약 img 태그의 위치를 정의해준다고 가정한다면
<img src="/app/xxx.jpg" /> 처럼 사용을 하시면 됩니다.
보통은 mapping의 디렉토리와 location의 디렉토리명을 일치시켜줍니다.
<img width="200" height="200" alt="" src="/resource/test.jpg">
이미지파일을 resource디렉토리로 이동시켰으니
src 속성에 resource디렉토리로 재설정을 해준 다음 재실행 해보았습니다.
실행결과 정상적으로 리소스 파일을 출력 할 수 있었습니다.
마지막으로 favicon.ico 설정을 잡아보도록 하겠습니다.
동일하게 mvc:resources 태그를 이용하여 설정이 가능합니다.
favicon 아이콘파일은 webroot에 보통 존재하므로
사용할 favicon.ico 파일을 webapp 디렉토리 밑에 위치 시킨 다음
다음코드를 작성해주면 정상적으로 favicon 적용이 가능합니다.
하단코드는 특정 1개의 리소스파일을 적용할때 사용하시면 되겠습니다.
<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />
by 개발로짜
Spring3 Pathvariable 어노테이션을 이용하여 PARAMETER를 URL처럼 받아보기 (0) | 2014.11.11 |
---|---|
Spring3 jackson JSON 라이브러리 + ResponseBody 이용하여 JSON 파싱하기 (0) | 2014.11.10 |
Spring3 파일전송을 위한 multipartResolver 설정하기 (2) | 2014.11.07 |
Spring3 한글깨짐 방지를 위한 UTF-8 인코딩 설정하기 (6) | 2014.11.06 |
STS 이클립스를 이용하여 UTF-8 인코딩 설정 및 Spring3 MVC 연동해보기 (3) | 2014.11.06 |