原文:http://zetcode.com/java/mvc/

Java MVC 教程是 Java MVC 框架的入门教程。 我们使用 Java MVC 创建一个简单的 Web 应用,并将其部署在 Tomcat 和 Glassfish 上。

MVC

模型视图控制器(MVC)架构模式将应用分为三个部分:模型,视图和控制器。 该模型表示应用中的数据,视图是数据的可视表示,控制器处理并响应事件(通常是用户操作),并且可以调用模型上的更改。 这个想法是通过引入一个中间组件:控制器,将数据访问和业务逻辑与数据表示和用户交互分开。

Java MVC

Java MVC 是针对新的基于 Java 动作的 Web 框架的规范(JSR-371)。 它是传统的基于组件的 JSF 的替代方案。 MVC API 位于 JAX-RS 之上,并与现有的 Java EE 技术(如 CDI 和 Bean 验证)集成。 Eclipse Ozark 是 Java MVC 的实现。 它当前包含对 RESTEasy,Jersey 和 Apache CXF 的支持。

MVC 控制器是由@Controller装饰的 JAX-RS 资源方法。 MVC 控制器负责组合数据模型和视图(模板)以生成 Web 应用页面。 模型承载在视图中显示的数据。 使用@Named注解或通过注入Models接口创建模型。

视图定义了输出页面的结构,可以引用一个或多个模型。 视图引擎的责任是通过提取模型中的信息并生成输出页面来呈现视图。

Tomcat 中的 Java MVC 示例

我们使用 Java MVC 创建一个简单的 Web 应用,并将其部署在 Tomcat 上。 在 JAX-RS 库中,我们选择了 Jersey。

  1. $ tree
  2. .
  3. ├── nb-configuration.xml
  4. ├── pom.xml
  5. └── src
  6. ├── main
  7. ├── java
  8. └── com
  9. └── zetcode
  10. ├── conf
  11. └── ApplicationConfig.java
  12. ├── controller
  13. └── HelloController.java
  14. └── model
  15. └── Message.java
  16. ├── resources
  17. └── webapp
  18. ├── index.html
  19. ├── META-INF
  20. └── context.xml
  21. └── WEB-INF
  22. ├── beans.xml
  23. └── views
  24. └── hello.jsp
  25. └── test
  26. └── java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>JavaMvcTomcatEx</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <name>JavaMvcTomcatEx</name>
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. </properties>
  17. <dependencyManagement>
  18. <dependencies>
  19. <dependency>
  20. <groupId>org.glassfish.jersey</groupId>
  21. <artifactId>jersey-bom</artifactId>
  22. <version>2.26</version>
  23. <type>pom</type>
  24. <scope>import</scope>
  25. </dependency>
  26. </dependencies>
  27. </dependencyManagement>
  28. <dependencies>
  29. <dependency>
  30. <groupId>org.glassfish.jersey.inject</groupId>
  31. <artifactId>jersey-hk2</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.glassfish.jersey.containers</groupId>
  35. <artifactId>jersey-container-servlet</artifactId>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.glassfish.jersey.core</groupId>
  39. <artifactId>jersey-server</artifactId>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.glassfish.jersey.ext.cdi</groupId>
  43. <artifactId>jersey-cdi1x</artifactId>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.glassfish.jersey.ext</groupId>
  47. <artifactId>jersey-bean-validation</artifactId>
  48. </dependency>
  49. <dependency>
  50. <groupId>javax.enterprise</groupId>
  51. <artifactId>cdi-api</artifactId>
  52. <version>2.0-EDR1</version>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.jboss.weld.servlet</groupId>
  56. <artifactId>weld-servlet-shaded</artifactId>
  57. <version>3.0.2.Final</version>
  58. </dependency>
  59. <dependency>
  60. <groupId>org.hibernate</groupId>
  61. <artifactId>hibernate-validator</artifactId>
  62. <version>5.2.2.Final</version>
  63. </dependency>
  64. <dependency>
  65. <groupId>javax.mvc</groupId>
  66. <artifactId>javax.mvc-api</artifactId>
  67. <version>1.0-pr</version>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.mvc-spec.ozark</groupId>
  71. <artifactId>ozark-core</artifactId>
  72. <version>1.0.0-m03</version>
  73. </dependency>
  74. <dependency>
  75. <groupId>org.mvc-spec.ozark</groupId>
  76. <artifactId>ozark-jersey</artifactId>
  77. <version>1.0.0-m03</version>
  78. </dependency>
  79. </dependencies>
  80. <build>
  81. <plugins>
  82. <plugin>
  83. <groupId>org.apache.maven.plugins</groupId>
  84. <artifactId>maven-war-plugin</artifactId>
  85. <version>2.3</version>
  86. <configuration>
  87. <failOnMissingWebXml>false</failOnMissingWebXml>
  88. </configuration>
  89. </plugin>
  90. </plugins>
  91. </build>
  92. </project>

为了在 Tomcat 上运行 Java MVC,我们需要包括 Java MVC,Jersey,Bean Validation 和 CDI 的多个依赖项。

context.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context path="/JavaMvcTomcatEx">
  3. <Resource name="BeanManager"
  4. auth="Container"
  5. type="javax.enterprise.inject.spi.BeanManager"
  6. factory="org.jboss.weld.resources.ManagerObjectFactory" />
  7. </Context>

在 Tomcat 的context.xml文件中,我们定义上下文路径并注册WeldBeanManager工厂。

beans.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
  5. http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
  6. bean-discovery-mode="all">
  7. </beans>

WEB-INF目录中,我们有一个空的beans.xml文件。 它是 CDI 的部署描述符。 它可用于配置拦截器,装饰器和其他内容。 即使没有配置,我们也需要添加一个空的beans.xml来注册 CDI。

ApplicationConfig.java

  1. package com.zetcode.conf;
  2. import com.zetcode.controller.HelloController;
  3. import java.util.HashSet;
  4. import java.util.Set;
  5. import javax.ws.rs.ApplicationPath;
  6. import javax.ws.rs.core.Application;
  7. @ApplicationPath("mvc")
  8. public class ApplicationConfig extends Application {
  9. @Override
  10. public Set<Class<?>> getClasses() {
  11. Set<Class<?>> set = new HashSet<>();
  12. set.add(HelloController.class);
  13. return set;
  14. }
  15. }

ApplicationConfig是应用配置类。 从 Servlet 3.0 开始,可以省略web.xml文件。 在 Jersey 中,我们创建一个配置类来扩展抽象Application并使用@ApplicationPath注解。 Application定义 JAX-RS 应用的组件并提供其他元数据。 在这里,我们注册应用所需的资源类,供应器或属性。

  1. set.add(HelloController.class);

我们注册HelloController

Message.java

  1. package com.zetcode.model;
  2. import javax.enterprise.context.RequestScoped;
  3. import javax.inject.Named;
  4. @Named("message")
  5. @RequestScoped
  6. public class Message {
  7. private String text;
  8. public String getText() {
  9. return text;
  10. }
  11. public void setText(String text) {
  12. this.text = text;
  13. }
  14. }

这是一个模型类。 它保存该视图的数据。 @Named注解为模型命名。 我们将在视图中引用该模型。 @RequestScoped使模型在请求期内有效。

HelloController.java

  1. package com.zetcode.controller;
  2. import com.zetcode.model.Message;
  3. import javax.inject.Inject;
  4. import javax.mvc.annotation.Controller;
  5. import javax.ws.rs.GET;
  6. import javax.ws.rs.Path;
  7. @Path("hello")
  8. @Controller
  9. public class HelloController {
  10. @Inject
  11. private Message message;
  12. @GET
  13. public String hello() {
  14. message.setText("Today is a sunny day");
  15. return "hello.jsp";
  16. }
  17. }

@Controller装饰的类是 Java MVC 控制器。 使用@Path,它绑定到hello路径段。

  1. @Inject
  2. private Message message;

使用@Inject,我们注入了模型对象。 它将数据从控制器传送到视图。

  1. @GET
  2. public String hello() {
  3. message.setText("Today is a sunny day");
  4. return "hello.jsp";
  5. }

hello()方法对 GET 请求作出反应。 它将数据设置到模型并返回视图。 从控制器方法返回的字符串被解释为视图路径。 视图引擎的默认视图目录为WEB-INF/views

hello.jsp

  1. <%@page contentType="text/html" pageEncoding="UTF-8"%>
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>JSP Page</title>
  7. </head>
  8. <body>
  9. <p>
  10. The message: ${message.text}
  11. </p>
  12. </body>
  13. </html>

这是视图。 它使用${}语法显示数据。

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Home Page</title>
  5. <meta charset="UTF-8">
  6. </head>
  7. <body>
  8. <p>
  9. <a href="mvc/hello">Get message</a>
  10. </p>
  11. </body>
  12. </html>

这是一个主页。 它包含一个调用控制器的链接。

Glassfish 中的 Java MVC 示例

要在 Glassfish 上运行该示例,我们不需要context.xml文件,并且需要以下三个依赖项:

  1. <dependencies>
  2. <dependency>
  3. <groupId>javax</groupId>
  4. <artifactId>javaee-web-api</artifactId>
  5. <version>7.0</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>javax.mvc</groupId>
  10. <artifactId>javax.mvc-api</artifactId>
  11. <version>1.0-pr</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.mvc-spec.ozark</groupId>
  15. <artifactId>ozark-jersey</artifactId>
  16. <version>1.0.0-m03</version>
  17. </dependency>
  18. </dependencies>

Glasfish 已经包含许多 Tomcat 中不存在的库。 无需其他修改。

在本教程中,我们介绍了 Java MVC 框架。 您可能也对相关教程感兴趣: Java 教程Java MVC Thymeleaf 教程游戏简介Stripes 简介, 或 Java Spark 教程