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 对象作为方法参数

     HttpServletRequestHttpServletResponseHttpSessionjava.security.PrincipalLocaleInputStreamOutputStreamReaderWriter

使用要求

  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;@Overridepublic 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;@Overridepublic 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, "猫猫头", "男");//设置sessionrequest.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")@ResponseBodypublic 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

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

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

相关文章

1、Qt6 Quick 简介

一、Qt6 Quick 简介 1、Qt Quick简介 Qt Quick 是 Qt 6 中使用的用户界面技术的总称。它是在 Qt 4 中引入的&#xff0c;现在在 Qt 6 中进行了扩展。Qt Quick 本身是几种技术的集合&#xff1a; QML——用户界面标记语言JavaScript - 动态脚本语言Qt C - 高度可移植的增强型…

element-plus按需引入报错Components is not a function

官网文档&#xff1a;快速开始 | Element Plus webpack配置 // webpack.config.js const AutoImport require(unplugin-auto-import/webpack) const Components require(unplugin-vue-components/webpack) const { ElementPlusResolver } require(unplugin-vue-components…

【AIGC】如何通过ChatGPT轻松制作个性化GPTs应用

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;前言&#x1f4af;什么是GPTsGPTs的工作原理GPTs的优势GPTs的应用前景总结 &#x1f4af;创建GPTS应用的基本流程进入GPTs创建界面方式一&#xff1a;按照引导完成生成创建GPTs方式二…

uniapp配置消息推送unipush 厂商推送设置配置 FCM 教程

说真的&#xff0c;这个 密钥文件 和 google-services.json 太难找了 现在 Firebase 已经不允许注册Cloud Messaging API (旧版)的密钥&#xff0c;所以下面这个官方的文档教程并不适用,但是大致位置可以参考 UniPush支持谷歌推送FCM配置指南 - DCloud问答 密钥文件 通过这里…

51单片机数字电子钟proteus仿真(数电课设,含时间显示、校准、整点报时、闹钟功能)

51单片机数字电子钟proteus仿真 由于学校实验课要求完成51单片机数字电子钟proteus仿真的实验&#xff0c;下面是经过一段时间的努力完成的学习成果。希望分享给有需要的人。 功能描述&#xff1a; 显示功能&#xff1a;可以显示时、分、秒&#xff08;基于1602液晶显示屏&…

Java8 新特性 —— Optional API 详解

本文涉及到的知识点有Lambda表达式&#xff0c;函数式接口以及Stream API&#xff0c;有不了解的小伙伴可以先学习前两篇文章&#xff1a; Java8 新特性 —— Lambda 表达式、函数接口以及方法引用详解 Java8 新特性 —— Stream API 详解 前言 Optional类是Java8新引进的一个…

深入理解Python设计模式:工厂模式实践与应用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

Windows系统安装部署C++基础开发环境

目录 前言安装MinGW-w64安装VSCode安装CMake完成 前言 这篇文章讨论一下Windows系统怎么安装部署C基础开发环境&#xff0c;你或许在想这还不简单吗&#xff0c;安装vs不就可以了吗&#xff0c;很对&#xff0c;可以在官网下载vs集成开发环境然后进行安装&#xff0c;这也是非…

Cisco ACI Leaf交换机导出show tech

cisco.com 文档描述操作如下&#xff1a; https://www.cisco.com/c/en/us/support/docs/cloud-systems-management/application-policy-infrastructure-controller-apic/214520-guide-to-collect-tech-support-and-tac-re.html#toc-hId–2125674131 Trigger via Switch CLI O…

基于matlab的人眼开度识别

我国已经成为世界汽车生产和制造大国&#xff0c;道路车辆的不断增加道路基础设施不断增强&#xff0c;但是随之而来的问题也日益严重&#xff0c;比如交通事故&#xff0c;噪声大气污染等。汽车行驶的安全性由于关乎人民生命安全&#xff0c;所以日益受到各国政府以及研究机构…

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

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

详细分析Java8中的Duration时间类基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 拓展Demo 前言 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 Duration 类是 Ja…

Day14买卖股票的最佳时机

给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如…

【星闪EBM-H63开发板】小熊派的开发板实物

前几天介绍了&#xff0c;我参加了小熊派的星闪EBM-H63开发板内测活动。今天去快递站取回来开发板&#xff0c;让我们看看实物照片。 下面是开发板的正面照片&#xff0c;绿色的部分是核心板&#xff0c;蓝色的部分实际上是个底板&#xff0c;引出了串口的管脚&#xff0c;再加…

zookeeper的选举机制

zk中有两种角色&#xff1a;Leader 和 Fllower Leader是自己的集群各台电脑投票选举出来的。 事务&#xff1a;一通操作&#xff0c;要么同时成立&#xff0c;要么都不成立。 举例&#xff1a;Jack 和 Rose Rose 给 Jack&#xff08;小李子&#xff09; 转钱 Rose -100 J…

六:java 基础知识(6)-- Maven项目管理

目录 1. 引言 1.1 什么是 Maven 1.2 Maven 的优势 2. Maven 基础 2.1 Maven 的基本概念 2.2 Maven 的工作原理 2.3 Maven 的安装与配置 3. Maven 项目结构 3.1 Maven 项目的标准目录结构 3.2 POM 文件&#xff08;pom.xml&#xff09;概述 3.3 POM 文件的基本配置 4…

Centrifuge 5425R - 微量离心机技术数据详情——艾本德

离心机&#xff0c;作为实验室中的关键设备&#xff0c;扮演着分离、浓缩和纯化样品的重要角色。而在众多离心机型号中&#xff0c;Centrifuge 5425R 以其出色的性能和多功能性&#xff0c;成为了众多科研人员的首选。下面&#xff0c;我们就来详细了解一下这款微量离心机的技术…

【06】A-Maven项目SVN设置忽略文件

做Web项目开发时&#xff0c;运用的是Maven管理工具对项目进行管理&#xff0c;在项目构建的过程中自动生成了很多不需要SVN进行管理的文件&#xff0c;SVN在对源码进行版本管理时&#xff0c;需要将其忽略&#xff0c;本文给出了具体解决方案。 SVN设置忽略Maven项目中自动生成…

TDengine 签约蘑菇物联,改造通用设备工业互联网平台

在当前工业互联网迅猛发展的背景下&#xff0c;企业面临着日益增长的数据处理需求和智能化转型的挑战。通用工业设备的高能耗问题愈发突出&#xff0c;尤其是由这些设备组成的公辅能源车间&#xff0c;亟需更高效的解决方案来提升设备运行效率&#xff0c;降低能源消耗。为此&a…

革新汽车装配产线:MR30分布式IO模块引领智能制造新时代

在日新月异的汽车制造行业中&#xff0c;每一分每一秒的效率提升都意味着成本的降低与市场竞争力的增强。随着工业4.0时代的到来&#xff0c;智能化、自动化已成为汽车产线升级转型的关键词。在这场技术革命的浪潮中&#xff0c;MR30分布式IO模块以其高效、灵活、可靠的特点&am…