Web 项目 tiger 之16 使用外置 Servlet 容器

本文导读

  • 嵌入式 Servlet 容器的应用打成为可执行的 jar 包,优点是 简单、便携;缺点是 不支持 JSP、优化定制比较复杂(使用定制器、全局配置文件修改)
  • Spring Boot 提供程序员可以使用外置的 Servlet 容器,本文以外置的 Tomcat 服务器为例,此时应用要打包成为 war 包。
  • 简而言之,大概流程如下:
  1. 必须创建一个 war 包项目,利用 idea 创建好目录结构
  2. 将嵌入式的 Tomcat 指定为 provided;
  3. 必须编写一个 SpringBootServletInitializer 的子类,并调用 configure 方法

外置 Servlet 容器

新建项目

默认pom. xml 文件

  • pom.xml 文件虽然是自动生成的,但是如果以后我们需要将 一个 嵌入式 Servlet 容器的 Spring Boot 项目直接转为外置的 Servlet 容器的项目书时,则需要自己手动将嵌入式的 Tomcat 进行如下处理:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>www.wmx.com</groupId>
	<artifactId>tiger2</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>

	<name>tiger2</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- 此时 Tomcat 组件是单独提取出来的,而且 scope 是 provided
		即用户自己已经提供环境,Spring Boot 可以不用管 Tomcat 了-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

ServletInitializer

  • 这个文件虽然是自动生成的,但是如果以后我们需要将 一个 嵌入式 Servlet 容器的 Spring Boot 项目直接转为外置的 Servlet 容器的项目书时,则需要自己是手动写此文件,规则如下:

package com.example.demo;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

/**
 * 自定义类继承 SpringBootServletInitializer,自定义类名字可以自己随便取
 * 作用是应用启动时,会自动执行 configure 方法,从而初始化 Spring Boot的 Servlet
 */
public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        /**
         * 传入SpringBoot应用的主程序
         */
        return application.sources(Tiger2Application.class);
    }
}

项目设置

  • 从上面的默认结构中可以看到 “ src/main” 下面应该还有 webapp/WEB-INF/web.xml 没有自动生成,可以自己手动创建,也可以如下所示进行项目构建

项目部署

扫描二维码关注公众号,回复: 2750033 查看本文章

运行测试

MVC 流程测试

HelloController

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by Administrator on 2018/8/13 0013.
 */
@RequestMapping("hello")
@Controller
public class HelloController {

    /**
     * 做简单的页面跳转,同时携带一个数据过去
     * @param model
     * @return
     */
    @GetMapping("success")
    public String toSuccess(Model model) {
        model.addAttribute("name", "华安");
        /**跳转到此页面,注意千万不要引入 Thymeleaf,否则这里会进入 模板引擎目录下去的*/
        return "/WEB-INF/pages/success.jsp";
    }
}

success. jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功页面</title>
</head>
<body>
<h3>祝您成功:${name}</h3>
</body>
</html>

index. jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <base href="${pageContext.request.contextPath}/">
    <title>主页</title>
</head>
<body>
<h2>欢迎来到主页</h2>
<a href="hello/success">成功之路</a>
</body>
</html>

运行测试

视图前后缀配置

#设置后台访问 jsp 视图路径前缀
spring.mvc.view.prefix=/WEB-INF/pages/
#设置后台访问 jsp 视图路径后缀
spring.mvc.view.suffix=.jsp
  • 如同之前使用 Thymeleaf 魔板引擎时,同样可以配置 Thymeleaf 的模板路径,如下所示,不过 Thymeleaf 通常采用默认值:
spring.thymeleaf.prefix=classpath:/templates/ # Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.suffix=.html # Suffix that gets appended to view names when building a URL.
  • 此时后台访问视图层时,可以不再写路径前后缀
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by Administrator on 2018/8/13 0013.
 */
@RequestMapping("hello")
@Controller
public class HelloController {

    /**
     * 做简单的页面跳转,同时携带一个数据过去
     *
     * @param model
     * @return
     */
    @GetMapping("success")
    public String toSuccess(Model model) {
        model.addAttribute("name", "华安");
        /**跳转到此页面,注意千万不要引入 Thymeleaf,否则这里会进入 模板引擎目录下去的
         * 当全局配置文件中配置视图的前后缀时,可以在此处省略前后缀*/
        /*return "/WEB-INF/pages/success.jsp";*/
        return "success";
    }
}
  • 运行访问同样ok

 

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/81634549