20.2. @Template

20.2.1. Annotating Resource methods 注释资源的方法

不需要每次都用 Viewable ,如果你想绑定模型到模板上。为了让资源方法可读性更强(为了避免冗长的包装模板参考模型到 Viewable),你可以简单的通过 @Template 注释资源的方法。从前面的例子,我们做下修改,见 Example 20.2, “Using @Template on a resource method”

Example 20.2. Using @Template on a resource method

  1. package com.example;
  2. @Path("foo")
  3. public class Foo {
  4. @GET
  5. @Template("index.foo")
  6. public String get() {
  7. return "FOO";
  8. }
  9. }

在这个例子中,Foo JAX-RS 资源类仍然是上一节中的 控制器,但是 模型现在是返回注解资源的方法。

这种方法的处理基本上是和 放回一个 Viewable 类实例是相同的。如果一个方法是@Template注解的,也可返回 Viewable 类实例,Viewable 类实例将优先于那些在注释的定义。产生的媒体类型,是Viewable 还是 @Template 将有方法或者类级别的@Produces注解决定。

20.2.2. Annotating Resource classes 注解资源类

资源类可以隐式地通过@Template注解来与模板进行关联。见 Example 20.3, “Using @Template on a resource class”

Example 20.3. Using @Template on a resource class

  1. @Path("foo")
  2. @Template
  3. public class Foo {
  4. public String getFoo() {
  5. return "FOO";
  6. }
  7. }

这个例子需要更多的解释是这样的。首先,你可能已经注意到,没有定义资源的方法为 JAX-RS 资源。同时,没有被定义的模板引用。在这种情况下,由于@Template 注释放在资源类中不包含任何信息,默认模板将使用相对引用 index(详见20.3节,20.3. Absolute vs. Relative template reference)。对于缺少资源的方法,默认的 @GET 方法将自动生成的 Foo 资源(现在是 MVC 的控制器)。生成的资源的方法执行与下列显示资源的方法的实现是等效的:

  1. @GET
  2. public Viewable get() {
  3. return new Viewable("index", this);
  4. }

可见,资源类充当了 model 的角色。产生媒体类型是由 声明在资源类的 @Produces注解决定的,如果需要的话。

注意:在这种基于资源类的隐式的 MVC 视图模板中,控制器同时也是模型。在这种情况下,模板引用 index 是特殊的,它的模板引用关联的是控制器实例本身。

下面例子,MVC 控制器以 JAX-RS @GET 子资源方法来表示,同时也可以在资源类中注明 @Template来生成

  1. @GET
  2. @Path("{implicit-view-path-parameter}")
  3. public Viewable get(@PathParameter("{implicit-view-path-parameter}") String template) {
  4. return new Viewable(template, this);
  5. }

这允许 Jersey 来支持隐式的子资源模板。举例,一个在 foo/bar 路径的JAX-RS 将视图使用相对模板引用 bar ,分解为 绝对模板引用 /com/foo/Foo/bar

换句话说,一个 HTTP GET 请求/foo/bar会通过 Foo 资源方法自动处理产生并将请求转到注册模板处理器来支持绝对参考引用 /com/foo/Foo/bar,其中模型仍然是相同的 JAX-RS 资源类 Foo 的一个实例。