SpringBoot(一、项目创建和网络请求,文件上传)
2019-05-13 本文已影响0人
强某某
创建项目
基本配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.techsel.springboot</groupId>
<artifactId>Hello</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 默认jar可省略 -->
<!-- <packaging>jar</packaging> -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 需要模板引擎渲染的时候,才需要引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 该插件是,打包的时候需要,因为虽然可以打包成功,但是没有mainfast文件
即java -jar命令执行时候,无法找到主函数,运行失败,添加该插件即可解决 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
主函数
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class);
}
}
其他说明
- @RestController and @RequestMapping是springMVC的注解,不是springboot特有的
- @RestController = @Controller+@ResponseBody
- @SpringBootApplication = @Configuration+@EnableAutoConfiguration+@ComponentScan
localhost:8080 - @RestController=@Controller+@ResponseBody
Get请求
@RequestMapping("user")
@RestController
public class GetAndPostController {
/**
* 动态路由
* @param user_name
* @param age
* @return
*/
@GetMapping("/{user_name}/{user_age}")
public String hello(@PathVariable String user_name,@PathVariable("user_age")String age){
//例如访问地址http://127.0.0.1:8080/zq/30
/**
* @PathVariable意义是去访问路径里面取参数"user_name"
* 对应GetMapping中的user_name,user_age同理
* 如果@PathVariable("user_name")省略("user_name")则String name
* 要变化为String user_name
*/
return "hello world:"+user_name+"----"+age;
}
/**
* 此路由是针对参数的,区别于上面的动态路由
* required = true 默认就是true,所以一般省略,代表是否必须有值
* 如果请求时候没有传递该值,也不会报错,会取取defaultValue的值
* 如果defaultValue也没有定义,此时会报错
* @param index
* @return
*/
@GetMapping("/index")
public String hello1(@RequestParam(defaultValue = "3",name = "size") int index){
return "hello world:"+index;
}
/**
* 例如提交注册信息的时候,数据量可能很大,上面一个个参数获取肯定不合适
* @RequestBody自动序列化数据到对象中
* 但是客户端需要指定:http的头为content-type为application/json
* @param user
* @return
*/
@PostMapping("/body")
public User getBody(@RequestBody User user){
return user;
}
/**
* 获取http请求头中的信息
* @param accessToekn
* @return
*/
@GetMapping("/header")
public String getHeader(@RequestHeader("access_header") String accessToekn){
return accessToekn;
}
/**
* spring会自动吧参数注入到HttpServletRequest中
* 其实就是对原始servlet的封装,获取方式和servlet时候一致
* 特定场景下还是可以使用的
* @param request
* @return
*/
@GetMapping("/request")
public User getParmer(HttpServletRequest request){
User user=new User();
user.setName(request.getParameter("name"));
return user;
}
}
其他请求
@RequestMapping("other")
@RestController
public class OtherController {
@PostMapping("v1/login")
//此时name和age没有添加requestparamer这种注解,所以必须用户提交和这个名称一致
public User post(String name, String age) {
User user=new User();
user.setName(name);
user.setAge(age);
return user;
}
@PutMapping("v1/login")
public User put(String name, String age) {
User user=new User();
user.setName(name);
user.setAge(age);
return user;
}
@DeleteMapping("v1/login")
public User delete(String name, String age) {
User user=new User();
user.setName(name);
user.setAge(age);
return user;
}
}
Jackson相关
1、常用框架 阿里 fastjson,谷歌gson等
JavaBean序列化为Json,性能:Jackson > FastJson > Gson > Json-lib 同个结构
Jackson、FastJson、Gson类库各有优点,各有自己的专长
空间换时间,时间换空间
2、jackson处理相关自动
指定字段不返回:@JsonIgnore
指定日期格式:@JsonFormat(pattern="yyyy-MM-dd hh:mm:ss",locale="zh",timezone="GMT+8")
空字段不返回:@JsonInclude(Include.NON_NUll)
指定别名:@JsonProperty
对应对象
public class User {
@JsonProperty("username") //别名:返回字段名称就是username了
String name;
@JsonInclude(JsonInclude.Include.NON_NULL)//空字段不返回
String age;
@JsonIgnore //忽略该字段
String sex;
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8")
Date time;
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
", sex='" + sex + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
控制器
@RequestMapping("json")
@RestController
public class JacksonController {
/**
* 测试json胡忽略字段
* @return
*/
@PostMapping("/v2/json")
public User getInfo() {
User user=new User();
// user.setAge("12");
user.setName("zq");
user.setSex("hahah");
user.setTime(new Date());
return user;
}
}
静态资源目录
同个文件的加载顺序,静态资源文件
META/resources > resources > static > public 里面找是否存在相应的资源,如果有则直接返回。
常用目录
目录讲解
src/main/java:存放代码
src/main/resources下的
static: 存放静态文件,比如 css、js、image,html (访问方式 http://localhost:8080/js/main.js),不需要模板引擎
templates:存放静态页面jsp,html,tpl,该目录生效需要配置模板引擎,否则即使html放里面也识别不了
config:存放配置文件,application.properties
resources:等效于static/public
依赖 Thymeleaf
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
自定义静态资源目录
spring:
resources:
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
打jar包
- 首先添加插件
因为这样才能生成mainfast文件,否则找不到主函数入口
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
图一.png
target文件夹下面有生成的jar包
- java -jar jar名称即可
文件上传
基本案例
@Controller
public class FileController {
@RequestMapping("v1/getindex")
public Object index(){
//返回的是查找模板名称并渲染返回
//如果没有自定义模板引擎的地址,则返回的是templates目录下的文件可以是html
return "index";
}
/**
最终生成的文件上传目录,不要是打好jar包内部的路径,因为其实无法上传
应该定义外部路径,或者定义nginx等的路径
*/
private static final String filePath="E:\\Upload\\";
@PostMapping("upload")
@ResponseBody
public String upload(@RequestParam("head_img")MultipartFile file, HttpServletRequest request) {
// file.isEmpty()文件是否为空
// file.getSize()文件大小判断可用
String filename = file.getOriginalFilename();//文件名
String suffixName = filename.substring(filename.lastIndexOf("."));//文件后缀名
//文件上传后的路径
filename= UUID.randomUUID()+suffixName;
File dest=new File(filePath+filename);
System.out.println(dest);
try {
//MultipartFile 对象的transferTo方法,用于文件保存(效率和操作比原先用FileOutStream方便和高效)
file.transferTo(dest);//效率更高
} catch (IOException e) {
e.printStackTrace();
return e.toString();
}
return "OK";
}
}
上传java指定目录时候的配置
web.images-path: /Users/jack/Desktop
spring:
resources: # 自定义静态资源路径
static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}
说明:file:{}代表引用
如果不添加自定义静态资源路径,则打好jar包运行所有的文件上传其实都是失败的,必须指定一个外部路径,或者如果不指定自定义的路径,则需要配置nginx等的路径,这样也相当于配置了外部可响应的静态资源路径(只要文件上传到对应的地址)
文件上传配置修改
- 方式一:java配置
@Configuration
public class MultipartConfig {
@Bean
public MultipartConfigElement multipartConfigElement() {
//如果不覆盖则走的默认配置,例如单个文件上传限制MultipartFile为接近10M
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
//文件最大10M,DataUnit提供5中类型B,KB,MB,GB,TB
factory.setMaxFileSize(DataSize.of(10, DataUnit.MEGABYTES));
/// 设置总上传数据总大小10M
factory.setMaxRequestSize(DataSize.of(10, DataUnit.MEGABYTES));
return factory.createMultipartConfig();
}
}
- 方式二: yml文件配置
spring:
servlet:
multipart:
max-file-size: 20MB #maxFileSize 是单个文件大小
max-request-size: 20MB #max-request-size=20MB