Spring MVC(一)

一.啥么是Spring Web MVC

Spring MVC是基于Servle API创建的原始的web框架,从一开始就包含在Spring框架中.它的正式名称为"Spring web MVC",但它通常被常委"Sping MVC"

什么是Servlet?

Servlet是一中实现动态页面的技术。准确的来说Servlet是一套Java Web来发的规范,或者说是一套Java Web开发的技术标准。只是规范并不能任何事情,必须要有人去实现它。所谓实现Servlet规范,就是真正编写代码去实现Servlet规范提到的各种功能,包括类,方法,属性等。

Servlet规范的产品包括Tomcau,Weblogic,Jetty,Jboss,WebSphere等,ta们都被称为"Servlet容器".Servlet容器用来管理程序员编写的Servlet类。

从上述定义我们可以得到一个信息: Spring Web MVC是一个Web框架。

二.MVC定义

MVCModel View Controller 的缩写,它是软件工程中的一种软件架构设计模式,它把软件系统分为模型,视图和控制器三个部分。

  • **View(视图)**指在应用程序中专门用来与浏览器进行交互,展示数据的资源
  • **Model(模型)**是应用程序的主体部分,用来处理程序中数据逻辑的部分
  • **Controller(控制器)**可以理解为一个分发器,用来决定对试图发来的请求,需要用哪一个模型来处理,以及处理完成后需要跳回到哪一个始于。即用来连接视图和模型

三.什么是Spring MVC?

MVC是一种框架设计模式,也是一种设计思想,而Spring MVC是对MVC思想的具体实现.除此之外,Spring MVC还是一个Web框架.

总结来说,Spring MVC是一个实现了MVC模式的Web框架.

四.Spring MVC学习

学习Sping MVC,重点就是学习如何通过浏览器和用户程序进行交互的。

主要分为以下三个方面:

  1. 建立连接: 将用户(浏览器)和Java程序连接起来,也就是访问一个地址可以调用到我们的Spring程序.
  2. **请求:**用户请求的时候会带来一些参数,在程序中要想办法获取这些参数,所以请求这块主要是获取参数的功能。
  3. **响应:**执行了业务逻辑之后,要把程序执行的结果返回给用户

小提示:

url是Uniform Resource Locator(统一资源定位符) ,简单理解就是网页地址,也就是浏览器地址。

例如:

|-----------------------|
| https://www.baidu.com |

这就是一个URL。

一个完整的URL一般由及部分组成:

|---------------------|
| 协议://域名:端口/路径?参数#锚点 |

例如:

|---------------------------------------------------------------------------------------------------------------------------------------------|
| https://www.example.com:8080/user?id=123#top |

拆开:

|----------------------|----|-----------|
| 部分 | 含义 | 示例 |
| https | 协议 | 使用https通信 |
| www.example.com:8080 | 域名 | 网站地址 |
| 8080 | 端口 | 服务器端口 |
| /user | 路径 | 访问哪个资源 |
| ?id=123 | 参数 | 给服务器传数据 |
| #top | 锚点 | 页面位置 |

五.建立连接

在Spring MVC中使用 @RequestMapping 来实现URL路由映射,也就是浏览器连接程序的作用。

@RequestMapping使用

@RequestMapping 即可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类路径+方法路径

简单使用:

java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloContorller {
    @RequestMapping("/r1")
    public String r1(){
        return "hello Spring r1~";
    }
}

注意:

@RequestingMapping的URL路径前面加不加/都可以,Spring程序启动时,会进行判断,如果前面没有/,Spring会拼接上一个/

java 复制代码
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("hello")
public class HelloContorller {
    @RequestMapping("/r1")
    public String r1(){
        return "hello Spring r1~";
    }
    @RequestMapping("r2")
    public String r2(){
        return "hello Spring r2";
    }
}

@RequestMapping的URL路径也是可以多层路径,最终访问时,依旧是类名+方法名。

java 复制代码
    @RequestMapping("/r3/r4")
    public String r3(){
        return "hello Spring r3";
    }

注意:

第一个/可以省略,第二个/不可以省略

第一个/省略

java 复制代码
    @RequestMapping("r3/r4")
    public String r3(){
        return "hello Spring r3";
    }

第二个/省略

java 复制代码
    @RequestMapping("r3r4")
    public String r3(){
        return "hello Spring r3";
    }

@ResquestMapping是GET还是POST请求?

用浏览器访问默认是GET请求

通过这个例子可以看出来@RequestMapping支持PoST请求

注意:

RequestMapping 不可以使用同一个名字,因为这样不知道请求哪个方法。

java 复制代码
    @RequestMapping("/r5")
    public String r5(){
        return "hello Spring r5";
    }
    @RequestMapping("/r5")
    public String r6(){
        return "hello Spring r5";
    }

Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'helloContorller' method

com.bit.springbootcsdndemofirst.HelloContorller#r6()

to { /hello/r5}: There is already 'helloContorller' bean method

com.bit.springbootcsdndemofirst.HelloContorller#r5() mapped.

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.validateMethodMapping(AbstractHandlerMethodMapping.java:646) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:606) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:327) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:459) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.registerHandlerMethod(RequestMappingHandlerMapping.java:80) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambdadetectHandlerMethods1(AbstractHandlerMethodMapping.java:294) ~spring-webmvc-7.0.8.jar:7.0.8

at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) ~na:na

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:292) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.processCandidateBean(AbstractHandlerMethodMapping.java:261) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:220) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:208) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:158) ~spring-webmvc-7.0.8.jar:7.0.8

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862) ~spring-beans-7.0.8.jar:7.0.8

at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1811) ~spring-beans-7.0.8.jar:7.0.8

... 18 common frames omitted

通过以上的例子可以说明@RequestMapping即支持GET请求有支持POST请求。

那么是否可以让@RequestMapping只支持GET 或 POST请求呢?

只支持GET请求

java 复制代码
    @RequestMapping(value = "/r5",method = RequestMethod.GET)
    public String r5(){
        return "hello Spring r5";
    }

只支持POST请求

java 复制代码
    @RequestMapping(value = "/r6",method = RequestMethod.POST)
    public String r6(){
        return "hello Spring r6";
    }

注意:@RequsetMapping不同类型的请求@RequetMapping中的value值可以重复.

@GetMapping("/r5")<=> @RequestMapping(value = "/r5",method = RequestMethod.GET)

@PostMapping("/r5")<=>@RequestMapping(value = "/r5",method = RequestMethod.POST)

六:传参介绍

1.普通传参,也就是通过查询字符串来传参

URL的格式如下:

其中,查询字符串就是请求的参数

2.form-data

3.x-www-form-urlencoded

4.raw

七.请求

++传参数的时候传参数的名字必须要和接受参数的名字要相同++

1.传一个参数

java 复制代码
 @PostMapping("/r7")
    public String r7(String name){
        return "得到的参数是:"+name;
    }

2.传多个参数

java 复制代码
    @PostMapping("/r11")
    public String r11(String name,String password){
        return "得到的参数 name :"+name+" password: "+password;
    }

3.传对象

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}
java 复制代码
    @PostMapping("/r14")
    public String r14(Person person){
        return "得到的参数是 Person:" +
                person+
                " person.name " +person.getName()+
                " person.age "+person.getAge()+
                " person.password "+person.getPassword();
    }

4.传数组

java 复制代码
    @PostMapping("/r15")
    public String r15(String[] names){
        return "得到的参数是:"+ Arrays.toString(names);
    }

5.传递集合

java 复制代码
    @PostMapping("/r16")
    public String r16(@RequestParam List<Integer> nums){
        return "得到的参数是 nums : "+nums;
    }

@RequestParam 主要用于接收:

  • String
  • Integer
  • Double
  • 简单类型
  • 数组/List参数
相关推荐
老马识途2.02 小时前
关于跨域问题的总结
java·前端
都叫我大帅哥3 小时前
Java日期时间三十年战争:从Date考古到LocalDateTime革命,以及数据库与前端的那点事儿
java
Muscleheng3 小时前
SpringBoot 集成 DeepSeek 实现 RAG 文档问答
java·spring boot·ai·springai
2501_936415694 小时前
可变参数&综合练习&斗地主游戏
java·windows·游戏
极客先躯5 小时前
高级java每日一道面试题-2026年05月03日-实战篇[Docker]-如何实现容器化环境的数据加密?
java·运维·docker·容器·金融·加解密·高级面试
xqqxqxxq5 小时前
Java Socket 多人聊天室(私聊+群聊)技术笔记(V4版本)
java·网络·笔记
wang09075 小时前
自己动手写一个spring之aop_1
java·后端·spring
国科安芯6 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
deng12046 小时前
【Thread类的用法(1)-- Thread类的基本用法】
java·java-ee