如何路由到目录?

时间:2014-02-21 03:54:36

标签: fantom afbedsheet

我正在玩afBedSheet并希望处理对目录的所有请求。 例如,对/ abcd的请求调用abcdMethod#doSomething

我将路线设置为

@Contribute { serviceId="Routes" }
static Void contributeRoutes(OrderedConfig conf) {
  conf.add(Route(`/abcd/?`, abcdMethod#doSomething))
}

然而,当我浏览/ abcd时,我得到404错误:(

我如何使这项工作?

1 个答案:

答案 0 :(得分:1)

确保您的路由处理程序方法doSomething()执行 NOT 获取任何参数。例如,将以下内容另存为Example.fan

using afIoc
using afBedSheet

class MyRoutes {
  Text abcdMethod() {
    return Text.fromPlain("Hello from `abcd/`!")
  }
}

class AppModule {
  @Contribute { serviceId="Routes" }
  static Void contributeRoutes(OrderedConfig conf) {
    conf.add(Route(`/abcd/?`, MyRoutes#abcdMethod))
  }
}

class Example {
  Int main() {
    afBedSheet::Main().main([AppModule#.qname, "8080"])
  }
}

运行它:

> fan Example.fan -env dev

(附加-env dev将列出404页面上的所有可用路线。)

由于/abcd/?的结尾为?,因此它会匹配http://localhost:8080/abcd的文件网址和http://localhost:8080/abcd/的目录网址。但请注意,不会匹配/abcd内的任何网址。

要匹配/abcd内的文件,请在路线方法中添加Uri参数(以捕获路径)并将路线更改为:

/abcd/**  only matches direct descendants --> /abcd/wotever

/abcd/*** will match subdirectories too   --> /abcd/wot/ever

例如:

using afIoc
using afBedSheet

class MyRoutes {
  Text abcdMethod(Uri? subpath) {
    return Text.fromPlain("Hello from `abcd/` - the sub-path is $subpath")
  }
}

class AppModule {
  @Contribute { serviceId="Routes" }
  static Void contributeRoutes(OrderedConfig conf) {
    conf.add(Route(`/abcd/***`, MyRoutes#abcdMethod))
  }
}

class Example {
  Int main() {
    afBedSheet::Main().main([AppModule#.qname, "8080"])
  }
}