文章目录

  • 配置端口和上下文
  • 静态资源配置
  • 文章参考
  • springboot默认寻找静态资源路径
  • 配置上下文之后访问图片(静态资源)
  • 配置视图(展示页面)的路径
  • 创建静态资源文件夹(html文件存放的位置)
  • 创建控制器,配置 URL 跳转到静态页面
  • 查看效果和图片引用的地址
  • 自定义多个配置文件
  • 文章参考
  • 默认配置文件
  • springboot如何同时加载多个配置文件
  • 将配置文件的属性赋给实体类
  • 自定义配置文件
  • 允许跨域的配置
  • 利用 Filter 实现允许跨域
  • Spring 定义的CorsFilter 对象
  • 文件上传
  • 文章参考
  • 文件上传介绍
  • 文件上传案例说明
  • 如何设置上传文件大小
  • application.property 配置
  • 增加Bean配置


配置端口和上下文

设置application.properties配置文件

# 启动的端口号
server.port=8888
# 上下文名称
server.context-path=/test

静态资源配置

  1. springboot默认寻找静态资源路径
classpath:/META-INF/resources/ 
classpath:/resources/
classpath:/static/ 
classpath:/public/

优先级从上到下逐渐降低

如果static里面有个index.html,public下面也有个index.html,则优先会加载static下面的index.html,因为优先级!

配置上下文之后访问图片(静态资源)

  1. 目录结构
  2. java boot 静态块 内根据不同的环境获取配置文件的内容_spring

  3. 使用浏览器访问

java boot 静态块 内根据不同的环境获取配置文件的内容_配置文件_02

配置视图(展示页面)的路径

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文件存放的位置)
  1. src/main/resouces(默认资源目录,即 classpath 目录),创建static文件夹(默认存放静态资源的文件夹)
  2. 然后根据配置文件,在static目录下面创建 pages 文件夹
  3. src/main/resouces/static/pages 文件夹下创建 testpage.html
  4. 在页面中可以根据路径,引入 “css” 和 “图片”

java boot 静态块 内根据不同的环境获取配置文件的内容_java_03

创建控制器,配置 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";
	}
}
查看效果和图片引用的地址
  1. 在地址栏中输入 http://localhost:8080/testpage 访问页面
  2. 在地址栏中输入 http://localhost:8080/images/1.png 访问的是 src/main/resouces/static/images/1.png的图片

java boot 静态块 内根据不同的环境获取配置文件的内容_java_04

自定义多个配置文件

默认配置文件

当我们创建一个springboot项目的时候,系统默认会为我们在src/main/Java/resources目录下创建一个application.properties(我们也可以手动改为application.yml)。

springboot如何同时加载多个配置文件

  1. springboot 默认是在src/main/resources文件夹中加载application.properties默认配置文件

格式为application-{profile}.properties,其中{profile}对应你的环境标识

  1. 在application.properties中添加spring.profiles.active = dev,database
# 加载多个配置文件,系统加载了application.properties application-database.properties  application-dev.properties 三个配置文件
spring.profiles.active = dev,database
  1. 系统加载了src/main/resources目录下的application.properties application-database.properties application-dev.properties 三个配置文件

将配置文件的属性赋给实体类

  1. application-dev.properties文件内容
dev.name=liumei
  1. 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,需要加这三个注解。

  1. @Configuration
  2. @PropertySource(value = “classpath:test.properties”)
  3. @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);
	}
}

文件上传

文件上传介绍

  1. 为了能上传文件,必须将表单的method设置为POST,并将enctype设置为multipart/form-data。
  2. 设置了enctype为multipart/form-data,浏览器即会采用二进制流的方式来处理表单数据,而对于文件上传的处理则涉及在服务器端解析原始的HTTP响应。

在2003年,Apache Software Foundation发布了开源的Commons FileUpload组件,其很快成为Servlet/JSP程序员上传文件的最佳选择。
Servlet3.0规范已经提供方法来处理文件上传,但这种上传需要在Servlet中完成。而Spring MVC则提供了更简单的封装。

  1. 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();
    }
}