sprintboot-learn(一)
@Controller和@RestController
示例工程springboot-learn
@Controller 注解使用下,返回的字符串默认是一张页面的名字。
返回的是index.html页面
@RestController 注解使用,默认是返回体。相当于加了@ResponseBody
返回的是字符串”index.html”
资源文件相关注解
示例工程springboot-learn和springboot-mybatis
Springboot会默认读取application.properties配置文件。
@Configuration:标记某个实体类为资源文件,在启动时实例化。
@PropertySource("classpath:pro.properties"):当标记在某个类上面的时候,如果该类在启动时需要实例化,则通过该注解指定读取资源文件pro.properties,类中使用@Value的方式注入。
@ConfigurationProperties(prefix = "myProps"):根据指定的前缀读取文件信息并绑定到实体类上面。
其中,String类型的一定要使用setter来接受属性值,集合不需要。该注解一般针对yml配置文件绑定属性的时候用的较多。
对应ylm配置:
@ImportResource:引入xml配置文件(springMVC的<bean>方式配置)
如图所示:改class有两个注解,@Configuration标记改类为资源类,在启动时实例化,实例化的时候由于用@ImportResource注解引入了资源文件,所以会解析该资源文件。如果不加@Configuration,则该类不会实例化,就不会引入资源文件。总的来说,改class并没有用,写这个类主要是为了引入一个资源文件,结构好看些。所以将该注解直接放在启动类上面也可以。类似如图:
application.properties
静态资源文件夹
Server.port:配置服务器端口号,其它相关配置在类org.springframework.boot.autoconfigure.web.ServerProperties中可以找到。
spring.resources.staticLocations:配置资源文件的默认路径,和以下配置方式是一样的,/**暂时还没没搞懂啥情况,测试中无论咋配置结果都一样,网上表示配置/**会覆盖掉默认的/static等资源目录,/path/**则不会覆盖掉默认的,只是在默认的路径中追加。但是实际测试并不是这样。
spring.profiles.active:加载指定后缀的配置文件。
资源文件加载顺序:
如果在程序运行的时候指定了其他资源文件,资源文件加载的顺序:
@ProperSource指定 > 默认application.properties > spring.profiles.active指定
即:最先加载@ProperSource注解指定的,然后加载默认的,最后加载默认配置中使用spring.profiles.active指定的。
这个加载顺序在是springbootce测试的时候有详细说明,看“Junit单元测试.docx”,工程springbootJunit。
打包时拷贝静态资源
种类 |
targetPath |
会被打包的文件夹 |
Idea路径 |
Jar路径 |
资源访问情况 |
第一种 |
无 |
只会打包springboot配置了的静态资源文件夹,如resources/static, |
位于target/classes路径下 |
位于BOOT-INF/classes路径下 |
Springboot自己静态文件夹下的会被自动打包,Idea运行或者jar包运行都能访问 |
第二种 |
static/ |
会将<directDictory>指定的文件夹下面的所有内容全部打包 |
target/classes/static |
BOOT-INF/classes/static |
都能访问 |
第三种 |
BOOT-INF/classes/static/ |
会将<directDictory>指定的文件夹下面的所有内容全部打包 |
target/BOOT-INF/classes/static |
BOOT-INF/classes/static |
jar宝运行可以访问,idea运行不能访问 |
第四种 |
不配置<resources> |
会将resources下所有文件及其文件夹打包到classes下 |
Target/classess |
BOOT-INF/classes |
如果resources下包含的文件夹是静态文件夹,Idea运行或者jar包运行都能访问 |
假定dist目录中有index.html,第三种中idea运行时是不能访问到index.html的,但是打成jar包运行就能访问到。
原因:idea在运行的时候target下classes就相当于jar包中的BOOT-INF/classes(可以看第二种情况),但是在第三种情况中idea的路径变成了target/BOOT-INF/classes而不是target/clasess,所以会出现访问不到的情况。
*.*:当前目录下所有文件,不包含文件夹
**/**:当前目录下所有文件,包含文件夹
乱码:
配置默认读取properties文件的编码格式
spring.messages.encoding=UTF-8
关于乱码这个问题,在后边测试的时候不起作用了,建议还是讲中文转成unicode编码放配置里头,就不会乱码。
日志
logging.path:配置日志文件文件路径
logging.file:配置日志文件的名字(必须包含路径,否则路径配置项无效)
如果logging.path=logs3,logging.file=myapp.log,只会在当前目录下生成myapp.log
如果只配logging.file=lgs3/myapp.log,效果跟图示效果一样,会创建logs3文件夹并在其中生成日志文件myapp.log。
拦截器
示例工程:springboot-learn
继承WebMvcConfigurerAdapter,需要加注解@Confifuration才会生效。
拦截规则中测试结果是/**和/*都是拦截所有,一般都用/**。
AddInterceptor方法的参数可以看到是HandlerInterceptor类型。
这里需要配置自定义的拦截器
MyIntercepter:
MyIntercepter2:
方法说明:
preHandle:在controller方法之前执行
postHandle:在controller方法之后执行
afterCompletion:只有在preHandle方法返回true的时候才执行
执行顺序:
根据拦截器的配置顺序执行。
图中的true是preHandle的返回值,只有当返回值为true的时候才执行下一个拦截器,否则直接中断。
afterCompletion是在preHandle和postHandle都执行完之后再执行,顺序是反向的。
Controller:
访问localhost:8080/test,localhost:8080/test1,看控制台输出:
over~~~
转载于:https://my.oschina.net/wtkid/blog/2244948