原文: http://zetcode.com/spring/webjars/

Spring WebJars 教程展示了如何在 Spring Web 应用中使用 WebJars。

Spring 是用于创建企业应用的流行 Java 应用框架。

Webjars

WebJars 是打包到 JAR(Java 存档)文件中的客户端 Web 库(例如 jQuery 或 Semantic UI)。 WebJars 使前端库和资产的工作自动化。

Spring WebJar 示例

在以下示例中,我们使用 Semantic-UI WebJar。 语义 UI 是一种流行的 CSS 框架。

  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. logback.xml
  14. └───templates
  15. index.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>WebJarEx</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. <spring-version>5.1.4.RELEASE</spring-version>
  16. <thymeleaf-version>3.0.11.RELEASE</thymeleaf-version>
  17. </properties>
  18. <dependencies>
  19. <dependency>
  20. <groupId>ch.qos.logback</groupId>
  21. <artifactId>logback-classic</artifactId>
  22. <version>1.2.3</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>javax.servlet</groupId>
  26. <artifactId>javax.servlet-api</artifactId>
  27. <version>4.0.1</version>
  28. <scope>provided</scope>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-webmvc</artifactId>
  33. <version>${spring-version}</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.webjars</groupId>
  37. <artifactId>Semantic-UI</artifactId>
  38. <version>2.4.1</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.webjars</groupId>
  42. <artifactId>webjars-locator</artifactId>
  43. <version>0.34</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.thymeleaf</groupId>
  47. <artifactId>thymeleaf-spring5</artifactId>
  48. <version>${thymeleaf-version}</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.thymeleaf</groupId>
  52. <artifactId>thymeleaf</artifactId>
  53. <version>${thymeleaf-version}</version>
  54. </dependency>
  55. </dependencies>
  56. <build>
  57. <plugins>
  58. <plugin>
  59. <groupId>org.apache.maven.plugins</groupId>
  60. <artifactId>maven-war-plugin</artifactId>
  61. <version>3.2.2</version>
  62. </plugin>
  63. </plugins>
  64. </build>
  65. </project>

pom.xml中,我们具有项目依赖项。

  1. <dependency>
  2. <groupId>org.webjars</groupId>
  3. <artifactId>Semantic-UI</artifactId>
  4. <version>2.4.1</version>
  5. </dependency>

我们使用语义 UI WebJar。

  1. <dependency>
  2. <groupId>org.webjars</groupId>
  3. <artifactId>webjars-locator</artifactId>
  4. <version>0.34</version>
  5. </dependency>

webjars-locator允许我们引用资产而不引用资产的版本,该版本会自动检测到。

resources/logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <logger name="org.springframework" level="ERROR"/>
  4. <logger name="com.zetcode" level="INFO"/>
  5. <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n
  8. </Pattern>
  9. </encoder>
  10. </appender>
  11. <root>
  12. <level value="INFO" />
  13. <appender-ref ref="consoleAppender" />
  14. </root>
  15. </configuration>

这是logback.xml配置

com/zetcode/config/MyWebInitializer.java

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

MyWebInitializer初始化 Spring Web 应用。 它包含一个配置类:WebConfig

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.DefaultServletHandlerConfigurer;
  9. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  10. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  11. import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
  12. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  13. import org.thymeleaf.spring5.SpringTemplateEngine;
  14. import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
  15. import org.thymeleaf.spring5.view.ThymeleafViewResolver;
  16. @Configuration
  17. @EnableWebMvc
  18. @ComponentScan(basePackages = {"com.zetcode"})
  19. public class WebConfig implements WebMvcConfigurer {
  20. @Autowired
  21. private ApplicationContext applicationContext;
  22. @Bean
  23. public SpringResourceTemplateResolver templateResolver() {
  24. var templateResolver = new SpringResourceTemplateResolver();
  25. templateResolver.setApplicationContext(applicationContext);
  26. templateResolver.setPrefix("classpath:templates/");
  27. templateResolver.setSuffix(".html");
  28. return templateResolver;
  29. }
  30. @Bean
  31. public SpringTemplateEngine templateEngine() {
  32. var templateEngine = new SpringTemplateEngine();
  33. templateEngine.setTemplateResolver(templateResolver());
  34. templateEngine.setEnableSpringELCompiler(true);
  35. return templateEngine;
  36. }
  37. @Bean
  38. public ViewResolver viewResolver() {
  39. var resolver = new ThymeleafViewResolver();
  40. var registry = new ViewResolverRegistry(null, applicationContext);
  41. resolver.setTemplateEngine(templateEngine());
  42. registry.viewResolver(resolver);
  43. return resolver;
  44. }
  45. @Override
  46. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  47. registry
  48. .addResourceHandler("/webjars/**")
  49. .addResourceLocations("/webjars/").resourceChain(false);
  50. }
  51. @Override
  52. public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  53. configurer.enable();
  54. }
  55. }

WebConfig配置 Thymeleaf 模板引擎,告诉 Spring 在哪里寻找 WebJars,并启用转发到默认 servlet 来处理静态资源的功能。

  1. @Override
  2. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  3. registry
  4. .addResourceHandler("/webjars/**")
  5. .addResourceLocations("/webjars/").resourceChain(false);
  6. }

我们将通过/webjars/路径引用 WebJars。 对于版本无关的 WebJars,必须调用resourceChain()方法。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.ui.Model;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import java.util.List;
  6. @Controller
  7. public class MyController {
  8. @GetMapping(value = "/")
  9. public String home(Model model) {
  10. var words = List.of("wood", "star", "cloud", "water",
  11. "river", "spring");
  12. model.addAttribute("words", words);
  13. return "index";
  14. }
  15. }

MyController包含主页的一种路由。 我们向模板发送一些数据。 数据将显示在 HTML 表中,该表将使用 Semantic-UI 设置样式。

resources/templates/index.html

  1. <!DOCTYPE html>
  2. <html xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Home page</title>
  6. <link rel="stylesheet" th:href="@{/webjars/Semantic-UI/semantic.css}">
  7. </head>
  8. <body>
  9. <section class="ui container">
  10. <h2>English words</h2>
  11. <table class="ui striped celled table">
  12. <thead>
  13. <tr>
  14. <th>Index</th>
  15. <th>Word</th>
  16. </tr>
  17. </thead>
  18. <tbody>
  19. <tr th:each="word : ${words}">
  20. <td th:text="${wordStat.index + 1}">Index</td>
  21. <td th:text="${word}">A word</td>
  22. </tr>
  23. </tbody>
  24. </table>
  25. </section>
  26. </body>
  27. </html>

这是主页。

  1. <link rel="stylesheet" th:href="@{/webjars/Semantic-UI/semantic.css}">

我们链接到semantic.css文件,该文件来自 WebJar。

  1. <table class="ui striped celled table">

CSS 类来自 Semantic-UI 库。

在本教程中,我们创建了一个使用 Semantic-UI WebJar 样式化 HTML 表的样式。

您可能也对这些相关教程感兴趣: Spring Jetty 教程Spring @GetMapping教程Spring DefaultServlet教程Spring Web 应用简介Java 教程