只需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"