Spring Boot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递 文件上传)

SpringBoot的web开发

静态资源映射规则

总结:只要静态资源放在类路径下:

called /static (or /public or /resources or //METAINF/resources

一启动服务器就能访问到静态资源文件

springboot只需要将图片放在 static 下 就可以被访问到了

总结:

只要静态资源放在类路径下: called /static (or INF/resources

访问:当前项目根路径/ + 静态资源名

静态资源访问前缀

spring:
  mvc:
    static-path-pattern: static/test/**


enjoy模板引擎

四个步骤:

1.加坐标

<dependency>
    <groupId>com.jfinal</groupId>
    <artifactId>enjoy</artifactId>
    <version>5.0.3</version>
</dependency>

2.开启配置

在configure包下新建配置类  官网可以复制https://gitee.com/jfinal/enjoy

package com.stringzhua.springboot_web_demo01.config;


import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBootConfig {

    @Bean(name = "jfinalViewResolver")
    public JFinalViewResolver getJFinalViewResolver() {

        // 创建用于整合 spring boot 的 ViewResolver 扩展对象
        JFinalViewResolver jfr = new JFinalViewResolver();

        // 对 spring boot 进行配置
        jfr.setSuffix(".html");
        jfr.setContentType("text/html;charset=UTF-8");
        jfr.setOrder(0);

        // 设置在模板中可通过 #(session.value) 访问 session 中的数据
        jfr.setSessionInView(true);

        // 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样
        Engine engine  = JFinalViewResolver.engine;

        // 热加载配置能对后续配置产生影响,需要放在最前面
        engine.setDevMode(true);

        // 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件
        engine.setToClassPathSourceFactory();

        // 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath
        // 代替 jfr.setPrefix("/view/")
        engine.setBaseTemplatePath("/templates/");


        // 更多配置与前面章节完全一样
        // engine.addDirective(...)
        // engine.addSharedMethod(...);

        return jfr;
    }
}

3.将页面保存在templates目录下

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
    <h1>测试测试测试</h1>
    <img src="http://localhost:8080/lb1.jpg"/>
</body>
</html>

4.编写代码逻辑

package com.stringzhua.springboot_web_demo01.controller;

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

/**
 * @Author Stringzhua
 * @Date 2024/9/18 12:05
 * description:
 */
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
    /**
     * @RequestMapping 意义:处理用户的请求,相似于doget与dopost
     * 位置:
     * 类上:一级目录
     * 方法:二级目录
     * 例如:user/save
     * user/delete
     * student/save
     * student/delete
     * 属性:
     * value = "",path = "" value等同于path,只有它时可省略
     * 表示请求路径
     * =========================
     * method=常量,此请求的类型(get,post),若不设置则此请求适配所有的请求方式
     * =========================
     * params = ""
     * 限制请求参数,例如:params={"msg1","msg2"}表示请求路径中必须携带参数名为msg1与msg2的参数
     * 注意:1.超链接默认发送的是get请求
     * 2.所有请求所携带的参数格式均为:key = value
     * @DeleteMapping 删除
     * @PutMapping 修改
     * @GetMapping 查询
     * @PostMapping 新增
     * @RequestMapping 可以点击查看源码
     * @Target({ElementType.METHOD,ElementType.TYPE}) METHOD==代表修饰方法,TYPE==代表修饰类
     */
    @RequestMapping(value = "/init")//二级目录
    public String init() {
        System.out.println("==========进入了springMVC的控制器=========");
        System.out.println("返回业务层,调用持久层");
        return "success";//返回方法执行完要跳转的页面名称
    }
}

加坐标 写配置类

在templates 下有success.html

不加 responsebody

测试:

SpringMVC

1.请求处理

2.参数绑定

3.常用注解

4.数据传递

5.文件上传

SpringMVC-请求处理

@RequestMapping

  • 意义:处理用户的请求,相似于doget与dopost
  • 位置:
    • 类上:一级目录
    • 方法:二级目录

例如:

  • user/save
  • user/delete
  • student/save
  • student/delete

属性:

  • value = “”,path = “” 表示请求路径
  • method=常量,此请求的类型(get,post),若不设置则此请求适配所有的请求方式
  • params = ""限制请求参数,
    • 例如:params={“msg1”,“msg2”}表示请求路径中必须携带参数名为msg1与msg2的参数

注意:

  1. 超链接默认发送的是get请求
  2. 所有请求所携带的参数格式均为:key = value

还有这些请求

  • @GetMapping   查询
  • @PostMapping  新增
  • @PutMapping   修改
  • @DeleteMapping 删除

@RequestMapping可以点击查看源码

@Target({ElementType.METHOD, ElementType.TYPE})

METHOD代表修饰方法,TYPE代表修饰类

浏览器默认 get请求

post 跳转不了

测试:

demo01.postman_collection.json

准备工作:下载postman

官网:https://www.postman.com/

1.下载postman使用postman测试

2.新建文件夹,新建测试:使用上面的success.html作为返回页面

Get方式请求:

 @RequestMapping(value = "/init")//二级目录
public String init() {
    System.out.println("==========进入了springMVC的控制器=========");
    System.out.println("返回业务层,调用持久层");
    return "success";//返回方法执行完要跳转的页面名称
}

Post方式请求

package com.stringzhua.springboot_web_demo01.controller;

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

/**
 * @Author Stringzhua
 * @Date 2024/9/18 12:05
 * description:
 */
@Controller
@RequestMapping("/user")//一级目录
public class UserController {
    /**
     * @RequestMapping 意义:处理用户的请求,相似于doget与dopost
     * 位置:
     * 类上:一级目录
     * 方法:二级目录
     * 例如:user/save
     * user/delete
     * student/save
     * student/delete
     * 属性:
     * value = "",path = "" value等同于path,只有它时可省略
     * 表示请求路径
     * =========================
     * method=常量,此请求的类型(get,post),若不设置则此请求适配所有的请求方式
     * =========================
     * params = ""
     * 限制请求参数,例如:params={"msg1","msg2"}表示请求路径中必须携带参数名为msg1与msg2的参数
     * 注意:1.超链接默认发送的是get请求
     * 2.所有请求所携带的参数格式均为:key = value
     * @DeleteMapping 删除
     * @PutMapping 修改
     * @GetMapping 查询
     * @PostMapping 新增
     * @RequestMapping 可以点击查看源码
     * @Target({ElementType.METHOD,ElementType.TYPE}) METHOD==代表修饰方法,TYPE==代表修饰类
     */
    @RequestMapping(value = "/show1", method = {RequestMethod.POST})
    public String show1() {
        System.out.println("==========进入了springMVC的控制器=========");
        System.out.println("使用post方式发送请求访问show1");
        return "success";
    }
}

限制请求携带的参数

@RequestMapping(value = "/show2", params = {"param1=aa", "param2=bb"})
public String show2() {
    System.out.println("==========进入了springMVC的控制器=========");
    return "success";
}

@GetMapping

//postman测试
@GetMapping("/show3")
public String show3() {
    System.out.println("==========进入了springMVC的控制器=========");
    System.out.println("必须使用get方式请求[默认]查询");
    return "success";
}

@PostMapping

 @PostMapping("/show4")
public String show4() {
    System.out.println("==========进入了springMVC的控制器=========");
    System.out.println("必须使用post方式请求新增");
    return "success";
}

@DeleteMapping

@DeleteMapping("/show5")
public String show5() {
    System.out.println("==========进入了springMVC的控制器=========");
    System.out.println("必须使用delete方式请求删除");
    return "success";
}

@PutMapping

@PutMapping("/show6")
public String show6() {
    System.out.println("==========进入了springMVC的控制器=========");
    System.out.println("必须使用put方式请求修改");
    return "success";
}

SpringMVC-参数绑定

springMVC请求参数的绑定

绑定的机制:SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的

支持数据类型:

1.基本类型参数:

           包括基本类型和 String 类型

2.POJO类型参数:

            包括实体类,以及关联的实体类

3.数组和集合类型参数:

            包括 List 结构和 Map 结构的集合(包括数组)

4.使用 ServletAPI 对象作为方法参数

     HttpServletRequest

     HttpServletResponse

     HttpSession

     java.security.Principal

     Locale

     InputStream

     OutputStream

     Reader

     Writer

使用要求

  1. 发送请求中携带数据的key与方法参数的name必须一致
  2. 数据类型合法

测试项目准备:

controller层OneController的完整代码:

package com.stringzhua.springboot_web_demo02.controller;

/**
 * @Author Stringzhua
 * @Date 2024/9/18 16:27
 * description:
 */

import com.stringzhua.springboot_web_demo02.pojo.Dep;
import com.stringzhua.springboot_web_demo02.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * springMVC请求参数的绑定
 * 绑定的机制:SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的
 *
 * 一.支持数据类型:
 *      1.基本类型参数:
 *                  包括基本类型和 String 类型
 *      2.POJO类型参数:
 *                  包括实体类,以及关联的实体类
 *      3.数组和集合类型参数:
 *                  包括 List 结构和 Map 结构的集合(包括数组)
 *      4.使用 ServletAPI 对象作为方法参数
 *          HttpServletRequest
 *          HttpServletResponse
 *          HttpSession
 *          java.security.Principal
 *          Locale
 *          InputStream
 *          OutputStream
 *          Reader
 *          Writer
 *
 *  二.使用要求
 *     1.发送请求中携带数据的key与方法参数的name必须一致
 *     2.数据类型合法
 *
 * */
@Controller
@RequestMapping("/one")
public class OneController {
    //打开one的html页面
    @RequestMapping("/show")
    public String show(){
        return "one";
    }
    /***********************基本类型和 String 类型作为参数*********************************/
    @RequestMapping("/show1")
    public String show1(String msg1){
        System.out.println("接收到用户发送的数据为:" + msg1);
        return "success";
    }

    @RequestMapping("/show2")
    public String show2(String msg1,int msg2){
        System.out.println("接收到用户发送的数据为:" + msg1);
        System.out.println("接收到用户发送的数据为:" + msg2);
        return "success";
    }

    /***********************POJO 类型作为参数*********************************/
    //单一对象
    @RequestMapping("/show3")
    public String show3(Emp emp){
        System.out.println("接收到用户发送的数据为:" + emp);
        return "success";
    }
    //对象嵌套
    @RequestMapping("/show4")
    public String show4(Emp emp){
        System.out.println("接收到用户发送的数据为:" + emp);
        return "success";
    }

    //数组、map集合[list集合不行]
    @RequestMapping("/map")
    public String map(@RequestParam Map map){
        System.out.println(map);
        return "success";
    }

    /***********************POJO 类型中包含集合类型的参数*********************************/
    @RequestMapping("/show5")
    public String show5(Dep dep){
        System.out.println("接受到用户发送数据为" + dep);
        return "success";
    }

    @RequestMapping("/show6")
    public String show6(int[] nums){
        System.out.println("接受到用户发送数据为" + Arrays.toString(nums));
        return "success";
    }
    /*********************使用 ServletAPI 对象作为方法参数*********************************/
    @RequestMapping("/show7")
    public String show7(HttpServletRequest request, HttpServletResponse response){
//        request.setCharacterEncoding("UTF-8");
//        response.setCharacterEncoding("UTF-8");
        System.out.println(request);
        System.out.println(response);
        request.getParameter("msg1");

        HttpSession session =     request.getSession();
        System.out.println(session);
        session.setAttribute("","");

//        try {
//            response.sendRedirect("重定向");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        ServletContext applaction =  session.getServletContext();

        return "success";
    }
}

pojo下创建俩实体类:

Dep.java

package com.stringzhua.springboot_web_demo02.pojo;

import java.util.List;
import java.util.Map;

/**
 * @Author Stringzhua
 * @Date 2024/9/18 16:38
 * description:
 */
public class Dep {
    private int did;
    private String dname;

    //依赖员工集合
    private List<Emp> mylist;
    private Map<String, Emp> myMap;

    @Override
    public String toString() {
        return "Dep{" +
                "did=" + did +
                ", dname='" + dname + '\'' +
                ", mylist=" + mylist +
                ", myMap=" + myMap +
                '}';
    }

    public int getDid() {
        return did;
    }

    public void setDid(int did) {
        this.did = did;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public List<Emp> getMylist() {
        return mylist;
    }

    public void setMylist(List<Emp> mylist) {
        this.mylist = mylist;
    }

    public Map<String, Emp> getMyMap() {
        return myMap;
    }

    public void setMyMap(Map<String, Emp> myMap) {
        this.myMap = myMap;
    }
}

Emp.java

package com.stringzhua.springboot_web_demo02.pojo;

/**
 * @Author Stringzhua
 * @Date 2024/9/18 16:37
 * description:
 */
public class Emp {
    private int eid;
    private String ename;
    private String esex;


    //emp依赖的dep对象
    private Dep dept;

    @Override
    public String toString() {
        return "Emp{" +
                "eid=" + eid +
                ", ename='" + ename + '\'' +
                ", esex='" + esex + '\'' +
                ", dept=" + dept +
                '}';
    }

    public int getEid() {
        return eid;
    }

    public void setEid(int eid) {
        this.eid = eid;
    }

    public String getEname() {
        return ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getEsex() {
        return esex;
    }

    public void setEsex(String esex) {
        this.esex = esex;
    }

    public Dep getDept() {
        return dept;
    }

    public void setDept(Dep dept) {
        this.dept = dept;
    }
}

配置类同上,templates下创建两个页面

one.html

<!DOCTYPE html>
<html lang="cn" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Title</title>
</head>
<body>

    <h1>springMVC控制器方法参数作用:接受用户请求中的数据</h1>
    <hr/>

    <h3>基本类型和 String 类型作为参数</h3>
    <a href="/one/show1?msg1=9527">发送请求1</a>
    <a href="/one/show2?msg1=jdk&msg2=9527">发送请求2</a>

    <h3>POJO 类型作为参数</h3>
    <a href="/one/show3?eid=1&ename=郭凡&esex=小奶狗">发送请求3</a>

    <form action="/one/show4" method="post">
        员工编号:<input type="text" name="eid" ><br/>
        员工姓名:<input type="text" name="ename" ><br/>
        员工性别:<input type="text" name="esex" ><br/>
        部门编号:<input type="text" name="dept.did" ><br/>
        部门名称:<input type="text" name="dept.dname" ><br/>
        <input type="submit" value="发送请求4"/>
    </form>

    <form action="/one/map" method="post">
        员工编号:<input type="text" name="eids"><br/>
        员工姓名:<input type="text" name="enames"><br/>
        员工性别:<input type="text" name="esexs"><br/>
        <input type="submit" value="发送请求4(map)"/>
    </form>


    <h3>POJO 类中包含集合类型参数</h3>
    <form action="/one/show5" method="post">
        部门编号:<input type="text" name="did" ><br/>
        部门名称:<input type="text" name="dname" ><br/>
        员工编号1:<input type="text" name="mylist[0].eid" ><br/>
        员工姓名1:<input type="text" name="mylist[0].ename" ><br/>
        员工性别1:<input type="text" name="mylist[0].esex" ><br/>
        员工编号2:<input type="text" name="mylist[1].eid" ><br/>
        员工姓名2:<input type="text" name="mylist[1].ename" ><br/>
        员工性别2:<input type="text" name="mylist[1].esex" ><br/>

        员工编号3:<input type="text" name="myMap['one'].eid" ><br/>
        员工姓名3:<input type="text" name="myMap['one'].ename" ><br/>
        员工性别3:<input type="text" name="myMap['one'].esex" ><br/>
        员工编号4:<input type="text" name="myMap['two'].eid" ><br/>
        员工姓名4:<input type="text" name="myMap['two'].ename" ><br/>
        员工性别4:<input type="text" name="myMap['two'].esex" ><br/>
        <input type="submit" value="发送请求5"/>
    </form>

    <a href="/one/show6?nums=123&nums=456&nums=789">发送请求6</a>

    <h3>使用 ServletAPI 对象作为方法参数</h3>
    <a href="/one/show7">发送请求7</a>

</body>
</html>

success.html

<!DOCTYPE html>
<head>
    <meta charset="UTF-8">
    <title>success</title>
</head>
<body>
    <h1>spring成功页面</h1>
</body>
</html>

基本类型和 String 类型作为参数

OneController

单个参数

package com.stringzhua.springboot_web_demo02.controller;

/**
 * @Author Stringzhua
 * @Date 2024/9/18 16:27
 * description:
 */

import com.stringzhua.springboot_web_demo02.pojo.Dep;
import com.stringzhua.springboot_web_demo02.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * springMVC请求参数的绑定
 * 绑定的机制:SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的
 *
 * 一.支持数据类型:
 *      1.基本类型参数:
 *                  包括基本类型和 String 类型
 *      2.POJO类型参数:
 *                  包括实体类,以及关联的实体类
 *      3.数组和集合类型参数:
 *                  包括 List 结构和 Map 结构的集合(包括数组)
 *      4.使用 ServletAPI 对象作为方法参数
 *          HttpServletRequest
 *          HttpServletResponse
 *          HttpSession
 *          java.security.Principal
 *          Locale
 *          InputStream
 *          OutputStream
 *          Reader
 *          Writer
 *
 *  二.使用要求
 *     1.发送请求中携带数据的key与方法参数的name必须一致
 *     2.数据类型合法
 *
 * */
@Controller
@RequestMapping("/one")
public class OneController {
    //打开one的html页面
    @RequestMapping("/show")
    public String show(){
        return "one";
    }
    /***********************基本类型和 String 类型作为参数*********************************/
    @RequestMapping("/show1")
    public String show1(String msg1){
        System.out.println("接收到用户发送的数据为:" + msg1);
        return "success";
    }
}

访问http://localhost:8080/one/show

进入主页面,点击发送请求1


多个参数

@RequestMapping("/show2")
    public String show2(String msg1,int msg2){
        System.out.println("接收到用户发送的数据为:" + msg1);
        System.out.println("接收到用户发送的数据为:" + msg2);
        return "success";
    }

进入主页面,点击发送请求2:

POJO类型作为参数

单一对象

 /***********************POJO 类型作为参数*********************************/
    //单一对象
    @RequestMapping("/show3")
    public String show3(Emp emp){
        System.out.println("接收到用户发送的数据为:" + emp);
        return "success";
    }

进入主页面,点击发送请求3:


对象嵌套

//对象嵌套
    @RequestMapping("/show4")
    public String show4(Emp emp){
        System.out.println("接收到用户发送的数据为:" + emp);
        return "success";
    }

进入主页面,填写表单,点击发送请求4:


@RequestParam

//数组、map集合[list集合不行]
    @RequestMapping("/map")
    public String map(@RequestParam Map map){
        System.out.println(map);
        return "success";
    }

进入主界面,填写表单,点击发送请求4(map)

POJO 类中包含集合类型参数

/***********************POJO 类型中包含集合类型的参数*********************************/
    @RequestMapping("/show5")
    public String show5(Dep dep){
        System.out.println("接受到用户发送数据为" + dep);
        return "success";
    }

进入主页面,填写表单,点击发送请求5:


@RequestMapping("/show6")
    public String show6(int[] nums){
        System.out.println("接受到用户发送数据为" + Arrays.toString(nums));
        return "success";
    }

使用 ServletAPI 对象作为方法参数

/*********************使用 ServletAPI 对象作为方法参数*********************************/
    @RequestMapping("/show7")
    public String show7(HttpServletRequest request, HttpServletResponse response){
//        request.setCharacterEncoding("UTF-8");
//        response.setCharacterEncoding("UTF-8");
        System.out.println(request);
        System.out.println(response);
        request.getParameter("msg1");

        HttpSession session =     request.getSession();
        System.out.println(session);
        session.setAttribute("","");

//        try {
//            response.sendRedirect("重定向");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        ServletContext applaction =  session.getServletContext();

        return "success";
    }

SpringMVC-常用注解

@RequestParam

作用:

  • 把请求中指定名称的参数给控制器中的形参赋值。
  • 如果页面标签名称和方法参数名称不一致,可以使用此注解实现

属性:

  • name属性:设置参数名称
  • defaultValue属性:设置默认值
  • required属性:设置是否为必传

测试:

项目结构:

name属性

单个参数

package com.stringzhua.springboot_web_demo03.controller;

/**
 * @Author Stringzhua
 * @Date 2024/9/18 22:49
 * description:
 */

import com.stringzhua.springboot_web_demo03.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * springMVC常用注解
 *
 * 一.@RequestParam
 *      作用:
 *          把请求中指定名称的参数给控制器中的形参赋值。
 *          如果页面标签名称和方法参数名称不一致,可以使用此注解实现
 *      属性:
 *          name属性:设置参数名称
 *          defaultValue属性:设置默认值
 *          required属性:设置是否为必传
 *
 * 二.@RequestBody json
 *      作用:
 *          用于获取"请求体"内容。直接使用得到是 key=value&key=value...
 *          结构的数据,并可以转换为对象
 *      属性:
 *          required:是否必须有请求体。默认值是:true。
 *
 *
 *
 * 三.@PathVaribale
 *      作用:
 *          用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},
 *          这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之
 *          后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志
 *      属性:
 *          value:用于指定 url 中占位符名称。
 *          required:是否必须提供占位符。
 *
 *  Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。
 *  主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,
 *  更易于实现缓存机制等。
 *
 *  Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
 *       GET:用于获取资源
 *       POST:用于新建资源
 *       PUT:用于更新资源
 *       DELETE:用于删除资源
 * 例如:
 *  /users/1                GET :      得到 id = 1 的 user
 *  /users/1                DELETE:    删除 id = 1 的 user
 *  /users/1/新名/新性       PUT:       更新 id = 1 的 user
 *  /users/新名/新性         POST:      新增 user
 *
 * */
@Controller
@RequestMapping("/one")
public class OneController {
    @RequestMapping("/show1")
    public String show1(@RequestParam(name = "msg1") String msg){
        System.out.println("接收到用户发送数据为" + msg);
        return "success";
    }
}

使用postman测试:

es.postman_collection.json


多个参数

@RequestMapping("/show2")
public String show2(@RequestParam("msg1") String msg,@RequestParam("msg2") String num){
    System.out.println("接收到用户发送数据为" + msg);
    System.out.println("接收到用户发送数据为" + num);
    return "success";
}


defaultValue属性:设置默认值

@RequestMapping("/show3")
public String show3(@RequestParam(name = "uname",defaultValue = "暂无用户") String name){
    System.out.println("用户名"+name);
    return "success";
}

如果不传参数,测试:

@RequestBody

作用:

  • 用于获取"请求体"内容。直接使用得到是 key=value&key=value…
  • 结构的数据,并可以转换为对象

属性:

  • required:是否必须有请求体。默认值是:true。

测试:

/**
     * 前后端分离
     * @RequestBody可以将json ===》 javaBean
     * 注意:
     *  1.前端不能使用GET方式提交数据,GET方式无请求体
     * {
     * 	"eid":007,
     * 	"ename":"詹姆斯邦德",
     * 	"esex":"绅士"
     * }
     *
     * * */
    //RequestBody注解解析json字符串,要求json字段直接使用得到key=value&
    @RequestMapping("/show4")
    public String show4(@RequestBody Emp emp){
        System.out.println(emp);
        return "success";
    }

@PathVariable

作用:

  • 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},
  • 这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的,是 springmvc 支持 rest 风格 URL 的一个重要标志

属性:

value:用于指定 url 中占位符名称。

required:是否必须提供占位符。

测试:

@RequestMapping("/show5/{uname}/{pwd}")
public String show5(@PathVariable("uname")String msg1,@PathVariable("pwd")String msg2){
    System.out.println(msg1);
    System.out.println(msg2);
    return "success";
}

当参数名和字段名相同时,省略@PathVariable()括号中的内容,进行简写

@RequestMapping("/show6/{uname}/{pwd}")
public String show6(@PathVariable String uname,@PathVariable String pwd){
    System.out.println(uname);
    System.out.println(pwd);
    return "success";
}

restFul

Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。

主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次,

更易于实现缓存机制等。

Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:

  •  GET:用于获取资源
  •  POST:用于新建资源
  •  PUT:用于更新资源
  •  DELETE:用于删除资源

例如:

  •  /users/1                GET :      得到 id = 1 的 user
  •  /users/1                DELETE:    删除 id = 1 的 user
  •  /users/1/新名/新性       PUT:       更新 id = 1 的 user
  •  /users/新名/新性         POST:      新增 user

@RequestHeader

**作用:**用于获取请求消息头。

属性:

value:提供消息头名称

required:是否必须有此消息头

测试:

package com.stringzhua.springboot_web_demo03.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @Author Stringzhua
 * @Date 2024/9/19 10:38
 * description:
 */
/**
 *
 * springMVC常用注解
 *
 * 四.@RequestHeader
 *      作用:
 *          用于获取请求消息头。
 *      属性:
 *          value:提供消息头名称
 *          required:是否必须有此消息头
 * 五.@CookieValue
 *      作用:
 *          用于把指定 cookie 名称的值传入控制器方法参数。
 *      属性:
 *          value:指定 cookie 的名称。
 *          required:是否必须有此 cookie。
 *
 * */
@Controller
@RequestMapping("/two")
public class TwoController {
    /**
     * 获取头信息
     * @param msg
     * @return
     */
    @RequestMapping("/show1")
    public String show1(@RequestHeader(value = "msg1") String msg){
        System.out.println(msg);
        return "success";
    }
}

@CookieValue

**作用:**用于把指定 cookie 名称的值传入控制器方法参数。

属性:

value:指定 cookie 的名称。

required:是否必须有此 cookie

测试:

/**
 * 获取cookie
 */
@RequestMapping("/show2")
public String show2(@CookieValue(value = "JSESSIONID",required = false)String jsonid){
    System.out.println(jsonid);
    return "success";
}

SpringMVC-数据传递

准备工作:

index.html

<!DOCTYPE html>
<html lang="cn">
<head>
    <title>Title</title>
</head>
<body>
    <h3>springMVC控制器返回字符串</h3>
    <a href="/string/show1">发送请求1</a><br/>
    <a href="/string/show2">发送请求2</a><br/>
    <a href="/string/show3">发送请求3</a><br/>
    <a href="/string/show4">发送请求4</a><br/>
    <hr/>
    <h3>springMVC控制器返回json字符串</h3>
    <a href="/json/show1">发送请求1</a><br/>
    <a href="/json/show2">发送请求2</a><br/>
</body>
</html>

success_String.html

注意 测试发送请求123时,将span标签删掉 要不然会报错

<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>返回值String成功页面</h1>
<!--        <span>#(session.emp.eid)</span>-->
<!--        <span>#(session.emp.ename)</span>-->
<!--        <span>#(session.emp.esex)</span><br/>-->
</body>
</html>

主页面

字符串


充当视图的逻辑名称,默认页面跳转为请求转发方式

package com.stringzhua.springboot_web_demo04.controller;

import com.stringzhua.springboot_web_demo04.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author Stringzhua
 * @Date 2024/9/19 11:20
 * description:
 */
@Controller
@RequestMapping("/string")
public class StringController {
    /**
     * 进入首页
     */
    @RequestMapping("/show")
    public String show() {
        return "index";
    }

    //请求转发
    //充当试图的逻辑名称,默认页面跳转为请求转发方式
    @RequestMapping("/show1")
    public String show1() {
        System.out.println("===show1转发...===");
        return "success_String";
    }
}


充当一次请求重定向

//作充当一次请求重定向,url地址改变,显示的页面改变
// http://localhost:8080/string/show1
@RequestMapping("/show2")
public String show2() {
    System.out.println("===show2重定向===");
    return "redirect:show1";
}


充当一次请求转发

//作充当一次请求转发,url地址不变,但显示的页面改变
    // http://localhost:8080/string/show3
    @RequestMapping("/show3")
    public String show3() {
        System.out.println("===show3转发===");
        return "forward:show1";
    }


通过session传入数据.

先修改下页面:

//ServletAPI
    @RequestMapping("/show4")
    public String show4(HttpServletRequest request) {
        System.out.println("===show4===");
        //模拟查询数据库
        Emp emp = new Emp(1, "猫猫头", "男");
        //设置session
        request.getSession().setAttribute("emp", emp);
        return "success_String";
    }


JSON

package com.stringzhua.springboot_web_demo04.controller;

import com.stringzhua.springboot_web_demo04.pojo.Emp;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author Stringzhua
 * @Date 2024/9/19 11:59
 * description:
 */

/**
 * @ResponseBody 对象====>json
 * 位置:1.类
 * 2.方法
 * @RequestBody json====>对象
 * 位置:方法参数
 * @RestController =  @Controller  +  @ResponseBody
 */
//@Controller
//@ResponseBody
@RestController
@RequestMapping("/json")
public class JsonController {
    @RequestMapping("/show1")
    @ResponseBody
    public List<Emp> show1() {
        List<Emp> list = new ArrayList<>();
        Emp emp1 = new Emp(2, "柳永", "男");
        Emp emp2 = new Emp(3, "橙橙", "男");
        Emp emp3 = new Emp(1, "李郁", "女");

        list.add(emp1);
        list.add(emp2);
        list.add(emp3);

        return list;
    }

    @RequestMapping("/show2")
    @ResponseBody//不加ResponseBody注解,就是逻辑地址的页面,加了就是json串,如果返回值是String类型不转,其他的都是json串
//    public String show2(){
//        return "特殊";
//    }
//    public int show2(){
//        return 50;
//    }
//    public Emp show2() {
//        return new Emp(1, "李郁", "女");
//    }
    public Map<String, Emp> show2() {
        HashMap<String, Emp> map = new HashMap<>();
        map.put("1", new Emp(2, "柳永", "男"));
        map.put("2", new Emp(3, "橙橙", "男"));
        map.put("3", new Emp(1, "李郁", "女"));
        return map;
    }

}

@RequestMapping("/show2")
@ResponseBody//不加ResponseBody注解,就是逻辑地址的页面,加了就是json串,如果返回值是String类型不转,其他的都是json串
public String show2(){
    return "特殊";
}

SpringMVC-文件上传

项目结构:

1.导入文件上传的坐标:

<!-- 文件上传-->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

导入前端页面:

success.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
上传成功
<span>#(session.picname)</span>
<img src="http://sk1sw9rkd.hn-bkt.clouddn.com/#(session.picname)"/>
<form action="delete" method="post" enctype="multipart/form-data">
    <button>删除</button>
</form>
</body>
</html>

upload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
<form action="fileupload" method="post" enctype="multipart/form-data">
    用户名:<input name="uname"/>
    <br>
    图片:<input name="upic" type="file"/>
    <br>
    <input type="submit" value="上传图片"/>
</form>
</body>
</html>


2.编写Controller层:

@Controller
public class OneController {
    //进入测试页面
    @RequestMapping("/show")
    public String show(){
        return  "index";
    }
    //文件上传
    @RequestMapping("/fileupload")
    public String fileload(String uname, MultipartFile upic, HttpServletRequest request){
        System.out.println("用户名"+uname);
        System.out.println(upic);
        System.out.println(upic.getOriginalFilename());
        System.out.println(upic.getName());
 
 
        return "success_File";
    }
}

一般将文件upic以流的方式写入当前服务器磁盘(应用服务器)

这里我们使用文件服务器 七牛云

重新修改为七牛云的Controller:

package com.stringzhua.springboot_web_demo05.controller;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;

/**
 * @Author Stringzhua
 * @Date 2024/9/19 14:14
 * description:
 */
@Controller
public class UploadController {
    @RequestMapping("upload")
    public String upload() {
        return "upload";
    }

    //文件上传
    @RequestMapping("/fileupload")
    public String fileupload(String uname, MultipartFile upic, HttpServletRequest request) {
        //获取文件信息
        System.out.println("用户名" + uname);
        System.out.println(upic);
        System.out.println(upic.getOriginalFilename());
        System.out.println(upic.getName());

        //将文件保存到磁盘的某处
        //方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)


        //方式2.文件服务器(七牛云)
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //生成上传凭证,准备开始上传
        String accessKey = "Farupk0sMM7VMjF3xluaFTjwUQ-DtwA1QW1LOvMH";
        String secretKey = "kdzeXaRT8uiV2KZfX1YF89vTu11wDeT2fwGqGlBu";
        String bucket = "stringzhuaworkspace";
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = null;
        String name = null;

        try {
            byte[] uploadBytes = upic.getBytes();
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);

            try {
                Response response = uploadManager.put(uploadBytes, key, upToken);
                //解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                System.out.println(putRet.key);//获取文件名
                System.out.println(putRet.hash);//获取文件hash值
                name = putRet.key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception ex) {
            //ignore
        }
        request.getSession().setAttribute("picname", name);


        return "success";
    }

    //删除文件
    @RequestMapping("delete")
    public String delete(String uname, MultipartFile upic, HttpServletRequest request) {
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.region0());
        //...其他参数参考类注释
        String accessKey = "Farupk0sMM7VMjF3xluaFTjwUQ-DtwA1QW1LOvMH";
        String secretKey = "kdzeXaRT8uiV2KZfX1YF89vTu11wDeT2fwGqGlBu";
        String bucket = "stringzhuaworkspace";
        String key = (String) request.getSession().getAttribute("picname");
        System.out.println(key);
        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, key);
        } catch (QiniuException ex) {
            //如果遇到异常,说明删除失败
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
        }

        return "upload";
    }
}

需要上传自己的密钥 并且新建一个存储空间

注意设置为公开 否则上传失败:

导入七牛云需要的坐标:

<!--        七牛云文件上传需要的坐标-->
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>qiniu-java-sdk</artifactId>
    <version>7.2.25</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.14.2</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.qiniu</groupId>
    <artifactId>happy-dns-java</artifactId>
    <version>0.1.6</version>
    <scope>test</scope>
</dependency>

启动项目,测试上传:

上传成功!

点击删除按钮,删除七牛云上的图片:

删除成功!

其他的详细操作,请查阅七牛云文档!

https://developer.qiniu.com/kodo/1650/chunked-upload

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

#Jest进阶知识:整合 webpack 综合练习

这一小节&#xff0c;我们来做一个综合的练习&#xff0c;该练习会整合&#xff1a; typescriptwebpackjest 准备工作 首先创建项目目录&#xff0c;通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发&#xff0c;因此需要安装 typescript npm i t…

可以将题库文档做成答题考试的小程序

&#x1f4a5;轻松构建个人题库&#xff0c;开启高效在线答题体验&#xff01;&#x1f4af; &#x1f389;梦想拥有个性化题库&#xff0c;随时随地进行在线练习吗&#xff1f;“土著刷题”小程序正是为此而生&#xff0c;助你实现愿望&#xff01;✨ &#x1f31f;这款小程序…

使用Netty实现一个简单的聊天服务器

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;Netty &#x1f96d;本文内容&a…

使用 Spring Boot 搭建 WebSocket 服务器实现多客户端连接

在 Web 开发中&#xff0c;WebSocket 为客户端和服务端之间提供了实时双向通信的能力。本篇博客介绍如何使用 Spring Boot 快速搭建一个 WebSocket 服务器&#xff0c;并支持多客户端的连接和消息广播。 1. WebSocket 简介 WebSocket 是 HTML5 的一种协议&#xff0c;提供了客…

PHP常量

PHP 中的常量是指一旦定义后将不能被改变的标识符。 常量可以用const和define&#xff08;&#xff09;来定义。 PHP常量的特性 不变性: 常量一旦定义&#xff0c;其值不能改变。全局作用域: 常量在定义后&#xff0c;可以在整个脚本的任何地方使用&#xff0c;无需使用 glo…

让Erupt框架支持.vue文件做自定义页面模版

Erupt是什么&#xff1f; Erupt 是一个低代码 全栈类 框架&#xff0c;它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。 零前端代码、零 CURD、自动建表&#xff0c;仅需 一个类文件 简洁的注解配置&#xff0c;快速开发企业级 Admin 管理后台。 提…

Echarts 图表根据屏幕大小自适应图表大小/标签文字大小

自适应图表大小 echarts多个图表大小随屏幕的大小改变自适应&#xff0c;Echarts 多图表自适应窗口大小&#xff0c;echarts随页面大小变化而变化&#xff1b; 但 Echarts 同一页面存在多个图表的时候&#xff0c;只有一个生效 只有一个图表的时候 直接用 window.onresize …

基于 Transformer 的语言模型

基于 Transformer 的语言模型 Transformer 是一类基于注意力机制&#xff08;Attention&#xff09;的模块化构建的神经网络结构。给定一个序列&#xff0c;Transformer 将一定数量的历史状态和当前状态同时输入&#xff0c;然后进行加权相加。对历史状态和当前状态进行“通盘…

Docker:容器编排 Docker Compose

Docker&#xff1a;容器编排 Docker Compose docker-composedocker-compose.ymlservicesimagecommandenvironmentnetworksvolumesportshealthcheckdepends_on 命令docker compose updocker compose down其它 docker-compose 多数情况下&#xff0c;一个服务需要依赖多个服务&a…

力扣633.平方数之和 c++

给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 a2 b2 c 。 示例 1&#xff1a; 输入&#xff1a;c 5 输出&#xff1a;true 解释&#xff1a;1 * 1 2 * 2 5示例 2&#xff1a; 输入&#xff1a;c 3 输出&#xff1a;false提示&…

【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)

1. 问题 在调试I2C外设的demo时&#xff0c;按照官方文档的描述调用相关API&#xff0c;烧录程序后发现程序会不断崩溃&#xff0c;系统log如下。 初步分析log&#xff0c;原因是访问到了不存在的地址。一开始我以为是自己的代码问题&#xff0c;反反复复改了几次都会出现同样的…

链表交集相关算法题|AB链表公共元素生成链表C|AB链表交集存放于A|连续子序列|相交链表求交点位置(C)

AB链表公共元素生成链表C 设A和B是两个单链表(带头节点)&#xff0c;其中元素递增有序。设计一个算法从A和B中的公共元素产生单链表C&#xff0c;要求不破坏A、B的节点 算法思想 表A&#xff0c;B都有序&#xff0c;可从第一个元素起依次比较A、B两表的元素&#xff0c;若元…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机&#xff0c;无法搜索附近蓝牙设备 具体型号当时忘记查看了&#xff0c;如果你遇到有以下选项&#xff0c;记得打开~ 设置权限

2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能

基于matlab-GUI的脉冲响应不变法实现音频滤波功能&#xff0c;输入加噪信号&#xff0c;通过巴特沃斯模拟滤波器脉冲响应不变法进行降噪。效果较好。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能…

智慧生活新标准:解锁耐能科技的潜能

『从马路上&#xff0c;看到旁边摄影机下方的牌子写着科技执法』 『开车进入停车场时&#xff0c;车牌辨识成功开启闸门』 『回到家门口前&#xff0c;进行脸部辨识解锁开门』 『手机APP弹起提醒&#xff0c;出现宝宝的画面表示正在哭泣』 上述的情景&#xff0c;你我是否很熟悉…

[VUE]框架网页开发1 本地开发环境安装

前言 其实你不要看我的文章比较长&#xff0c;但是他就是很长&#xff01;步骤其实很简单&#xff0c;主要是为新手加了很多解释&#xff01; 步骤一&#xff1a;下载并安装 Node.js 访问 Node.js 官网&#xff1a; Node.js — Download Node.js 下载 Windows 64 位版本&…

C++线程异步

本文内容来自&#xff1a; 智谱清言 《深入应用C11 代码优化与工程级应用》 std::future std::future作为异步结果的传输通道&#xff0c;可以很方便地获取线程函数的返回值。 std::future_status Ready (std::future_status::ready): 当与 std::future 对象关联的异步操作…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分&#xff0c;图形显示有所变化&#xff0c;美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

后端eclipse——文字样式:UEditor富文本编辑器引入

目录 1.富文本编辑器的优点 2.文件的准备 3.文件的导入 导入到项目&#xff1a; 导入到html文件&#xff1a; ​编辑 4.富文本编辑器的使用 1.富文本编辑器的优点 我们从前端写入数据库时&#xff0c;文字的样式具有局限性&#xff0c;不能存在换行&#xff0c;更改字体…

基于springboot+小程序的汽车销售管理系统(汽车4)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 ​ 1、管理员实现了首页、个人中心、管理员管理、基础数据管理、论坛管理、公告信息管理、汽车管理、用户管理、轮播图信息等。 ​ 2、用户实现了注册、登录、首页、汽车类型、论坛、购物…