Java EE 8 MVC:控制器的详细介绍

Java EE MVC是为Java EE 8规划并在JSR-371中指定的基于动作的新MVC框架。 这是我的Java EE 8 MVC教程的第二篇文章。 第一篇文章介绍了基础知识,并展示了如何开始使用 Java EE 8 MVC参考实现Ozark

在本文中,我们将更详细地介绍MVC控制器。

MVC控制器

控制器负责处理传入的请求。 它调用业务逻辑,更新模型并返回应呈现的视图。 MVC控制器是用@Controller注释的JAX-RS资源方法。 如果使用@Controller注释类,则该类的所有资源方法都将被视为控制器。

以下示例显示了一个简单的Controller,该Controller呈现给定产品ID的产品详细信息页面:

@Path("product")
@Controller
public class ProductController {

  @Inject
  private Models models;

  @Inject
  private ProductService productService;

  @GET
  public String getProductDetailPage(@QueryParam("id") long productId) {
    Product product = this.productService.getProduct(productId);
    models.put("product", product);
    return "/WEB-INF/jsp/productDetailPage.jsp";
  }
}

该控制器使用ProductService解析产品ID(作为ID请求参数传递给产品)。 将获得的产品添加到模型中,并返回视图的路径。 然后使用存储在模型中的信息渲染视图。

像JAX-RS中一样,@Path批注用于定义URL路径。 可通过如下所示的URL访问此控制器:

/<application-path>/product?id=42

下面的示例显示了一个混合类,具有一个MVC控制器方法和一个传统的JAX-RS资源方法:

@Path("hybrid")
public class HybridController {

  @GET
  @Path("jaxrs")
  public Response jaxrs() {
    return Response.status(200).build();
  }

  @Path("mvc")
  @GET
  @Controller
  public String mvc() {
    return "/WEB-INF/jsp/hello.jsp";
  }
}

控制器方法的工作方式与JAX-RS资源方法非常相似。 但是,有两个小区别:

  • Controller方法上String的返回类型被解释为视图路径。 使用JAX-RS资源方法,返回的String被解释为文本内容。
  • Controller方法的默认响应媒体类型是text / html。 像在JAX-RS中一样,可以使用@Produces批注来更改媒体类型。

MVC Controller类和具有MVC Controller方法的混合类需要是CDI管理的bean。 像JAX-RS资源类一样,每个请求都实例化MVC控制器类。 对于每个请求,都会创建一个新的Controller类实例。

像在JAX-RS中一样,受支持的HTTP动词由注释定义。 如果控制器方法应侦听HTTP POST请求,则需要使用@POST而不是@Get进行注释。

例如:

@Controller
@Path("http")
public class PostController {

  @POST
  @Path("post")
  public String post() {
    return "/WEB-INF/jsp/hello.jsp";
  }
}

控制器返回类型

MVC控制器方法支持四种不同的返回类型:

  • 字符串–返回的字符串值被解释为视图路径。
  • void –在这种情况下,需要使用@View批注定义视图
  • 可视的–一种抽象,包括有关视图,模型和使用的视图引擎的信息。
  • 响应– JAX-RS响应。 响应的实体类型必须为String,void或Viewable。

下列类使用不同的返回类型定义了四种控制器方法。 所有方法都返回相同的响应:

@Controller
@Path("return-types")
public class ReturnTypesController {

  @GET
  @View("/WEB-INF/jsp/hello.jsp")
  @Path("return-void")
  public void returnVoid() {
  }

  @GET
  @Path("return-string")
  public String returnString() {
    return "/WEB-INF/jsp/hello.jsp";
  }

  @GET
  @Path("return-string")
  public Viewable returnViewable() {
    return new Viewable("/WEB-INF/jsp/hello.jsp");
  }

  @GET
  @Path("return-response")
  public Response returnResponse() {
    return Response.status(Response.Status.OK)
        .entity("/WEB-INF/jsp/hello.jsp")
        .build();
  }
}

返回JAX-RS响应是最灵活的方法。 这样,可以使用JAX-RS响应构建器来修改HTTP状态代码,响应标头等。

如果将void用作返回类型,则需要使用@View批注定义视图。 @View可以应用于方法(如前面的示例)和类。 如果使用@View注释类,则该视图将应用于该类中的所有控制器方法。 类级别的@View批注可以由方法级别上的更特定的视图定义覆盖,如以下示例所示:

@Controller
@Path("views")
@View("/WEB-INF/jsp/foo.jsp")
public class ViewController {

  @GET
  @Path("first")
  public void first() {
    // renders foo.jsp
  }

  @GET
  @Path("second")
  @View("/WEB-INF/jsp/bar.jsp")
  public void second() {
    // renders bar.jsp
  }

  @GET
  @Path("third")
  public String third() {
    // renders baz.jsp
    return "/WEB-INF/jsp/baz.jsp";
  }
}

摘要

@Controller批注可用于方法和类。 当在类上使用时,该类的所有方法均被视为控制器。 控制器方法调用业务逻辑并确定应呈现的视图。 具有Controller方法的类是CDI管理的Bean。 对于每个请求,将创建一个新的类实例。 传统的JAX-RS资源方法可以与同一类中的MVC Controller方法结合使用。

在有关Java EE 8 MVC的下一篇文章中,我们将介绍参数绑定和验证。

  • 您可以在GitHub上找到示例源代码。

翻译自: https://www.javacodegeeks.com/2015/10/java-ee-8-mvc-a-detailed-look-at-controllers.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值