写一个控制器很简单,但有下面注意的事项需要遵守的。
- 每个控制器类必须要实现IController接口,才能表明为控制器组件,否则不被视为控制器。
- 至少要一个
@Path
路径的注解定义在类声明上。 - 控制器的类名推荐以Controller结尾,比如ApplicationController, HelloController等。
- 控制器必须在配置site_config.json指定的
System.scanPackage
包名之中,也就是上述定义搜索的包名,否则不能登记该控制器。
可以多个URL绑定对应一个控制器类(如下例子所示),但作为父级URL路径只允许有一个。一个父级的路由下面可以有多个子路由,在该控制器下的子路由规则都会和父路由的@Path
路径进行拼接。每个控制器可以有多个操作,每个操作将会独立映射到URL上,均是通过@Path
注解完成。例如上面的例子@Path("/SayHello")
等于在浏览器使用http://localhost:8080/HelloWorld/SayHello
访问,其中HelloWorld是所在的项目名称;SayHello是URL任意的目录,URL还可以有别的部分。
下面看一个稍微复杂一点的例子。注意第三个方法redirect()
的@Path
路径以斜杠“/”开头,表示不参与父级URL的组合拼接,独自从跟目录开始。
package com.mysoft.app;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import com.ajaxjs.mvc.controller.IController;
@Path("/foo") // 定义URL路径
public class SimpleController implements IController {
@GET
public String showHTML() {
return "html::Hello World!";
}
@GET
@Path("jsp") // 与类的@Path注解里的路径组合
public String gotoJSP() {
return "/jsp/my-jsp.jsp";
}
@GET
@Path("/bar/blog") // 注意斜杠 / 开头,表示不与类的@Path注解里的路径组合
public String redirect() {
return "redirect::http://blog.csdn.net/zhangxin09";
}
@POST
public String showJSON() {
return "json::{\"name\":\"Jack\"}";
}
}
一个控制器可以管理彼此相关的多个动作Action,定义在不同的方法中,如上例的@GET、@POST、@PUT、@DELETE
注解所示,通过方法的注解来支持HTTP四个方法。上例将相应的URL 映射到控制器的Action方法上,如表格 4.2所示。
表格 4.2: URL映射类的方法
首先用户访问目录/foo即可执行这个类showHTML()方法;若访问/foo/jsp这个路径,执行的是这个类身上gotoJSP()方法,对应渲染的视图文件为/jsp/my-jsp.jsp1;若访问/bar/blog这个路径,执行的是这个类身上redirect()
方法,它会执行一个URL跳转,目标地址就是返回的字符串。因为当前控制器父级路径是/foo
,所以直接/foo与blog
组合成为了这个地址。如果是HelloWorld例子,那便是/HelloWorld/blog
的组合;最后一个是POST方法,当POST/foo的时候,执行的是这个类身上showJSON()
方法,不会渲染任何视图,只是返回JSON字符串。以上就是把表格 4.1的约定前缀演示一遍了。
@Path
总结用法如下。
- 每个控制器类至少有一个@Path位于其类注解身上。
- 类
@Path
与方法非斜杠/开头的@Path
联合组成一个完整的URL请求地址,以/开头的@Path
独立一个URL,不受类@Path
影响。 - 方法若没有任何
@Path
注解表示依从类@Path
路径。 @Path
包含{id}
为纯数字URL地址部分,类似/product/10020/
中10020部分,通常为获取id所用。@Path
包含{root}
的表示为类@Path
之变量,获取顶级目录。解析控制器时候,会把{root}
替换为类@Path
注解的实际值。例如/{root}/detail/
,类注解为/product
,替换为/product/detail
。
-{id}和{root}
皆不能在类@Path上使用,只能在方法注解上使用。- 对于多级的路径是直接支持的,例如
@Path("blog/detail/show")
,不需要定义中间的@Path("blog")或@Path("blog/detail")
。