SpringMvc学习——在idea中新建springWeb项目 浏览器请求 和 服务器响应 SpringMvc文件相关

news2024/9/30 1:28:34

目录

  • 引出
  • 基础知识:三层架构和MVC
    • 1. 三层架构
    • 2.MVC模型
  • springWeb项目IDEA搭建
    • 1.新建一个普通的maven项目
    • 2.导入包,pom.xml文件
    • 3.写主启动类Main.java文件@SpringBootApplication
    • 4.写application.yml文件spring的配置文件
    • 5.启动,运行main.java就可以启动
  • SpringMvc的浏览器请求初步
    • 1.初识springMvc @RequestMapping("/demo")
    • 2.由@RequestMapping衍生出来的
      • 405异常:服务器只能处理post,浏览器请求的是get方法
  • 浏览器请求Request传参数的方式
    • 1.基础数据类型和String
    • 2.发送name,接收是username,@RequestParam(value = "name")
      • 400异常,加了@RequestParam(value = "name") 必须传值
      • 400异常,后端类型是Integer,前端传的是string,转换失败
    • 2.【应用】分页可以用@RequestParam(value = "pageNum",defaultValue = "1")
    • 3.Rest风格的查询xxx/search/手机/白色----xxx/search?item=手机&color=白的
    • 4.后端用对象接收 + 数组/集合
    • 5.日期的处理,默认格式2021/05/28,【未完待续】
      • 400异常,日期格式转换失败
    • 6.怎么获取请求头,cookie里的值,以及原来的request和response等
  • 服务器响应Response---后端给前端发送内容
    • 1.响应一个Json + 时间显示@JsonFormat【有坑】
    • 2.响应一个页面,返回值String
    • 2.响应页面,ModelAndView 且共享数据[[${usename}]]
    • 3.如果想自己处理,就用void
  • SpringMvc处理上传文件
    • 1.上传文件,并保存到本地 MultipartFile
    • 2.上传同名文件被覆盖的问题---用uuid改名
    • 3.本地电脑图片进行展示---静态资源映射--协议 file:
    • 4.上传文件的路径放到spring的配置文件中,获取@Value("${imgLocation}")
  • 总结

引出


mvc是啥,springMvc是啥,如何搭建springWeb项目,
在springMvc下的request和response怎么发请求,怎么进行响应?
springMvc处理文件相关:上传文件,uuid改名,静态资源映射,yaml配置路径,spring配置文件初步;

在这里插入图片描述

基础知识:三层架构和MVC

1. 三层架构

  1. 表现(视图)层:WEB层,用来和客户端进行数据交互的。 servlet-controller
  2. 业务层:处理公司具体的业务逻辑的 service
  3. 持久层:用来操作数据库的 dao-mapper

2.MVC模型

  1. MVC全名是Model View Controller 模型视图控制器,每个部分各司其职。

  2. Model:数据模型,JavaBean的类,用来进行数据封装。

  3. View:指JSP、HTML用来展示数据给用户安卓-http,苹果,小程序

  4. Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。

springWeb项目IDEA搭建

1.新建一个普通的maven项目

在这里插入图片描述

2.导入包,pom.xml文件

(1)继承一个父

    <!--    继承一个父-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
    </parent>

(2)web项目的包+前端模板引擎

       <!--    做web项目的包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
<!--        前端模板引擎,类似于jsp-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

(3)完整的pom.xml文件

<?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.tianju</groupId>
    <artifactId>springMvc620</artifactId>
    <version>1.0-SNAPSHOT</version>

<!--    继承一个父-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.0.RELEASE</version>
    </parent>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>

        <!--    做web项目的包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

<!--        前端模板引擎,类似于jsp-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
<!--        其他需要的包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.22</version>
        </dependency>

    </dependencies>
    
</project>

3.写主启动类Main.java文件@SpringBootApplication

要点:

  • 是spingMvc的配置类:@SpringBootApplication;
  • 启动: SpringApplication.run(Main.class);
  • 目录层级的问题,和其他同级目录;

在这里插入图片描述

Main.java文件

package com.tianju;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;


/**
 * springMvc的主启动类
 * 1.本质是配置类;@SpringBootApplication :@Configuration是它的爷爷辈
 * 2.启动容器,SpringApplication.run(Main.class);
 */
@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        // 集成了的new对象,放容器,启动执行
        ApplicationContext ac = SpringApplication.run(Main.class);
    }
}

4.写application.yml文件spring的配置文件

要点:

  • 文件名是 application.yml
  • 颜色要是黄色,要有空格

在这里插入图片描述

在这里插入图片描述

server:
  port: 80

5.启动,运行main.java就可以启动

在这里插入图片描述

SpringMvc的浏览器请求初步

1.初识springMvc @RequestMapping(“/demo”)

要点:

  • 1.controller要在容器中:@Controller
  • 2.用来处理浏览器的请求:@RequestMapping(“/demo”)
  • @RequestMapping(“/demo”)可以在类上,也可在方法上:一级、二级目录;

在这里插入图片描述

ResponseControllerDemo.java文件

package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {
    @RequestMapping({"/hello","/hello2"}) // 二级目录
    @ResponseBody
    public String hello(){
        return "Hello SpringMvc";
    }
}

在这里插入图片描述

2.由@RequestMapping衍生出来的

@PostMapping,@GetMapping,@DeleteMapping,@PutMapping

在这里插入图片描述

@RequestMapping

@PostMapping(“/hello”)
@GetMapping
@DeleteMapping
@PutMapping

405异常:服务器只能处理post,浏览器请求的是get方法

在这里插入图片描述

浏览器请求Request传参数的方式

1.基础数据类型和String

要点:

  • string不传默认是,空字符串;
  • Integer不传,默认是null;
http://localhost/demo/hello?username=&age=
package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {
    @RequestMapping("/hello") // 二级目录
    @ResponseBody
    public String hello(String username,Integer age){
        System.out.println(username);
        System.out.println(age);
        return "Hello SpringMvc";
    }
}

2.发送name,接收是username,@RequestParam(value = “name”)

要点:

  • 默认必须传值,不传会报400异常;

  • 如果不想传,就加required=false;

  • 还可以给个默认值,defaultValue=“admin”;【应用:分页的时候,默认第一页,默认每页10条数据】

http://localhost/demo/hello?name=hell
    @RequestMapping("/hello") // 二级目录
    @ResponseBody
    public String hello(@RequestParam(value = "name") String username){
        System.out.println(username);
        return "Hello SpringMvc";
    }

400异常,加了@RequestParam(value = “name”) 必须传值

在这里插入图片描述

400异常,后端类型是Integer,前端传的是string,转换失败

在这里插入图片描述

2.【应用】分页可以用@RequestParam(value = “pageNum”,defaultValue = “1”)

package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {
    @RequestMapping("/hello") // 二级目录
    @ResponseBody
    public String hello(@RequestParam(value = "pageNum",defaultValue = "1") Integer pageNum,
                        @RequestParam(value = "pageSize",defaultValue = "10") Integer pageSize){
        System.out.println(pageNum);
        System.out.println(pageSize);
        return "Hello SpringMvc";
    }
}

3.Rest风格的查询xxx/search/手机/白色----xxx/search?item=手机&color=白的

要点:

  • 访问路径:@RequestMapping(“/search/{item}/{color}”);
  • 获取参数:@PathVariable(“item”)

在这里插入图片描述

http://localhost/demo/search/mobilephone/red
package com.tianju.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.security.SignedObject;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {

    // http://localhost/demo/search/mobilephone/red
    @RequestMapping("/search/{item}/{color}") // 二级目录
    @ResponseBody
    public String hello(@PathVariable("item") String item,
                        @PathVariable("color") String color){
        System.out.println(item);
        System.out.println(color);
        return "Hello SpringMvc";
    }
}

4.后端用对象接收 + 数组/集合

要点:

  • 可以用对象接收前端传来的数据,会自动做映射
  • 可以传数组,或集合

在这里插入图片描述

http://localhost/demo/add/user?username=peter&password=123&hobby=learn&hobby=game
package com.tianju.controller;

import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.security.SignedObject;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {

    // http://localhost/demo/add/user?username=peter
    // &password=123&hobby=learn&hobby=game
    @RequestMapping("/add/user") // 二级目录
    @ResponseBody
    public String hello(User user){
        System.out.println(user);
        return "Hello SpringMvc";
    }
}

5.日期的处理,默认格式2021/05/28,【未完待续】

要点:

  • 默认只能发送2021/05/28格式的日期
http://localhost/demo/date?birthday=2021/05/28
package com.tianju.controller;

import com.tianju.entity.User;
import lombok.Data;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.security.SignedObject;
import java.util.Date;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {

    // http://localhost/demo/date?birthday=2021/05/28
    @RequestMapping("/date") // 二级目录
    @ResponseBody
    public String hello(Date birthday){
        System.out.println(birthday);
        return "Hello SpringMvc";
    }
}

400异常,日期格式转换失败

Failed to convert from type [java.lang.String] to type [java.util.Date] for value ‘2021-5-28’; nested exception is java.lang.IllegalArgumentException]

在这里插入图片描述

6.怎么获取请求头,cookie里的值,以及原来的request和response等

要点:

  • 需要啥写啥;

  • HttpServletRequest request,

  • HttpSession httpSession,

在这里插入图片描述

http://localhost/demo/set/session
http://localhost/demo/native
package com.tianju.controller;

import com.tianju.entity.User;
import lombok.Data;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.security.SignedObject;
import java.util.Date;

/**
 * controller层,
 * 1.在容器中: @Controller
 * 2.用来处理网络请求:即 @RequestMapping("/demo")
 * 既可以放在类上:一级目录;
 * 也可以在方法上:二级目录:http://localhost/demo/hello
 */
@Controller
@RequestMapping("/demo") // 一级目录
public class ResponseControllerDemo {

    // http://localhost/demo/date?birthday=2021/05/28
    @RequestMapping("/native") // 二级目录
    @ResponseBody
    public String hello(HttpServletRequest request,
                        HttpSession httpSession,
                        HttpServletResponse response,
                        @RequestHeader("Connection") String connection,
                        @CookieValue("JSESSIONID") String jsessionid){
        // 1.request里面就可以获得session,之前servlet就是这样的
        HttpSession session = request.getSession();
        // 2.加上httpSession,也能获得;
        Object username = httpSession.getAttribute("username");
        System.out.println(username);
        System.out.println(response);
        System.out.println("----获取请求头里的connection------");
        System.out.println(connection);
        System.out.println(jsessionid);
        return "Hello SpringMvc";
    }

    @RequestMapping("/set/session")
    @ResponseBody
    public String setSession(HttpSession session){
        session.setAttribute("username", "peter");
        System.out.println(session);
        return "success";
    }
}

请求头
在这里插入图片描述获取connection和 jsessionid

在这里插入图片描述

服务器响应Response—后端给前端发送内容

在这里插入图片描述

需要一个包,前端模板引擎,类似于jsp

<!--        前端模板引擎,功能类似于jsp-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

1.响应一个Json + 时间显示@JsonFormat【有坑】

要点:

  • 响应是json,要加@ResponseBody;

  • 时间显示的问题,要GMT+8:

  • @JsonFormat(pattern = “yyyy-MM-DD hh:mm:ss”, timezone = “GMT+8”)

  • 如果一个controller响应都是json则,可以用@RestController代替 @Controller 和 @ResponseBody

在这里插入图片描述

注意这里,日期转换格式写错了,DD要改成小写dd

在这里插入图片描述

日期格式的转换

    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",timezone = "GMT+8")
    private Date birthday;

controller的代码

package com.tianju.controller;

import com.tianju.entity.ResData;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.Date;

/**
 * 响应相关:1.响应json;2.响应页面
 * 要点:
 * 1.在容器@Controller;
 * 2.路径;@RequestMapping("/resp");
 * 3.如果是响应json,需要加@ResponseBody;
 * 4.如果响应页面,则返回值是string
 * 补充:如果一个controller响应都是json
 * 则,@RestController代替 @Controller 和 @ResponseBody
 */
@Controller
@RequestMapping("/resp")
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
    @RequestMapping("/json")
    @ResponseBody // 如果响应是json,必须加
    public ResData respJson(){
        User user = new User("peter", "123",
                new Date(), Arrays.asList(new String[]{"learn","movie"}));
        return new ResData(200, "success", user);
    }
}

可以不写responseBody,用@RestController

在这里插入图片描述

2.响应一个页面,返回值String

要点:

  • 1.返回值为string;
  • 2.不能加Responsebody

在这里插入图片描述

服务器响应html代码,显示在前端页面上

在这里插入图片描述

访问resources下的文件可以修改,不建议
在这里插入图片描述

访问连接

http://localhost/resp/list

后端代码

    /**
     * 响应一个页面
     * @return list页面,会在前面拼 /templates,后面拼.html
     * 最终访问到xxx/templates/opus/list.html
     */
    @RequestMapping("/list")
    public String respHtml(){
        return "/opus/list";
    }

2.响应页面,ModelAndView 且共享数据[[${usename}]]

要点:

<html lang="en" xmlns:th="http://www.thymeleaf.org">
// 1.定义要跳转的页面,2.添加要共享的数据
        ModelAndView mv = new ModelAndView("opus/list");
        mv.addObject("username", "peter");

第一种方式:不建议

在这里插入图片描述

第二种方式:以后共享数据都用这种方式

在这里插入图片描述

共享值显示到前端

在这里插入图片描述

    @RequestMapping("/listAndData")
    public ModelAndView respHtmlData(){
        // 1.定义要跳转的页面,2.添加要共享的数据
        ModelAndView mv = new ModelAndView("opus/list");
        mv.addObject("username", "peter");
        return mv;
    }

3.如果想自己处理,就用void

要点:没有返回值,用void

在这里插入图片描述

package com.tianju.controller;

import com.alibaba.fastjson.JSON;
import com.tianju.entity.ResData;
import com.tianju.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;

/**
 * 响应相关:1.响应json;2.响应页面
 * 要点:
 * 1.在容器@Controller;
 * 2.路径;@RequestMapping("/resp");
 * 3.如果是响应json,需要加@ResponseBody;
 * 4.如果响应页面,则返回值是string
 * 补充:如果一个controller响应都是json
 * 则,@RestController代替 @Controller 和 @ResponseBody
 */
@Controller
@RequestMapping("/resp")
//@RestController // 等价于@Controller + @ResponseBody
public class ResponseControllerDemo {
    @RequestMapping("/json")
    @ResponseBody // 如果响应是json,必须加
    public ResData respJson(){
        User user = new User("peter", "123",
                new Date(), Arrays.asList(new String[]{"learn","movie"}));
        return new ResData(200, "success", user);
    }

    /**
     * 响应一个页面
     * @return list页面,会在前面拼 /templates,后面拼.html
     * 最终访问到xxx/templates/opus/list.html
     */
    @RequestMapping("/list")
    public String respHtml(){
        return "/opus/list";
    }

    @RequestMapping("/listAndData")
    public ModelAndView respHtmlData(){
        // 1.定义要跳转的页面,2.添加要共享的数据
        ModelAndView mv = new ModelAndView("opus/list");
        mv.addObject("username", "peter");
        return mv;
    }

    /**
     * 如果想自己处理,就用void
     */
    @RequestMapping("/self")
    public void test(HttpServletResponse response) throws IOException {
        ResData resData = new ResData(200, "success", null);
        response.getWriter().write(JSON.toJSONString(resData));
    }
}

SpringMvc处理上传文件

1.上传文件,并保存到本地 MultipartFile

要点:

  • 1.提交用post + 分段提交enctype=“multipart/form-data”;
  • 2.接收用MultipartFile进行接收,可以获得名字大小等;
  • 3.保存到本地可以用transferTo,或者拿到输入流处理;

在这里插入图片描述

可以拿到图片,获取图片大小,进行大小处理

在这里插入图片描述

后端controlle代码

package com.tianju.controller;

import com.tianju.entity.ResData;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * 上传文件:
 * 要点:
 * 1.前端怎么提交:
 * 2.后端怎么接收:
 * 3.接收后怎么处理:
 */
//@RestController // 等价于@Controller 和 @ResponseBody
@Controller
@RequestMapping("/file")
public class UploadController {
    // 1.先到上传图片的页面
    @RequestMapping("/uploadPage")
    public String uploadPage(){
        return "/opus/upload";
    }

    // 2.处理前端上传的图片
    @RequestMapping("/upload")
    @ResponseBody
    public ResData uploadImg(MultipartFile headImg) throws IOException {
        long size = headImg.getSize(); // 文件大小
        String filename = headImg.getOriginalFilename(); // 文件名
        System.out.println("上传的文件:"+filename+",文件大小"+size);
        // 对文件进行处理
        // (1)拿到输入流,然后保存到本地;以后也可能通过网络发送到其他地方
        InputStream inputStream = headImg.getInputStream();
        FileOutputStream outputStream = new FileOutputStream("D:/06/" + filename);
        IOUtils.copy(inputStream, outputStream);
        // 谁建的谁关
        outputStream.close();

        // (2)不用流直接存到本地文件中
        headImg.transferTo(new File("D:\\620\\"+filename));
        return new ResData(200, "ok", null);
    }

}

前端upload.html页面代码

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!-- 提交方法必须是post,并且用分段提交 -->
<form action="/file/upload"
      method="post"
      enctype="multipart/form-data">
    <input type="file" name="headImg">
    <input type="submit" value="提交">
</form>

</body>
</html>

2.上传同名文件被覆盖的问题—用uuid改名

要点:

  • 1.用uuid改名,uuid去掉-,replace方法;
  • 2.获取上传文件的后缀int i = originalFilename.lastIndexOf(“.”); substring(i);
  • 3.保存到本地

在这里插入图片描述

package com.tianju.controller;

import com.tianju.entity.ResData;
import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

/**
 * 上传文件:
 * 要点:
 * 1.前端怎么提交:
 * 2.后端怎么接收:
 * 3.接收后怎么处理:
 */
//@RestController // 等价于@Controller 和 @ResponseBody
@Controller
@RequestMapping("/file")
public class UploadController {
    // 1.先到上传图片的页面
    @RequestMapping("/uploadPage")
    public String uploadPage(){
        return "/opus/upload";
    }

    // 2.处理前端上传的图片
    @RequestMapping("/upload")
    @ResponseBody
    public ResData uploadImg(MultipartFile headImg) throws IOException {
        long size = headImg.getSize(); // 文件大小
        String originalFilename = headImg.getOriginalFilename(); // 文件名
        System.out.println("上传的文件:"+originalFilename+",文件大小"+size);
        // 对文件进行处理 (2)不用流直接存到本地文件中
        // 获得uuid,并把中间-去掉
        String randomStr = UUID.randomUUID().toString().replace("-", "");
        // 获取上传文件的后缀
        int i = originalFilename.lastIndexOf(".");
        String suffix = originalFilename.substring(i, originalFilename.length());
        headImg.transferTo(new File("D:\\620\\"+randomStr+suffix));
        return new ResData(200, "ok", null);
    }

}

3.本地电脑图片进行展示—静态资源映射–协议 file:

要点:

  • 1.新建一个配置类,实现WebMvcConfigurer接口;
  • 2.addResourceHandlers方法,本地文件协议 file:

在这里插入图片描述
本地文件协议,/** 表示子目录也可以找到

在这里插入图片描述

网页访问本地图片

在这里插入图片描述

在这里插入图片描述

springMvcConfig.java文件

package com.tianju.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * springMvc的配置类,spring的相关配置都在这里
 * 要点:
 * 1.是配置类;@Configuration
 * 2.是springMvc的配置类:implements WebMvcConfigurer
 */
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {

    /**
     * 能够把服务器上的一个目录,映射成一个路径,http可以直接访问到
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 在浏览器上,如果访问/bookImg/1.jpg,springMvc就去D:\620\1.jpg找对应的文件
        // /bookimg/** 表示子目录下的文件也能找到
        registry.addResourceHandler("/bookimg/**")
                .addResourceLocations("file:D:\\620\\");
    }
}

4.上传文件的路径放到spring的配置文件中,获取@Value(“${imgLocation}”)

要点:

  • 在application.yml文件中配置;
  • 通过@Value("${imgLocation}"拿到;

在这里插入图片描述

application.yml文件

server:
  port: 80

## 图片上传的路径
imgLocation: D:\\620\\

其他文件获取:

package com.tianju.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * springMvc的配置类,spring的相关配置都在这里
 * 要点:
 * 1.是配置类;@Configuration
 * 2.是springMvc的配置类:implements WebMvcConfigurer
 */
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
    @Value("${imgLocation}")
    private String imgLocation;

    /**
     * 能够把服务器上的一个目录,映射成一个路径,http可以直接访问到
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 在浏览器上,如果访问/bookImg/1.jpg,springMvc就去D:\620\1.jpg找对应的文件
        // /bookimg/** 表示子目录下的文件也能找到
        registry.addResourceHandler("/bookimg/**")
                .addResourceLocations("file:"+imgLocation);
    }
}


总结

1.Model View Controller 模型视图控制器;
2.idea建springWeb项目,普通项目,继承一个父,主启动类@SpringBootApplication,application.yml配置文件;
3.浏览器请求@RequestMapping(“/demo”),可以在类上,方法上,一二级目录;
4.请求传参@RequestParam(value = “pageNum”,defaultValue = “1”),可以用在分页上;
5.请求:查询xxx/search/手机/白色,@RequestMapping(“/search/{item}/{color}”)----@PathVariable(“item”);
6.请求:获取request,参数加上HttpServletRequest request;
7.服务器响应,响应页面,响应json,自己处理;
8.响应JSON,@ResponseBody,时间格式,@JsonFormat(pattern = “yyyy-MM-DD hh:mm:ss”, timezone = “GMT+8”);
9.响应页面:返回值为string,不能加@ResponseBody;
10.响应页面带点数据:ModelAndView 且共享数据[[${usename}]];
11.上传文件MultipartFile接收,分段post提交:enctype=“multipart/form-data”;
12.静态资源映射:springMvcConfig 配置类@Configuration,实现接口WebMvcConfigurer,addResourceHandlers方法,本地文件协议file:/ ;
13.拿到application.yml文件中的值,用@Value(" $ {imgLocation}" ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分享】PowerPoint可以设置哪些密码保护?

想要给PPT设置密码保护&#xff1f;那我们来看看PowerPoint自带哪些密码功能。 PowerPoint可以设置两种密码保护&#xff0c;分别是“打开密码”和“限制密码”。 【打开密码】 PowerPoint设置“打开密码”后&#xff0c;就无法随意打开文件&#xff0c;需要输入正确密码才可…

4.地址转换,实现101012分页

实现内存检测&#xff0c;理解Linux内存管理&#xff0c;实现101012分页 参考&#xff1a; 检测内存容量 趣谈 Linux 操作系统 内存管理 《操作系统真相还原》 1.内存检测 BIOS 中断 0x15 的子功能够获取0xE820 能够获取系统的内存布局&#xff0c;由于系统内存各部分的类型属…

什么是版本控制系统?怎么学习? - 易智编译EaseEditing

版本控制系统&#xff08;Version Control System&#xff0c;简称VCS&#xff09;是一种用于管理和跟踪文件版本的工具或系统。它可以追踪文件的变更历史&#xff0c;记录每个版本的修改内容&#xff0c;以及支持多人协作开发。 学习版本控制系统可以帮助你更好地管理和控制你…

HTTPS加密:保障网站安全的重要手段

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是HTTPS加密&a…

由于找不到d3dx9_42.dll,无法继续执行代码怎么修复,这三个修复方法可以解决

是不是遇到过在打开软件或者游戏的时候&#xff0c;电脑提示“由于找不到d3dx9_42.dll,无法继续执行代码”&#xff0c;无法正常启动游戏程序&#xff0c;d3dx9_42.dll是一个DirectX相关的动态链接库文件&#xff0c;它是DirectX 9中的一个组件。DirectX是微软公司开发的一个多…

TC8:SOMEIP_ETS_001-003

SOMEIP_ETS_001: Array_Length_longer_as_message_length_allows_it 目的 当Tester发送的SOME/IP消息中,payload数据是序列化的数组时,数组的Length字段值比SOME/IP Length字段允许的要大时,DUT回复SOME/IP Error消息 如果DUT忽略SOME/IP Request消息,这条测试也是Pass的,…

Sentieon | 每周文献-Genetic Disease-第二期

遗传病系列文章-1 标题&#xff08;英文&#xff09;&#xff1a;Answer ALS, a large-scale resource for sporadic and familial ALS combining clinical and multi-omics data from induced pluripotent cell lines标题&#xff08;中文&#xff09;&#xff1a;Answer ALS&…

业务数据又多又杂,该如何高效开展数据治理?

某集团目前有近百套系统&#xff0c;数据分散在各个系统内&#xff0c;且业务范围广泛&#xff0c;数据来源复杂&#xff0c;随着集团业务系统的建设和推广应用&#xff0c;数据质量不高、数据标准不一、数据难以互通共享融合、系统之间存在数据壁垒等问题逐渐显现&#xff0c;…

Selenium教程__单选框和复选框的选中状态判定以及元素是否可用和可见判定(10)

简单写个单选框和复选框界面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>test</title></head><body bgcolor"burlywood"><form><input type"radio" name"sex&…

Vulnhub项目:Aragog

1、靶机地址&#xff1a; HarryPotter: Aragog (1.0.2) ~ VulnHub 死亡圣器三部曲之第一部&#xff0c;Aragog是海格养的蜘蛛的名字&#xff0c; 并且又牵扯到了密室 2、渗透过程 确定靶机ip&#xff0c;攻击机ip&#xff0c;扫描靶机开放端口 只有22&#xff0c;80端口&a…

盖雅工场荣膺第二届山东人力资源服务创新大赛信息科技创新赛道一等奖

6月20日&#xff0c;第二届山东人力资源服务创新大赛决赛落下帷幕。经过激烈角逐&#xff0c;盖雅工场脱颖而出&#xff0c;荣膺信息科技创新赛道一等奖。 关于第二届山东人力资源服务创新大赛 第二届山东人力资源服务创新大赛是由山东省人力资源和社会保障厅、威海市人民政府…

SpringCloud Alibaba入门之创建多模块工程

一、创建父项目 创建一个父Maven项目&#xff0c;项目命名为myshop,用于管理子模块。 创建项目后&#xff0c;删除src和增加pom设置 二、创建子module 右键父项目&#xff0c;新建module 此我们的子module就创建完成了。接下来如法炮制&#xff0c;创建另外几个子module&…

快速定位jar冲突插件-maven-dependency-helper

于jar冲突&#xff0c;例如在某一项目A中引入了其他项目B的jar&#xff0c;而2个项目用的mybati版本不一致&#xff0c;则导致jar冲突 例如:B项目用mybatis 3.3.2 this.count() 返回值为integer 而 A项目用版本3.5.1中返回值为Long A项目引入B后&#xff0c;部分代码报错:返回值…

使用哪些频率是不需要取得许可的呢?

无线电频率的使用&#xff0c;你知道哪些不需要许可吗&#xff1f;近日&#xff0c;有关无线电频率的知识又成为了网络热议的话题。你是否也对此感到好奇呢&#xff1f; 首先&#xff0c;我们需要了解一些基础知识。无线电频率是电磁频谱的一部分&#xff0c;大多数人都熟悉AM…

Python学习—装饰器的力量

Python学习—装饰器的力量 作为许多语言都存在的高级语法之一&#xff0c;装饰器是你必须掌握的知识点。 Python的装饰器&#xff08;Decorator&#xff09;允许你扩展和修改可调用对象&#xff08;函数、方法和类&#xff09;的行为&#xff0c;而无需永久修改可调用的对象本身…

买无线耳机什么牌子好?七款好用的无线蓝牙耳机盘点

随着科技的不断进步&#xff0c;蓝牙耳机已经成为了现代生活中不可或缺的伴侣。它们不仅给我们带来了便捷的无线音频体验&#xff0c;还赋予了我们自由移动的能力&#xff0c;让我们可以随时随地沉浸在音乐的海洋中。然而&#xff0c;市场上蓝牙耳机品牌众多、型号繁多&#xf…

win10 安装 langchain-chatglm 避坑指南(2023年6月21日最新版本)

官网看起来安装很简单&#xff0c;网上教程也是&#xff0c;但实际上我耗费了两天时间&#xff0c;查阅了当前网络上所有可查阅的资料&#xff0c;重复「安装-配置-卸载」十几遍&#xff0c;总结出的安装方法。 1、安装Anaconda&#xff08;这个就不啰嗦了&#xff0c;网上安装…

SpringBoot 一个注解,搞定业务操作日志记录

需求描述与分析 客户侧提出需求很简单&#xff1a;要对几个关键的业务功能进行操作日志记录&#xff0c;即什么人在什么时间操作了哪个功能&#xff0c;操作前的数据报文是什么、操作后的数据报文是什么&#xff0c;必要的时候可以一键回退。 日志在业务系统中是必不可少的一…

父类与子类的上下类型转换

文章目录 前言一、上下类型转换是什么&#xff1f;二、使用方法 1.父类与子类的转换2.instanceof关键字总结 前言 动物有共性的行为&#xff0c;例如吃。狗属于动物中的一类&#xff0c;对于“吃"这种行为&#xff0c;又有自己独特的见解&#xff0c;“吃狗粮”。当我们把…

STM32--基于固件库(Library Faction)的流水灯、静态数码管

目录 一、GPIO介绍 二、基于固件库&#xff08;Library Faction&#xff09;的流水灯 三、基于固件库&#xff08;Library Faction&#xff09;的静态数码管 一、GPIO介绍 GPIO库函数&#xff0c;对GPIO可进行一些&#xff0c;读写控制的操作&#xff0c;本文章应用的就是…