지난 포스팅은 간단하게 폼필드에 대해서 작성을 해보았습니다.
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 |
이번에는 게시판에 주로 사용되는 페이징 쿼리에 대해서 DBMS별로 포스팅해보도록 하겠습니다.
DBMS 종류는 MySQL,ORACLE,MSSQL 2005(+) 을 작성해보도록 하겠습니다.
페이징쿼리를 돌리기위한 테이블 + 데이터가 필요하겠죠?
기존에 데이터가 많이 쌓여있는 테이블로 테스트 하셔도 무관하나
저같은 경우에는 예를들기위해 임의로 테이블 생성을 해보도록 하겠습니다.
create table board( idx int, title varchar(100) ); insert into board values(1,'제목1'); insert into board values(2,'제목2'); insert into board values(3,'제목3'); insert into board values(4,'제목4'); insert into board values(5,'제목5'); insert into board values(6,'제목6'); insert into board values(7,'제목7'); insert into board values(8,'제목8'); insert into board values(9,'제목9'); insert into board values(10,'제목10'); insert into board values(11,'제목11'); insert into board values(12,'제목12'); insert into board values(13,'제목13'); insert into board values(14,'제목14'); insert into board values(15,'제목15'); insert into board values(16,'제목16'); insert into board values(17,'제목17'); insert into board values(18,'제목18'); insert into board values(19,'제목19'); insert into board values(20,'제목20');
테이블 생성 후 임의로 20개정도의 데이터 등록을 하였습니다.
생성된 데이터를 이용하여 DBMS별로 페이징 쿼리를 작성해보도록 하겠습니다.
MySQL은 LIMIT 문법을 사용하여 페이징 쿼리를 만들 수 있습니다.
SELECT 컬럼1,컬럼2, ... 컬럼 n FROM 테이블명 LIMIT 시작INDEX, 뽑을데이터수
위 쿼리를 이용하여 페이징 쿼리를 만들 수 있습니다.
※ limit 다음 2개의 값을 작성해주게 되어있는데 하나만 작성 할 경우 뽑힌 data의 정의된 수 만큼 출력이 됩니다.
기존의 뽑힌 데이터를 가지고 페이지당 5개씩 출력해보도록 하겠습니다.
-- 1페이지 SELECT * FROM board LIMIT 0,5; -- 2페이지 SELECT * FROM board LIMIT 5,5; -- 3페이지 SELECT * FROM board LIMIT 10,5; -- 4페이지 SELECT * FROM board LIMIT 15,5;
각 페이지별 페이징 쿼리를 작성 후 실행해 보았습니다.
게시판의 페이지라고 생각하고 페이지별로 데이터를 출력해보았습니다.
오라클 경우 ROWNUM을 이용하여 페이징쿼리를 만들 수 있습니다.
-- 1 페이지 SELECT * FROM ( SELECT rownum rnum,idx,title FROM board ) board WHERE rnum BETWEEN 1 AND 5; -- 2 페이지 SELECT * FROM ( SELECT rownum rnum,idx,title FROM board ) board WHERE rnum BETWEEN 6 AND 10; -- 3 페이지 SELECT * FROM ( SELECT rownum rnum,idx,title FROM board ) board WHERE rnum BETWEEN 11 AND 15; -- 4 페이지 SELECT * FROM ( SELECT rownum rnum,idx,title FROM board ) board WHERE rnum BETWEEN 16 AND 20;
작성한 쿼리를 실행해보도록 하겠습니다.
마지막으로 MSSQL 페이징 쿼리에 대하여 작성해보도록 하겠습니다.
MSSQL 2005부터 지원이 되는 ROW_NUMBER() 함수를 이용하여 페이징 처리를 하도록 하겠습니다.
※ MSSQL 2000버전에는 ROW_NUMBER() 지원이 되지 않습니다. 2000버전은 TOP 절을 이용하여 페이징 처리를 해줍니다.
MS-SQL 2000에 대한 페이징쿼리를 다음에 포스팅 하도록 하겠습니다.
-- 1 페이지 SELECT * FROM ( SELECT row_number() over(order by idx) rnum,idx,title FROM board ) board WHERE rnum BETWEEN 1 AND 5; -- 2 페이지 SELECT * FROM ( SELECT row_number() over(order by idx) rnum,idx,title FROM board ) board WHERE rnum BETWEEN 6 AND 10; -- 3 페이지 SELECT * FROM ( SELECT row_number() over(order by idx) rnum,idx,title FROM board ) board WHERE rnum BETWEEN 11 AND 15; -- 4 페이지 SELECT * FROM ( SELECT row_number() over(order by idx) rnum,idx,title FROM board ) board WHERE rnum BETWEEN 16 AND 20;
MSSQL 2005 페이징쿼리 실행 결과는 ORACLE 페이징쿼리결과와 동일하므로 생략하였습니다.
by 개발로짜
MSSQL,ORACLE을 이용하여 트리구조로 출력시켜주는 재귀쿼리를 만들어보자 (0) | 2014.10.26 |
---|---|
oracle,mssql,mysql 문자열 합치기 사용법을 비교해보자 (0) | 2014.10.17 |
오라클 시퀀스 생성법과 테이블에 등록시 시퀀스 자동증가등을 알아보자 (0) | 2014.10.15 |
MySQL과 MSSQL의 시퀀스생성 및 초기화 하는방법에 대해서 알아보도록 하자 (0) | 2014.10.14 |
MySQL- GROUP_CONCAT 함수로 세로로 출력된 결과를 하나의 컬럼에 가로로 출력하기 (0) | 2014.10.13 |