Thymeleaf页面通过获取Spring容器中配置的Bean来取得配置文件中的参数值

日期:2018-04-20 作者:杜冬斌
环境:SpringBoot,页面是Thymeleaf
前言:
有时候我们需要从前端获取后端配置文件中的配置,比如我在application.properties配置文件中,配置文件上传限制相关的参数
但是,这个参数前端页面在文件上传时,也是需要的,如果两处写,就会出现修改不一致的问题,造成困扰不好解决。
因此,我们希望前端和后端使用同一个配置,这样只要更新配置文件中的参数即可。

1.整体分析过程如下:
第一步,我们需要知道一个前提,我们写在application.properties配置文件中的参数,会被SpringBoot自动读取并配置;
第二步,我们知道Spring的很多对象都是在Spring容器里面的,所以包含这个参数的对象应该也不例外;
第三步,我们知道使用Thymeleaf的th:属性,或者[[ ]]是可以取到后端的数据的;
第四步,关键点,Thymeleaf如何取到Spring容器中的Bean,只要能取到Bean就有成功的希望;
第五步,到底容器中的哪个Bean保存了我们需要的数据;这一点如果找不到,则没有办法继续进行下了
第六步,在页面的<script>标签中,使用内联的写法获取对应的值作为变量,这样其他js中就可以使用了。
2.在配置文件中找到文件上传的配置:
#启用文件上传支持
spring.http.multipart.enabled = true
#文件写入磁盘的阀值
spring.http.multipart.file-size-threshold = 2MB
#上传的文件存在位置,使用相对路径会报错,下面的路径是Linux操作系统中的临时目录
spring.http.multipart.location = /tmp/
#是否延迟处理
spring.http.multipart.resolve-lazily = true
#单个文件的最大大小
spring.http.multipart.max-file-size = 10MB
#单个请求的最大的大小,如果是同时上传多个文件,多个文件大小之和,不应该大于下面的值!
spring.http.multipart.max-request-size = 50MB
3.找到上面配置属性中的关键字(比如: multipart),在IDEA中双击shift出现搜索框
出现的内容会比较多,但是要找与autoconfigure有关的条目
4.打开上面选中的条目:会见到如下的反编译后的代码。
5.到此你可能以为这个就是保存信息的那个Bean了,然后用下面的语法去取值,项目会告诉你找不到这个Bean。
< script th :inline= "javascript" >
var maxSize = [[${@ multipartProperties .maxRequestSize}]];
console.log(maxsize);
</ script >
上面的语法是对的,只是没有找到Bean
当然你也可以通过项目的actuator监控去直观的查找,也没有对应的Bean:
你会查不到类似下面首字母小写的Bean的名字: multipartProperties,下面的“bean”,就是指容器中的Bean的名字

6.这说明刚才找到的还不是我们想要的Bean,继续找,还是在 multipartProperties反编译的代码中,我们发现如下代码:
这说明使用了 multipartProperties的属性去配置了一个工厂类,最后又使用这个工厂类去生成一个 MultipartConfigElement类型的对象。
7.好了,在源码中选中 MultipartConfigElement,按Ctrl+t,打开这个类的反编译的代码看看
通过看这个类的源码,我们已经知道这是一个最终的类,没有再通过当前的类去创建其他类型的对象。
接下来我们通过从actuator中去查找看看,有没有这个对象
漂亮了,真的有这个Bean,说明这个Bean应该就是我们想要的了。
8.我们继续用刚才的语法去看看能不能获得我们想要的值
< script th :inline= "javascript" >
var maxSize = [[${@multipartConfigElement.maxRequestSize}]];
console . log ( "maxSize :" + maxSize )
</ script >
发起测试页面:观察控制台
第一行是打印出来的值 ,第二行是我在另一个js中测试能否取到值。
很明显值已经取出来了。
9.至此,细心的读者可能已经发现了,
我配置文件中的是 spring.http.multipart.max-request-size = 50MB
现在的值是52428800 ,其实只要你换算一下你会发现是一样的
50MB=50*1024KB=50*1024*1024Byte=52428800
10.好了,现在已经取到值了,想一致就可以了;
11.通过这个分析过程,如果读取其他的配置信息,我相信你已经有了思路了。

猜你喜欢

转载自blog.csdn.net/dusuanyun/article/details/80021253
今日推荐