GXT RIA App 만들기2011. 1. 15. 03:44

1. 본격적인 코딩에 들어가기 전에 프로젝트 생성 시 만들어진 파일들을 정리하자

▶ RiaApp.java를 아래와 같이 정리한다.


▶ war 밑에 위치한 RiaApp.html을 아래와 같이 정리한다.


▶ RiaApp.gwt.xml파일을 아래와 같이 정리한다.


▶ 이제 gxt기능을 사용하기 위한 라이브러리를 등록하자. gxt.jar파일을 그림과 같이 lib폴더에 복사하고 Build Path를 잡아주자.




2. 이제 필요한 클래스를 하나씩 만들어 보자. 현재 상태에서 어플리케이션을 실행해도 아무것도 나오지 않는다.
우리는 여기에 하나씩 살을 붙여 UI를 구성해 보도록 하자


▶ 이번 강좌에서 필요한 클래스는 3가지 클래스가 필요하다.
 AppEvents.java  EventType클래스를 이용해 이벤트를 정의 한다.
 AppController.java  Controller 클래스를 상속받아 AppView가 실행될 수 있도록 돕는다.
 Controller 클래스는 MVC모델의 C에 해당된다고 생각하면 되겠다.
 AppView.java  View클래스를 상속받아 화면에 보여질 UI구성요소 등을 정의한다.
 MVC모델의 V에 해당되겠다.

▶ 일단 AppEvents.java에 이벤트를 정의 하자. 이름에서 대강의 쓰임새를 알 수 있을 것이다. 이렇게 이벤트를 정의하여
    Controller나 View에서 사용할 수 있는 것이다.
package com.gxt.riaapp.client;
import com.extjs.gxt.ui.client.event.EventType;
public class AppEvents {
    public static final EventType Init = new EventType();
    public static final EventType ShowPage = new EventType();
    public static final EventType HidePage = new EventType();
    public static final EventType TabChange = new EventType();
    public static final EventType ChartLoading = new EventType();
    public static final EventType Login = new EventType();
    public static final EventType Error = new EventType();
}
▶ 이번에는 우리가 만들 어플리케이션의 뼈대를 구성할 View 클래스를 생성해 보자. 아래 클래스는 View클래스를
    상속 받고 최소한의 생성자와 handleEvent() 메소드만 정의 되어 있다. 여기에 살을 붙여 기본 틀을 구성하게 된다.
package com.gxt.riaapp.client.mvc;

import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Controller;
import com.extjs.gxt.ui.client.mvc.View;

public class AppView extends View {
    public AppView(Controller controller) {
        super(controller);
    }
    @Override
    protected void handleEvent(AppEvent event) {
    }
}
▶ 다음은 위의 두개의 클래스를 통제할 Controller클래스를 생성한다. 이 클래스는 최초의 Init이벤트가 호출될 시 AppView로
    이동하여 기본 화면 틀을 보이도록 제어하는 역할을 하게 된다.
package com.gxt.riaapp.client.mvc;

import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Controller;
import com.gxt.riaapp.client.AppEvents;

public class AppController extends Controller {
    private AppView appView;
    public AppController() {
        appView = new AppView(this);
        registerEventTypes(AppEvents.Init); // 등록과 동시에 handleEvent메소드 호출
    }
    @Override
    public void handleEvent(AppEvent event) {
        if (event.getType() == AppEvents.Init) { // 호출시 전달된 이벤트가 Init라면 
            forwardToView(appView, event);
        }
    }
}
▶ 이제 위에서 생성한 Controller를 RiaApp클래스에 탑재 해 보도록 하자. 아래 소스에서 주목할 부분은 Dispatcher 클래스에
    Controller를 추가하고 이벤트를 전달하여 Dispatcher내의 여러 Controller들이 움직이도록 하는데 있다.
package com.gxt.riaapp.client;

import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.google.gwt.core.client.EntryPoint;
import com.gxt.riaapp.client.mvc.AppController;

/**
 * Entry point classes define onModuleLoad().
 */
public class RiaApp implements EntryPoint {
	private Dispatcher dispatcher;
	public void onModuleLoad() {
		dispatcher = Dispatcher.get();
	    dispatcher.addController(new AppController());
	    dispatcher.dispatch(AppEvents.Init);
	}
}

3. 이제 AppView클래스를 수정하여 아래 그림과 같은 표대를 만들어 보자 .

Posted by 베니94
카테고리 없음2011. 1. 15. 01:57


지금이 새벽 2시가 조금 안된 시간이군.... 오픈 잘할 수 있을 라나....다 문제....

저번주에 도망갔어야 했는데..... 쩝 오른쪽 어깨는 점점 말을 안듣구...

에구 ㅠ.ㅠ 난방 두 안해주네.. 점퍼를 비싼걸 사길 잘했어... ㅋㅋ
Posted by 베니94
GXT RIA App 만들기2011. 1. 13. 21:09
강좌 소스를 공유하기 위해 구글프로젝트에 프로젝트를 생성하고 구글에서 제공하는 svn을 이용해
소스를 받을 수 있도록 세팅한다
.

 

1. 프로젝트를 생성하자
   - 구글 코드 code.google.co.kr에 접속하여 프로젝트를 생성한다.
   - 이를 통해 강좌 소스를 svn을 통해 내려받을 수 있다. 이부분은 따라하지 마세요



▶code.google.com으로 접속해서 ext-gwt-ria-app로 검색하면 아래처럼 우리가 생성한 프로젝트를 확인할 수 있다.


▶ File -> New -> Other를 선택한 후 아래화면에서 "SVN"입력한다.


 
▶ "Project from SVN"을 선택하고 "Next"를 클릭한면 아래화면을 확인 할 수 있다.
▶ "Create a new repository location"을 체크하고 "Next"를 클릭한다.


▶ URL란에 http://ext-gwt-ria-app.googlecode.com/svn/RiaApp/를 입력하고 "Next"를 클릭한다.


▶ Date를 체크하고 "Finish"를 클릭한다.


▶svn client가 위에서 정해 준 주소로 접속해 RiaApp프로젝트를 검색한다.


▶ "Next"를 클릭한다.


▶ 로컬디스크에 저장할 workspace를 선택한다. 별다른게 없다면 "Finish"를 클릭하자.


▶ 최종 로컬 이클립스에 내려온 모습니다. 이전에 프로젝트가 동일한 이름으로 만들어져 있었다면 이클립스는 프로젝트를
    지우고 svn서버에서 내려받은 파일로 프로젝트를 구성하게 될것 이다.


▶ 이 과정을 거치게 되면 강좌소스를 변경하게 되면 svn을 통해 소스를 내려받을 수 있게 된다. 간단하게 내가 소스를 수정하고
   수정된 소스를 내려받는 과정을 알아보도록 하자.
   사전에 RiaApp.java를 일부 수정하였다. 수정된 내용을 내려 받을 수 있는지 보도록 하자.
▶ 그전에 필자가 이미 소스를 수정해서 커밋했으므로 어떤 내용이 커밋되었는지 구글 코드를 통해 먼저확인 할 수 있다.
▶ 구글코드(code.google.com)에 접속해 "ext-gwt-ria-app"로 프로젝트를 검색하고 아래와 같이 "Source"를 클릭하여
    변경된 내용을 확인 할 수 있다. "r5 변경된 내용을 내려받는지 확인한다"는 조금전에 필자가 커밋한 내용이다.
    "r5"를 클릭하자


▶ "r5"를 클릭하면 변경된 내용이 어떤 파일인지 확인 할 수 있다. 변경된 파일은 RiaApp.java이고 로그메시지는 "변경된 내용..."이다.
    이제 자신의 이클립스의 svn을 통해 변경된 RiaApp.java를 내려받아 보자.


▶ 아래의 그림과 같이 RiaApp.java파일에서 마우스우측 클릭하고 Team->Update를 클릭하자. 만약 어떤 파일이 수정되었는지
    모른다면 프로젝트 루트에서 같은 방법으로 전체 파일을 업데이트 받을 수 있다.

▶ 아래와 같이 RiaApp.java가 svn을 통해서 필자가 업데이트 한 내용을 로컬로 내려받은 것을 확인 할 수 있다.


이렇게 해서 강좌에서 사용되는 소스파일을 간단하게 svn을 통해 내려받게 된다. 그러나 여러분에게는 권한이 없으므로 각자가 수정한 소스를 커밋할 수는 없다. 단 로컬에서 수정은 자유롭다. - 끝 -
Posted by 베니94
Gxt, Gwt2011. 1. 11. 16:57
아래 동영상은 Gxt Scheduler에 터치를 적용 한 경우다 .  우와~ 감탄사가 나오더군요 !!
향 후 웹어플들이 어디까지 진화 할 지 기대됩니다.


'Gxt, Gwt' 카테고리의 다른 글

Ext GWT Book  (0) 2011.01.11
GXT Scheduler  (0) 2011.01.11
날자 형식의 표현  (0) 2011.01.06
스크린 샷  (0) 2011.01.06
Posted by 베니94
Gxt, Gwt2011. 1. 11. 16:50

Ext Gwt에 대한 문서 등이 그리 많지 않았던 때 우연히 찾아낸 사이트로 상당히 괜찮은 내용이 오픈되어 있다. 내 경우 아마존 가서

직접 pdf를 사서 봤지만 웹에 오픈된 걸 찾았을 때는 이미 돈주구 구입한 뒤라 소위 뒷북을 치고 말았다. 된장~

참고 사이트 : http://issuu.com/turbokuzmich/docs/developing_with_ext_gwt

'Gxt, Gwt' 카테고리의 다른 글

Gxt Scheduler Touch Support  (3) 2011.01.11
GXT Scheduler  (0) 2011.01.11
날자 형식의 표현  (0) 2011.01.06
스크린 샷  (0) 2011.01.06
Posted by 베니94
Gxt, Gwt2011. 1. 11. 16:43
Gxt를 이용한 웹용 스케즐러로 구글 캘랜더와 유사한 UI를 가지고 있다. 회사 인턴이 들어와서 이 녀석에게 샘플을 만들어 보라고
시켰더니 꽤 괜찮은 놈이 나왔다.
참고 사이트 : http://www.ext-scheduler.com/





 

'Gxt, Gwt' 카테고리의 다른 글

Gxt Scheduler Touch Support  (3) 2011.01.11
Ext GWT Book  (0) 2011.01.11
날자 형식의 표현  (0) 2011.01.06
스크린 샷  (0) 2011.01.06
Posted by 베니94
음악2011. 1. 11. 16:18

Far East Movement는 일본, 중국, 한국, 필리핀계의 다양한 아시아계 인종으로 구성된 미국 일렉트릭
 힙합
그룹이다. 한국계로 알려져 있어 모두 한국인으로 착각했는데 아무튼 다민족 2세들로 구성된
특이한 그룹인것 같다.


노래에서 느낄 수 있지만 기존 힙합에 비해 상당히 부드럽고 세련된 음악을 구사한다.

이 곡은 빌보드 싱글챠트  1위를  한곡으로 라이언테더가 피쳐링한 곡이다

Posted by 베니94
Gxt , Ext Gwt강좌2011. 1. 11. 10:27
2011/01/06 - [Gxt , Ext Gwt강좌] - Ext Gwt[Gxt] 강좌07-GxtSmpl모듈 개발하기


1. 우리는 gxtsmpl.client아래에 GxtSmplService라는 이름으로 서비스를 생성하였다. 이제 생성된 서비스를 이용하여
     서비스내에 메소드를 작성하고 이 작성된 메소드를 Client UI에서 이용할 수 있도록 코딩하도록 하자.
우선 추가한 Service에 데이터베이스에서 테이블의 내용을 끌고 올 메소드를 정의하자.
// GxtSmplService.java   
public interface GxtSmplService extends RemoteService {   
/**  
 * Utility class for simplifying access to the instance of async service.  
 */  
  public static class Util {   
    private static GxtSmplServiceAsync instance;   
      public static GxtSmplServiceAsync getInstance(){   
        if (instance == null) {   
          instance = GWT.create(GxtSmplService.class);   
        }   
        return instance;   
      }   
  }   
  // Return type과 LoadConfig에 주목하자.   
  public BaseListLoadResult getSystemUserList(BaseListLoadConfig config, HashMap param) throws Throwable;   
}   
// GxtSmplServiceAsync.java   
public interface GxtSmplServiceAsync {   
  public void getSystemUserList(BaseListLoadConfig config, HashMap param,
 AsyncCallback> callback);   
}  
2. 위와 같이 GxtSmplService.java에 메소드를 정의하게 되면 같은 패키지의 GxtSmplServiceAsync.java와 GxtSmplServiceImpl.java에도 동일한 메소드가 정의 된다. GxtSmplService.java와 GxtSmplServiceAsync.java는 인터페이스로 메소드를 정의하고 실제 구현은 server패키지내의 GxtSmplServiceImpl.java에서 하게 된다. com.hansol.gxtsmpl.server.GxtServiceImpl.java를 열어서 아래와 같이 시스템 로그를 남겨 클라이언트에서 서버와 통신하는지 알아보도록 하자.
@Override  
public BaseListLoadResult getSystemUserList(BaseListLoadConfig config, HashMap param) 
throws Throwable {   
  System.out.println("호출되나.....");   
}  

이제 실제 클라이언트 단에서 위의 메소드를 콜하도록 GridSmplTabItem클래스의 prepareService메소드를 수정하자.
	
private GxtSmplServiceAsync service; // 서비스선언
private HashMap param = new HashMap(); // 파라메터 전달용 hashmap
	/**
	 * Desc : 서버통신모듈 관련
	 */
	public void prepareService(){
		downGridPanel = new ContentPanel();
		downGridPanel.setHeading("관리자 현황");
		downGridPanel.setWidth(800);
		downGridPanel.setHeight(400);
		service = (GxtSmplServiceAsync) Registry.get(GxtApp.SERVICE);
		proxy = new RpcProxy>() {
			@Override
			public void load(Object loadConfig,	AsyncCallback> callback) {
				//try{param.put("search_name", search_name.getValue());}catch(Exception e){System.out.println("!!!!!!!!!!!!!!!!"+ e.toString());};
				
				service.getSystemUserList((BaseListLoadConfig) loadConfig, param, callback); // 추가한 메소드 호출
			}
		};
		loader = new BaseListLoader>(proxy);
		loader.setRemoteSort(true);
		store = new ListStore(loader);
		store.setMonitorChanges(true);
	}
------------------------------------------------------------------------------------------
// GxtApp.java의 상단에 아래 내용 추가해주세요. 그래야 위에서 호출하는 GxtApp.SERVICE가 
// 에러가 안나겠죠.
------------------------------------------------------------------------------------------
// 서버와 통신모듈 선언
	public static final String SERVICE = "GxtSmplService";

3. 이제 예제를 실행하면 아래와 같이 Console창에 로그가 출력되는 것을 확인 할 수 있다.

4. 이제 Client와 Server가 통신하는 것을 확인했으니 Impl클래스를 제대로 구현해서 Grid에 내용이 표시되도록 해보자. 우리는 데이터베이스안 데이터를 Select해와야 하므로 디비와 통신하기 위한 설정이 필요하다. 여기서는 간단하게 jdbc드라이버와 jdbc드라이버를 구현하는 클래스를 만들도록 해보자.
우선 jdbc드라이버를 war/WEB-INF/lib폴더에 카피하고 이클립스가 인식하도록 아래 그림과 같이 Build Path를 잡아주도록 하자.


5. 이제 DBSource라는 클래스를 만들고 디비커넥션을 맺어 올수 있도록 코딩하자. 클래스는 server 아래에 두도록 한다.
package com.hansol.gxtsmpl.server;   
  
import java.sql.Connection;   
import java.sql.DriverManager;   
  
public class DBSource {   
  static String driver;   
  static String url;   
  static String user;   
  static String passwd;   
  
  public static  Connection getConnection( String name) throws Exception{   
    driver = "oracle.jdbc.driver.OracleDriver";   
    url = "jdbc:oracle:thin:@디비서버아이피:포트:SID";      
    user = "user명";   
    passwd = "패스워드";   
    Class.forName(driver);   
    Connection con = DriverManager.getConnection(url, user, passwd);   
    return con;       
  }   
}  
6. 이제 Impl클래스의 메소드를 변경해보자. 기존 System.out.println("호출되나''");는 삭제하고 아래와 같이 코딩하자.
@Override  
public BaseListLoadResult getSystemUserList(   
  BaseListLoadConfig config, HashMap param) throws Throwable {   
  // return시 java.util.List에 LoginUserInfo객체를 차곡차곡 쌓아 리턴한다.   
  List returnValue = new ArrayList();   
  Connection conn = null; // 데이터베이스 커넥션 객체   
  PreparedStatement pstmt = null;  // 쿼리를 실행할 Statement객체   
  ResultSet rs = null;  // 쿼리를 실행한 후 꺼내온 데이터를 담을 객체   
  StringBuffer sql = new StringBuffer(); // SQL을 정의할 StringBuffer클래스   
  try{   
    conn = DBSource.getConnection(); // DBSource클래스에서 커넥션을 생성한다.   
    // 이하 쿼리 정의    
    // 쿼리는 테이블 내의 데이터를 모두 가져온다.    
    // 이때 주의할 것은 Client Grid의 컬럼정의 시(new ColumnConfig("userSabun",    
    // "사번", 75)) ColumnConfig생성시 사용된 이름과 컬럼명이 동일해야 Sort처리시 쿼리에     
    // 문제가 발생하지 않는다 해서 아래 쿼리에서는 alias를 주어 실제 컬럼명과 Grid에서   
    //  사용된 컬럼명을 일치 시켜주도록 하고 SubQuery를 사용해 sort시 문제가 발생하지    
    // 않도록 조치했다.   
    sql.append(" select * from (");   
    sql.append(" Select userid userSabun, username userName,     \n");   
    sql.append("  orgoid userOrgOid, orgname userOrgName,    \n");   
    sql.append("  teamname userTeamName, inputdate,     \n");   
    sql.append("  confirmyn confirmYnTmp,        \n");   
    sql.append("  decode(confirmyn,'Y','예','아니오') confirmYnName \n");   
    sql.append("  From COMMONLOGINUSER         \n");   
    sql.append(" ) \n");   
    // Sort에 대한 처리 LoadConfig에서 Sort에 대한 속성이 정의 되어 있다.   
    // Grid화면에서 컬럼을 클릭할 때 마다 Sort에 대한 속성이 변경되어 서버에 전달된다.   
    if(config.getSortField() == null) sql.append(" order by username asc ");   
    else sql.append(" order by "+ config.getSortField()+" "+ config.getSortDir());   
    // 쿼리문을 통해 statement생성   
    pstmt = conn.prepareStatement(sql.toString());   
    // statement를 통해 생성 된 결과를 ResultSet에 담는다.   
    rs = pstmt.executeQuery();   
    // loop돌면서   
    while(rs.next()){   
      // LoginUserInfo객체를 생성   
      LoginUserInfo entity = new LoginUserInfo();   
      entity.setUserName(rs.getString("username"));   
      entity.setUserSabun(rs.getString("userSabun"));   
      entity.setUserOrgOid(rs.getString("userOrgOid"));   
      entity.setUserOrgName(rs.getString("userOrgName"));   
      entity.setUserTeamName(rs.getString("userTeamName"));   
      entity.setInputDate(rs.getDate("inputdate"));   
      entity.setConfirmYnName(rs.getString("confirmYnName"));   
      entity.setConfirmYnTmp(rs.getString("confirmYnTmp"));   
      // return할 java.util.List객체에 차곡차곡 쌓는다.   
      returnValue.add(entity);   
    }   
  } finally {   
    // 사용된 자원에 대한 해제는 필수적으로...   
    try{ rs.close(); }catch(Exception e){}   
    try{ pstmt.close(); }catch(Exception e){}   
    try{ conn.close(); }catch(Exception e){}   
  }   
  // java.util.List에 담긴 데이터를 최종 리턴Type인 BaseListLoadResult를 생성하여 리턴.   
  return new BaseListLoadResult (returnValue);   
}  


7. 이제 코딩이 끝났으니 이클립스 Console에서 빨간색 버튼을 클릭해 실행을 정지 시키고 다시 시작해보자 우리는 Server쪽 메소드를 변경하였으므로 이과정이 꼭 필요하다. Client쪽이 변경된 경우에는 브라우저를 리프레시하면 변경된 내용이 적용되지만 서버쪽은 꼭 리스타트해줘야 변경된 내용을 확인 할 수 있다.
내용에 비해 Grid가 좀 큰듯하여 TabItem의 Width를 500으로 Grid의 Height를 240으로 변경하였다.실행된 화면을 확인하자

Posted by 베니94
GXT RIA App 만들기2011. 1. 11. 00:40
1. Gxt를 사용할 수 있도록 프로젝트 설정을 변경하자.

 ▶ com.gxt.riaapp에서 우측 마우스 클릭하고 "Google Web Toolkit"-> Convert project into GWT project를 선택하자


▶ Configure for using Ext GWT (GXT)를 선택한다.

▶ 내려받은 Gxt모듈의 디렉토리를 지정해준다. 이 부분이 이해되지 않는다면 이전 강좌를 확인하고 Gxt라이브러리를
    다운받도록 하자.


▶ 아래와 같이 RiaApp.gwt.xml파일에 Gxt관련 한줄이 추가된 것을 확인 할 수 있다. 물론 내부적으로는 Gxt라이브러리
   홈을 지정해 줌으로써 classpath등이 잡히게 될 것이다.

Posted by 베니94
자바스크립트2011. 1. 10. 12:46
/**
*** 해당 라디오 객체에 인자로 넘어온 값이 체크되었는지
*** 확인한다.
*/
function returnCheckValue(field, val){
        for(i=0; i < field.length; i++ ){
            if(field[i].value == val && field[i].checked){
                return true;
            }
        }
        return false;
 }
/**
*** 사업자번호 체크
**/
function chkBusinessNo(){
    var chkRule = "137137135";
    var strCoreNum = document.myform.business_no1.value 
                              + document.myform.business_no2.value 
                              + document.myform.business_no3.value;
    var step1, step2, step3, step4, step5, step6, step7;
	
    step1 = 0;
    for(i=0; i<7;i++)
        step1 = step1 + (strCoreNum.substring(i, i+1)* chkRule.substring(i, i+1));
		
    step2 = step1 % 10;
    step3 = (strCoreNum.substring(7,8) * chkRule.substring(7,8)) % 10;
    step4 = strCoreNum.substring(8,9) * chkRule.substring(8,9);
	
    step5 = Math.round(step4 / 10 - 0.5);
    step6 = step4 - (step5 * 10);

    step7 = (10 - ((step2 + step3 + step5 + step6) % 10)) % 10;

    if(strCoreNum.substring(9,10) != step7){
        alert('올바른 사업자등록번호가 아닙니다. 다시 확인해주세요');
        return false;
    }
    return true;
}
Posted by 베니94