package org.nutz.mvc.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 声明了一组URL。 * <p> * 这个注解可以声明在模块上,也可以声明在每个模块的入口函数里。 * <p> * <b> 如果声明在模块上:</b> * <ul> * <li>如果没有设值,那么默认的,就采用模块类名小写作为路径 * <li>如果声明了多个值,那么一个模块就可能会有多个前缀 * </ul> * 比如下面的例子表示, 整个 Abc 模块各个入口函数的地址以 以 /abc 开头: * * <pre> * @At * public class Abc {} * </pre> * * 又比如这个例子表示,整个模块各个入口函数的地址以 /uuu 或 /ddd 开头 * * <pre> * @At({"/uuu", "/ddd"}) * public class Abc {} * </pre> * * <p> * <b>如果声明在入口函数上</b> * <ul> * <li>如果没有设值,那么默认的,就采用函数名小写作为路径 * <li>如果声明了多个值,那么一个入口函数就可能会有多个地址,并且这个地址会和模块的地址做“笛卡尔积”<br> * <i>就是说,如果模块有两个地址,一个入口函数有两个地址,那么这个入口函数实际上有 2 x 2 = 4 个地址</i> * </ul> * * 比如下面的例子,入口函数地址为 :<b>/abc/hello</b> * * <pre> * @At * public class Abc { * @At * public String hello() { * return "Hello"; * } * } * </pre> * * 而这个例子,入口函数可以支持4个地址: * <ul> * <li><b>/uuu/say</b> * <li><b>/uuu/hello</b> * <li><b>/ddd/say</b> * <li><b>/ddd/hello</b> * </ul> * * <pre> * @At("/uuu", "/ddd") * public class Abc{ * @At("/say","/hello") * public String hello() { * return "Hello"; * } * } * </pre> * * @author zozoh(zozohtnt@gmail.com) */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Documented public @interface At { /** * 如果为这个映射声明一个 key,哪么,可以通过 key 来访问这个 @At 的一个值 * <p> * 默认的,你不需要关心这个属性 */ String key() default ""; String[] value() default {}; }