Spring Boot教程(14) – 跨域访问

前两天,看了看前端小伙伴的代码,发现他在访问API的时候,并不是直接访问API域名的,而是访问前端域名下的/api路径,然后在部署的服务器上,用nginx把/api路径的请求,转发到API域名那里。我感觉很奇怪,为什么要这样做?本来可以直接访问的东西,为啥还要再绕一圈?

(更多…)

继续阅读 →

使用frp将服务器请求转发到本地

如果你对接过国内的一些开放平台,比如微信(公众号、小程序)、支付宝什么的,你会发现在开发阶段就需要一个公网地址来提供API或者接收回调,你总不能搞个服务器,开发一点,部署一点吧。今天我们介绍一个方法,将服务器的请求,转发到你的开发机上,这样不管是修改代码、查看日志还是跟踪调试,都会很方便。

(更多…)

继续阅读 →

Spring Boot教程(12) – 编写JSON API

目前很多公司开发项目,都选择了前后端分离的方式,不仅仅因为前端现在有丰富的生态和活跃的社区,更是因为分离让前端和后端的耦合度大大降低。前后端开发人员各司其职,各自做擅长的事情,提高了团队效率。而现在在电脑前学Spring Boot的你,很可能在将来的工作中扮演后端API开发的角色。

前端和后端的数据交换格式,现在用的最广泛的是JSON,Spring Boot的Web Starter也自带了JSON的支持,而且选用了Jackson库,我之前也写过它如何使用,阅读本文之前最好看一看。另外,还有个JSON库叫Gson,使用也比较广泛,加入了Gson的依赖之后,可以通过配置将其作为默认的JSON库。

对于前后端一体的应用,请求处理处理方法会返回模板的名字用来生成页面。而写接口的话,就需要在方法上添加@ResponseBody注解。你返回一个字符串,请求接口就会得到一个字符串。

(更多…)

继续阅读 →

Spring Boot教程(11) – 理解注解@ControllerAdvice

之前,我们介绍过@ModelAttribute@ExceptionHandler,前者可以往请求的Model里加数据,后者可以接受请求处理方法抛出的异常。但是他们放在控制器(Controller)里的时候,作用范围是有限的,只管当前控制器里的方法。如果你有几百个控制器,在每个控制器里都加上类似的代码,不免有点冗余和费劲儿。Spring框架提供了@ControllerAdvice注解,帮助你将其应用到所有的控制器上。

Controller Advice字面上意思是“控制器通知”,Advice除了“劝告”、“意见”之外,还有“通知”的意思。你可以将@ModelAttribute@ExceptionHandler标记的方法提取出来,放到一个类里,并将加上@ControllerAdvice,这样,所有的控制器都可以用了:

(更多…)

继续阅读 →

Spring Boot教程(10) – 错误处理

如果你使用Spring Initializr新建一个web项目,运行并访问他的话,因为没有写控制器,你会得到一个错误页面,告诉你请求路径没找到(404错误):

页面标题为“Whitelabel Error Page”,直译为“白标错误页”,啥是白标,知乎上我搜到了这个答案:

White Label 意思是你开发了一个产品,而这个产品可以根据其他不同公司的品牌形象(品牌logo,品牌颜色,图片等等)包装成该公司自身的产品。

Gary Ma

我觉着吧,“白标错误页”的意思就是这个错误页面是个样板,你可以根据自己的需求自定义错误页面样式。

(更多…)

继续阅读 →

Spring Boot教程(9) – Model的用法

你一定知道Model类,在控制器中,数据会存放到Model对象中,当需要生成HTML的时候,模板引擎会根据名字来定位数据,向下图这样。

从广义上来说,Model指的是MVC中的M,即Model(模型)。从狭义上讲,Model就是个key-value集合。实际上,上图home方法得到的model对象就是一个 java.util.Map ,你可以将Model类型替换为Map<String, Object> ,或者ModelMap——一个实现了Model接口的java.util.HashMap

(更多…)

继续阅读 →

Spring Boot教程(8) – 理解注解@SpringBootApplication

上一篇文章说了说Spring容器的作用,这次趁热打铁,看看Spring Boot中它是怎么起作用的。

有了Spring容器之后,开发的模式简化了很多,你的注意力基本只需要集中在编写Bean上,比如@Controller类呀,@Service类呀,@Repository类呀等等。你新建了一个Spring Boot应用之后,随便编写一个控制器(Controller),他就可以用来处理网络请求了。按理说,一个控制器成为容器中的Bean,得有@ComponentScan来扫描呀,但是新建的应用也没看到有配置类,更不用说依靠在其之上的@ComponentScan注解了。这一些都要从@SpringBootApplication说起。

(更多…)

继续阅读 →

Spring Boot教程(7) – 直观地理解Spring容器

在你学习Spring之前,你肯定听说过“控制反转”、“依赖注入”、“上下文”等名词,伴随着这些名词的,是一些冗长晦涩的解释,这些解释并没有什么显著的错误,但是因为太过抽象导致初学者们无法直观地去理解它们。

废话不多说,我们通过举例或者写代码来一步一步理解它们。

在一个系统里,可能有多个业务部分,比如用户服务,订单服务,数据服务等等,在代码里,这些服务也许分布在多个类中,可能叫做UserService或者OrderService等等。为了简便,我们假设系统里有A、B、C、D四个类,他们有如下的依赖关系:

(更多…)

继续阅读 →

Spring Boot教程(6) – 请求映射

之前的例子里有演示过,控制器(Controller)里的方法加上@GetMapping注解,就可以处理对应路径上的GET请求了。除了它,还有对应的@PostMapping、@PatchMapping、@PutMapping和@DeleteMapping等等。这些注解都来源于一个更通用的注解@RequestMapping,字面意思就是请求映射。我们来看看它的用法:

图中有一个名为method的注解参数,指明了@RequestMapping处理的是GET请求。如果把这个method注解删掉,那么home方法就会处理发送到”/”路径的所有请求。如果你无意在一个方法里处理多种请求的话,我建议你在注解参数里写明需要处理的HTTP请求类型,或者使用更方便的@GetMapping或者@PostMapping等。

(更多…)

继续阅读 →