地方名称没有冒号(:)?

时间:2011-12-09 01:34:40

标签: gwt gwt-places

这里还有一些GWT菜鸟,但正如Google here所描述的那样使用活动和地点取得进展。

我知道Place的“URL”包含Place的简单类名(如“HelloPlace”),后跟冒号(:)和PlaceTokenizer返回的标记。

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

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

任何建议(甚至更好的代码建议)都会非常感激!

3 个答案:

答案 0 :(得分:3)

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

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哈希不再需要基于类名或使用:分隔符。

答案 1 :(得分:3)

您可以提供自己的PlaceHistoryMapper(不使用生成器),如Boris_siroB已经建议的那样,或者您可以在PlaceTokenizer中使用空前缀:使用空前缀,不会有冒号和标记生成器可以做任何你想做的事。如果你完全不同的地方,让它成为Place的标记化器,所以它也是getToken的“catchall”。通过这种方式,您可以使用前缀,PlaceTokenizers和WithTokenizers(如果您想利用它们)保留代的所有优势。

答案 2 :(得分: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 "";
        }

    }
}