原文: http://zetcode.com/articles/springwebfirst/

在本教程中,我们将在 Spring 中创建简单的 Web 应用。 创建了三个 Web 应用。 每个应用都以不同的方式配置。

在我们的 Spring Web 应用中,我们使用 Spring 5 和 Thymeleaf 3。

Spring 是流行的 Java 应用框架。 Spring Boot 致力于以最小的努力来创建独立的,生产级的基于 Spring 的应用。

有三种配置 Spring Web 应用的基本方法:

  • XML 格式
  • Java 配置
  • Spring Boot 自动配置

传统上,Spring 使用 XML 文件来配置应用。 后来,创建了一种新方法,其中在 Java 配置类中完成配置。 Spring Boot 自动配置魔术是配置 Spring Web 应用的最新方法。

使用 XML 的 Spring Web 应用配置

在第一个示例中,我们创建一个以 XML 文件配置的 Spring Web 应用。

  1. pom.mxl
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. └───controller
  8. HomeController.java
  9. ├───resources
  10. └───webapp
  11. index.html
  12. └───WEB-INF
  13. spring-servlet.xml
  14. web.xml
  15. └───templates
  16. showMessage.html
  17. └───test
  18. └───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>springwebfirst</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.slf4j</groupId>
  19. <artifactId>slf4j-api</artifactId>
  20. <version>1.7.25</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.slf4j</groupId>
  24. <artifactId>slf4j-simple</artifactId>
  25. <version>1.7.25</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>javax.servlet-api</artifactId>
  30. <version>4.0.1</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.thymeleaf</groupId>
  35. <artifactId>thymeleaf-spring5</artifactId>
  36. <version>3.0.11.RELEASE</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.thymeleaf</groupId>
  40. <artifactId>thymeleaf</artifactId>
  41. <version>3.0.11.RELEASE</version>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-webmvc</artifactId>
  46. <version>5.1.3.RELEASE</version>
  47. </dependency>
  48. </dependencies>
  49. <build>
  50. <plugins>
  51. <plugin>
  52. <groupId>org.apache.maven.plugins</groupId>
  53. <artifactId>maven-war-plugin</artifactId>
  54. <version>3.2.2</version>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

这是 Maven 构建文件。 我们具有以下依赖关系:slf4j-apislf4j-simple用于日志记录,javax.servlet-api用于 Java Servlet 技术,thymeleaf-spring5thymeleaf用于 Thymeleaf 模板引擎,以及spring-webmvc用于创建 Spring Web MVC 应用。

maven-war-plugin创建 Web 存档(WAR)。

WEB-INF/spring-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context.xsd
  10. http://www.springframework.org/schema/mvc
  11. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  12. <context:component-scan base-package="com.zetcode"/>
  13. <mvc:annotation-driven/>
  14. <mvc:default-servlet-handler/>
  15. <bean id="templateResolver"
  16. class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
  17. <property name="prefix" value="/WEB-INF/templates/"/>
  18. <property name="suffix" value=".html"/>
  19. <property name="templateMode" value="HTML"/>
  20. </bean>
  21. <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
  22. <property name="templateEngine" ref="templateEngine"/>
  23. </bean>
  24. <bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
  25. <property name="templateResolver" ref="templateResolver"/>
  26. </bean>
  27. </beans>

spring-servlet.xml配置 Spring Web 应用。 它启用组件扫描,Spring Web 注解(@Controller)并配置 Thymeleaf 模板。

  1. <context:component-scan base-package="com.zetcode" />

这告诉 Spring 在哪里寻找带有@Controller@Repository@Service@Component注解的类并进行注册。 在我们的例子中,我们有一个带有@Controller注解的控制器。

  1. <mvc:annotation-driven/>

<mvc:annotation-driven/>启用基于 Web 的 Spring 注解。

  1. <mvc:default-servlet-handler/>

我们需要此标记来启用静态 HTML 文件。 主页上有一个静态的index.html

  1. <bean id="templateResolver"
  2. class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
  3. <property name="prefix" value="/WEB-INF/templates/"/>
  4. <property name="suffix" value=".html"/>
  5. <property name="templateMode" value="HTML"/>
  6. </bean>
  7. <bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
  8. <property name="templateEngine" ref="templateEngine"/>
  9. </bean>
  10. <bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
  11. <property name="templateResolver" ref="templateResolver"/>
  12. </bean>

这些行用模板引擎,模板视图解析器和模板解析器配置 Thymeleaf。 在模板解析器中,我们指定模板的位置及其扩展名。

WEB-INF/web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app 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/web-app_4_0.xsd"
  6. version="4.0">
  7. <welcome-file-list>
  8. <welcome-file>index.html</welcome-file>
  9. </welcome-file-list>
  10. <servlet>
  11. <servlet-name>spring</servlet-name>
  12. <servlet-class>
  13. org.springframework.web.servlet.DispatcherServlet
  14. </servlet-class>
  15. <load-on-startup>1</load-on-startup>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>spring</servlet-name>
  19. <url-pattern>/</url-pattern>
  20. </servlet-mapping>
  21. <session-config>
  22. <session-timeout>
  23. 30
  24. </session-timeout>
  25. </session-config>
  26. </web-app>

web.xml文件中,我们设置了 Spring DispatcherServlet并选择了欢迎文件。 DispatcherServlet是 Spring 的前端控制器。 该 Servlet 映射到扩展名为*.html的 URL。

com/zetcode/controller/HomeController.java

  1. package com.zetcode.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. @Controller
  5. public class HomeController {
  6. @GetMapping("/message")
  7. public String message() {
  8. return "showMessage";
  9. }
  10. }

HTTP 请求由控制器处理。 它准备一个模型并返回一个视图。 返回的showMessage字符串映射到位于WEB-INF/templates/目录中的showMessage.html文件。

WEB-INF/templates/showMessage.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Message</title>
  6. </head>
  7. <body>
  8. <p>
  9. Hello there
  10. </p>
  11. </body>
  12. </html>

showMessage.html文件显示一条消息。

index.html

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

index.html是主页。 它包含一个链接。

使用 Java 配置进行 Spring Web 应用配置

在第二个示例中,我们创建一个在 Java 配置类中配置的 Spring Web 应用。 在该示例中,web.xmlspring-servlet.xml被替换为MyWebInitializer.javaWebConfig.java

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. ├───config
  8. MyWebInitializer.java
  9. WebConfig.java
  10. └───controller
  11. MyController.java
  12. ├───resources
  13. └───webapp
  14. └───WEB-INF
  15. └───templates
  16. index.html
  17. showMessage.html
  18. └───test
  19. └───java

这是项目结构。 pom.xml文件与第一个示例中的相同。

com/zetcode/config/WebConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.ComponentScan;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.web.servlet.ViewResolver;
  8. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  9. import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
  10. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  11. import org.thymeleaf.spring5.SpringTemplateEngine;
  12. import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
  13. import org.thymeleaf.spring5.view.ThymeleafViewResolver;
  14. @Configuration
  15. @EnableWebMvc
  16. @ComponentScan(basePackages = {"com.zetcode"})
  17. public class WebConfig implements WebMvcConfigurer {
  18. @Autowired
  19. private ApplicationContext applicationContext;
  20. @Bean
  21. public SpringResourceTemplateResolver templateResolver() {
  22. var templateResolver = new SpringResourceTemplateResolver();
  23. templateResolver.setApplicationContext(applicationContext);
  24. templateResolver.setPrefix("/WEB-INF/templates/");
  25. templateResolver.setSuffix(".html");
  26. return templateResolver;
  27. }
  28. @Bean
  29. public SpringTemplateEngine templateEngine() {
  30. var templateEngine = new SpringTemplateEngine();
  31. templateEngine.setTemplateResolver(templateResolver());
  32. templateEngine.setEnableSpringELCompiler(true);
  33. return templateEngine;
  34. }
  35. @Bean
  36. public ViewResolver viewResolver() {
  37. var resolver = new ThymeleafViewResolver();
  38. var registry = new ViewResolverRegistry(null, applicationContext);
  39. resolver.setTemplateEngine(templateEngine());
  40. registry.viewResolver(resolver);
  41. return resolver;
  42. }
  43. }

使用WebConfig.java代替spring-servlet.xml文件。 在WebConfig中,我们使用@EnableWebMvc启用 Spring Web 注解,使用@ComponentScan启用组件扫描,并配置 Thymeleaf 模板引擎。

com/zetcode/config/MyWebInitializer.java

  1. package com.zetcode.config;
  2. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  3. public class MyWebInitializer extends
  4. AbstractAnnotationConfigDispatcherServletInitializer {
  5. @Override
  6. protected Class<?>[] getRootConfigClasses() {
  7. return null;
  8. }
  9. @Override
  10. protected Class<?>[] getServletConfigClasses() {
  11. return new Class[]{WebConfig.class};
  12. }
  13. @Override
  14. protected String[] getServletMappings() {
  15. return new String[]{"/"};
  16. }
  17. }

使用MyWebInitializer类代替web.xml文件。 我们指定 servlet 配置类的名称。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. @Controller
  5. public class MyController {
  6. @GetMapping("/")
  7. public String index() {
  8. return "index";
  9. }
  10. @GetMapping("/message")
  11. public String message() {
  12. return "showMessage";
  13. }
  14. }

这是控制器。 我们有主页和showMessage页面的映射。

WEB-INF/templates/showMessage.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Message</title>
  6. </head>
  7. <body>
  8. <p>Today is a sunny day!</p>
  9. </body>
  10. </html>

showMessage.html文件显示一条消息。

WEB-INF/templates/index.html

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

index.html是主页。 它包含一个链接。

Spring Boot Web 应用

在第三个示例中,我们使用 Spring Boot 创建一个 Web 应用。 Spring Boot 使用另一种默认方法。 它通过嵌入式 Web 服务器使用 JAR 存档。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. Application.java
  8. └───controller
  9. MyController.java
  10. └───resources
  11. application.properties
  12. ├───static
  13. index.html
  14. └───templates
  15. showMessage.html
  16. └───test
  17. └───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>springbootwebfirst</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <parent>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-parent</artifactId>
  19. <version>2.1.0.RELEASE</version>
  20. </parent>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.springframework.boot</groupId>
  35. <artifactId>spring-boot-maven-plugin</artifactId>
  36. </plugin>
  37. </plugins>
  38. </build>
  39. </project>

这是 Maven 构建文件。 spring-boot-starter-web是使用 Spring MVC 构建 Web(包括 RESTful)应用的入门 POM。 spring-boot-starter-thymeleaf是 Thymeleaf 模板引擎的启动器 POM。

请注意,包装设置为 JAR。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. @Controller
  5. public class MyController {
  6. @GetMapping("/message")
  7. public String message() {
  8. return "showMessage";
  9. }
  10. }

这是 Spring Boot Web 应用的控制器类。 控制器以@Controller注解修饰。 控制器具有一个映射。 映射解析为showMessage.html模板,该模板位于WEB-INF/templates目录中。

Application.java

  1. package com.zetcode;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

Application设置 Spring Boot 应用。

WEB-INF/templates/showMessage.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Message</title>
  6. </head>
  7. <body>
  8. <p>Today is a cold day</p>
  9. </body>
  10. </html>

showMessage.html显示一条简单消息。

WEB-INF/static/index.html

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

index.html是包含链接的应用的主页。 静态资源(例如,纯 HTML 文件)被放入static目录。

在本教程中,我们创建了第一个 Spring Web 应用。 您可能也对相关教程感兴趣:独立的 Spring 应用FreeMarker 教程Java 教程Spring DefaultServlet教程Spark 简介Strips 简介