如何在没有web.xml的情况下将Spring应用程序部署到Tomcat

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(85)   2024-04-21 06:20:13

介绍

由于 Servlet 3 规范 web.xml 不再需要用于配置您的 Web 应用程序,并且已被使用注释所取代。在本文中,我们将了解如何将不使用 web.xml 的简单的基于 Spring 的应用程序部署到 Tomcat 8.5.*。

创建一个空应用程序

使用以下命令使用 maven webapp 原型创建一个空的 Web 应用程序:

mvn archetype:generate -DgroupId=info.sanaulla -DartifactId=spring-tomcat-sample 
   -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-webapp

删除在 web.xml 中创建的 src\main\webapp\WEB-INF 然后我们需要更新 maven-war-plugin 如果 web.xml 丢失不会失败,这可以通过更新 build 标签中的插件信息来完成,如下所示:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <id>default-war</id>
      <phase>prepare-package</phase>
      <configuration>
        <failOnMissingWebXml>false</failOnMissingWebXml>
      </configuration>
    </execution>
  </executions>
</plugin>

设置依赖项

我们需要将以下依赖项添加到 pom.xml

<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>javax.servlet-api</artifactId>
  <version>4.0.0</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>${spring.version}</version>
</dependency>
<dependency>
  <groupId>org.thymeleaf</groupId>
  <artifactId>thymeleaf-spring5</artifactId>
  <version>${thymeleaf.version}</version>
</dependency>
<dependency>
  <groupId>nz.net.ultraq.thymeleaf</groupId>
  <artifactId>thymeleaf-layout-dialect</artifactId>
  <version>${thymeleaf-layout-dialect.version}</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>${jackson.version}</version>
</dependency>
<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>${h2.version}</version>
</dependency>
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
  <version>${lombok.version}</version>
</dependency>

它们对应的版本属性如下:

<properties>
  <maven.compiler.target>1.8</maven.compiler.target>
  <maven.compiler.source>1.8</maven.compiler.source>
  <java.version>1.8</java.version>

  <apache.commons.version>3.6</apache.commons.version>
  <h2.version>1.4.196</h2.version>
  <jackson.version>2.9.2</jackson.version>
  <lombok.version>1.16.18</lombok.version>
  <spring.version>5.0.0.RELEASE</spring.version>
  <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
  <thymeleaf-layout-dialect.version>2.2.1</thymeleaf-layout-dialect.version>
</properties>

配置 H2 嵌入式数据库

让我们创建一个配置 bean 来配置我们的 DataSource,它是 Embedded H2 并创建 Bean 类型的 NamedParameterJdbcTemplate

@Configuration
public class DBConfiguration {

  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
      .generateUniqueName(false)
      .setName("testdb")
      .setType(EmbeddedDatabaseType.H2)
      .addDefaultScripts()
      .setScriptEncoding("UTF-8")
      .ignoreFailedDrops(true)
      .build();
  }

  @Bean
  public NamedParameterJdbcTemplate namedParamJdbcTemplate() {
    NamedParameterJdbcTemplate namedParamJdbcTemplate = 
      new NamedParameterJdbcTemplate(dataSource());
    return namedParamJdbcTemplate;
  }
}

然后我们需要一个 SQL 脚本 schema.sql 来设置表,并且 data.sql 会在每次应用程序运行时为它们添加数据。让我们在 src/main/resources 中创建相应的文件:

-- schema.sql
DROP TABLE IF EXISTS person;

CREATE TABLE person(
  id NUMERIC IDENTITY PRIMARY KEY,
  first_name VARCHAR(512) NOT NULL,
  last_name VARCHAR(512) NOT NULL,
  date_of_birth TIMESTAMP NOT NULL,
  place_of_birth VARCHAR(512)
);

-- data.sql
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth) 
VALUES ('First', 'Last', DATE '1990-02-21', 'Bangalore');
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth) 
VALUES ('First2', 'Last2', DATE '1987-02-21', 'Mumbai');
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth) 
VALUES ('First3', 'Last3', DATE '1996-02-21', 'Chennai');
INSERT INTO person(first_name, last_name, date_of_birth, place_of_birth) 
VALUES ('First4', 'Last4', DATE '1978-02-21', 'Delhi');

创建 API 控制器

让我们创建一个模型类 Person

@Data
public class Person {
  private Integer id;
  private String firstName;
  private String lastName;
  private Date dateOfBirth;
  private String placeOfBirth;
}

以及相应的 DAO 类 PersonDAO

@Service
public class PersonDAO {

  @Autowired NamedParameterJdbcTemplate jdbcTemplate;

  public List<Person> getPersons(){
    return jdbcTemplate.query("SELECT * FROM person", 
      (ResultSet rs, int rowNum) -> {
        Person p = new Person();
        p.setId(rs.getInt("id"));
        p.setFirstName(rs.getString("first_name"));
        p.setLastName(rs.getString("last_name"));
        p.setDateOfBirth(rs.getDate("date_of_birth"));
        p.setPlaceOfBirth(rs.getString("place_of_birth"));
        return p;
    });
  }
}

API控制器如下图所示:

@RestController
@RequestMapping("/api/persons")
public class ApiController {

  @Autowired PersonDAO personDao;

  @GetMapping
  public ResponseEntity<?> getPersons(){
    return ResponseEntity.ok(personDao.getPersons());
  }
}

将应用程序部署到 Tomcat

我假设您已经下载了 Tomcat 并将其解压缩到您的文件系统。出于开发目的,我更喜欢更新 server.xml 来配置上下文并指向 exploded war 目录,如下所示:

<Context path="/sample" reloadable="true" 
  docBase="G:\samples\spring-tomcat-sample\target\spring-tomcat-sample" />

对于与生产相关的部署,您可以将 war 上传到服务器。

因此,一旦启动服务器,您就可以通过在浏览器中访问 API URL http://localhost:8080/sample/api/persons 来验证应用程序是否已正确部署以获取数据如下所示:

配置 Thymeleaf

现在让我们配置 Thymeleaf 作为我们的模板引擎来为我们的应用程序提供 UI。配置它需要以下 bean 定义: – 解析模板的技术。有很多可能性,我们将使用基于类路径的模板解析器 – 创建 SpringTemplateEngine 的实例并设置模板解析器技术 – 设置 Spring 的 ViewResolver 以使用 SpringTemplateEngine

@Configuration
public class ViewConfiguration {

  @Bean
  public ClassLoaderTemplateResolver templateResolver() {
    ClassLoaderTemplateResolver templateResolver = 
      new ClassLoaderTemplateResolver();
    templateResolver.setPrefix("templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode(TemplateMode.HTML);
    templateResolver.setCacheable(false);
    return templateResolver;
  }

  @Bean
  public SpringTemplateEngine templateEngine() {
    SpringTemplateEngine templateEngine = 
      new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver());
    templateEngine.addDialect(new LayoutDialect());
    return templateEngine;
  }

  @Bean
  public ViewResolver viewResolver() {
    ThymeleafViewResolver viewResolver = 
      new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    viewResolver.setCharacterEncoding("UTF-8");
    return viewResolver;
  }

}

创建视图控制器

让我们创建一个简单的控制器来为我们的 UI 模板提供服务:

@Controller
@RequestMapping("/")
public class ViewController {

  @Autowired PersonDAO personDao;

  @GetMapping
  public String index(Model model) {
    model.addAttribute("persons", personDao.getPersons());
    return "index";
  }
}

创建基于 Thymeleaf 的模板

我们需要创建一个从上述控制器返回的模板 index.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" 
  xmlns:th="http://www.thymeleaf.org">
  <head>
    <link rel="stylesheet" 
      href="https://bootswatch.com/4/cerulean/bootstrap.min.css" />
  </head>
  <body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-primary">
      <a class="navbar-brand" href="#">Spring on Tomcat</a>
    </nav>
    <div class="container">
      <div class="page-header"><h1>Spring on Tomcat</h1></div>
      <div class="row">
        <div class="col">
          <ul class="list-group">
            <li class="list-group-item" th:each="p : ${persons}">
            [[${p.firstName}]] [[${p.lastName}]], 
            Date Of Birth: [[${#dates.format(p.dateOfBirth, 'dd/MMM/yyyy')}]]
            Place: [[${p.placeOfBirth}]]
            </li>
          </ul>
        </div>
      </div>
    </div>
    <script src="https://bootswatch.com/_vendor/jquery/dist/jquery.min.js"></script>
    <script src="https://bootswatch.com/_vendor/popper.js/dist/umd/popper.min.js"></script>
    <script src="https://bootswatch.com/_vendor/bootstrap/dist/js/bootstrap.min.js"></script>
  </body>
</html>

总结

在本文中,我们研究了在不使用 web.xml(不使用 Spring Boot)的情况下配置一个简单的基于 Spring MVC 的应用程序并将其部署到 Tomcat。我们还配置了 Thymeleaf 来呈现我们的 UI 模板。完整的代码可以在这里找到

标签2: Java教程
地址:https://www.cundage.com/article/jcg-deploy-spring-application-without-web-xml-tomcat.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...