由于 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>
让我们创建一个配置 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');
让我们创建一个模型类 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 并将其解压缩到您的文件系统。出于开发目的,我更喜欢更新 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 作为我们的模板引擎来为我们的应用程序提供 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"; } }
我们需要创建一个从上述控制器返回的模板 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