Google Web Toolkit 1.0.20 GWTShell [-port port-number] [-noserver] [-logLevel level] [-gen dir] [-out dir] [-style style] [-notHeadless] [url] where -port Runs an embedded Tomcat instance on the specified port (defaults to 8888) -noserver Prevents the embedded Tomcat server from running, even if a port is specified -logLevel The level of logging detail: ERROR, WARN, INFO, TRACE, DEBUG, SPAM, or ALL -gen The directory into which generated files will be written for review -out The directory to write output files into (defaults to current) -style Script output style: OBF[USCATED], PRETTY, or DETAILED (defaults to OBF) -notHeadless Causes the log window and browser windows to be displayed. Useful for debugging. and url Automatically launches the specified URL새로운 GWT 프로젝트를 위한 배치 파일, 보조 클래스(scaffolding classes), 디렉터리 등을 생성하는 applicationCreator를 포함한다. 그러나, 우리의 목적은 이런 것들은 무시하고, 처음부터 시작하는 것이다. 먼저, GWT Maven 플러그인을 설치해야 한다. 플러그인 프로젝트의 압축을 풀고, install-now를 입력해서 maven 플러그인을 설치한다. 또한, gwt-user.jar를 ~/.maven/repository/com.google.gwt/jars/에 복사한다. JAR는 최종 WAR 파일에 포함되어야하므로, Maven POM 파일에 의존성으로 등록되어야 한다.
다음은 우리의 모듈을 시작할 차례다. 실행하려면 루트 HTML 문서가 필요하다. 여기서는 src/java/com/totsp/gwt/public/Table.html을 사용한다. 진입점(entry point)를 HTML 문서에 삽입하기 위해 두 가지를 포함시켜야 한다. 먼저, 포함시킬 모듈을 가리키는 메타 태그를 다음과 같이 추가한다.
두번째, HTML에서 GWT가 렌더링을 시작할 위치에서 gwt.js 자바스크립트 파일을 포함시킨다.
이는 기본 스크립트를 실행하고, 시작하기 위해 필요한 것들을 알아내기 위해 gwt:module 값을 검사한다. 또한, 웹 응용프로그램이 아니라 자바 소스 트리의 공개 패키지(public package)에 HTML 페이지, CSS 파일, 그래픽 파일을 두어야 한다는 것에 주의해야 한다. 이는 다소 직관적이지 않지만, GWTShell과 GWTCompile 단계는 자바 소스 트리에서 이들을 로드하게 되어 있다. 그러나, GWT는 가능하면 기본설정에서 이것들을 읽어오기 때문에, 웹 응용프로그램 폴더에 이들을 넣어둘 필요는 없다.
import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; public class TableEntryPoint implements EntryPoint { private Table table; public void onModuleLoad() { table = new Table( null, "myTable" ); table.setStyleName("myTable"); RootPanel.get().add(table); getData(); //just ignore this for the moment. }Looking over these classes, we have a few things here. First is the Window class. 이들 클래스들을 보면서 몇 가지를 살펴보자. 먼저, Window 클래스가 있다. 이는 자바스크립트의 window 객체를 연상시킬 것이마. 이 클래스는 alert(), getClientWidth() 등의 함수를 제공한다. RootPanel은 get()을 이용해 위짓(widgets)을 배치하기 위한 루트를 반환하는 싱글톤 클래스다. 싱글톤을 이용한 방법은 작업하기에 매우 편하기 때문에, 구현하게될 클래스에 이를 추가할 것이다. 다음은 Widget이다. 이는 위짓들을 위한 기본 클래스이며, 다음 "Hello" 예제처럼 이벤트 처리를 위해 사용된다.
Button b = new Button("Click me", new ClickListener() { public void onClick(Widget sender) { Window.alert("Hello, Ajax"); } });EntryPoint 클래스를 시작하기 위해, 우리의 디스플레이를 빌드하기 위해 코드에 onModuleLoad() 메서드를 재정의(override)해야 한다. 이 기사에서의 목적에 따라, 간단한 Table 클래스를 사용할 것이다.
public void onCellClicked(SourcesTableEvents sender, int row, int cell) { this.getRowFormatter() .removeStyleName(selectedRow, selectedStyle); if ((source.getHeaderRow() == null) || (row > 0)) { this.getRowFormatter() .addStyleName(row, selectedStyle); selectedRow = row; } }테이블은 또한 TableDataSource로부터 데이터를 채우기 위한 메서드를 갖고 있다. 이에 대해서는 다음 절에서 살펴보자.
public interface DataService extends RemoteService { public Person[] getData(); }다음은 서비스에서 Async 인터페이스를 생성한다. 이는 전적으로 명명규칙으로 끝난다. 서비스 인터페이스와 모든 메서드에 맞는 인터페이스를 생성해야 한다. 그러나, 반환 형식 대신에 모든 메서드는 void이며, 마지막 인자는 AsyncCallback 구현물이어야 한다. 따라서, public void myMethod( Param p..., AsyncCallback callback )과 같이 되어야 한다. 마지막으로, 인터페이스 클래스 이름은 접미어 Async를 가져야 하며, RemoteService 인터페이스 이름과 일치해야 한다. 간단한 서비스를 구현하는 경우, 다음과 같다.
public interface DataServiceAsync { public void getData(AsyncCallback callback); }다음은 서비스를 구현하는 것이다. 이는 GWT의 RemoteServiceServlet 서블릿을 확장하고, 서비스 인터페이스를 구현한 것이다.
public class DataServlet extends RemoteServiceServlet implements DataService { public Person[] getData(){ //... } }휴. 이제 거의 다 끝났다. 이제, 이 서블릿을 web.xml에 추가하고, 선언을 Table.gwt.xml 파일에 추가하면 된다. 두번째 항목은 GWTShell에게 서블릿을 로드하고, 톰캣에 테스트베드를 마운트하고, 클라이언트 스텁을 생성하라고 알려준다.
이제, 호출 자체를 다룰 차례다. GWT는 오직 비동기 호출만 지원한다. 이렇게 된 데에는 많은 기술적인 이유들이 있다. 잘 알려진 이유로는 비동기 호출을 하는 가장 분명한 경로는 응답이 올때까지 대기를 반복하는 것이다. 불행하게도, 많은 브라우저들은 실제로 이런 "반복"이 완료될 때 까지 XmlHttpRequest 이벤트를 일으키지 못한다. 그러나, 이건 에이잭스(Ajax)다. Sjax가 아니다. 오키?
private void getData(){ DataServiceAsync dataService = (DataServiceAsync) GWT.create( DataService.class ); ServiceDefTarget endpoint = (ServiceDefTarget) dataService; endpoint.setServiceEntryPoint("/DataService"); dataService.getData(new AsyncCallback(){ public void onSuccess(Object result) { table.setSource( new SimpleDataSource( (Person[]) result ) ); } public void onFailure(Throwable caught) { Window.alert("Unable to get data from server: " +caught.toString()); } }); }ServiceDefTarget으로 형변환하는 것을 알 수 있다. 왜 GWT.create( Class clazz, String url) 메서드를 만들지 않았는지는 설명할 수 없지만, 여러분은 그 이유를 알 수 있을 것이다.
// Add a new listener to record the row history table.addTableListener( new TableListener(){ public void onCellClicked(SourcesTableEvents sender, int row, int cell) { History.newItem( ""+row ); } });이제, 뒤로 이동 버튼에 변경사항을 캡처할 수 있으며, 테이블에 선택된 행을 적절하게 업데이트할 수 있다. 이제, EntryPoint에 HistoryListener를 만든다.
public class TableEntryPoint implements EntryPoint, HistoryListener { //... public void onHistoryChanged(String historyToken){ table.onCellClicked( table, Integer.parseInt( historyToken ), 0); }사용자가 뒤로 이동 버튼을 클릭할 때마다, 마지막으로 선택된 항목을 추적한다. 마지막으로 할 일은 북마크된 페이지나 페이지를 다시 불러오는 경우에도 초기화 작업이 동작하게 하는 것이다. 이 작업을 하기 위해 EntryPoint에 getData() 메서드를 다시 살펴보고, AsyncCallback의 onSuccess() 핸들러를 수정한다. onSuccess() 핸들러에서는 History 객체에 저장된 토큰이 있는지 검사하고, 테이블의 상태를 히스토르 토큰에 저장된 선택된 열로 설정한다.
public void onSuccess(Object result) { table.setSource( new SimpleDataSource( (Person[]) result ) ); if(History.getToken().length() != 0){ table.onCellClicked( table, Integer.parseInt( History.getToken()), 0); } }GWT 스크립트가 히스토리 조작을 위해 사용하는 숨겨진 iframe을 가진 HTML 페이지를 수정한다.
이는 상당히 원시적인 예제지만, 보다 복잡한 응용프로그램에서 History 클래스를 이용할 정도로 이해되기를 희망한다. 그림3은 예제 응용프로그램의 테이블을 표시한 것이다.
google.webtoolkit.home=/home/cooper/local/gwt-linux-1.0.21 google.webtoolkit.runtarget=com.totsp.gwt.Table/Table.html google.webtoolkit.compiletarget=com.totsp.gwt.Table google.webtoolkit.logLevel=DEBUG첫번째 줄은 GWT 설치 경로이다. 두번째는 GWTShell이 시작할 대상을 지정한다. 이는 쉘을 실행하고 테스트 브라우저를 연다. compiletarget은 gwt:compile을 호출할 때 사용하길 원하는 모듈 선언이다. 마지막으로, logLevel은 테스트할 때 GWTShell에서 보여줄 로그 레벨이다. 프로젝트 속성에서 Mavenide properties 창에서 나머지 설정 사항을 볼 수 있다. 이들 속성들은 GWT에서 명령줄 인자와 일대일로 매핑되어 있다.
라이선스에 대하여
구글 웹 툴킷 개발 도구나 이와 관련된 어떤 서비스나 소프트웨어도 배포할 수 없다. 구글에서 서면으로 권한을 획득하지 않는 한 구글 웹 툴킷 개발 도구로부터 파생된 어떤 작업- 수정, 복사, 라이선스, 만들기-도 허용되지 않는다.GWT가 의도하는 바는 사람들이 새롭고, 흥미로운 커포넌트를 만드는 것을 허용하는 것이다. 그러나, 내게는 이것이 파생된 작업을 금지하는 것으로 여겨진다. 또한, 다운로드 페이지에 정보보호에 관한 지침(privacy notice)도 눈여겨 볼 필요가 있다.
정보보호에 관한 지침: 당신이 구글 웹 툴킷에서 호스팅되는 웹 브라우저를 이용할 때, 응용프로그램은 당신이 최신 버전의 제품을 사용하고 있는지 확인하기 위해 구글의 서버에 요청을 보낼 것입니다. 이 요청의 일부로, 구글은 당신이 구글 웹 툴킷을 다운로드 받은 날짜와 시간과 같은 타임스, 컴퓨터의 IP 주소를 포함한 사용 데이터를 기록할 것입니다.리소스
최신 콘텐츠