AJAXJS MVC 使用教程之二:定义路由路径

写一个控制器很简单,但有下面注意的事项需要遵守的。

  • 每个控制器类必须要实现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所示。

AJAXJS MVC 使用教程之二:定义路由路径_第1张图片表格 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")

你可能感兴趣的:(AJAXJS,Framework)