4

这里仍然有点 GWT 菜鸟,但使用谷歌在此处描述的活动和地点取得了进展。

我知道地方的“URL 由地方的简单类名(如“HelloPlace”)后跟冒号 (:) 和 PlaceTokenizer 返回的令牌组成。

当我没有要发送的令牌时,我可以以某种方式删除冒号吗?

例如,当我需要使用 PersonId=2 时,我可以使用“#editPerson:2”这样的 URL。但是当我只想呈现一个空白的 Person 表单时呢?在这种情况下,我宁愿使用“#addPersonForm”而不是“#addPersonForm:”

任何建议(甚至更好的代码建议)将不胜感激!

4

3 回答 3

3

要完全控制 URL 哈希(即从 Places 生成您自己的令牌并将这些令牌映射回 Places),您可以实现自己的历史映射器(实现PlaceHistoryMapper接口的类)。

public class MyPlaceHistoryMapper implements PlaceHistoryMapper {

   @Override
   public Place getPlace(String token) {
        // parse tokens and create Places here  
   }

   @Override
   public String getToken(Place place) {
        // examine Places and compose tokens here
   }
}

在您的入口点类中,您将替换以下行:

AppPlaceHistoryMapper historyMapper = GWT.create(AppPlaceHistoryMapper.class);

和:

PlaceHistoryMapper appHistoryMapper = new MyPlaceHistoryMapper();

就是这样。您的 URL 哈希不再需要基于类名或使用:分隔符。

于 2011-12-09T17:16:05.407 回答
3

您可以按照 Boris_siroB 的建议提供自己的 PlaceHistoryMapper(不使用生成器),或者您可以在具有空前缀的 PlaceTokenizer 中执行此操作:使用空前缀,不会有冒号,并且标记器可以做任何事情你要。如果你完全不同的地方,让它成为 Place 的标记器,所以它也是 getToken 的“笼统”。这样,您可以使用前缀、PlaceTokenizers 和 WithTokenizers 保留生成的所有优势(如果您想利用它们)

于 2011-12-10T01:00:52.863 回答
1

我正在使用一个名为 PlaceHistoryMapperWithoutColon 的 PlaceHistoryMapper 装饰器。

用法 :

final PlaceHistoryMapper historyMapper0 = GWT
                .create(PlaceHistoryMapperImpl.class);

final PlaceHistoryMapper historyMapper = new PlaceHistoryMapperWithoutColon(historyMapper0);

装饰器来源:

public class PlaceHistoryMapperWithoutColon implements PlaceHistoryMapper {

    private static final String COLON = ":";

    private PlaceHistoryMapper placeHistoryMapper;

    public PlaceHistoryMapperWithoutColon(PlaceHistoryMapper placeHistoryMapper) {
        this.placeHistoryMapper = placeHistoryMapper;
    }

    @Override
    public Place getPlace(String token) {
        if (token != null && !token.endsWith(COLON)) {
            token = token.concat(COLON);
        }
        return placeHistoryMapper.getPlace(token);
    }

    @Override
    public String getToken(Place place) {
        String token = placeHistoryMapper.getToken(place);
        if (token != null && token.endsWith(COLON)) {
            token = token.substring(0, token.length() - 1);
        }
        return token;
    }

}

装饰源示例:

@WithTokenizers({ FirstPlace.Tokenizer.class, SecondPlace.Tokenizer.class })
public interface PlaceHistoryMapperImpl extends PlaceHistoryMapper {

}

放置源示例:

public final class FirstPlace extends Place {

    @Prefix("first")
    public static class Tokenizer implements PlaceTokenizer<FirstPlace> {

        @Override
        public NetworkInfosPlace getPlace(String token) {
            return new FirstPlace ();
        }

        @Override
        public String getToken(FirstPlace place) {
            return "";
        }

    }
}
于 2013-12-30T10:31:54.703 回答