介绍
由于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
删除在src\main\webapp\WEB-INF
创建的web.xml
,然后我们需要更新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来配置嵌入式H2的DataSource
,并创建一个NamedParameterJdbcTemplate
类型的Bean
:
@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
来配置上下文并指向爆炸的war目录,如下所示:
<Context path="/sample" reloadable="true"
docBase="G:\samples\spring-tomcat-sample\target\spring-tomcat-sample" />
对于与生产相关的部署,您可以将战争上传到服务器上。
因此,一旦启动服务器,就可以通过在浏览器中访问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模板。 完整的代码可以在这里找到
翻译自: https://www.javacodegeeks.com/2017/11/deploy-spring-application-without-web-xml-tomcat.html