50.SpringBoot学习笔记

使用外部Servlet容器与JSP支持

Posted by Chen Xingxu on June 20, 2020

50.SpringBoot学习笔记–使用外部Servlet容器与JSP支持

嵌入式 Servlet 容器

应用打包成可执行的 jar 包。

  • 优点:简单,便捷
  • 缺点:
    • 默认不支持 JSP
    • 优化定制比较复杂
      • 使用定制器【ServerProperties、自定义 EmbeddedServletContainerCustomizer】
      • 自己编写嵌入式 Servlet 容器的创建工厂【EmbeddedServletContainerFactory】

外置 Servlet 容器

外部安装 Tomcat — 应用以 war 包的方式打包。

创建项目

1、创建项目时,Packaging 选择 War

2、按照下面图片的方法,创建 webapp 文件夹

3、按照下面图片的方法,创建 web.xml。其中 web.xml 的创建路径的示例如下:

D:\IdeaProjects\springboot\springboot-04-web-jsp\src\main\webapp\WEB-INF\web.xml

配置项目

1、Edit Configurations…

2、+ –> Tomcat Server – Local

3、按照下面图片的方法,配置 Tomcat Home (配置好 Tomcat Home 后,Tomcat base directory 会自动填好)

4、Deployment –> + –> Artifact

5、选择 exploded 版本

6、配置 Application context

7、选择刚刚配置好的 tomcat8,启动。

开发项目

src\main\webapp\hello.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>Hello JSP</h1>
    <a href="abc">abc</a>
</body>
</html>

src\main\webapp\WEB-INF\success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>SUCCESS</h1>
    <h3>${msg}</h3>
</body>
</html>

demo.yangxu.springboot.controller.HelloController

package demo.yangxu.springboot.controller;

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

@Controller
public class HelloController {
    
    @GetMapping("/abc")
    public String hello(Model model){
        model.addAttribute("msg","你好");
        return "success";
    }
}

application.properties

#指定视图解析路径前缀
spring.mvc.view.prefix=/WEB-INF/
#指定视图解析后缀
spring.mvc.view.suffix=.jsp
#jsp修改不需要重启
server.servlet.jsp.init-parameters.development=true

总结

1、创建一个 War 项目 (利用 IDEA 创建好目录结构)

2、将嵌入式的 Tomcat 指定为 provided (使用 Spring Initializr 会自动配置好)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>

3、编写一个 SpringBootServletInitializer 的子类,并调用 configure 方法 (使用 Spring Initializr 会自动配置好)

package demo.yangxu.springboot;

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

public class ServletInitializer extends SpringBootServletInitializer {

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

}

4、启动服务器就可以使用。