目录
一、spring boot 整合测试
二、RestController与Rest讲解
1,RestController 例子
2,什么是REST?
三、接收路径参数
四、spring boot中的日志管理
1,日志管理的基本概念
2,spring boot中设置日志管理
3,关闭sl4j,开启log4j
五、配置开发者模式
六、访问静态资源
七、定义消息转化器
八、使用fastjson解析json数据
九、自定义拦截器
1,创建父工程、子工程
打包方式:pom;pom的打包方式可以支持
当然如果你要作为父项目,很重要的一点是要设置
父级项目:
子项目:
子项目当然要有
2,进行整合测试
需要依赖两个包
Spring-boot-starter-test
Junit
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<scope>testscope>
dependency>
然后嘛编写测试类(重点):
package com.unicom.springboot.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import junit.framework.TestCase;
//指定当前要测试的类
@SpringBootTest(classes=HelloController.class)
//// 指定实现测试的类
@RunWith(SpringJUnit4ClassRunner.class)
////@RunWith(SpringRunner.class)
//// 和web整合
@WebAppConfiguration
public class UserControllerTest {
@Autowired // 自动注入要测试的类
private HelloController helloController;
@Test
public void testHello() {
String hello = helloController.hello();
System.out.println(hello);
// 使用断言进行测试
TestCase.assertEquals(this.helloController.hello(), "hello");
}
}
嘿嘿,打印一下结果看看:
把controller的返回值拿了过来!终于成功了!(spring mvc可以自己试一试,test这个类算核心部分啦)南雁的另一篇文章,有讲之前一直失败的原因。-_-|| eclipse还是有许多坑的,maven的junit死活引用不了!
顺便说明下assert,这个类的方法很有意思。assert又叫断言,它默认断言的的条件为真,不然就不抛出异常!比如这句,如果helloController返回的不是hello,它就报错!
TestCase.assertEquals(this.helloController.hello(), "hello");
RestController很好理解的,就是它的方法,不用设定,默认返回的内容都是response body里的内容。
为什么它叫rest?这个名字很常见的样子呀!
REST即Representational State Transfer的缩写,可译为"表现层状态转化”。REST最大的几个特点为:资源、统一接口、URI和无状态。
一个名词一个名词的来看一下。资源,就是txt,jpg,mp3等各类文件,通常以Representation为载体显示,像json就是一种Representation咯
统一接口嘛,统一的数据操作接口,CRUD(create, read, update和delete),GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
URI,指每个URI都对应一个特定的资源。
无状态,指的是通过url就能获取资源,不用登陆啥的,没有权限问题。
何为路径参数,就是url上的值咯,这种用法如下:
输入url,相关的效果就是这样的:
先来说明下日志管理的基础概念
日志管理中,日期时间可精确到毫秒,日志级别如下:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE
越右边的越细致咯,比如debug,可以输出很多调试的信息。
为什么要用日志管理啊?它是干嘛的?这个嘛,我把它当成一个框架用来做输出信息的东东。为什么这么说呢,因为框架运行会有很多信息嘛,如果不输出来,开发的人不知道它进行到哪一步了,一旦出错,又很难排查,真的烦。所以嘛,就要用个logger来打印输出各个级别的内容咯。
一般有两种日志的实现,sl4j和log4j
看下这段代码就知道日志是用来干嘛的:
static Logger logger = Logger.getLogger(ClientWithLog4j.class.getName());
然后在main程序中,突然发生了点什么,然后打印出信息:
logger.info("Client socket: " + client);
是吧,日志的概念很好理解的。
在 application.properties 中加入如下内容:
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.file=d\:\\springbootlog\\log.log
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH\:mm\:ss} [%thread] %-5level %logger- %msg%n
来看一下控制台的输出效果:
2018/10/08-14:46:03 [main] DEBUG org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping- Rejected bean name 'messageSource': no URL paths identified
这个格式其实就是 logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n 确定的嘛
然后在硬盘上真的有个文件了:
这个文件是由于 logging.file=d\:\\springbootlog\\log.log 这句产生的
关闭的话,将依赖去除即可,用
来一份log4j的配置,写在log4j.properties中,放在resourses中即可直接引用(为啥这个配置文件没有在哪里写它都可以自动加载呢?):
log4j.rootLogger=DEBUG,CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
用这段代码之后就可以不用重启,就可以修改代码后重新运行了哦!
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>springloadedartifactId>
<version>1.2.8.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
dependency>
嘿嘿,还有一个热部署,如果你开发过thymeleaf就会发觉为啥老要重新启动才能看html,在application.properties中加入如下设置就可以实现thymeleaf的热部署了!
spring.thymeleaf.cache=false
默认情况:spingboot 从 classpath 下的 /static /public 或者 /meta-inf/resources文件夹或 ServletContext 根目录提供静态内容
Js css img
第一种方式:
默认路径
自定义配置:
在application.properties中手动配置静态资源路径
spring.resources.static-locations=classpath:/static/
会不会存在乱码的情况?嘿嘿,你试试用ISO8859-1,果然前台显示有点奇怪
// 定义消息转化器
@Bean
public StringHttpMessageConverter stringHttpMessageConverter(){
StringHttpMessageConverter converter= new StringHttpMessageConverter(Charset.forName("ISO8859-1"));
return converter;
}
采用这个url 一测试,果然乱码了!
再改回来:
// 定义消息转化器
@Bean
public StringHttpMessageConverter stringHttpMessageConverter(){
StringHttpMessageConverter converter= new StringHttpMessageConverter(Charset.forName("UTF-8"));
return converter;
}
就没有问题了
使用fastjson有两步:
第一步:导入依赖
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.50version>
dependency>
第一种方式:
继承 WebMvcConfigurerAdapter
第二种方式:
说起来阿里巴巴还是很强大的,好多技术成果都开源出来可以供我们使用。
有了这个之后,restcontroller,显示出来的结果是这个样子的:
1,首先继承 WebMvcConfigurerAdapter 并重写父类方法
2,写好拦截器内容,然后,注册!注册挺有意思的 /** 表示对所有的路径都有
3,spring boot的启动程序要扫描这个包
已输入一个url就会有一条信息打印在控制台: