2009-05-30 3 views
9

동일한 모듈에 여러 진입 점이 있습니다.여러 입력 문제 동일한 모듈의 포인트

예를 들어, 홈 페이지에는 홈 엔트리 포인트가 있고 관리자 페이지에는 관리자 엔트리 포인트가 있습니다.

<entry-point class='com.company.project.client.HomeModule'/> 
<entry-point class='com.company.project.client.AdminModule'/> 

지금 설치하고있는 방법 - 나는 이는 onModuleLoad 내에서 다음과 같이 somt 확인해야합니다 위해 관리자 진입 점은 실행되지

if((RootPanel.get("someHomeWidget")!=null)&& 
    (RootPanel.get("someOtherHomeWidget")!=null)) 
{ 
    // do the stuff 
} 

홈 페이지가 열려 얻을 때 그리고 다른 방향으로.

위의 검사를 수행하지 않는 경우 에 주사하는 내용이 무엇이든간에 홈 및 관리자 페이지에서 동일한 이름의 div가있는 경우 해당 항목이 두 번 표시됩니다.

이 냄새가 1000 마일이나 떨어져서 분명히 틀렸습니다. 사람들의 경험에서 올바른 방법은 무엇입니까?

도움을 주셨습니다.

RootPanel panel = RootPanel.get("someHomeWidget"); 
if (panel) panel.add(new HomeWidget()); 

panel = RootPanel.get("adminWidget"); 
if (panel) panel.add(new AdminWidget()); 

그냥 당신이 가지고있는 div를 찾고있는 페이지를 검색하고 삽입 그런 식 :

답변

8

올바른 방법은 적절한 된 div에서 해당 위젯을 스틱이, 모듈 당 단일 진입 점을 가지고있다 적절한 위젯. 따라서 HTML 페이지는 GWT 코드가 어떤 상황을 처리 할 준비가되었는지 표시 할 때 어떤 위젯을 표시할지 결정합니다. 위의 경우 악취가 나는 것은 아닙니다. 진입 점을 기록하는 방법입니다.

대체 방법은 관리 영역과 정상 영역이 완전히 다른 경우 (예 : 별도의 시간에로드하려는 경우) 별도의 진입 점이있는 별도의 모듈이어야합니다.

+0

제 경우에는 홈 페이지와 관리자 페이지가 다른 시간에로드되어야합니다 (서로 다른 페이지입니다!) - 단일 진입 점이라도 div를 찾지 못하면 예외가 발생합니다. 다른 말로하면, 다른 모듈을 사용하는 것에 대해 명확하지 않은 것은 어느 페이지에서 어떤 페이지를 실행해야 하는지를 구성하는 방법입니다. – JohnIdol

+1

div가없는 이유는 무엇입니까? 원하는만큼 많은 페이지에 GWT 용 자바 스크립트 가져 오기를 넣을 수 있다는 것을 알고 있습니다. 그래서 당신은 당신의 관리 페이지에 넣었을 것이고, 더 아래에있는 admin div를 가질 것입니다. 그런 다음 일반 페이지에 추가하고 일반 div를 페이지 아래로 더 가져 가야합니다. 다른 모듈에 여러 모듈이 있다면 원하는 페이지에 원하는 모듈에 대한 자바 스크립트 가져 오기를 포함하면됩니다. 실제로는 매우 간단합니다. – rustyshelf

+0

이것은 좋은 해결책입니다. – Feargal

1

다른 페이지로 관리 및 홈 페이지를 고려하지 마십시오. 페이지의 개념은 GWT에는 적용되지 않는다. 하나의 단일 페이지, 즉 단일 진입 점이 있기 때문이다. 다른 페이지의 효과를주고 싶다면 GWT의 URL 재 작성 기능을 사용하십시오.

다른 Entrypoint를 사용하려면 위에서 설명한 것처럼 다른 모듈을 사용하십시오.

+0

고마워요 - URL 재 작성에 익숙하지 않습니다 (링크를 제공 할 수 있습니까?) -이 모듈과 여러 모듈 간의 최적의 접근 방식은 무엇입니까? 설명하는 시나리오에서 여러 항목을 정의 할 수있는 이유는 무엇입니까? 동일한 모듈의 여러 엔트리 포인트를 절대로 사용해서는 안된다는 말입니까? – JohnIdol

+0

안녕하세요, URL을 다시 작성하려면 GWT의 전체 기록 관련 자료를 살펴 보시기 바랍니다. 모듈 기반 항목에 대한 다중 진입 점 - 특히 엔터프라이즈 응용 프로그램의 경우 모듈 집합을 배포하고 클라이언트가 구입 한 모듈을 기반으로 다른 모듈 집합을 배포하지 않을 수 있습니다. 이것이 모듈의 기본 개념입니다. 별도의 엔트리 포인트를 사용하여 각 모듈은 별도로 배포 할 수있는 앱 단위입니다. 단일 모듈의 다중 진입 점은 기술적 측면뿐만 아니라 비즈니스 측면에서도 나에게 의미가 없습니다. – sbidwai

1

일반적으로 하나의 EntryPoint 만있는 것이 좋습니다. 하나의 모듈에있는 여러 개의 EntryPoint는 모두 동시에 시작하며 때로는 예상치 못한 일을 할 수 있습니다.

별도로 처리하는 방법에는 많은 옵션이 있습니다. - Admin 및 홈 응용 프로그램에 대해 각각 2 가지 다른 컴파일이 필요합니다. - 내역 토큰을 사용하여 관리자 또는 집이 있음을 나타냅니다. - JS 변수 중 하나가 표시되는지 확인합니다. - 관리자 또는 홈 (RootPanel.get (id))을 표시 할 특정 DIV ID가 있는지 확인 - URL 매개 변수를 사용하여 응용 프로그램을 나타냅니다. - ... etc

+0

동시에 시작하는 여러 엔트리 포인트에 대한 귀하의 의견은 기본 응용 프로그램을 패키지화하고 확장하려고 할 때 겪고있는 것입니다. 진입 점이 여러 번 호출 될 수있는 이유에 대한 의심을 확인해 주셔서 감사합니다. – Stevko

0

블로그에이 문제에 대한 해결책이 있습니다. 여러 진입 점이 있고 URL 재 작성을 사용하는 샘플 maven 프로젝트를 다운로드 할 수 있습니다.한번보세요 : http://zenoconsulting.wikidot.com/blog:16

4

GWT 장난감 응용 프로그램에서 여러 페이지를 사용하고 싶었지만 생각났습니다. 배포 설명자 (myApp.gwt.xml)를 마사지하는 데 걸렸지 만 여기에 내가 한 일이 있습니다.

  • 다른 클래스가 EntryPoint를 구현하고 새 페이지에서만 div에 추가 한 코드를 추가했습니다.
  • 원래 gwt.xml을 복사하고 두 가지를 변경 :
    • 모듈 - 이름 바꾸기 -에 - 나는
    • 진입 점은 새로운 클래스를 지정 "anothergwtapp"로 변경되었습니다.
  • 프로젝트를 컴파일 할 때 "war"폴더에 "anothergwtapp"이라는 다른 디렉토리가 있습니다. 그것은 GWT 마술 인 "anothergwtapp.nocache.js"를 포함하고 있습니다.
  • 마지막으로 원본 HTML 페이지를 복사하고 "stockwatcher/stockwatcher.nocache.js"를 "anothergwtapp/anothergwtapp.nocache.js"로 바꿨습니다 (예, 저는 매우 새로운 - 튜토리얼은 여전히 ​​내 컴퓨터에 있습니다)
    • 새로운 HTML을 약간 변경하여 (새로운 엔트리 포인트의 onload에 대한 새 div가 채워짐) 첫 번째 페이지의 새 페이지에 간단한 href를 추가했습니다.

효과가있었습니다. gwt.xml을 복제하고 모듈의 새 이름을 제공하여 새 앱 페이지와 함께 진행하면됩니다. 다른 링크 중 일부를 살펴본 결과 설명 된 내용을 실제로 수행했을 수도 있지만 너무 많은 단어와 리디렉션이 있습니다 (즉, 실제로 읽지는 않았습니다). Galileo 용 최신 GWT 플러그인을 사용하고 있습니다. 지금은 아마 IJW 일 것입니다.

+0

나는 이것을 찾고 있었다! 고맙습니다. – McTrafik

0

아직이 프레임 워크를 사용해 보지 않으셨습니까? http://gwtmultipage.org/ 클라우디우스이를 달성하는 간단한 (복잡한) 방법이

+1

링크가 끊어졌습니다. – rmtheis

1

:

는 Main 클래스에게 당신의 진입 점을 확인가.

package com.example.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.user.client.Window; 
import com.google.gwt.user.client.ui.RootPanel; 

public class Main implements EntryPoint { 

    public void onModuleLoad() { 

    String url = Window.Location.getHref(); 
    if (url.indexOf("?install")>-1) { 
     Install install = Install.getInstance(); 
     RootPanel.get().add(install);  
    else if (url.indexOf("?admin")>-1) { 
     Admin admin = Admin.getInstance(); 
     RootPanel.get().add(admin);  
    } else { 
     Application app = Application.getInstance(); 
     RootPanel.get().add(app);  
    } 
    } 
} 

이제 다른 클래스의 응용 프로그램 관리를하고 별도의 단위와 같은 작업을 설치합니다

<module rename-to='gwt'> 
    <inherits name='com.google.gwt.user.User'/> 
    <entry-point class='com.example.client.Main'/> 
    <source path='client'/> 
    <source path='shared'/> 
</module>;<br/> 

는 디스패처처럼 작동하는이 Main.java를 만듭니다. 여기

간단한 설치, 예를 들면 :

package comexample.client; 

import com.google.gwt.user.client.ui.FlowPanel; 
import com.google.gwt.user.client.ui.HTML; 

public class Install extends FlowPanel { 

    /** Singleton stuff - to access Main from all subclasses! */ 
    private static Install singelton; 
    public static Install getInstance() { 
    if (singelton == null) {singelton = new Install();} 
    return singelton; 
    } 

    /** Constructor - called by Main.onModuleLoad() */ 
    private Install() { 
    this.add(new HTML("<h1>Do whatever You have to do!</h1>")); 
    } 
} 

당신은 싱글 물건 (의 getInstance)가 필요하지 않습니다,하지만 큰 애플리케이션에 매우 편리합니다.

이제/전쟁 디렉토리에 설치라는 이름의 디렉토리와 관리자를 작성하고 매우 그들의이 같은 HTML 페이지 생성 : 사용자가 자신이 리디렉션됩니다 http://www.example.com/install 자신의 브라 우어 지시 그럼 언제

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="refresh" content="0; URL=/index.html?install"> 
</head> 
<body></body> 
</html> 

http://www.example.com/index?install 및 index.html은 Main.java에 바인딩되어 요청을 디스패치하고 Install을로드합니다.자바

관련 문제