Spring Web MVC————入门(1)

今天开始正式带大家学习Spring部分的内容了,大家尝试去弄个专业版嗷,学习起来爽一点

在idea中下载这个插件就行了

我们之后开始创建Spring项目,

蓝色 部分自己起名,type选Maven,其他的默认就好了,之后next,

勾选完点击next,就创建好了;

看下项目结构,蓝色java包中的就是我们写代码的地方,之间javaSE怎么写现在就怎么写,

resources是写前端代码的地方,或者可以存放静态资源,test中可以测试代码;

这个东东是启动类,跟以往的main函数不同,这个类一但运行就不会停止的,我们是服务器开发,服务器哪有停下来的道理;准备工作完毕,开始无聊的理论;

1,什么是Spring Web MVC

Spring Web MVC是基于servlet API构建的原始框架,servlet是一种实现动态界面技术,反正Spring Web MVC就是一套Web开发框架,我们可以简称为Spring MVC;

1)什么是MVC

model view controller的缩写,是一种软件架构设计模式,分别为模型,视图,控制器,

模型:就是我们的程序,怎么来处理业务逻辑,怎么处理数据

视图:指应用程序专门用来与浏览器交互的部分

控制器:选择处理模型,选择视图

2)什么是Spring MVC

Spring MVC就是实现了MVC模式的Web框架,有同学可能会有疑问,我们创建的不是Spring Boot项目吗,为啥变成MVC项目了,可以这么理解,Spring Boot只是实现SpringMVC的一种方式,Spring Boot可以添加不同的依赖来实现不同的功能,添加MVC就能实现MVC的功能了;

2,学习MVC

我们学习MVC主要学习通过浏览器和用户交互的程序,主要分三个方面

建立连接:讲用户(浏览器)和java程序连接起来,就是访问一个地址能调用我们的Spring程序

请求:用户访问会携带一些参数,在程序中我们要想办法获取到参数

响应:我们根据获取到的参数,执行业务逻辑,并返回程序运行的结果

1,建立连接

我们这里就要使用到注解了,

我们刚才看到的这个就是启动类的注解,

那么我们如何通过注解建立连接呢,创建一个类,

之后再类的上面写RequestMapping("/hello"),这样就能实现URL路由映射,达到浏览器连接程序的效果;

路由映射的意思就是用户访问URL之后,就会请求到应用程序某个类的某个方法中;

java 复制代码
@RequestMapping("Hello")
@RestController
public class HelloController {
    @RequestMapping("m1")
    public static String m1(){
        return "Hello yaoyu";
    }
}

这个RestController,可以起到序列化数据的作用,把它变成json和xml格式,并且我们创建的这个类可能和Spring内置的重名,我们Spring项目中那么多的类,我们不可能每次启动程序来把所有东西扫描一变来获得我们要的类,所以加上这个控制器,就可以就扫描带有控制器的类,启动项目更快;

第一个Hello是类路径,第二个m1是方式路径

类路径+方法路径合起来就是我们要的资源路径了;

我们去浏览器来访问程序:

我们输入http://127.0.0.1:8080/Hello/m1

就能看到你好yaoyu了;

我们这里的RequestMapping是啥请求呢,我们之前学过,get,post,put,delete,我们使用html,form表单来请求一下;前端代码我们放到

这个static下面,前端代码:

html 复制代码
<form action="http://127.0.0.1:8080/Hello/m1" method="post">
    <input type="submit" value="yaoyu">

后端代码:

java 复制代码
@RequestMapping("Hello")
@RestController
public class HelloController {
    @RequestMapping("m1")
    public static String m1(){
        return "Hello yaoyu";
    }
}

启动程序,看效果:

我们点击它,

就跳转到我们的程序了;这里为啥用127.0.0.1:8080,因为是我们同一台电脑上写服务器并且测试,就先用127.0.0.1就行;我们这里使用的post请求,浏览器发送的请求是get,所以这个RequestMapping是支持很多请求的;

但是我们可以指定方法

java 复制代码
    @RequestMapping(value = "/m2",method = RequestMethod.GET)
    public static String m2(){
        return "我是get请求";
    }

来用postman访问

啥都不传的get请求,看看效果:

得到结果了,那么我们使用post请求访问会有问题吗?

不行的,405是客户端出错,我们设定成get,客户端使用post就会发生错误;

都是ok的,除此之外,我们还有专门的postMapping和getMapping来接收请求:

java 复制代码
    @GetMapping("a1")
    public static String a1(){
        return "我是get请求";
    }
    
    @PostMapping("a2")
    public static String a2(){
        return "我是post请求";
    }

2,工具使用

那我们每次都要写前端代码好麻烦呀,我们后端程序员往后不就会更多的前端代码了吗,莫得事,我们有工具,我们可以使用postman,来构建请求;

下载好后打开,点击那个create Collection,之后点击蓝色的Add,自己给自己的请求起名字,

接下来就能使用我们的工具了,

3,传递参数

1,普通传参

就是查询字符串传参;

这个Params,下面以键值对的方式放到URL中

2,form-data

可以提交文件和图片等

4,form表单

5,raw

这些都是我们之前说的请求正文的内容;对应content-type大家还记得不;

4,请求传参

接下来我们重点来学习用postman传递参数并且用在后端中接收参数

1,传递单个参数

java 复制代码
    @RequestMapping("/r1")
    public static String r1(String s){
        return "接收参数为" + s;
    }

来发请求,

这里查询字符串中的key就是s一定要和我们资源路径里面方法参数的名字是一样的,不然的话就找不到的;

再来看两个代码:

java 复制代码
    @RequestMapping("/r2")
    public static Integer r2(Integer s){
        return s;
    }

    @RequestMapping("/r3")
    public static int r3(int s){
        return s;
    }

这俩有啥区别呢,一个使用包装类型,一个是基本类型,我们使用基本类型的时候参数是必须传的,因为基本类型不能为null,

传递是成功的,现在我们不传参数:

不可以因为int a不能为null,我们再试试Integer,

可以的,要是类型不匹配会发生400错误;

2,传递多个参数

java 复制代码
    @RequestMapping("/r4")
    public static String r4(String s1,String s2){
        return "第一个参数" + s1 + ",第二个参数" + s2;
    }

3,传递对象

先创建一个对象:

java 复制代码
public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
java 复制代码
    @RequestMapping("/r5")
    public static String r5(User user) {
        return user.toString();
    }

传递对象的时候就对对象内部的元素挨个赋值就行了,对象中有name和age,我们来传递

4,参数绑定

参数绑定,又叫参数重命名,参数映射,就是前端可能对参数进行加密,可能名字起的非常奇怪啊,那我们还要记一个小纸上吗,显然是不应该的,这里我们就使用参数绑定,对于前段加密复杂的参数我们让他绑定一个易懂的参数名,我们使用RequestParam

java 复制代码
    @RequestMapping("/r6")
    public static String r6(@RequestParam(value = "p",required = false) String s){
        return "接收的参数为"+ s;
    }

这里的required说明是不是必须传的,我们默认是必须传递的,我们加一个false就可以不传递;

我们改成true

我们在改回来:

ok了;

5,传递数组

java 复制代码
    @RequestMapping("/r7")
    public static String r7(String[] s){
        return Arrays.toString(s);
    }

这里可以有两种方式来传递:

可以用逗号分隔:

还可以

6,传递集合

传递集合的话我们得使用参数绑定,因为默认传的是数组,

java 复制代码
    @RequestMapping("/r8")
    public static String r8(@RequestParam List<Integer> list){
        return list.toString();
    }

7,传递json

这里我们要使用RequestBody,可以把传递来的json转变为对象,

java 复制代码
    @RequestMapping("/r9")
    public static String r9(@RequestBody User user){
        return user.toString();
    }

来个json的语法:

JSON的语法: 1. 数据在 键值对 (Key/Value) 中 2. 数据由逗号 , 分隔 3. 对象⽤ {} 表⽰ 4. 数组⽤ [] 表⽰ 5. 值可以为对象,也可以为数组,数组中可以包含多个对象 JSON的两种结构 1. 对象:⼤括号 {} 保存的对象是⼀个⽆序的 键值对集合.⼀个对象以左括号 { 开始,右括号 } 结束。每个"键"后跟⼀个冒号 : ,键值对使⽤逗号 , 分隔 2. 数组:中括号 [] 保存的数组是值(value)的有序集合.⼀个数组以左中括号 [ 开始,右中括 号 ] 结束,值之间使⽤逗号 , 分隔;

8,从URL中获取参数

java 复制代码
    @RequestMapping("/r10/{id}/{type}")
    public static String r10(@PathVariable Integer id,@PathVariable("type") Integer newType){
        return "获取文章id"+id+",获取文章类型"+newType;
    }

PathVariable是路径变量,可能有网站会把参数设置到路径上,我们就要从路径上拿参数,第一个id对应路径上的id第二个我们把type这个参数名绑定为newtype

来看效果:

9,上传文件

使用RequestPart注解:

java 复制代码
    @RequestMapping("/r11")
    public static String r12(@RequestPart("file1") MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("C:/cctalk/java代码容易犯错的知识点/"+file.getOriginalFilename()));
        return "文还上传成功";
    }

这个file1是我们前端传入的参数我们把它绑定为file,我们要使用MultipartFile file,我们使用transferTo来快速上传文件,这里跟我们之前学的文件操作是一样的,就是进行了封装,更好用了,

java 复制代码
    @RequestMapping("/r11")
    public static String r12(@RequestPart("file1") MultipartFile file) throws IOException {
        System.out.println(file.getOriginalFilename());
        file.transferTo(new File("C:/cctalk/java代码容易犯错的知识点/"+file.getOriginalFilename()));
        return "文还上传成功";
    }
相关推荐
叽哥4 分钟前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
Hy行者勇哥19 分钟前
物联网软件开发过程中,数据流图(DFD),用例图,类图,活动图,序列图,状态图,实体关系图(ERD),BPMN(业务流程建模)详解分析
java·物联网·struts
Miracle65824 分钟前
从 0 到 1 开发校园二手交易系统:飞算 JavaAI 全流程实战
java
A尘埃39 分钟前
Java+Python混合微服务OCR系统设计
java·python·微服务·混合
Seven971 小时前
剑指offer-22、从上往下打印⼆叉树
java
A尘埃1 小时前
企业级Java项目金融应用领域——保险系统(补充)
java·金融·保险系统
冬天vs不冷1 小时前
Java基础(九):Object核心类深度剖析
java·开发语言·python
悟空聊架构2 小时前
我的网站被攻击了,被干掉了 120G 流量,还在持续攻击中...
java·前端·架构
Dajiaonew2 小时前
Spring AI RAG 检索增强 应用
java·人工智能·spring·ai·langchain
IT古董6 小时前
第四章:大模型(LLM)】06.langchain原理-(3)LangChain Prompt 用法
java·人工智能·python