美文网首页SpringBoot
SpringBoot(一、项目创建和网络请求,文件上传)

SpringBoot(一、项目创建和网络请求,文件上传)

作者: 强某某 | 来源:发表于2019-05-13 11:41 被阅读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:{web.upload-path} 中web.upload-path是自定义的名称,{}代表引用

    如果不添加自定义静态资源路径,则打好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
    

    相关文章

      网友评论

        本文标题:SpringBoot(一、项目创建和网络请求,文件上传)

        本文链接:https://www.haomeiwen.com/subject/ysrlaqtx.html