Java Restlet-如何动态地将资源附加到路由器上



这是我要做的事情的基础知识。我正在研究一个项目,在该项目中,我正在创建各种Web API的混搭页面。Mashup页面包含国家信息。

我有一个BLL层,在其中创建MASHUP页面(使用块库的country输入的HTML页面)。这是用于设置模板

的方法
public String GetTemplate(Country country) throws IOException {
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    URL resource = classLoader.getResource("BLL/themes/page.html");
    Theme theme = new Theme("src/BLL", "themes");
    Chunk html = theme.makeChunk("page", "html");
    html.set("countryName", country.getName());
    html.set("countryCode", country.getCode());
    html.set("countryContinent", country.getContinent());
    html.set("countryCapital", country.getCapital());
    html.set("countryAreaInSqKm", country.getAreaInSqKm());
    html.set("countryPopulation", country.getPopulation());
    html.set("countryCurrencyCode", country.getCurrencyCode());
    html.set("countryExchangeRate", country.getExchangeRate());
    html.set("countryFlagUrl", country.getFlagUrl());
    html.set("countryDescription", country.getDescription());
    html.set("countryMap", country.getMapLocation());
    return html.toString();
}

最终,我将在所有可用国家/地区使用数据库。

所以我想在雷斯特服务器上做什么,在所有国家/地区都以类似的方式迭代?

public Restlet createInboundRoot() {
    Router router = new Router(getContext());
    router.attach("/countries/", Countries.class);
    for (Country country : cm.GetAllCountries()) {
         router.attach("/countries/" + country.getName(), new CountryTemplate(country)); 
         // Obviously this doesn't work, and it doesn't work with getClass() either.
    }
    return router;
}

因此,我试图获取我的资源以返回GET方法中的HTML(来自TemplateManager):

public class CountryTemplate extends ServerResource {
    CountryManager cm = null;
    TemplateManager tm = null;
    Country country = null;
    public CountryTemplate(Country _country) throws Exception {
        cm = new CountryManager();
        tm = new TemplateManager();
        country = _country;
    }
    @Get("html")
    public String getTemplate() throws IOException, RemoteException, UnsupportedCurrencyException {
        return tm.GetTemplate(country);
    }
}

确实有一种这样做的方法,还是我接近这一切?

如果其他人应该在这里找到自己,Tim的代码完全根据需要工作。已发布的代码已更改为他的版本。

,而不是试图使用剩余资源的硬代码动态动态行为,而是应该使用查询参数。

首先,您可以创建一个新的REST资源/countries/html/并将其绑定到类CountryResource。此资源将接受与您要访问的HTML的国家相对应的查询参数countryID

public Restlet createInboundRoot() {
    Router router = new Router(getContext());
    router.attach("/countries/", Countries.class);
    router.attach("/countries/html/", CountryResource.class); 
    return router;
}

CountryResource的定义中,您可以访问查询参数countryID以获取适当的HTML内容:

public class CountryResource extends ServerResource {
    CountryManager cm;
    TemplateManager tm;
    public CountryTemplate() throws Exception {
        // Note: I usually do NOT define a constructor using Restlets,
        // but you should be OK doing this
        cm = new CountryManager();
        tm = new TemplateManager();
    }
    @Get("html")
    public String getTemplate() throws IOException, RemoteException, UnsupportedCurrencyException {
        String countryID = getQueryValue("countryID");
        Country country = tm.getCountry(countryID);
        return tm.GetTemplate(country);
    }
}

我假设CountryManager具有一个方法getCountry(),可以基于输入字符串返回Country对象。如果当前不存在此类方法,则需要找到一种将传入查询参数映射到代码中实际Country对象的方法。

相关内容

  • 没有找到相关文章

最新更新