1、System.getProperty("user.dir") #获取当前项目文件夹在磁盘上的绝对路径(java命令执行的地方)
2、File tmpFile = new File("/tmp/tomcat"); #这样会在当前项目所在磁盘的根路径下创建该文件夹
3、File tmpFile = new File("tmp/tomcat"); #这样就是在当前项目的根目录下创建该文件夹 。。默认是从当前项目根目录下开始找
4、File tmpFile = new File("../tmp/tomcat"); #与项目同级创建该文件夹
5、String fileAbsolutePath = file.getCanonicalPath(); #获取解析后的文件(夹)的绝对路径,如D:\java\companyProject\zt_slimming\..\headImg =》D:\java\companyProject\headImg
classpath里面时
this.getClass().getClassLoader().getResources("word/xunhuan.docx").toURI().getPath();
this.getClass().getClassLoader().getResourceAsStream("word/xunhuan.docx");
this.getClass().getResources("/word/xunhuan.docx").toURI().getPath();
this.getClass().getResourceAsStream("/word/xunhuan.docx");
classLoader默认就是从当前类路径下classpath/ 开始加载,所以不用加 /
class 默认是从当前类的位置开始加载,加上/ 就代表从类路径下开始加载。
斜杠(/)和反斜杠(\)
java中一般用斜杠 /
window的文件路径为 \ ,因为需要转义,所以要 \\ 。但通过 / 同样可以定位到文件。
Linux的文件路径为 /
数据库中存储是就存 /
如:从类路径下获取某个文件的文件路径,提示找不到资源:
String filePath = this.getClass().getClassLoader().getResource("word/xunhuan.docx").getPath();
解决:加上toURI()方法即可
String filePath = this.getClass().getClassLoader().getResource("word/xunhuan.docx").toURI().getPath();
PS:直接获取对应的流时,路径中带有中文或空格就没有关系了。
为什么要转成war包?
war包更像是一个大的应用资源容器,而jar包更像是一个功能单元,打成war包后就能随意的访问war包内的任意资源,但jar包却不可以。
步骤:两大步
1.1 packaging改成war包
com.jyf
online_exam
0.0.1-SNAPSHOT
online_exam
war
Demo project for Spring Boot
1.2 排除内置的tomcat服务器
org.springframework.boot
spring-boot-starter-tomcat
provided //只在编译时有效,打包运行时就是用服务器的环境了
或者在spring-boot-starter-web中排除tomcat的依赖,并额外添加javax.servlet-api(provided)
1.3添加项目名(可选)
继承SpringBootServletInitializer,并重写其configure方法
@SpringBootApplication
@MapperScan(basePackages = "com.zhaotai.mapper")
public class OnlineExamApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(OnlineExamApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(OnlineExamApplication.class);
}
}
之后使用maven clean、compile、 package 打包即可
由于原来访问时,是直接从端口号开始的没有项目名,在tomcat中也想这么做的话,有两种方式:
方式一:默认的ROOT目录
webapps下新建ROOT文件夹:将war包中的文件夹放到ROOT下即可。
方式二:虚拟路径映射
server.xml文件中的
path:代表项目名。此时 如 localhost:8080 这样就可以访问。
docBase:代表项目的绝对路径。如:F:\temp\sixBookStore
注意:如果是直接放到webapps下,默认是根据项目的文件名进行访问的。
此时后台路径的 “/” 就代表当前项目的根目录,但前台的 “/”代表当前端口号下,所有就访问不了后台,所以要在访问路径中加上当前项目的contextPath。
如:使用Thymeleaf的内联表达式 var path = "[[${#request.getContextPath()}]]";
后台整个 ServletContextListener 在服务器启动时在application域中添加代表当前项目根目录的一个变量,前台:var path = "${application.myContextPath}";
首先,java Date类型默认的接收时间格式为 xxxx/xx/xx xx:xx:xx,但前端的日期插件和数据库中默认时间格式都为 xxxx-xx-xx xx:xx:xx。
所以为了后台能正确接收需要
方式一、使用@DateTimeFormat注解,局部的较灵活
方式二、配置文件中 spring.mvc.date-format=yyyy-MM-dd HH:mm:ss 全局的,不太灵活
例如:
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")//接收时
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")返回时
private Date createTime;//创建时间
springBoot默认使用Jackson作为HttpMessageConverter(消息转换器),此时直接在实体类的属性上使用@JsonFormat注解,即可按照指定的时间格式返回,注意要添加时区 timezone="GMT+8"。
局部的:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
yml文件中全局配置:
spring:
#配置统一的日期返回格式
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
注意:若全局和和局部的方式都存在的话,采用就近原则:局部的会覆盖全局的。
使用fastJson 的@JsonField注解:@JSONField(format = "yyyy-MM-dd HH:mm:ss")
此时需要注入FastJson的转换器来替换掉默认的
@Bean
public HttpMessageConverters httpMessageConverter(){
FastJsonHttpMessageConverter fastJson = new FastJsonHttpMessageConverter();
return new HttpMessageConverters(fastJson);
但是FastJson默认所有为null的属性不参与序列化,所以返回结果中将没有这些属性。
解决: 在所有可能为null的属性上添加 @JsonFiled注解的一个属性即可:@JSONField(serialzeFeatures = SerializerFeature.WriteMapNullValue)
tomcat默认的上传文件的大小为2MB,
maxPostSize="0"
port="8080"
protocol="HTTP/1.1"
redirectPort="8443"/>
springboot默认的上传的单个文件大小为1MB,一次请求的多个文件大小为10MB,
参看源码配置类 MultipartProperties
springBoot中配置文件上传大小:
springboot2.x
spring.servlet.multipart.max-file-size=5MB #单个文件的最大大小限制
spring.servlet.multipart.max-request-size=30MB #单个请求中多个文件的最大大小限制
springboot1.x
spring.http.multipart.max-file-size=5MB
spring.http.multipart.max-request-size=30MB
文件上传会先上传到OS的临时目录中,在同步到设定目录中。
System.getProperty("java.io.tmpdir"); 当前操作系统默认的临时文件存放位置。
window下:C:\Users\ADMINI~1\AppData\Local\Temp\ 环境变量->用户变量的TEMP变量值
Linux下:/tmp
如果是用外部的servlet容器,如Tomcat,则会在tomcat启动的时候在catalina.sh里面,将tomcat的临时目录temp的路径位置赋值给OS的临时目录,这样上传的资源就会到tomcat的temp目录下,在同步到设定的目录中。当tomcat重启时会清空temp的内容。
如果是用内嵌的servlet容器,如springBoot项目,当项目启动时,会创建一个临时目录用来存放上传的文件资源(临时目录就是OS的临时目录),当部署到Linux下,Linux会每隔10天自动清理不使用的临时目录,就导致文件上传不上去。
解决:指定一个目录当做临时目录,这样就不会被Linux清理掉了
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
String location = System.getProperty("user.dir") + "/../tempUpload";//与项目同级创建该文件夹
File tmpFile = new File(location);
if (!tmpFile.exists()) {
tmpFile.mkdirs();
}
factory.setLocation(location);
return factory.createMultipartConfig();
}
如:
System.out.println("\033[31;44;0m" + "我滴个颜色" + "\033[31;44;0m");
System.out.println("\033[33;0m"+"异常为:"+"\033[33;0m");
格式:
前缀:\033[ 中间:颜色;背景色;样式 后缀m
中间的任意一个不写默认为不加该样式
范围:颜色表达式后面的所有,除非遇到另一个颜色表达式
颜色1 |
背景色 |
样式 |
30 白色 |
40-47颜色和颜色1一样 |
0 空样式 |
31 红色 |
1 粗体 |
|
32 绿色 |
4 下划线 |
|
33 黄色 |
7 反色 |
|
34 蓝色 |
||
35 紫色 |
||
36 浅蓝 |
||
37 灰色 |
idea中不像eclipse中有workspace和project的概念,取而代之的是project和module的概念。当我们在同一个project下建立多个module时,比如我们要做一个springBoot的maven多模块项目,默认情况下idea是会自动检测多个springBoot项目,当同时启动第二个springBoot项目时会询问你是否在Run Dashboard(顾名思义叫运行仪表盘,可以方便管理多个项目的运行和停止等操作)中运行。如果前几个module都是在Run Dashboard中运行,新建的module不在Run Dashboard中运行了,可以是idea的run configurations没配置好:
通过Run-》Edit Configurations 打开运行配置,可以看到
新创建的应用跑到Application中去了,所以idea不会把它和其他项目归为一类,所以不会再仪表盘中显示。
解决:
点击绿加号-》选择springBoot-》修改新添加的配置的Name和Main class 即可,然后就可以在Run Dashboard中看到刚才新添加的项目了。
待续...
也可以将你的其他问题以及验证过得解决方式发布到这篇文章中来,评论区留言即可,看到后我会合并进来的...