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的参数
注意:
- 超链接默认发送的是get请求
- 所有请求所携带的参数格式均为: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
使用要求
- 发送请求中携带数据的key与方法参数的name必须一致
- 数据类型合法
测试项目准备:

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
相关文章:
Spring Boot2(Spring Boot 的Web开发 springMVC 请求处理 参数绑定 常用注解 数据传递 文件上传)
SpringBoot的web开发 静态资源映射规则 总结:只要静态资源放在类路径下: called /static (or /public or /resources or //METAINF/resources 一启动服务器就能访问到静态资源文件 springboot只需要将图片放在 static 下 就可以被访问到了 总结&…...
nginx中location模块中的root指令和alias指令区别
在 Nginx 配置中,location 模块用于定义如何处理特定请求路径。root 和 alias 是两个常用的指令,用于指定请求文件的位置,但它们有不同的行为。 root 指令 root 指令用于设置请求的根目录。当请求到来时,Nginx 会将请求的 URI 附…...
C++ 线程常见的实际场景解决方案
文章目录 一、主线程阻塞等待子线程返回1、代码示例2、代码改进 一、主线程阻塞等待子线程返回 主线程等待一个线程,此线程会开始连接一个服务器并循环读取服务器存储的值,主线程会阻塞直到连接服务器成功。因为如果不阻塞,可能上层业务刚开…...
Node.js——fs模块-文件删除
1、在Node.js中,我们可以使用unlink或unlinkSync来删除文件。 2、语法: fs.unlink(path,callback) fs.unlinkSync(path) 参数说明: path 文件路径 callback 操作后的回调函数 本文的分享到此结束,欢迎大家评论区一同讨论学…...
发布一个npm组件库包
Webpack 配置 (webpack.config.js) const path require(path); const MiniCssExtractPlugin require(mini-css-extract-plugin); const CssMinimizerPlugin require(css-minimizer-webpack-plugin); const TerserPlugin require(terser-webpack-plugin);module.exports {…...
处理PhotoShopCS5和CS6界面字体太小
处理PhotoShop CS6界面字体太小 背景:安装PhotoShop CS6后发现无法调大字体大小,特别是我的笔记本14寸的,显示的字体小到离谱。 百度好多什么降低该电脑分辨率,更改电脑的显示图标大小,或者PS里的首选项中的界面设置。…...
srs http-flv处理过程
目录 处理tcp请求,创建HttpConn 解析 http request创建consumer 读取consumer数据转封装为flv 处理tcp请求,创建HttpConn 调用堆栈如下: srs!SrsHttpConn::SrsHttpConn(ISrsHttpConnOwner*, ISrsProtocolReadWriter*, ISrsHttpServeMux*, std::__1::basic_string<ch…...
若Git子模块的远端地址发生了变化本地应该怎么调整
文章目录 前言git submodule 相关命令解决方案怎么保存子模块的版本呢总结 前言 这个问题复杂在既有Git又有子模块,本身Git的门槛就稍微高一点,再加上子模块的运用,一旦出现这种远端地址发生修改的情况会让人有些懵,不知道怎么处…...
docker运行code-servre并配置https通信
code-server 可以在浏览器中运行,使得开发者可以随时随地通过网络访问自己的开发环境,无需局限于某一台设备。只要有浏览器和网络连接,就可以继续编写代码和调试项目,非常适合远程办公和移动办公的需求。 由于每次启动code-serve…...
Linux 外设驱动 应用 4 触摸屏实验
触摸屏实验 1 触摸屏介绍1.1 基本应用介绍1.2 触摸屏工作原理介绍1.3 硬件介绍 2 应用代码编写2.1 找到输入设备2.2 打开驱动2.3 驱动查询应用2.4 应用结果 1 触摸屏介绍 1.1 基本应用介绍 LCD 显示屏包括显示屏和触摸屏,上层的是触摸屏,下层是显示屏。…...
Python-利用Pyinstaller,os库编写一个无限弹窗整蛊文件(上)
前言:本篇文章我们将学习一下如何利用你室友的这个习惯整蛊一下Ta,同时更重要的是借此提醒Ta要注意要做好个人信息的防泄露措施......(声明:本次教学无任何不良引导) 编程思路:本次编程中无限弹窗的实现我们需要调用Py…...
后台管理系统窗体程序:文章管理 > 文章列表
目录 文章列表的的功能介绍: 1、进入页面 2、页面内的各种功能设计 (1)文章表格 (2)删除按钮 (3)编辑按钮 (4)发表文章按钮 (5)所有分类下拉框 &a…...
图神经网络(GNN)入门笔记(2)——从谱域理解图卷积,ChebNet和GCN实现
一、谱域图卷积(Spectral Domain Graph Convolution) 与谱域图卷积(Spectral Domain Graph Convolution)对应的是空间域(Spatial Domain)图卷积。本节学习的谱域图卷积指的是通过频率来理解卷积的方法。 …...
接口类和抽象类在设计模式中的一些应用
C设计模式中,有些模式需要使用接口类(Interface Class)和抽象类(Abstract Class)来实现特定的设计目标。以下是一些常见的设计模式及其需要的原因,并附上相应的代码片段。 1. 策略模式(Strateg…...
【系统架构】如何演变系统架构:从单体到微服务
引言 随着企业的发展,网站架构必须不断演变以应对日益增长的用户流量和复杂性需求。本文将详细探讨从单体架构到微服务架构的演变过程,尤其关注订单和支付服务的实现方式,帮助您打造一个高效、可扩展的在线平台。 步骤1:分离应用…...
Neo4j入门:详解Cypher查询语言中的MATCH语句
Neo4j入门:详解Cypher查询语言中的MATCH语句 引言什么是MATCH语句?示例数据1. 基础节点查询查询所有节点按标签查询节点 2. 关系查询基础关系查询指定关系方向指定关系类型 3. 使用WHERE子句4. 使用参数5. 多重MATCH和WITH子句实用技巧总结 引言 大家好…...
CPP贪心算法示例
设有n个正整数(n ≤ 20),将它们联接成一排,组成一个最大的多位整数。 例如:n3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n4时,4个整…...
GPT对NLP的冲击
让我来详细解释张俊林对GPT冲击NLP领域的分析: 中间任务(脚手架)的消失: 传统NLP中间任务: - 分词 - 词性标注 - 命名实体识别 - 句法分析 - 词向量学习为什么会消失: - GPT直接进行端到端学习 - 不需要人工定义的中间步骤 - 模…...
中值定理类证明题中对‘牛顿插值法’的应用
牛顿插值法是一种使用多项式插值的方法,它通过构造一个多项式来近似一组数据点。这种方法是由艾萨克牛顿提出的。牛顿插值法的一个优点是,当需要添加更多的数据点时,它不需要重新计算整个多项式,只需要对现有的多项式进行修改。...
HTMLCSS:3D 旋转卡片的炫酷动画
效果演示 这段代码是一个HTML和CSS的组合,用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁?我在那<…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
