我正在开发一款用于展示汽车不同方面的应用。该应用程序具有如下树状结构:
Country>Manufacturer>Model>Car_subsystem>Part
我希望这个结构能够反映在浏览器的地址栏中:
http://localhost:9000/Germany/BMW/X6/Body/doors
目前,我使用play框架的动态路由,如下所示:
GET /:Country controllers.Application.controllerFunction(Country : String)
GET /:Country/:Manufacturer controllers.Application.controllerFunction(Country : String, Manufacturer : String)
等
这样可行,但我不喜欢将5或6个参数传递给我的所有控制器功能,只是为了让路径显示得很漂亮!还有其他办法吗?
答案 0 :(得分: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
,德国/梅赛德斯/ 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"