当前位置: 首页 > news >正文

网站建设使用虚拟主机的优点与缺点/网络推广项目计划书

网站建设使用虚拟主机的优点与缺点,网络推广项目计划书,做盗文网站,做实验用哪些国外网站SpringBoot的web开发 静态资源映射规则 总结:只要静态资源放在类路径下: called /static (or /public or /resources or //METAINF/resources 一启动服务器就能访问到静态资源文件 springboot只需要将图片放在 static 下 就可以被访问到了 总结&…

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

相关文章:

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

SpringBoot的web开发 静态资源映射规则 总结&#xff1a;只要静态资源放在类路径下&#xff1a; called /static (or /public or /resources or //METAINF/resources 一启动服务器就能访问到静态资源文件 springboot只需要将图片放在 static 下 就可以被访问到了 总结&…...

nginx中location模块中的root指令和alias指令区别

在 Nginx 配置中&#xff0c;location 模块用于定义如何处理特定请求路径。root 和 alias 是两个常用的指令&#xff0c;用于指定请求文件的位置&#xff0c;但它们有不同的行为。 root 指令 root 指令用于设置请求的根目录。当请求到来时&#xff0c;Nginx 会将请求的 URI 附…...

C++ 线程常见的实际场景解决方案

文章目录 一、主线程阻塞等待子线程返回1、代码示例2、代码改进 一、主线程阻塞等待子线程返回 主线程等待一个线程&#xff0c;此线程会开始连接一个服务器并循环读取服务器存储的值&#xff0c;主线程会阻塞直到连接服务器成功。因为如果不阻塞&#xff0c;可能上层业务刚开…...

Node.js——fs模块-文件删除

1、在Node.js中&#xff0c;我们可以使用unlink或unlinkSync来删除文件。 2、语法&#xff1a; fs.unlink(path,callback) fs.unlinkSync(path) 参数说明&#xff1a; path 文件路径 callback 操作后的回调函数 本文的分享到此结束&#xff0c;欢迎大家评论区一同讨论学…...

发布一个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界面字体太小 背景&#xff1a;安装PhotoShop CS6后发现无法调大字体大小&#xff0c;特别是我的笔记本14寸的&#xff0c;显示的字体小到离谱。 百度好多什么降低该电脑分辨率&#xff0c;更改电脑的显示图标大小&#xff0c;或者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又有子模块&#xff0c;本身Git的门槛就稍微高一点&#xff0c;再加上子模块的运用&#xff0c;一旦出现这种远端地址发生修改的情况会让人有些懵&#xff0c;不知道怎么处…...

docker运行code-servre并配置https通信

code-server 可以在浏览器中运行&#xff0c;使得开发者可以随时随地通过网络访问自己的开发环境&#xff0c;无需局限于某一台设备。只要有浏览器和网络连接&#xff0c;就可以继续编写代码和调试项目&#xff0c;非常适合远程办公和移动办公的需求。 由于每次启动code-serve…...

Linux 外设驱动 应用 4 触摸屏实验

触摸屏实验 1 触摸屏介绍1.1 基本应用介绍1.2 触摸屏工作原理介绍1.3 硬件介绍 2 应用代码编写2.1 找到输入设备2.2 打开驱动2.3 驱动查询应用2.4 应用结果 1 触摸屏介绍 1.1 基本应用介绍 LCD 显示屏包括显示屏和触摸屏&#xff0c;上层的是触摸屏&#xff0c;下层是显示屏。…...

Python-利用Pyinstaller,os库编写一个无限弹窗整蛊文件(上)

前言&#xff1a;本篇文章我们将学习一下如何利用你室友的这个习惯整蛊一下Ta,同时更重要的是借此提醒Ta要注意要做好个人信息的防泄露措施......&#xff08;声明&#xff1a;本次教学无任何不良引导&#xff09; 编程思路&#xff1a;本次编程中无限弹窗的实现我们需要调用Py…...

后台管理系统窗体程序:文章管理 > 文章列表

目录 文章列表的的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;文章表格 &#xff08;2&#xff09;删除按钮 &#xff08;3&#xff09;编辑按钮 &#xff08;4&#xff09;发表文章按钮 &#xff08;5&#xff09;所有分类下拉框 &a…...

图神经网络(GNN)入门笔记(2)——从谱域理解图卷积,ChebNet和GCN实现

一、谱域图卷积&#xff08;Spectral Domain Graph Convolution&#xff09; 与谱域图卷积&#xff08;Spectral Domain Graph Convolution&#xff09;对应的是空间域&#xff08;Spatial Domain&#xff09;图卷积。本节学习的谱域图卷积指的是通过频率来理解卷积的方法。 …...

接口类和抽象类在设计模式中的一些应用

C设计模式中&#xff0c;有些模式需要使用接口类&#xff08;Interface Class&#xff09;和抽象类&#xff08;Abstract Class&#xff09;来实现特定的设计目标。以下是一些常见的设计模式及其需要的原因&#xff0c;并附上相应的代码片段。 1. 策略模式&#xff08;Strateg…...

【系统架构】如何演变系统架构:从单体到微服务

引言 随着企业的发展&#xff0c;网站架构必须不断演变以应对日益增长的用户流量和复杂性需求。本文将详细探讨从单体架构到微服务架构的演变过程&#xff0c;尤其关注订单和支付服务的实现方式&#xff0c;帮助您打造一个高效、可扩展的在线平台。 步骤1&#xff1a;分离应用…...

Neo4j入门:详解Cypher查询语言中的MATCH语句

Neo4j入门&#xff1a;详解Cypher查询语言中的MATCH语句 引言什么是MATCH语句&#xff1f;示例数据1. 基础节点查询查询所有节点按标签查询节点 2. 关系查询基础关系查询指定关系方向指定关系类型 3. 使用WHERE子句4. 使用参数5. 多重MATCH和WITH子句实用技巧总结 引言 大家好…...

CPP贪心算法示例

设有n个正整数&#xff08;n ≤ 20&#xff09;&#xff0c;将它们联接成一排&#xff0c;组成一个最大的多位整数。 例如&#xff1a;n3时&#xff0c;3个整数13&#xff0c;312&#xff0c;343联接成的最大整数为&#xff1a;34331213 又如&#xff1a;n4时&#xff0c;4个整…...

GPT对NLP的冲击

让我来详细解释张俊林对GPT冲击NLP领域的分析&#xff1a; 中间任务(脚手架)的消失&#xff1a; 传统NLP中间任务&#xff1a; - 分词 - 词性标注 - 命名实体识别 - 句法分析 - 词向量学习为什么会消失&#xff1a; - GPT直接进行端到端学习 - 不需要人工定义的中间步骤 - 模…...

中值定理类证明题中对‘牛顿插值法’的应用

牛顿插值法是一种使用多项式插值的方法&#xff0c;它通过构造一个多项式来近似一组数据点。这种方法是由艾萨克牛顿提出的。牛顿插值法的一个优点是&#xff0c;当需要添加更多的数据点时&#xff0c;它不需要重新计算整个多项式&#xff0c;只需要对现有的多项式进行修改。...

HTMLCSS:3D 旋转卡片的炫酷动画

效果演示 这段代码是一个HTML和CSS的组合&#xff0c;用于创建一个具有3D效果的动画卡片。 HTML <div class"obj"><div class"objchild"><span class"inn6"><h3 class"text">我是谁&#xff1f;我在那<…...

Node.js 全栈开发进阶篇

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;node.js篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来node.js篇专栏内容:node.js- 全栈开发进阶篇 前言 大家好&#xff0c;我是青山。在上一篇文章中&#xff0c;…...

SQL语句-MySQL

数据定义声明 改变数据库语句 ALTER {DATABASE | SCHEMA} [db_name]alter_option ... ALTER {DATABASE | SCHEMA} db_nameUPGRADE DATA DIRECTORY NAMEalter_option: {[DEFAULT] CHARACTER SET [] charset_name| [DEFAULT] COLLATE [] collation_name } ALTER DATABASE使您能…...

Tencent Hunyuan3D

一、前言 腾讯于2024年11月5日正式开源了最新的MoE模型“混元Large”以及混元3D生成大模型“Hunyuan3D-1.0”&#xff0c;支持企业及开发者在精调、部署等不同场景下的使用需求。 GitHub - Tencent/Hunyuan3D-1 二、技术与原理 Hunyuan3D-1.0 是一款支持文本生成3D&#xff08;…...

[ABC239E] Subtree K-th Max

[ABC239E] Subtree K-th Max 题面翻译 给定一棵 n n n 个节点的树&#xff0c;每个节点的权值为 x i x_i xi​。 现有 Q Q Q 个询问&#xff0c;每个询问给定 v , k v,k v,k&#xff0c;求节点 v v v 的子树第 k k k 大的数。 0 ≤ x i ≤ 1 0 9 , 2 ≤ n ≤ 1 0 5 , …...

Axure设计之左右滚动组件教程(动态面板)

很多项目产品设计经常会遇到左右滚动的导航、图片展示、内容区域等&#xff0c;接下来我们用Axure来实现一下左右滚动的菜单导航。通过案例我们可以举一反三进行其他方式的滚动组件设计&#xff0c;如常见的上下滚动、翻页滚动等等。 一、效果展示&#xff1a; 1、点击“向左箭…...

善用Git LFS来降低模型文件对磁盘的占用

将讲一个实际的例子&#xff1a;对于模型文件&#xff0c;动辄就是好几个G&#xff0c;而有的仓库更是高达几十G&#xff0c;拉一个仓库到本地&#xff0c;稍不注意直接磁盘拉满都有可能。 比如&#xff1a;meta-llama-3.1-8b-instruct&#xff0c;拉到本地后发现居然占用了60G…...

Oracle RAC的thread

参考文档&#xff1a; Real Application Clusters Administration and Deployment Guide 3 Administering Database Instances and Cluster Databases Initialization Parameter Use in Oracle RAC Table 3-3 Initialization Parameters Specific to Oracle RAC THREAD Sp…...

如何创建备份设备以简化 SQL Server 备份过程?

SQL Server 中的备份设备是什么&#xff1f; 在 SQL Server 中&#xff0c;备份设备是用于存储备份数据的物理或逻辑介质。备份设备可以是文件、设备或其他存储介质。主要类型包括&#xff1a; 文件备份设备&#xff1a;通常是本地文件系统中的一个或多个文件。可以是 .bak 文…...

DeBiFormer实战:使用DeBiFormer实现图像分类任务(一)

摘要 一、论文介绍 研究背景&#xff1a;视觉Transformer在计算机视觉领域展现出巨大潜力&#xff0c;能够捕获长距离依赖关系&#xff0c;具有高并行性&#xff0c;有利于大型模型的训练和推理。现有问题&#xff1a;尽管大量研究设计了高效的注意力模式&#xff0c;但查询并…...

【go从零单排】迭代器(Iterators)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;迭代器的实现通常不是通过语言内置的迭代器类型&#x…...