spring-boot创建最简单的web应用

参考:

https://segmentfault.com/a/1190000014832006

初衷

看了一下spring-boot相关的书籍,创建一个hello world!的应用,是那么的简单。然而,自己动手,却很不一样。

首先,我们只是创建一个简单的hello world!并不打算使用默认的thymeleaf,而是使用传统的jsp。
当然,我们不能把自己限制于一个简单的hello world!我们要的是具有热部署功能的!

spring-boot + 内置tomcat + jsp

一、初始化项目:

我们只是构建一个hello world! 的web应用。
打包方式选择war
起步依赖只需要选择Web和DevTools即可。

二、处理jsp目录

springboot默认提供thymeleaf的模板,对于从传统web开发转过来的人来说,不喜欢!
然而 spring boot并没有给我们初始化webapp目录。所以,还是手动吧。

在“src/main”下创建“webapp/WEB_INF/jsp”目录
并且在webapp目录下新建index.jsp, 内容为hello world页面。
注意是webapp目录下,不是“webapp/WEB-INF/jsp”目录。

题外话:如果你甘愿hello world!那就hello吧,反正我是 change the world!

三、处理pom.xml(添加jsp支持、war的插件)

1、然后添加jsp需要的依赖jstl

<dependency>
<groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>

2、jsp编译需要的依赖

<dependency>
<groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>

3、把spring-boot-starter-tomcat的provided属性注释掉

4、再添加一个插件(由于选择的是war包方式)

<plugin>
    <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin>

四、配置application.properties

server.port=9090

spring.thymeleaf.cache=false
spring.thymeleaf.enabled=false spring.mvc.view.prefix=/ spring.mvc.view.suffix=.jsp

五、启动应用

执行main方法启动应用
启动后访问localhost:9090即可

六、处理完后的pom.xml是先这样子的

<?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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lgh</groupId> <artifactId>sample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>sample</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!--<scope>provided</scope>--> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <!--<scope>provided</scope>--> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin> </plugins> </build> </project>

spring-boot + 外置tomcat + jsp

一、同样的方式初始化项目

二、同样的方式处理jsp目录

三、处理pom.mxl(添加jsp支持、war插件及排除掉)

1、然后添加jsp需要的依赖jstl

<dependency>
<groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>

2、start-web排除掉tomcat

<dependency>
    <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency>

3、添加servlet-api

<dependency>
    <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency>

4、删除spring-boot-starter-tomcat依赖

5、同样添加一个插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin>

四、同样的配置application.properties

五、启动应用

(idea中)在run/debug configuration窗口中,添加tomcatServer,配置部署即可
注意这种方式,application.properties中的server.port是不生效的。

六、处理完后的pom.xml是先这样子的

<?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>com.lgh</groupId> <artifactId>client</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>client</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> </project> 

踩过的坑,吃过的屎

没有热部署,特别难受

1、添加一个依赖(初始化时如果选了就不需要手动添加了)

<dependency>
    <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>

2、插件添加配置(里面的configuration节点加上)

<plugin>
    <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> </configuration> </plugin>

添加了上面的两个配置后,修改java代码后,idea中可以右键recompile重新编译
如果是在本地tomcat的情况下,idea会提示reload class。
如果是在spring boot内置的tomcat的情况下,应用会自动重启。

不同的引导方式,不同的报错信息

首先,我们用idea创建的项目中,pom.xml文件是长这样的

<?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.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lgh</groupId> <artifactId>sample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>sample</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <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>

为了支持jsp,我们加入两个依赖

<dependency>
    <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>

由于我们选择了war的打包方式,你会发现,自动创建了一个ServletInitializer类。
由于是war,还需要添加一个插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> <useSystemClassLoader>false</useSystemClassLoader> </configuration> </plugin>

我们再src/main下创建“webapp”目录,并创建一个index.jsp文件
(还要去配置application.properties文件,把默认的模板禁用掉)

以上步骤是大部分博客的过程。这时候,我们直接用main方法的方式启动时,是酱紫的

clipboard.png

解决办法是:
把pom文件中的spring-boot-starter-tomcat 和 tomcat-embed-jasper的 provided属性注释掉。
注释掉后,启动起来,访问localhost:8080即可看到hello world!

回到注释provided属性前,如果这时候我们把ServletInitializer注释掉
把Application类继承SpringBootServletInitializer, 像这样子

@SpringBootApplication
public class ClientApplication extends SpringBootServletInitializer{

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ClientApplication.class); } public static void main(String[] args) { SpringApplication.run(ClientApplication.class, args); }

}

此时执行main方法启动应用,报错如下
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.lgh.client.ClientApplication]; nested exception is java.lang.IllegalStateException: Failed to introspect annotated methods on class org.springframework.boot.web.servlet.support.SpringBootServletInitializer

猜你喜欢

转载自www.cnblogs.com/ilovecpp/p/12896240.html