ExtJS에서 스토어는 상당히 자주 사용되는 ExtJS 클래스입니다.
앞으로 girdpanel,treepanel,combo 등...
다양한 컴포넌트에 store 클래스를 사용하게 되므로
이번 포스팅을 통하여 스토어 개념을 잡아보도록 하겠습니다.
가장 심플하게 구현이 가능한 콤보박스 컴포넌트를 예를들어 이해를 돕도록 하겠습니다.
데이터들을 담아주는 역할을 하는 클래스입니다.
HTML태그로 예를들자면 SELECT BOX에 목록을 출력시켜주려면 OPTION 태그가 필요합니다.
<select> <option value="1">첫번째값</option> <option value="2">두번째값</option> <option value="3">세번째값</option> </select>
option이 있어야 화면에 key값이 출력되고 value값이 선택되면 서버전송이 가능한 기능을 해줍니다.
만약 option 태그가 없다면 select 태그는 그저 빈 껍데기에 불과하겠죠?
이 option 태그와 같은 역할을 하는 기능이 store 클래스입니다.
store클래스를 사용하여 콤보박스를 구현해보도록 하겠습니다.
Ext.onReady(function(){ Ext.create('Ext.panel.Panel',{ renderTo : Ext.getBody(), width : 300, height : 300, title : '콤보박스예제코드', items : [{ //콤보박스 컴포넌트 선언 xtype : 'combo', //최초에는 빈값이 출력되므로 설정 emptyText : '선택', //화면에 보여주는 store data속성의 key값 displayField: 'display', //실제 선택되었을때의 store data속성의 key값 valueField: 'value', //default true값이여서 화면에 보여지는 displayField값 수정이 됩니다. //false로 지정해줘야 제대로된 콤보박스기능이 동작됩니다. editable : false, store : Ext.create("Ext.data.Store",{ //data 속성의 json object에 정의된 key 값들과 매칭시켜줍니다. fields : ['display','value'], //저장공간에 fix값으로 data 속성에 json array type으로 담아줍니다. data : [{ display : '보여주는화면1', value : '선택값1', },{ display : '보여주는화면2', value : '선택값2', },{ display : '보여주는화면3', value : '선택값3', },{ display : '보여주는화면4', value : '선택값4', },{ display : '보여주는화면5', value : '선택값5', }], //data 속성에 fix값이 정의되있으므로 type을 memory로 정해줍니다. proxy : { type : 'memory' } }) }] }) })
위 코드를 설명하자면 패널에 combo박스 컴포넌트를 생성(html 기준 select태그 생성)한 다음
store의 data 속성을 통하여 disply/value값(option 태그에 해당)을 선언해 주었습니다.
스토어 클래스에 fields의 key값을 data속성의 key값과 일치 시켜주어야 합니다.
fields 속성은 store의 model 속성에도 존재합니다.
fields 속성만을 사용해도 무관합니다.
간단하게나마 store 클래스의 fields 속성대신 model 속성을 적용해보도록 하겠습니다.
Ext.create("Ext.data.Store",{ //data 속성의 json object에 정의된 key 값들과 매칭시켜줍니다. model : Ext.create("Ext.data.Model",{ fields: ['display','value'] }), //저장공간에 fix값으로 data 속성에 json array type으로 담아줍니다. data : [{ display : '보여주는화면1', value : '선택값1', },{ display : '보여주는화면2', value : '선택값2', },{ display : '보여주는화면3', value : '선택값3', },{ display : '보여주는화면4', value : '선택값4', },{ display : '보여주는화면5', value : '선택값5', }], //data 속성에 fix값이 정의되있으므로 type을 memory로 정해줍니다. proxy : { type : 'memory' } })
실행화면 먼저 보고 설명을 진행하도록 하겠습니다.
콤보박스 초기화면
콤보박스 목록 OPEN
콤보박스 목록 선택
model 사용하는법이나 fields 사용하는 법이나 별 차이가 없습니다.
1회성으로 사용을 하여 model 속성에 직접적으로 create 해서 적용을 해주었습니다.
예를들어 콤보박스의 경우 보통 2개의 key/value fields 만 있으면 됩니다.
이럴경우, 계속 같은 fields인대 store 적용할때마다 create model을 해주어야 할까요?
그렇게 되면 같은코드도 반복되면서 소스자체가 길어지고 유지보수도 힘들어 지겠죠?
이럴경우 자주사용되는 model을 정의해놓은 후 만들어놓은 모델만 사용을 하게된다면 오히려 간결해지겠습니다.
나누는 부분에 대해서는 MVC구조에 대하여 포스팅때 진행하도록 하겠습니다.
MVC 구조로 나누게 되면 STORE 역시 정의하여 재활용이 가능합니다.
뭐... 우선은 "아 그렇구나~" 라는 정도만 알고계시라고요 ㅎㅎ
이번 포스팅은 proxy type을 memory에대하여 설명하였는데
다음 장은 proxy type이 ajax에 대하여 포스팅 하도록 하겠습니다.
by 개발로짜
ExtJS 강좌 - 그리드패널을 출력시키기 위하여 이해를 한 후 출력시켜보자 (0) | 2014.11.03 |
---|---|
ExtJS 강좌 - 데이터스토어(store)의 proxy ajax를 통하여 콤보박스 목록 출력시켜보기 (0) | 2014.10.30 |
ExtJS 강좌 - ExtJS 사이트에서 제공하는 API DOCUMENT문서 사용하는 방법 (0) | 2014.10.28 |
ExtJS 강좌 - 파일필드를 이용하여 파일업로드하기(html5를 이용한 다중파일 포함) (17) | 2014.10.28 |
ExtJS 강좌 - xtype을 이용하여 html의 입력태그들과 HTML에디터 컴포넌트를 출력시켜보자 (0) | 2014.10.27 |
지난 포스팅은 간단하게 폼필드에 대해서 작성을 해보았습니다.
2014/10/27 - [웹개발강좌/ExtJS] - ExtJS 강좌 - xtype을 이용하여 html의 입력태그들과 HTML에디터 컴포넌트를 출력시켜보자
이번에는 파일필드에 대해서 알아보도록 하겠습니다.
단일 파일업로드 ~ HTML5를 이용하여 버튼하나로 다중파일업로드까지 처리해보도록 하겠습니다.
서버페이지 관련 로직은 본인이 파일업로드시 처리하시는 PHP/JSP/ASP 등등.. 로직을 사용하시면 되겠습니다.
Ext.onReady(function(){ Ext.create("Ext.form.Panel",{ width : 600, renderTo : Ext.getBody(), items : [{ xtype : 'filefield', //라벨 정의 fieldLabel : '파일첨부', //파일첨부 버튼에 텍스트 정의 //정의 안할시 Browse... 디폴트 정의됨 buttonText : '찾아보기', //<input type="file" name="fileupload"> 와 동일하게 서버에서 받기위한 name명이 fileupload name : 'fileupload' },{ xtype : 'button', text : '전송', handler : function(btn){ //form 객체 찾기 var frm = btn.up("form").getForm(); //폼패널 검증 if(frm.isValid()) { //폼 submit frm.submit({ url: '/fileTest', waitMsg : '업로드 중...', success : function(fp, res) { var jsonResult = Ext.JSON.decode(res.response.responseText); var msg = "UPLAODED FILE NAME : " + jsonResult.filename+"<br />"; msg += "UPLAODED FILE SIZE : " + jsonResult.filesize; Ext.MessageBox.show({ title : '업로드완료', msg : msg, buttons : Ext.MessageBox.YES, icon : Ext.MessageBox.INFO }); } }); } } }] }) })
처음으로 이벤트 핸들러의 코드라인이 많이 길어졌습니다.
로직을 설명드리자면
1. name값이 'fileupload' 라는 filefield를 폼필드 내에 선언 한 다음 handler를 이용하여 버튼클릭 이벤트 실행
2. 폼양식을 체크 한 후 true일 경우 form필드내에 있는 입력폼들을 submit
3. submit은 ajax call이 일어난 후 success callback 함수를 호출합니다.
※ 이경우 서버페이지에서 json object 로 전송받은 데이터들을 받아낼 수 있으며 별도로 화면 제어가 가능
4. formsubmit의 속성중 url은 submit url 페이지를 의미 form 태그의 action과 동일
5. waitMsg의 경우 submit 하는 도중 로딩바기능처럼 화면에 진행상태를 표시해주는 역할
callback으로 받은 스크립트 코드중, res.response.responseText라는 부분이 있습니다.
이 코드는 서버에서 전달한 json object를 담아온 데이터입니다.
하지만 object 타입이 아닌 text 타입이므로 Ext.JSON.decode를 이용하여 json object로 변경을 해준 것입니다.
Ext.Message.show는 전에 다이얼로그창 강좌에서 작성한 내용중 일부 컴포넌트를 작성한 내용입니다.
2014/10/23 - [웹개발강좌/ExtJS] - ExtJS 강좌 - 다이얼로그창을 이용하여 깔끔하게 종류별로 메시지창 띄워보기
서버페이지는 샘플용으로 저는 다음과 같이 작성 해보았습니다.
저같은 경우는 Spring3 MVC + jackson(json api) 를 이용한 샘플 서버코드입니다.
// filefield에서 정의해준 name값 private MultipartFile fileupload; public MultipartFile getFileupload() { return fileupload; } public void setFileupload(MultipartFile fileupload) { this.fileupload = fileupload; }
@RequestMapping(value="/fileTest") public @ResponseBody Map<String, Object> fileTest(Vo vo, HttpServletRequest request, HttpServletResponse response) { Map<String, Object> map = new HashMap<String, Object>(); //필수 값 map.put("success", true); map.put("filename", vo.getFileupload().getOriginalFilename()); map.put("filesize", vo.getFileupload().getSize()); return map; }
서버코드에서 필수로 json object에 넘겨줘야 할 key/value 값은
success key 값에 value가 true로 넘겨주어야 클라이언트부분에 success callback 호출이 가능합니다.
실행결과는 다음과 같습니다.
실행결과 다음처럼 싱글 파일 업로드가 완료되었습니다.
이어서 HTML5를 이용하여 다중파일업로드를 진행해보도록 하겠습니다.
Ext.onReady(function(){ Ext.create("Ext.form.Panel",{ width : 600, renderTo : Ext.getBody(), items : [{ xtype : 'filefield', buttonOnly: true, buttonText : '파일첨부', //<input type="file" name="fileupload"> 와 동일하게 서버에서 받기위한 name명이 fileupload name : 'fileupload', listeners:{ afterrender:function(object){ //input type="file" 태그 속성중 multiple이라는 속성 추가 object.fileInputEl.set({multiple:'multiple'}); }, change : function(object, value, eOpts ){ //파일첨부를 다중으로 선택시 열시버튼 누르면 //change 이벤트를 발생시켜 폼 submit! var frm = object.up("form").getForm(); if(frm.isValid()) { frm.submit({ url: '/fileTest', success : function(fp, res) { //json text to json object var jsonResult = Ext.JSON.decode(res.response.responseText); var msg = "업로드된 파일명<br/>"; //jQuery $.each 와 동일 문법 Ext.each(jsonResult.filelist,function(object){ msg += object.filename+"("+object.filesize+" byte)"+","; }); msg = msg.substring(0,msg.length-1); Ext.MessageBox.show({ title : '업로드완료', msg : msg, buttons : Ext.MessageBox.YES, icon : Ext.MessageBox.INFO }); //한번 submit 처리가 되면 filefield는 초기화 되므로 //다시 filefield에 multiple 속성 설정 object.fileInputEl.set({multiple:'multiple'}); } }); } } } }] }) })
싱글 파일업로드 경우 버튼 클릭 핸들러를 적용하여 서버로 submit 처리를 하였지만
다중파일은 change 이벤트 적용시 form submit 처리를 하도록 하였습니다.
현재 extjs5에서 filefield에 별도로 multiple 속성값을 제공하지 않는 관계로
임의로 파일태그내에 multiple 속성을 별도로 지정해주었습니다.
change 이벤트로 싱글파일업로드도 가능합니다.
1. afterrender : 랜더링이 완료 된후에 발생되는 기능정의를 의미하는 것인대 함수내 정의한 코드를 보시면
xtype이 filefield내에 fileInputEl속성의 set함수를 이용하여 input type="file" 태그에 multiple="multiple" 이란
HTML5 다중파일 속성을 지정하였습니다.
2. change : 파일첨부가 일어나는 시점에 발생되는 이벤트입니다. 이 코드를 이용하여 단일 파일업로드도 가능합니다.
이어서 설명드리자면 파일첨부 버튼 클릭 후 파일탐색기에서 여러개 파일 선택 후 열기 버튼 클릭시
자동으로 form submit이 되게 처리 하였습니다.
submit 후 callback 부분은 기존 싱글파일업로드와 동일하지만 마지막 코드에 추가로 또한번 multiple 속성을
지정해주었습니다.
재지정해준 이유는 form submit이 이루어 진후 multiple 속성이 초기화 되는 문제로 다시한번 multiple 속성을 지정해
준것입니다.
변경된 서버코드는 다음과 같이 작성되었습니다.
//다중파일에 정의한 filefield name명 private ArrayList<MultipartFile> fileupload; public ArrayList<MultipartFile> getFileupload() { return fileupload; } public void setFileupload(ArrayList<MultipartFile> fileupload) { this.fileupload = fileupload; }
@RequestMapping(value="/fileTest") public @ResponseBody Map<String, Object> fileTest(ConnectionInfo connectionInfo, HttpServletRequest request, HttpServletResponse response) { Map<String, Object> map = new HashMap<String, Object>(); Map<String, Object> map2 = null; ArrayList<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); if(connectionInfo.getFileupload() != null && connectionInfo.getFileupload().size() > 0) { for(MultipartFile file : connectionInfo.getFileupload()) { map2 = new HashMap<String, Object>(); map2.put("filename", file.getOriginalFilename()); map2.put("filesize", file.getSize()); list.add(map2); } } map.put("success", true); map.put("filelist", list); return map; }
실행결과를 보도록 하겠습니다.
실행결과 위화면처럼 다중파일업로드 결과가 출력되었습니다.
현재는 리스너 속성내에 정의된 이벤트들에 대한 이해가 안오시는 분들이 대부분이실 겁니다.
다음시간에는 간단하게 ExtJS의 Document 문서를 보면서
컴포넌트들의 주요속성 및 이벤트 핸들링에 대한 이해를 돕고자
설명을 진행을 하도록 하겠습니다.
문서 보는법을 간단하게나마 익히셔야 앞으로 포스팅 하는 내용들을 이해하실 수 있을 겁니다.
by 개발로짜
ExtJS 강좌 - 콤보박스를 예를들어 스토어(STORE) 개념잡아보기 (0) | 2014.10.30 |
---|---|
ExtJS 강좌 - ExtJS 사이트에서 제공하는 API DOCUMENT문서 사용하는 방법 (0) | 2014.10.28 |
ExtJS 강좌 - xtype을 이용하여 html의 입력태그들과 HTML에디터 컴포넌트를 출력시켜보자 (0) | 2014.10.27 |
ExtJS 강좌 - 버튼클릭으로 윈도우 모달창 띄워보기 (2) | 2014.10.24 |
ExtJS 강좌 - 다이얼로그창을 이용하여 깔끔하게 종류별로 메시지창 띄워보기 (4) | 2014.10.23 |
HTML에서 다양한 태그들이 존재하는 것처럼 ExtJS 역시 다양한 종류의 XTYPE이 존재합니다.
xtype은 기본 input 태그들에 살을 좀더 붙여서 만들어놓은 컴포넌트라고 생각하시면 되겠습니다.
그럼 자주 사용되는 input 태그들을 extjs의 xtype을 이용하여 출력시켜 보도록 하겠습니다.
비교를위한 HTML 입력폼을 간단하게 만들어보도록 하겠습니다.
이름 : <input type="text" /><br/> 패스워드 : <input type="password" /><br/> 생년월일 : <input type="text" /><br/> 나이 : <input type="text"/><br/> 성별 : <input type="radio" />남 <input type="radio" />여<br/> 메일주소 : <input type="text" /> @ <input type="text" /><br/> 자기소개 <br/><textarea rows="10" cols="50"></textarea><br/> <input type="checkbox" />메일수신에 동의합니다.<br/> <input type="button" value="가입하기" />
위 작성한 디자인 전~~혀 되있지 않는 코드를 한변 실행해보도록 하겠습니다.
실행결과 위와 같은 화면이 실행되었습니다.
디자인을 적용하면 물론 깔끔해지긴 하겠지만
저의 목적은 각 타입의 비교 및 이해를 시키고자 작성한 것이므로
css 적용은 하지 않았습니다.
위와같이 일반 태그들을 적용하였습니다.
그렇다면 별도로 CSS코딩을 하지 않고
이미 모든 준비가 되어있는 ExtJS의 XTYPE을 이용하여
동일하게 혹은 좀더 업그레이드 하여 구현하도록 해보겠습니다.
※ 추가로 ExtJS에서 제공해주는 기본 HTML 에디터까지 적용해보았습니다.
Ext.onReady(function(){ //form submit을 위한 form 패널을 생성 Ext.create("Ext.form.Panel",{ renderTo : Ext.getBody(), title : '폼필드 예제', width: 600, items : [{ fieldLabel: '이름', //<input type="text"/> 와 동일폼 xtype : 'textfield', },{ fieldLabel: '비밀번호', xtype : 'textfield', //<input type="password"/> 와 동일폼 inputType: 'password' },{ fieldLabel: '생년월일', //datepicker 달력 폼 xtype : 'datefield', format : 'Y.m.d' },{ fieldLabel: '나이', //숫자만 입력가능한 폼 xtype : 'numberfield', maxValue : 100, minValue : 0 },{ fieldLabel: '성별', //<input type="radio"/>와 동일폼 xtype: 'radiogroup', items: [ {boxLabel: '남', name : 'radio', inputValue: 1, checked: true}, {boxLabel: '여', name : 'radio', inputValue: 2}, ] },{ fieldLabel: '메일주소', //<input type="text"/> 와동일폼이면서 vtype을이용한 자동 메일주소검증 xtype : 'textfield', vtype : 'email' },{ //<textarea></textarea>와 동일폼 xtype: 'textareafield', fieldLabel: '자기소개' },{ //checkbox 선언 전 checkboxgroup으로 감싸주어야함 xtype: 'checkboxgroup', items: [ //<input type="checkbox"/>와 동일폼 {xtype: 'checkboxfield', boxLabel: '메일수신에 동의합니다', name: 'chkarr'} ] },{ //HTML 에디터 컴포넌트 xtype: 'htmleditor', fieldLabel : '비고' }], fbar : [{ xtype : 'button', text : '가입하기' }] }) })
위처럼 폼화면이 만들어 졌습니다.
코드에 주석들을 달긴하였지만 알아두셔야 할 부분이
기존에 일반 panel 도화지를 사용했었는데
이번 코드에서는 도화지만 form.panel 도화지를 사용하였습니다.
폼패널을 사용한 이유는 이번 포스팅에서는 구현이 되지 않았지만
HTML태그 기준으로 FORM SUBMIT을 하기 위함이랑
동일한 동작을 실행시키기 위해서 폼패널 도화지를 이용하였습니다.
"submit테스트를 하거나 각 입력값들을 받아오는법까지 설명해야지"
라고 말씀하시는분들이 계실건대 리스너 핸들링은 추후에 설명 드리겠습니다.
언제 설명하냐고요?
언젠가는 설명하겠죠...
컴포넌트 생성하는 습관(?)을 기른 후에 천천히 진행하려 합니다..
초심자였을때의 생각을 해보시면 HTML태그를 처음 접하려고 하셨을때!!
상당히 머리가 아프셨을겁니다.
대충 html을 이해하시려 했을때
자바스크립트와 CSS 이건또 뭐지?
멘붕이 오셨을 텐데
이런 순서와 유사하다고 보시면 되겠습니다.
기본적으로 껍데기 생성법을 익히신 다음
자바스크립트와 CSS 단계인 리스너 핸들러 단계 및 기능구현을 하고자 순차적으로 진행하는것이니..
급하신분들은 ExtJS EXAMPLE + DOCUMENT를 제공해주는
영문사이트로 고고!!
그리고 이번 포스팅에서는 빼먹은 태그(?)들이 존재합니다.
파일필드 및 콤보박스에 대해서는 폼필드안에 정의하긴 해야하겠지만
간단한 예를들어서 만들어보고자 이번 작성에서는 제외하였습니다.
다음 포스팅은 파일필드를 이용하여
간단하게 싱글파일 전송과
HTML5를 이용한 MULTIPLE 파일 전송에
대한 예를 다루어 보도록 하겠습니다.
by 개발로짜
ExtJS 강좌 - ExtJS 사이트에서 제공하는 API DOCUMENT문서 사용하는 방법 (0) | 2014.10.28 |
---|---|
ExtJS 강좌 - 파일필드를 이용하여 파일업로드하기(html5를 이용한 다중파일 포함) (17) | 2014.10.28 |
ExtJS 강좌 - 버튼클릭으로 윈도우 모달창 띄워보기 (2) | 2014.10.24 |
ExtJS 강좌 - 다이얼로그창을 이용하여 깔끔하게 종류별로 메시지창 띄워보기 (4) | 2014.10.23 |
ExtJS 강좌 - 메뉴버튼을 포함한 다양한 버튼컴포넌트 구현해보기 (4) | 2014.10.22 |