1

我正在开发一个应用程序来展示汽车的不同方面。该应用程序具有这样的树状结构:

Country>Manufacturer>Model>Car_subsystem>Part

我希望这个结构反映在浏览器的地址栏中:

http://localhost:9000/Germany/BMW/X6/Body/doors

目前,我使用播放框架的动态路由如下:

GET /:Country    controllers.Application.controllerFunction(Country : String)
GET /:Country/:Manufacturer     controllers.Application.controllerFunction(Country : String, Manufacturer : String)

等等

这可行,但我不喜欢将大约 5 或 6 个参数传递给我的所有控制器函数,只是为了让路径显示得很好!还有其他方法吗?

4

1 回答 1

4

只需Dynamic parts spanning several /按照路由文档中的说明使用

路线:

GET   /Cars/*path          controllers.Application.carResolver(path) 

行动(最简单的方法)

public static Result carResolver(String path) {
    Car car = Car.findByPath(path);
    return ok(carView.render(car));
}

所以每辆车的字段都应该path填写唯一的字符串 ID,即:Germany/BMW/X6、Germany/Mercedes/ASL` 等。

当然,如果你path先用斜线分割 arg 会更好,这样你就可以使用每个部分来显示不同的视图,将字符串“翻译”为真实对象 ID 等。

public static Result carResolver(String path) {

    String[] parts = path.split("/");
    int partsLength = parts.length;

    String country = (partsLength > 0) ? parts[0] : null;
    String manufacturer = (partsLength > 1) ? parts[1] : null;
    String carModel = (partsLength > 2) ? parts[2] : null;
    // etc

    switch (partsLength){
        case 0: return countrySelect();
        case 1: return allManufacturersIn(country);
        case 2: return allModelsOf(manufacturer);
        case 3: return singleViewFor(carModel);
        // etc
    }

    return notFound("Didn't find anything for required path...");
}

提示:将字符串“翻译”为对象将需要您在数据库中按某些字段进行搜索,因此有一些建议:

  • 尽量确保每个模型都有一个唯一的搜索字段,即。Country应该是独一无二的name,因为您可能不想拥有德国 1、德国 2 等。
  • 这种方法可能需要比通过数字 ID 搜索更多的时间,因此请尝试以某种方式缓存(mem-cache 或至少专用 DB 表)解析的结果,即:

    Germany/BMW/X6 = Country: 1, Manufacturer: 2, CarModel: 3, action: "singleViewFor" 
    
于 2013-11-09T10:46:24.100 回答