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