文章目录
- 配置端口和上下文
- 静态资源配置
- 文章参考
- springboot默认寻找静态资源路径
- 配置上下文之后访问图片(静态资源)
- 配置视图(展示页面)的路径
- 创建静态资源文件夹(html文件存放的位置)
- 创建控制器,配置 URL 跳转到静态页面
- 查看效果和图片引用的地址
- 自定义多个配置文件
- 文章参考
- 默认配置文件
- springboot如何同时加载多个配置文件
- 将配置文件的属性赋给实体类
- 自定义配置文件
- 允许跨域的配置
- 利用 Filter 实现允许跨域
- Spring 定义的CorsFilter 对象
- 文件上传
- 文章参考
- 文件上传介绍
- 文件上传案例说明
- 如何设置上传文件大小
- application.property 配置
- 增加Bean配置
配置端口和上下文
设置application.properties配置文件
# 启动的端口号
server.port=8888
# 上下文名称
server.context-path=/test
静态资源配置
- springboot默认寻找静态资源路径
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
优先级从上到下逐渐降低
如果static里面有个index.html,public下面也有个index.html,则优先会加载static下面的index.html,因为优先级!
配置上下文之后访问图片(静态资源)
- 目录结构
- 使用浏览器访问
配置视图(展示页面)的路径
application.yml
配置信息如下
#默认使用配置
spring:
profiles:
active: dev
mvc: ## 配置静态页面
view:
prefix: /pages/
suffix: .html
等价于
application.property
配置信息如下
spring.mvc.view.prefix=/pages/
spring.mvc.view.suffix=.html
创建静态资源文件夹(html文件存放的位置)
- 在
src/main/resouces
(默认资源目录,即 classpath 目录),创建static文件夹(默认存放静态资源的文件夹) - 然后根据配置文件,在static目录下面创建 pages 文件夹
- 在
src/main/resouces/static/pages
文件夹下创建testpage.html
- 在页面中可以根据路径,引入 “css” 和 “图片”
创建控制器,配置 URL 跳转到静态页面
package com.page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class LoginPageController {
// 如果是配置了spring security ,则这个url会默认被拦截
@RequestMapping("/login")
public String login() {
System.out.println("loginloginlogin");
return "login";
}
// 使用下面的链接来做相关测试
@RequestMapping("/testpage")
public String testpage() {
System.out.println("testpage");
// 根据配置文件会去找src/main/resouces/static/pages/testpage.html页面
return "testpage";
}
}
查看效果和图片引用的地址
- 在地址栏中输入
http://localhost:8080/testpage
访问页面 - 在地址栏中输入
http://localhost:8080/images/1.png
访问的是src/main/resouces/static/images/1.png
的图片
自定义多个配置文件
默认配置文件
当我们创建一个springboot项目的时候,系统默认会为我们在src/main/Java/resources目录下创建一个application.properties(我们也可以手动改为application.yml)。
springboot如何同时加载多个配置文件
- springboot 默认是在src/main/resources文件夹中加载application.properties默认配置文件
格式为application-{profile}.properties,其中{profile}对应你的环境标识
- 在application.properties中添加spring.profiles.active = dev,database
# 加载多个配置文件,系统加载了application.properties application-database.properties application-dev.properties 三个配置文件
spring.profiles.active = dev,database
- 系统加载了src/main/resources目录下的application.properties application-database.properties application-dev.properties 三个配置文件
将配置文件的属性赋给实体类
- application-dev.properties文件内容
dev.name=liumei
- java实体类
package com.hb.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix="dev")
public class DevConfig {
// application-dev.properties中dev.name的值
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@ConfigurationProperties(prefix=“dev”) 意思是说加载所有配置信息中dev.name的值;name的属性要有get和set方法
自定义配置文件
上面介绍的是我们都把配置文件写到application.yml中。有时我们不愿意把配置都写到application配置文件中,这时需要我们自定义配置文件,比如test.properties:
com.forezp.name=forezp
com.forezp.age=12
怎么将这个配置文件信息赋予给一个javabean呢?
@Configuration
@PropertySource(value = "classpath:test.properties")
@ConfigurationProperties(prefix = "com.forezp")
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
在最新版本的springboot,需要加这三个注解。
- @Configuration
- @PropertySource(value = “classpath:test.properties”)
- @ConfigurationProperties(prefix = “com.forezp”);在1.4版本需要
允许跨域的配置
利用 Filter 实现允许跨域
package com.config;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig implements Filter {
final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.class);
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// System.out.println("---------------允许跨域----------------");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
response.setHeader("Access-Control-Allow-Origin", "*");//允许跨域访问的域
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");//允许使用的请求方法,以逗号隔开
response.setHeader("Access-Control-Max-Age", "3600");// 缓存此次请求的秒数
//允许使用的请求方法,以逗号隔开
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Cache-Control,Pragma,Content-Type,Token");
response.setHeader("Access-Control-Allow-Credentials","true");//是否允许请求带有验证信息
chain.doFilter(req, res);
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
/**
* 文件上传配置
* @return
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大
factory.setMaxFileSize("10240KB"); //KB,MB
/// 设置总上传数据总大小
factory.setMaxRequestSize("102400KB");
return factory.createMultipartConfig();
}
}
Spring 定义的CorsFilter 对象
package com.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.setAllowCredentials(true);
config.addAllowedMethod("*");
config.addAllowedHeader("*");
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}
文件上传
文件上传介绍
- 为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。
- 设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。
在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。
Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。
- Spring MVC为文件上传提供了直接的支持,这种支持是用即插即用的MultipartResolver实现的。
Spring MVC使用Apache Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver
。因此,SpringMVC的文件上传还需要依赖Apache Commons FileUpload的组件。
文件上传案例说明
//上传文件会自动绑定到MultipartFile中
@RequestMapping(value="/upload",method=RequestMethod.POST)
public String upload(HttpServletRequest request,
@RequestParam("description") String description,
@RequestParam("file") MultipartFile file) throws Exception {
System.out.println(description);
//如果文件不为空,写入上传路径
if(!file.isEmpty()) {
//上传文件路径
String path = request.getServletContext().getRealPath("/images/");
//上传文件名
String filename = file.getOriginalFilename();
File filepath = new File(path,filename);
//判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
//将上传文件保存到一个目标文件当中
file.transferTo(new File(path + File.separator + filename));
return "success";
} else {
return "error";
}
}
Spring MVC会将上传的文件绑定到MultipartFile对象中。MultipartFile提供了获取上传文件内容、文件名等方法。通过transferTo()方法还可以将文件存储到硬件中
MultipartFile对象中的常用方法如下:
- byte[] getBytes():获取文件数据
- String getContentType[]:获取文件MIME类型,如image/jpeg等
- InputStream getInputStream():获取文件流
- String getName():获取表单中文件组件的名字
- String getOriginalFilename():获取上传文件的原名
- Long getSize():获取文件的字节大小,单位为byte
- boolean isEmpty():是否有上传文件
- void transferTo(File dest):将上传文件保存到一个目录文件中
如何设置上传文件大小
application.property 配置
# maxFileSize:单个文件大小
spring.http.multipart.maxFileSize=10MB
# maxRequestSize:总上传文件大小
spring.http.multipart.maxRequestSize=10MB
增加Bean配置
package com.hb.config;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CorsFilter implements Filter {
final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CorsFilter.class);
/**
* 文件上传配置
* @return
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//文件最大
factory.setMaxFileSize("10240KB"); //KB,MB
/// 设置总上传数据总大小
factory.setMaxRequestSize("102400KB");
return factory.createMultipartConfig();
}
}