spring boot项目02:Web项目

Eclipse版本:2021-03 (4.19.0)

Java:8

工具:Postman

 

web项目介绍:

提供Web服务——API。

 

导航:

创建项目

编写接口

更改端口

替换默认容器Tomcat

 

创建项目

进入 https://start.spring.io/ 网站;

左边的选择好后,右边选择依赖 Spring Web;

spring boot项目02:Web项目

下载后得到:

spring boot项目02:Web项目

导入Eclipse:

spring boot项目02:Web项目

检查pom.xml依赖:spring-boot-starter-web 和 spring-boot-starter-test。

spring boot项目02:Web项目

spring-boot-starter-web 包的依赖包结构如下:包含了 spring-core等基础的spring包,另外新增了 spring-boot-starter-tomcat、spring-web、spring-webmvc等。

spring boot项目02:Web项目

 

运行web项目,启动后,项目没有停止,并监听了8080端口(Tomcat):

spring boot项目02:Web项目

由于没有配置API,此时没有任何可访问接口(endpoint):

spring boot项目02:Web项目

 

WebApplication结构:

@SpringBootApplication
public class WebApplication {

	public static void main(String[] args) {
		SpringApplication.run(WebApplication.class, args);
	}

}

run执行后,返回 ConfigurableApplicationContext 对象,可以通过这个对象查看 Spring容器中的Bean。

ConfigurableApplicationContext的信息输出如下:

结果显示 其真是类型我 AnnotationConfigServletWebServerApplicationContext,容器中管理着 137个Bean。

spring boot项目02:Web项目

AnnotationConfigServletWebServerApplicationContext 类:

spring boot项目02:Web项目

 

从上面的信息来看,调用SpringApplication.run(...) 执行了很多操作,包括建立 ApplicationContext。

具体怎么实现的,需要检查源码。TODO

 

编写接口:GET、POST

使用 @RestController、@GetMapping、@PostMapping、@RequestParam、@RequestBody 等注解。

源码如下:

@RestController
public class HelloController {

    @GetMapping(value="hello") // 1、GET请求
    public String getHello(@RequestParam String name) {
        return "Hello, " + name;
    }
     
    @PostMapping(value="calAdd") // 2、POST请求
    public Integer calAdd(@RequestBody CalAddDTO dto) {
        if (dto.getA() == null || dto.getB() == null) {
            throw new RuntimeException("参数a、b不能为空");
        }
        
        return dto.getA() + dto.getB();
    }
}

测试:使用工具Postman分别调用两个接口

spring boot项目02:Web项目

spring boot项目02:Web项目

对于POST的接口 /calAdd 中,以下情况会出现异常:

1、请求方式为GET

Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]

2、a 或 b 任一缺失

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 参数a、b不能为空] with root cause

java.lang.RuntimeException: 参数a、b不能为空

3、a、b的值超过 Integer的范围

spring boot项目02:Web项目

 

将Integer更改为 BigInteger后,错误3可以避免:

	@PostMapping(value="calAdd")
	public BigInteger calAdd(@RequestBody CalAddDTO dto) { // CalAddDTO的 a、b 的类型也改了
		if (dto.getA() == null || dto.getB() == null) {
			throw new RuntimeException("参数a、b不能为空");
		}
		
		return dto.getA().add(dto.getB());
	}

结果:

spring boot项目02:Web项目

 

上面只是提供了Web项目中的后台接口,Web项目的页面呢?

在上面的项目中,resources目录下有static、templates 两个目录,可以将Web页面、模板建立在这里,然后,在页面中访问后端接口。

 

除了 @RestController 注解,还有 @Controller注解可以用来提供后端接口,但不止是接口。

 

更改端口

web项目默认端口为8080,更改端口的方式如下:

1、修改 application.properties文件

spring boot项目02:Web项目

2、在启动参数中设置server.port

spring boot项目02:Web项目

注,除了上面两种方式,还有其它修改的方式,这就涉及到配置的优先级了,需要检查 spring boot手册。

对于上面两种方式,第二种的优先级更高。

 

替换默认容器Tomcat

共有3中Servlet容器可供选择:Tomcat,Jetty,Undertow。

说明,后面两种有什么更优秀的特点,还没搞清楚。TODO

spring boot项目02:Web项目

 

本节介绍替换为Jetty。

 

默认的包依赖关系:

spring boot项目02:Web项目

排除spring-boot-starter-tomcat,引入 spring-boot-starter-jetty包,然后,启动:

spring boot项目02:Web项目

使用Poatman测试,两个接口正常。

 

undertow类似,请看 参考资料 1:依赖包为 spring-boot-starter-undertow。

 

参考资料

1、Spring Boot替换默认容器Tomcat

2、

 

上一篇:springboot学习


下一篇:spring boot 相关知识点