메이븐에 파일관련 라이브러리를 추가하여 진행해야 하므로
pom.xml에 dependency를 등록 하도록 하겠습니다.
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
등록하였으면 컨트롤러에 2개의 맵핑을 선언합니다.
/** * 파일등록화면 * @return */ @RequestMapping("/form") public String form(){ return "form"; } /** * form submit 파일결과 받기 * @param file */ @RequestMapping("/getFile") public void getFile(FileVo file){ System.out.println(file.getFile().getOriginalFilename()); }
첨부파일을 서버에서 받기위하여 vo클래스를 하나 생성 해보겠습니다.
패키지명 : com.spring.study.vo
vo 클래스명 : FileVo
package com.spring.study.vo; import org.springframework.web.multipart.MultipartFile; public class FileVo { private MultipartFile file; public MultipartFile getFile() { return file; } public void setFile(MultipartFile file) { this.file = file; } }
등록폼을 위한 form.jsp 파일을 view 디렉토리내에 생성 하여
body태그에 간단하게 다음코드를 추가합니다.
<form action="/getFile" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="서버전달"/> </form>
서버를 시작하여 form URL 호출을 해보겠습니다.
파일 첨부 후 "서버전달" 버튼 클릭을 하게 되면
위 오류메시지가 발생하게 됩니다.
스프링에서 파일처리를 위해서는
MultipartResolver 설정을 잡아주어야 하는데
해당 설정부분이 빠져있어서 파일처리도중 Exception 발생이 일어난겁니다.
mvc-config.xml 파일내에 다음 코드를 추가해주도록 합니다.
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
위 코드를 추가하신다음 다시한번 파일첨부후 실행을 해보도록 합니다.
첨부후 "서버전달"버튼 클릭을 하면
이번에는 500에러가 아닌 404 에러가 나타난다면
정상적으로 파일전송이 완료된겁니다.
이클립스의 콘솔을 확인해보시면 System.out.println을 이용하여
전송한 첨부파일의 파일명이 출력된 것을 확인할 수 있습니다.
by 개발로짜
Spring3 Pathvariable 어노테이션을 이용하여 PARAMETER를 URL처럼 받아보기 (0) | 2014.11.11 |
---|---|
Spring3 jackson JSON 라이브러리 + ResponseBody 이용하여 JSON 파싱하기 (0) | 2014.11.10 |
Spring3 RESTFUL 방식 리소스파일 및 favicon 인식할수 있게 설정하기 (3) | 2014.11.07 |
Spring3 한글깨짐 방지를 위한 UTF-8 인코딩 설정하기 (6) | 2014.11.06 |
STS 이클립스를 이용하여 UTF-8 인코딩 설정 및 Spring3 MVC 연동해보기 (3) | 2014.11.06 |
그리드패널에서 사용되는 스토어는 "Ext.data.Store" 를 사용하지만
트리패널에서 사용되는 스토어는 "Ext.data.TreeStore"를 사용합니다.
사용되는 데이터스토어가 다르고 스토어들의 사용법 또한 살짝(?) 다릅니다.
proxy 타입이 "memory" 기준으로 설명을 드리자면
data : [{ blogger_id : 'guklife', blogger_name : '국이', blogger_url : 'guklife.tistory.com' },{ blogger_id : 'hellogk', blogger_name : '개발로짜', blogger_url : 'hellogk.tistory.com' }]
위처럼 json array 하나에 여러개의 json object를 정의하는 구조인 1:n 형식입니다.
그렇다면 트리구조일 경우에는 데이터 출력을 위해 다음과 같은 구조로 정의해줍니다.
root : { text : '1depth', expanded : true, children: [{ text:'2depth(1)', expanded: true, children:[{ text:'3depth', leaf : true }] },{ text:'2depth(2)', leaf : true }] }
위 구조는 ajax 비동기 통신할때도 동일한 구조로 진행이 되어야 합니다.
각각 설명을 해보자면
① root속성부터 트리컴포넌트 1depth 노드의 시작이다.
② 자식노드를 출력하기 위해서는 children 속성내에 json배열 형식으로 각 object 를 선언한다.
※ 속성에 알아봐야 할 중요 key 설명
text : 트리구조 출력시 화면에 노출되는 문자열(필수)
expanded : true/false boolean 형식의 값을 정의한다.
true일 경우 - 자식노드 확장
false일 경우 - 자식노드가 확장을 해놓지 않음
leaf : 마지막 노드인지 구분을 위한 속성값
역시 true/false boolean 형태
expanded 속성과 leaf 속성을 구분하여 다음의 case별로 적용해주시면 되실거 같습니다.
1. 더이상의 자식노드가 없다면? expanded 속성 생략 + leaf : true
이 경우 childrend 속성도 생략해야 하겠죠?
2. 자식노드가 존재하지만 확장을 시켜놓지 않을것이다? expanded : false
3. 자식노드가 존재하며 확장을 시켜놓겟다? expanded : true
위 3가지를 꼭 기억해주도록 합니다.
Ext.onReady(function(){ Ext.onReady(function(){ Ext.create('Ext.tree.Panel',{ renderTo : Ext.getBody(), store : Ext.create('Ext.data.TreeStore',{ root : { text : '1depth', expanded : true, children: [{ text:'2depth(1)', expanded: true, children:[{ text:'3depth', leaf : true }] },{ text:'2depth(2)', leaf : true }] }, proxy : { type : 'memory' } }) }) });
위처럼 단순하게 트리컴포넌트를 생성해보았습니다.
실행결과를 확인해 보도록 합니다.
위처럼 트리구조로 목록이 출력되었습니다.
다음으로 proxy 타입이 'ajax'인 비동기방식으로 서버통신 후
json 객체로 트리노드를 동적으로 출력해보도록 하겠습니다.
이번 json response 작업 역시 json-simple 라이브러리를 이용하여 진행하였습니다.
2014/10/06 - [코드저장소/java] - JSON 라이브러리를 이용하여 object생성과 문자열을 object형으로 변환해보기
상단 코드중 children 속성을 ajax call 하여 json object로 받을 예정입니다.
proxy 사용방법은 기존 그리드 ajax 와 동일한 구조입니다.
일부 변경된 스크립트 코드는 다음과 같습니다.
Ext.onReady(function(){ Ext.create('Ext.tree.Panel',{ renderTo : Ext.getBody(), store : Ext.create('Ext.data.TreeStore',{ root : { text : '1depth', expanded : false }, proxy : { type : 'ajax', api: { read : '/tree_result.jsp' }, reader: { type: 'json', rootProperty: 'children' } } }) }) });
root 속성의 expanded 값을 false로 정의하였습니다.
트리패널에서는 서버통신이 이루어지는 경우는
트리노드가 확장(expanded : true)이벤트가 발생할때 호출되기 때문에
눈으로 확인해보고자 false로 지정하였습니다.
true로 줄경우 onload 되자마자 바로 트리패널의 children을 ajax call을합니다.
위와같이 작업하였다면 서버 페이지 코드를 작성해보도록 합니다.
JSONObject jsonTreeRootObject = new JSONObject(); JSONArray jsonArray = new JSONArray(); JSONObject jsonTreeObject = null; JSONArray jsonTreeChildrenArray = new JSONArray(); JSONObject jsonTreeChildrenObject = null; jsonTreeObject = new JSONObject(); jsonTreeObject.put("text", "2depth(1)"); jsonTreeObject.put("leaf", true); jsonArray.add(jsonTreeObject); jsonTreeObject = new JSONObject(); jsonTreeObject.put("text", "2depth(2)"); jsonTreeObject.put("expanded", true); jsonTreeChildrenObject = new JSONObject(); jsonTreeChildrenObject.put("text","3depth(1)"); jsonTreeChildrenObject.put("leaf",true); jsonTreeChildrenArray.add(jsonTreeChildrenObject); jsonTreeChildrenObject = new JSONObject(); jsonTreeChildrenObject.put("text","3depth(2)"); jsonTreeChildrenObject.put("leaf",true); jsonTreeChildrenArray.add(jsonTreeChildrenObject); jsonTreeObject.put("children",jsonTreeChildrenArray); jsonArray.add(jsonTreeObject); jsonTreeRootObject.put("success", true); jsonTreeRootObject.put("children", jsonArray); response.setContentType("text/plain; charset=UTF-8"); PrintWriter pw = response.getWriter(); pw.print(jsonTreeRootObject); pw.flush(); pw.close();
json 파싱코드가 기존 작업보다 상당히 길어지고 구조또한 복잡해진거 같죠?
트리의 json object는 depth 구조로 작업을 해야하기 때문입니다.
다음 구조를 보시면 이해가 되실겁니다.
추가 자식노드가 존재하는 json object에 children key값으로
json array 객체를 담는구조가 되어야합니다.
실행을 해보도록 하겠습니다.
정상적으로 ajax call이 이루어지면서 json object 데이터를 화면에 출력이 되었습니다.
트리패널을 ajax call할때 depth별 구조를 잘 잡아 주어야 하므로 json 파싱작업때 주의해주세요!!
트리패널 ajax 호출 시 expand/collapse 이벤트가 한번만 발생하고 이후 동작이 되지 않을경우
proxy속성의 동일 depth에 animate : false 속성을 추가해주도록 합니다.
by 개발로짜
ExtJS 강좌 - 클릭이벤트를 적용하여 탭컴포넌트 동적으로 추가하기 (12) | 2014.11.08 |
---|---|
ExtJS 강좌 - 마우스우클릭으로 contextmenu(컨텍스트메뉴) 띄워보기 (0) | 2014.11.08 |
ExtJS의 그리드패널 reconfigure함수를 적용하여 컬럼 및 데이터 재설정하기 (0) | 2014.11.05 |
ExtJS 강좌 - 그리드패널에 페이징툴바를 적용하여 페이징 목록 출력하기 (10) | 2014.11.03 |
ExtJS 강좌 - 그리드패널을 출력시키기 위하여 이해를 한 후 출력시켜보자 (0) | 2014.11.03 |
이번 포스팅은 스프링 MVC 환경 설정중
한글깨짐 현상을 해결하기 위한방법을 포스팅 하도록 하겠습니다.
테스트를 위하여 form submit 테스트를 해보겠습니다.
2014/11/06 - [개발에필요한연동법/스프링연동] - STS 이클립스를 이용하여 UTF-8 인코딩 설정 및 Spring3 MVC 연동해보기
@RequestMapping("/form") public String form(){ return "form"; } @RequestMapping("/submit") public String submit(HttpServletRequest request, Model model){ model.addAttribute("text",request.getParameter("text")); return "submit"; }
2개의 컨트롤러를 추가 하였습니다.
form url은 입력폼이 들어있는 페이지입니다.
submit은 form페이지에서 입력받은 text태그의 내용을 출력하는 화면입니다.
각 페이지를 다음처럼 작성합니다.
<h3>폼전송</h3> <form action="/submit" method="post"> <input type="text" name="text" /> <input type="submit" value="전송"/> </form>
<h3>폼전송 결과 : ${text }</h3>
코드 작성을 하였다면 실행을 해보도록 하겠습니다.
실행결과 한글깨짐이 발생합니다.
request.setCharacterEncoding("utf-8");
submit 컨트롤러에 위와같이 설정을 해주면 한글을 깨지지 않겠지만
각 컨트롤러마다 추가를 해줄 수 없으므로 web.xml파일의 web-app 태그내에
다음과 같이 코드를 추가해주도록 합니다.
<filter> <filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter </filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
코드를 추가하셨다면 form URL을 재호출하여
한글전송을 테스트 해보도록 하겠습니다.
정상적으로 한글 출력이 잘되네요.
다음은 파일전송에 대하여 포스팅 하도록 하겠습니다.
by 개발로짜
Spring3 Pathvariable 어노테이션을 이용하여 PARAMETER를 URL처럼 받아보기 (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 |
STS 이클립스를 이용하여 UTF-8 인코딩 설정 및 Spring3 MVC 연동해보기 (3) | 2014.11.06 |