java 구글 가장 큰 GWT 함정?




구글 gwt (20)

GWT는 매우 간단하고 직관적입니다.

특히 GWT 위젯을 XML로 배치 한 다음 자바로 코딩 할 수 있도록 UIBinder를 릴리스했습니다.

따라서 다른 Ajax 또는 Flash 디자인 도구 또는 Silverlight 등을 사용한 경우 GWT는 매우 쉽게 배울 수 있습니다.

주요 장애물은 함정이 아니라면 GWT RPC입니다. GWT를 사용하고자하는 바로 그 이유는 GWT 비동기 RPC 때문입니다. 그렇지 않으면 왜 CSS를 사용하여 페이지의 형식을 지정하지 않는 것이 좋을까요?

GWT RPC는 페이지를 새로 고치지 않고도 서버에서 서버의 데이터를 새로 고칠 수있는 요소입니다. 주식 성능 모니터링 (또는 미국의 현재 국가 및 공공 부채 또는 전 세계에서 중단 된 태아의 수)과 같은 페이지에서는 절대적인 요구 사항입니다.

GWT RPC는 이해하는데 약간의 시간이 걸리지 만 몇 시간이 지나면 분명히 나타납니다.

그 위에, GWT RPC를 배우려고 노력한 후 마침내 RPC를위한 서비스 구성 요소로 JSP를 사용할 수 없다는 것을 발견하게된다. 나는 JSP 사용법에 관한 블로그에 8 가지 시리즈를 가지고있다. GWT RPC 서비스 담당자. 그러나 당신이 대답을 요구하지 않았기 때문에 문제는 없었으므로, 나는 내 블로그를 광고하지 않을 것입니다.

그래서. GWT를 사용하는 최악의로드 블록 / 함정은 GWT 비동기 RPC를 올바르게 배포하는 방법과 JSP servicers를 사용하는 방법을 찾는 것입니다.

저는 GWT를 사용하여 구현하기로 선택한 프로젝트의 시작 / 중간에 있습니다. 극복 할 수없는 GWT (및 GWT-EXT)를 사용함에있어서 큰 함정에 빠진 사람이 있습니까? 성능 관점에서는 어떻습니까?

우리가 보거나 들었던 몇 가지 것들은 이미 포함되어 있습니다 :

  • Google이 콘텐츠를 색인 생성 할 수 없음
  • CSS와 스타일링은 일반적으로 조금 벗겨지는 것처럼 보입니다.

이 항목들에 대한 추가 피드백을 찾고 있습니다. 감사!


이미 언급 한 것들에 몇 가지 포인트를 추가 할 것입니다 :

  • 데이터 바인딩 / 유효성 검사. GWT에는이 영역에 대한 일부 프로젝트가 나오기 시작했지만 즉시 데이터 바인딩 / 유효성 검사 지원 기능이 없습니다. 많이 쓰는 것을 알게 될 것입니다.
TextField fname, faddress;
...
fname.setText(person.getName());
faddress.setText(person.getAddress());
...
  • 게으른 로딩. gwt가 클라이언트 측에 있기 때문에, 게으른 로딩은 실제로 옵션이 아닙니다. RPC 및 도메인 객체를 신중하게 설계해야합니다.
    • 필요한 모든 오브젝트 데이터를 전송하십시오.
    • 열망하는 모든 데이터를 가져 오는 것을 피하십시오.
    • 또한 프록시 / 비 직렬화 가능 객체를 전송하지 않도록해야합니다. hibernate4gwt 는 이러한 점들을 당신을 도울 수 있습니다.
  • UI 디자인. html보다 자바 (패널, 버튼 등)에서 UI를 시각화하는 것이 더 어렵습니다.
  • 역사 지원. GWT는 History 하위 시스템과 함께 제공되지 않으며 멋진 URL 또는 상태 저장 북 마킹을위한 하위 시스템과 함께 제공되지 않습니다. 자신 만의 롤을 만들어야합니다 (시작점 인 History 토큰을 지원하지만). 이것은 모든 AJAX 툴킷 AFAIK에서 발생합니다.

IMHO, GWT는이 '스레드'에 언급 된 모든 문제에 대해 기본적으로 지원되는 프레임 워크가 없습니다.


신뢰할 수있는 사실을 얻는 가장 좋은 방법은 gwt 조사 입니다. GWT의 가장 큰 문제 중 하나는 항상 긴 컴파일 시간이었습니다. 다행히도 매우 빠르게 개선되고있어 가까운 시일 내에 중요한 문제가되지 않을 것입니다. 또 다른 함정은 자바가 모든 단계에서 나쁜 코더에 저항하는 더 복잡한 언어이기 때문에 GWT가 훨씬 더 복잡하다는 것입니다. 또한 컴파일하면 레이어가 추가됩니다. 예를 들어, js interop은 약간의 상용구가 필요합니다. 근본적인 문제는 GWT가 단순하도록 설계되지 않았다는 것입니다. 그것은 극도로 복잡한 웹 응용 프로그램을 토대로 설계되었으며, 전체 커뮤니티는 일관된 코딩, 성능, 코드 품질, 아키텍처 등을 일관성있게 일관되게 고안되었습니다.
언제든지 GWT에서 js를 사용할 수 있다는 것을 기억하십시오. 따라서 GWT와 어려움을 겪고 있다면 js를 사용해보십시오. 하루가 끝나면 GWT는 js이므로 GWT에서 js에서 할 수있는 모든 것을 할 수 있습니다. 사실, 대부분의 GWT 프로젝트는 js를 사용합니다. 문제는 GWT가 상당히 복잡하다는 것입니다. 그럼에도 불구하고 때로는 추가 복잡성이 필요합니다.

GWT 3.0이 엄청난 발전을 가져올 것이라는 점은 주목할 가치가 있습니다.


약간 주제에서 벗어나지 만 irc의 #gwt 채널은 매우 유용합니다. 경우에 따라 문제가 계속됩니다.


GWT 팀은 작년에 GWT 2.7을 발표 할 때 큰 발전을 이루었습니다. GWT의 한 가지 주요 약점은 GWT 2.6 이하에서 많은 시간이 소요된다는 것입니다. 이제 사라졌습니다. GWT는 초고속이고 점진적으로 컴파일 만하는 점진적 컴파일이 없습니다.

GWT 2.7에 ( Source )가 있습니다.

  • 증분 빌드가 이제 막 몇 초가됩니다.
  • 더 작고 정확한 SourceMaps
  • GSS 지원
  • JSInterop
  • 훌륭한 자바 스크립트 성능
  • 더 작은 코드 크기

나는 최근에 GWT에 대한 많은 연구를 해왔다. 그리고 이것은 내가 말해야 할 wht이다.

  1. CSS 스타일링은 때로는 까다 롭습니다. IE의 IE 개발자 도구와 Firefox의 방화탄을 사용하여 정확히 무슨 일이 일어나고 있는지, 그리고 CSS가 바뀌어야하는지 명확하게 알 수 있습니다.
  2. 트릭을 사용하여 Google에서 색인을 생성 할 수 있습니다. 매우 유명한 사이트는 http://examples.roughian.com/ 이며 google에서 등급을 확인하십시오. 훨씬 덜 유명한 사이트는 www.salvin.in입니다. (언급 할만한 것은 없습니다.) 단어에 최적화되었습니다 : salvin 홈 페이지 (이 세 단어에 대해 google 검색)

GWT-EXT에 대해서는 잘 모릅니다.하지만 제 3 자 라이브러리를 포함 할 필요가 없다는 믿음이 있습니다.

귀하의 결정에 행운을 빈다 :)


나는 거대한 GWT 팬이라고 말하면서 시작 하겠지만, 많은 함정이 있지만 네가 극복 할 수 있었던 전부는 아니지만 대부분 :

문제 : 프로젝트가 커질수록 컴파일 시간이 길어 지므로 컴파일하는 데 걸리는 시간도 길어집니다. 나는 20 분짜리 컴파일에 대한 보고서를 들었다. 그러나 나의 평균은 약 1 분이다.

해결책 : 코드를 별도의 모듈로 나눠서 개미에게 변경된 경우에만 빌드하도록하십시오. 또한 개발하는 동안 하나의 브라우저 만 구축하여 컴파일 시간을 대폭 단축 할 수 있습니다. 이를 .gwt.xml 파일에 넣으면됩니다.

<set-property name="user.agent" value="gecko1_8" />

gecko1_8은 Firefox 2 이상, ie6은 IE 등입니다.

문제점 : 호스팅 모드는 (OS X에서) 매우 느리고 JSP 또는 Rails 페이지를 편집하고 브라우저에서 새로 고침을 할 때 나타나는 '실제'변경 사항과 거의 일치하지 않습니다.

해결책 : 호스트 모드에 더 많은 메모리를 할당 할 수는 있지만 (일반적으로 512M을 얻음) 여전히 느리다. GWT를 사용하면 충분하다. 변경 사항을 많이 만든 다음 하나의 브라우저 (일반적으로 20 분짜리 컴파일)로 컴파일 한 다음 브라우저에서 refresh를 누릅니다.

업데이트 : GWT 2.0 이상에서는 새로운 '개발 모드'를 사용하기 때문에 더 이상 문제가되지 않습니다. 이는 기본적으로 원하는 브라우저에서 직접 코드를 실행할 수 있음을 의미하므로 속도를 잃지 않고 방화범이 끌리거나 검사 할 수 있습니다.

http://code.google.com/p/google-web-toolkit/wiki/UsingOOPHM

문제 : GWT 코드는 java이며 HTML 페이지를 레이아웃하는 것과는 다른 생각이 있습니다. HTML 페이지를 작성하여 GWT로 변환하는 것이 더 어렵습니다.

솔루션 : 다시 익숙해 지지만 HTML 디자인을 GWT 디자인으로 변환하는 것은 HTML 디자인을 JSP 페이지로 변환하는 것보다 느리게 진행됩니다.

문제 : GWT는 머리를 조금 감싸 주며 아직 주류가 아닙니다. 팀에 참여하거나 코드를 유지 관리하는 대부분의 개발자가 처음부터 배워야한다는 것을 의미합니다.

해결책 : GWT가 이륙할지 여부는 아직 알 수 없지만, 고용주를 관리하는 회사 인 경우 GWT를 알고 있거나 배우고 싶은 사람을 선택할 수 있습니다.

문제 : GWT는 jquery 또는 일반 자바 스크립트와 비교되는 큰 실수입니다. JS 파일을 포함하는 것보다 더 많은 설정이 필요합니다.

해결책 : jquery와 같은 라이브러리를 사용하여 작고 간단한 작업에 적합합니다. GWT를 사용하면 AJAX에서 진정으로 복잡한 것을 만들거나 RPC 메커니즘을 통해 데이터를 앞뒤로 전달해야하는 경우가 있습니다.

문제 : 때때로 GWT 페이지를 채우기 위해 페이지가 처음로드 될 때 서버 호출을해야합니다. 필요한 데이터를 가져 오는 동안 사용자가 앉아서 로딩 기호를 보는 것은 짜증나게 할 수 있습니다.

솔루션 : JSP 페이지의 경우, 페이지가 HTML로되기 전에 서버에 의해 이미 렌더링되었으므로 실제로 모든 GWT 호출을 수행하고 즉시로드 할 수 있도록 페이지에 미리로드 할 수 있습니다. 자세한 내용은 여기를 참조하십시오.

GWT 호출을 미리 직렬화하여 페이지로드 속도를 높입니다.

나는 박스 위젯, 맞춤형 또는 다른 위젯을 CSS 스타일링하는 데 전혀 문제가 없었습니다. 그래서 함정이라는 것이 무슨 의미인지 모르겠습니까?

성능에 관해서는 컴파일 된 GWT 코드가 빠르면 AJAX 호출이 전체 페이지 새로 고침보다 거의 항상 작지만 GWT에만 국한되지는 않는다는 것을 알았지 만, 사용하는 경우 가져 오는 기본 RPC 패킷 JAVA 백엔드는 매우 컴팩트합니다.


현재 EXT GWT (GXT)를 사용하여 GWT EXT와 혼동하지 않는 프로젝트를 진행 중입니다. EXT GWT는 ExtJS를 자바 스크립트 라이브러리로 작성한 회사에서 실제로 제작 한 것입니다. GWT EXT는 ExtJS 라이브러리를 둘러싼 GWT 래퍼입니다. GXT는 네이티브 GWT입니다.

어쨌든, GXT는 아직 미숙하고 GWT EXT가 가지고 있다고 느끼는 견고한 커뮤니티가 없습니다. 그러나 GXT는 미래의 GXT이며 ExtJS를 만든 회사가 실제로 개발했습니다. GWT EXT는 ExtJS 라이브러리에서 라이센스가 변경됨에 따라 다소 어려움을 겪었으므로 GWT EXT의 개발 속도가 느려집니다.

전반적으로 GWT / GXT는 웹 애플리케이션 개발을위한 훌륭한 솔루션이라고 생각합니다. 실제로 개발을위한 호스팅 모드를 좋아합니다. 빠르고 쉽게 작업을 수행 할 수 있습니다. 또한 코드를 디버깅 할 수있는 이점이 있습니다. JUnit을 사용한 단위 테스트는 꽤 견고합니다. 필자는 엔터프라이즈 애플리케이션 테스트에 충분히 성숙한 자바 스크립트 유닛 테스트 프레임 워크를 아직 보지 못했습니다.

GWT EXT에 대한 추가 정보 : http://gwt-ext.com/

EXT GWT (GXT)에 대한 추가 정보 : http://extjs.com/products/gxt/


  • 각 서비스 인터페이스에 대해 작성해야하는 비동기 인터페이스는 GWT 컴파일러에 의해 자동으로 생성 될 수있는 것처럼 보입니다.
  • 대형 프로젝트의 컴파일 시간이 길어짐

그러나 큰 자바 스크립트 프로젝트의 경우 최상의 선택입니다.


우리가 겪은 함정 :

  • GWT EXT와 같은 것을 사용하면 많은 마일리지를 얻을 수 있지만, 자바 스크립트 라이브러리 위에 이러한 종류의 얇은 베니어를 사용할 때마다 디버깅 기능이 손실됩니다. 내가 IntelliJ 디버거 내부에서 GWT EXT 테이블 클래스에서 어떤 일이 일어나는지 검사 할 수 없기 때문에 한 번 이상 책상에 머리를 꽂았습니다 ... JavaScriptObject라는 것만 알면됩니다. 이것은 무엇이 잘못되었는지 알아내는 것을 어렵게 만듭니다 ...

  • CSS를 아는 팀원이 없습니다. 내 경험에 비추어 볼 때, 그 사람이 전문가가 아니어도 상관 없습니다 ... 그가 충분한 지식을 갖추고 있으면서도 필요할 때 Google에 올바른 용어를 알면 충분합니다.

  • 브라우저 간 디버깅. Out of Process Hosted Mode [ 1 ] [ 2 ] [ 3 ], 잘하면 GWT 1.6에 들어서십시오. 지금은 호스트 된 모드로 좋은 결과를 얻은 다음 "컴파일 / 찾아보기"버튼을 사용해야합니다 다른 브라우저에서 재생할 수 있습니다. 나에게있어 Windows에서 작업한다는 것은 FireFox에서 작업 내용을 볼 수 있고 FireBug를 사용하여 작업을보다 쉽게 ​​조정할 수 있음을 의미합니다.

  • IE6. 다른 IE 6이 어떻게 렌더링되는지는 놀랍습니다. 나는 CSS 규칙을 가질 수 있도록 브라우저에 따라 가장 바깥 쪽 "뷰포트"에 스타일을 적용하는 방법을 사용했습니다.

    .my-style { /* stuff that works most everywhere */ }
    
    .msie6 .my-style { /* "override" so that styles work on IE 6 */ }
    

마지막으로, 도움이되는 편집기를 사용해야합니다. IntelliJ를 사용합니다. GWT 스마트를 많이 가지고 있습니다. 예를 들어 JRE 에뮬레이션에서 처리하지 않는 클래스를 사용하려고하면 알 수 있습니다. 위젯의 스타일을 지정하고 그 스타일을 아직 정의하지 않은 경우 코드가 작은 빨간색으로 나옵니다 ... 또는 CSS를 볼 때 충돌 속성을 지정할 때 알려줍니다. 단일 규칙. (아직 시도하지는 않았지만 버전 8에는 "로컬"및 "비동기"RPC 인터페이스와 구현을 동기화 된 상태로 유지하는 것과 같은 GWT 지원이 더 우수하다는 것을 알고 있습니다.)


GWT 2.4는 앞에서 언급 한 많은 문제를 수정했으며 위젯 라이브러리는 Beta (Ext GWT 3.0.4 aka GXT)에서 나왔습니다. GWT는 JS 라이브러리의 래퍼가 아닌 GWT로 작성되었습니다.

남아있는 통증 :

  • CSS3 선택기 지원이 부족한 경우, "literal ()"을 사용하여 주위를 둘러 볼 수 있습니다.
  • CSS3 및 transitionEnd 와 같은 최신 브라우저 이벤트에 대한 지원이 부족합니다.
  • Java Calendar 클래스 지원 부족 (수년 후).
  • JUnit4 지원이 부족합니다 (5 년 및 계산).
  • Google GWT 팀의 명확한 로드맵 및 출시 일정이 없습니다.

우리는 거의 2 년간 gwt로 작업 해 왔습니다. 우리는 많은 교훈을 배웠습니다. 다음은 우리가 생각하는 것입니다 :

  1. 제 3 자 위젯 라이브러리, 특히 gwt-ext를 사용하지 마십시오. 디버깅, 개발 및 런타임 성능을 저하시킵니다. 이런 일이 발생하는 방법에 대해 궁금한 점이 있으면 저에게 직접 연락하십시오.

  2. gwt를 사용하면 앱의 동적 인 부분 만 채울 수 있습니다. 따라서 많은 필드와 복잡한 사용자 상호 작용이있는 경우 그러나 함께 제공된 패널을 사용하지 마십시오. 기존 재고 디자이너가 제공하는 페이지를 가져 가십시오. 앱 컨트롤이 포함될 영역을 개척하십시오. 이러한 컨트롤을 onModuleLoad () 내의 페이지에 연결하십시오. 이 방법으로 디자이너의 표준 페이지를 사용할 수 있으며 gwt 외부의 모든 스타일링을 수행 할 수 있습니다.

  3. 전체 응용 프로그램을 하나의 표준 페이지로 작성하지 말고 모든 응용 프로그램을 동적으로 작성하십시오. 내가 2 항에서 제안한 것을한다면, 이것은 어차피 일어나지 않을 것입니다. 모든 것을 동적으로 빌드하면 성능을 떨어 뜨리고 중형 및 대형 애플 리케이션을위한 엄청난 양의 메모리를 소비하게됩니다. 또한 내가 제안하는 것을 수행하면 뒤로 버튼이 잘 작동하므로 엔진 색인 생성 등이 검색됩니다.

다른 주석가들도 좋은 제안을했습니다. 엄지 손가락의 규칙은 표준 웹 페이지를 작성하는 것처럼 페이지를 작성하는 것입니다. 그런 다음 역동적 인 조각을 조각하십시오. 그것들을 id가있는 요소로 RootPanel.get( id ).add( widget ) 을 사용하여 그 영역을 채 웁니다.


GWT 2.0은 다음 몇 달 안에 언젠가는 나올 것으로 예상되는 많은 문제를 해결합니다.

  • html / xml과 유사한 구문을 사용하여 레이아웃 만들기
  • 동적 스크립트로드 - 필수 JS 만 초기에 다운로드됩니다. 나머지는 필요에 따라 다운로드됩니다.
  • 브라우저 내부 호스팅 모드 - 토론 된 호스트 모드 속도 문제를 처리 할 수 ​​있습니다.
  • "컴파일러 최적화"- 빠른 컴파일, 잘하면

Google I / O에서 GWT 2.0 미리보기 비디오


함정 나는 1을 만났다. 슈퍼 데브 모드에서 다른 행동. 예 : Someclass.class.getName ()은 Superdev 모드에서 절대적으로 작동하며 클래스의 정규화 된 이름을 반환합니다. 생산성있는 모드에서는 작동하지 않습니다.

  1. addWidget (widget)은 위젯의 removefromparent ()를 호출합니다.

"극복 할 수없는"것이 아니라 기본적인 것에 대한 약간의 고통.

날짜 처리 :

GWT는 더 이상 사용되지 않는 java.util.Date 를 사용하여 클라이언트 측에서 날짜를 처리 할 때 예기치 않은 동작을 일으킬 수 있습니다. java.util.Calendar 는 GWT에서 지원하지 않습니다. 더 많은 정보는 여기에 있습니다 .

관련 문제 예 :


우리는 GWT 코드베이스와 웹 디자이너 (우리가 GWT가 관리하기를 원했던 특정 div id를 가진 정적 HTML 페이지)에서 얻은 HTML 웹 템플릿을 결합하는 것이 매우 힘들었습니다. 적어도 우리가 그것을 사용했을 때 우리는 GWT가 GWT로 코딩되지 않은 웹 사이트의 일부와 통합되도록 할 수 없었습니다. 우리는 결국이 작업을했지만, 큰 해킹이었습니다.


하나의 큰 함정은 때로는 특정 CSS 스타일을 사용하기 위해 궁극적으로 HTML 요소가되는 것에 id를 명시 적으로 할당해야한다는 것입니다. 예를 들어, GWT TabPanel은 tabPanel의 tabBar에 id가 할당되고 해당 elementI에 : hover를 지정하면 tabBarItems 위로 마우스를 가져갑니다.

나는 다른 곳에서 GWT의 몇 가지 단점에 대해 썼다. 그러나 그들은 이미 rustyshelfs 응답으로 덮여있다. :).


나는 얼마 전 프로젝트에서 GWT와 GWT-ext를 함께 사용했다. 나는 웹 개발이 진행될 때 꽤 부드러운 경험을 발견했지만, 나의 조언은 다음과 같다 :

GWT 기본 위젯과 EXT 위젯을 함께 사용하지 마십시오. 대개 이름이 같기 때문에 지옥처럼 혼란 스럽습니다 (GWT.Button 또는 GWText.Button?).

필자가 생각한 것보다 복잡한 코드를 만들었던 한 가지 사실은 a) 동적으로 업데이트 할 수있는 b) 계단식

GWT 네이티브 패널은 동적이며 Ext 패널은 캐스 케이 딩 가능합니다. 해결책? GWTExt 패널을 래핑하는 GWT.VerticalPanel ... 혼돈. :)

그러나 어이, 그것은 작동한다. ;)


GWT 2.4에 관해서는 Firefox를 사용 하여 GWT를 디버깅 할 때 크롬을 사용하는 것이 더 빠릅니다. 파이어 폭스 만 사용한다면이 줄을 project.gwt.xml 파일에 넣는 것을 고려해보십시오.

<set-property name="user.agent" value="gecko1_8" />

또한, 이클립스를 사용하는 경우, 다음 인수 -> VM 인수 :

-Xmx512m -XX : MaxPermSize = 1024m -XX : PermSize = 1024m

서버와 클라이언트를 나눌 수 있습니다 -> 인수 인수 : -codeServerPort 9997 -startupUrl http://yourserver/project -noserver

또한 변경 사항이 발생할 때마다 서버를 새로 고침하지 않으려면 JRebel을 사용하십시오. http://zeroturnaround.com/blog/how-to-rock-out-with-jrebel-and-google-web-toolkit-gwt/ 여기에 라이브 데모가 있습니다. http://www.youtube.com/watch?feature=player_embedded&v=4JGGFCzspaY


RPC 서비스 객체 재사용.
앱이 매달려있는 것처럼 보이는 증상이있는 경쟁 조건이 발생합니다.





gwt-ext