Java Web基础入门,Springboot入门(3)
前言
语言都是相通的,只要搞清楚概念后就可以编写代码了。而概念是需要学习成本的。
本文首发于博客园-Ryan Miao. 由于限制2000字,只能分多篇。
编写第一个API
虽然服务端配置好了,但并没有API. 新建com.test.demo.controller.HelloController.java
package com.test.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Created by Ryan on 2017/11/14/0014.
*/
@Controller
public class HelloController {
@ResponseBody
@GetMapping("/hello")
public String hello(){
return "{\"hello\":\"world\"}";
}
}
然后,再次运行main方法,启动完毕后,访问 http://localhost:8080/hello, 第一个API开发完毕。
@Controller
这个注解标注这个类是一个controller,用来接收请求和响应response@GetMapping("/hello")
标注这个方法是一个路由请求实现,括号里就是我们的路由@ResponseBody
这个注解标注这个API的返回值是json,其实就是再response的header里塞入了contentType, 当然,在这里还涉及到class转json的问题。那么,回到开始的问题,json是什么东西?
JSON在Java里没有这个数据结构,其实就是一个String,遵从JSON规则的String,我们的方法在返回这段String的时候,加上header里的contentType,浏览器就会当做JSON读取。在Javascript去读Ajax的结果就变成了一个JSON对象了。其他的,比如Android,读取出来的还是一个字符串,需要手动反序列化成我们想要的类。
说到序列化,我们不可能每个返回结构都这样拼接字符串吧。所以,ResponseBody
标注的请求还会使用一个jackson的适配器,这些都是springboot内置的。暂时也不需要研究实现原理。jackson是什么鬼?
jackson是Java中使用最广泛的一个json解析lib,他可以将一个Java 类转变成一个json字符串,也同样可以把一个json字符串反序列化成一个java对象。Springboot是如何做到的?这就需要去研究源码了。
启动和调试
最简单的是启动就是运行main方法,还可以命令行启动
gradlew bootRun
debug,最简单的就是以debug启动main方法。当然也可以远程。
gradlew bootRun --debug-jvm
然后,在IDEA中,点击Edit configurations
选择remote
然后,点击debug
如果想支持热加载,则需要添加
compile("org.springframework.boot:spring-boot-devtools")
在IDEA里修改Java class后需要,重新build当前class才能生效。快捷键 ctrl+shif+F9
配置文件
spring boot默认配置了很多东西,但有时候我们想要修改默认值,比如不想用8080作为端口,因为端口被占用了。
在resources
下,新建application.properties
, 然后在里面输入
server.port=8081
然后,重启项目,发现端口已经生效。
再配置一些common的自定义,比如日志。项目肯定要记录日志的,System.out.println
远远达不到日志的要求。springboot默认采用Logback
作为日志处理工具。
spring.output.ansi.enabled=ALWAYS
logging.file=logs/demo.log
logging.level.root=INFO
接着,开发和生产环境的配置必然不同的,比如数据库的地址不同,那么可以分配置文件来区分环境。
在resources下新建application-dev.properties
, application-prod.properties
. spring默认通过后缀不同来识别不同的环境,不加后缀的是base配置。那么如何生效呢?
只要在base的配置文件中
spring.profiles.active=dev
比如,我们在dev环境中设置loglevel为debug
logging.level.root=debug
这样,springboot会优先读取base文件,然后读取dev,当dev有相同的配置项时,dev会覆盖base。
这样,本地开发和生产环境隔离,部署也方便。事实上,springboot接收参数的优先级为resources下的配置文件
<命令行参数
. 通常,我们部署项目的脚本会使用命令行参数来覆盖配置文件,这样就可以动态指定配置文件了。
下一篇,接收JSON参数,响应JSON。
相关文章