SpringBoot

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);
    }
}

其他说明

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包

文件上传

基本案例

@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:{web.upload-path} 中web.upload-path是自定义的名称,{}代表引用

如果不添加自定义静态资源路径,则打好jar包运行所有的文件上传其实都是失败的,必须指定一个外部路径,或者如果不指定自定义的路径,则需要配置nginx等的路径,这样也相当于配置了外部可响应的静态资源路径(只要文件上传到对应的地址)

文件上传配置修改

@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();
    }
}
spring:
  servlet:
    multipart:
      max-file-size: 20MB #maxFileSize 是单个文件大小
      max-request-size: 20MB  #max-request-size=20MB
上一篇下一篇

猜你喜欢

热点阅读