SpringBoot
学习网站:How2java
SpringBoot:几乎不用配置的SSM(H)框架
在学习SSM(H)的过程中,需要做大量的配置工作,其实很多配置行为本身只是手段,并不是目的。 基于这个考虑,把该简化的简化,该省略的省略,开发人员只用关心提供业务功能就行了,这便是 SpringBoot。
文章目录
1、SpringBoot配置
1.1 Eclipse环境下
- 首先新建个 maven 项目:
菜单 -> File -> New -> Other -> Maven -> Maven -> Maven Project -> New Maven ProjectSpringBoot本质上就是一个maven项目
因为我Ecilpse中已经存在一个springboot项目了,所以有报错误,你们应该是没有的。
- 配置pom.xml
新建项目中已存在一个pom.xml配置文件了,我们用以下的pom.xml覆盖掉项目中的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.how2java</groupId>
<artifactId>springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot</name>
<description>springboot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 创建Application.java文件
其注解 @SpringBootApplication 表示这是一个SpringBoot应用,运行其主方法就会启动tomcat,默认端口是8080
package com.how2java.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 创建HelloController.java
这个类就是Spring MVC里的一个普通的控制器。
@RestController 是spring4里的新注解,是@ResponseBody和@Controller的缩写。
package com.how2java.springboot.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
}
- 运行测试Application.java
跟运行一般的Java程序一样运行Application.java,之后访问127.0.0.1:8080/hello
疑问?为什么不用启动Tomcat,SpringBoot项目运行一个Java的main方法就可以启动了,它不是一个web程序吗?
解:因为这个 Application 类的主方法就把 tomcat 嵌入进去了,就不需要手动启动 tomcat 了。
2、SpringBoot部署
准备的SpringBoot项目:SpringBoot项目
2.1、Jar方式
- 编辑好相应的一个SpringBoot项目
- 在其项目根目录执行: mvn install ,会在其目录下生成一个jar文件
- 输入命令:java -jar target/springboot-0.0.1-SNAPSHOT.jar , 就可以启动该jar了
- 将该jar上传到服务器并运行,就可以达到部署的效果了
2.2、War方式
-
准备好一个SpringBoot项目
-
在Application修改为如下代码:
- 新加一个@ServletComponentScan注解,并继承SpringBoorServletInitializer
package com.how2java.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.support.SpringBootServletInitializer; @SpringBootApplication @ServletComponentScan public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
-
pom.xml代码修改:
-
新加打包成war的声明:
<packaging>war</packaging>
-
spring-boot-starter-tomcat修改为provided方式,避免与独立的tomcat容器产生冲突
-
3、配置jsp视图支持
-
在pom.xml中配置jsp支持
<?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.how2java</groupId> <artifactId>springboot</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot</name> <description>springboot</description> <packaging>war</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- servlet依赖. --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <!-- tomcat的支持.--> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> </dependencies> <properties> <java.version>1.8</java.version> </properties> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
在src/main/resoursces中增加application.properties文件,用于视图重定向
spring.mvc.viewprefix=/WEB-INF/jsp/ spring.mvc.suffix=.jsp
-
修改Controller相关类(以HelloController举例),注解改为@Controller。
此时返回的“hello”便是根据application.properties的视图重定向,到WEB-INF/jsp目录下去寻找hello.jsp文件
package com.how2java.springboot.web; import java.text.DateFormat; import java.util.Date; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping("/hello") public String hello(Model m) { m.addAttribute("now", DateFormat.getDateTimeInstance().format(new Date())); return "hello"; } }
-
准备一个hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> Hi JSP. 现在时间是 ${now}
4、Springboot热部署
目前的Springboot,当发生了任何修改之后,必须关闭后再启动Application类才能够生效,显得略微麻烦。 Springboot提供了热部署的方式,当发现任何类发生了改变,马上通过JVM类加载的方式,加载最新的类到虚拟机中。 这样就不需要重新启动也能看到修改后的效果了
只需要在pom.xml中增加一个依赖和一个插件便可:
-
依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> <!-- 这个需要为 true 热部署才有效 --> </dependency>
-
插件:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin>
5、SpringBoot错误处理
-
新增加一个类,用于捕捉Exception异常以及其子类。
捕捉到之后,把异常信息,发出异常的地址放进ModelAndView里,然后跳转到 errorPage.jsp
package com.how2java.springboot.exception; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { ModelAndView mav = new ModelAndView(); mav.addObject("exception", e); mav.addObject("url", req.getRequestURL()); mav.setViewName("errorPage"); return mav; } }
-
errorPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <div style="width:500px;border:1px solid lightgray;margin:200px auto;padding:80px"> 系统 出现了异常,异常原因是: ${exception} <br><br> 出现异常的地址是: ${url} </div>
如果你配置了热部署,修改之后不用手动重启,再次访问即可
6、SpringBoot端口和上下文路径
修改application.properties,修改访问的端口号和上下文路径
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
server.port=8888
server.servlet.context-path=/test
Springboot版本问题:在SpringBoot 2.1.2之前 上下文路径是server.context-path
7、SpringBoot配置切换
通过多配置文件实现多配置支持和切换,方便我们在本地用8080端口测试,而上线时候切换成80端口就可以了。
3个配置文件:
-
核心配置文件:application.properties
spring.mvc.view.prefix=/WEB-INF/jsp/ spring.mvc.view.suffix=.jsp spring.profiles.active=pro
-
开发环境用的配置文件:application-dev.properties
server.port=8080 server.context-path=/test
-
生产环境用的配置文件:application-pro.properties
server.port=80 server.context-path=/
这样就可以通过application.properties里的spring.profiles.active 灵活地来切换使用哪个环境了
另外亦可以在部署环境下,通过指定不同的参数确保生产环境总是使用的希望的那一套配置:
-
mvn install
-
java -jar ……
-
java -jar target/springboot-0.0.1-SNAPSHOT.jar --spring.profiles.active=pro
或
-
java -jar target/springboot-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
-
8、yml格式配置(选看)
spring:
mvc:
view:
prefix:/WEB-INF/jsp/
suffix:.jsp
server:
port:8888
servlet:
context-path:/text
注意:
- 不同“等级” 用冒号隔开
- 次等级的前面是空格,不能使用制表符(tab)
- 冒号之后如果有值,那么冒号和值之间至少有一个空格,不能紧贴着
properties配置和yml配置选一个,别折磨自己
9、导入SpringBoot项目
9.1、Eclipse导入
- 菜单->File->Import->Maven->Existing Maven Projects
- 选中你要导入的SpringBoot项目的目录,这个时候点一下 Refresh,下面就会跳出 pom.xml 文件
- 点 Finish
如果导入的是 maven 项目,所以在本地库没有 springboot 相关 jar 的前提下, eclipse 就会去进行下载。
一旦下载完成,就会展现为 如图所示的maven 风格的项目结构。
9.2、IDEA导入
- 菜单->File->New->Project From Existing Sources
- 选中你要导入的SpringBoot项目的目录,并选中 pom.xml
- 点击OK,然后后面就一路 Next 就行了
在IDEA中通过Open 也可以实现导入项目的(Idea牛逼!!)