Spring MVC程序开发(JavaEE进阶系列3)

目录

前言:

[1.什么是Spring MVC](#1.什么是Spring MVC)

1.1MVC的定义

[1.2MVC和Spring MVC的关系](#1.2MVC和Spring MVC的关系)

[1.3为什么要学习Spring MVC](#1.3为什么要学习Spring MVC)

[2.Spring MVC项目的创建](#2.Spring MVC项目的创建)

[3.Spring MVC框架的使用](#3.Spring MVC框架的使用)

3.1连接的功能

3.1.1@RequestMapping

3.1.2@GetMapping

3.1.3@PostMapping

3.2获取参数的功能

3.2.1获取单个参数

3.2.2获取对象

3.2.3上传文件

3.2.4获取Cookie

3.2.5获取Session

3.2.6获取Header

3.2.7从url的path(非参数部分)获取参数

3.3输出数据的功能

结束语:


前言:

在前几节中小编给大家分享了有关于Spring Boot的项目的创建和使用,那么在接下来小编将会给大家分享一些有关于Spring MVC的的程序的开发,以及什么是Spring MVC。

1.什么是Spring MVC

Spring MVC本质是Spring Web MVC他是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。从上面的一段描述中我们可以看出来Spring MVC是一个Web框架,Spring MVC是基于Servlet API构建的。

1.1MVC的定义

MVC是Model View Controller的缩写,他是软件工程中的一种软件架构模式,他把软件系统分成为模型、视图和控制器三个基本部分。

解释:

  • **Model(模型):**是应用程序中用于处理应用程序数据逻辑的部分,通常模型负责在数据库中存取数据。
  • **View(视图):**是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
  • **Controller(控制器):**是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

MVC的执行流程:

  • 用户的请求首先到Controller。
  • Controller将请求转发给Model。
  • Model处理业务并将数据结构给Controller。
  • Controller会将数据给View引擎。
  • View转换数据生成最终的页面给用户。

1.2MVC和Spring MVC的关系

MVC是一种思想,而Spring MVC是对MVC思想的具体实现。总结来说,Spring MVC是一个实现MVC模式,并继承了Servlet API的Web框架,既然是Web框架,那么当用户在浏览器中输入了url之后,我们的Spring MVC项目就可以感知到用户的请求。

1.3为什么要学习Spring MVC

现在绝大部分的Java项目都是基于Spring(或Spring Boot)的,而Spring的核心就是Spring MVC,也就是说Spring MVC是Spring框架的核心模块,而Spring Boot是Spring的脚手架,因此我们可以推断出,现在市面上绝大部分的Java项目约等于Spring MVC项目,这是我们要学习Spring MVC的原因。

2.Spring MVC项目的创建

和我们之前的创建Spring Boot项目的方式一样只不过是在我们选择项目依赖的时候需要对其进行多选择一个依赖,具体如下所示:

3.Spring MVC框架的使用

学习Spring MVC我们只需要掌握以下三个功能:

  • **连接的功能:**将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用我们Spring程序。
  • **获取参数的功能:**用户访问的时候会带一些参数,在程序中要想办法获取到参数。
  • **输出数据的功能:**执行了业务逻辑之后,要把程序执行的结果返回给用户。

3.1连接的功能

接下来我们就来实现客户端和程序之间的"连接"。

3.1.1@RequestMapping

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

它是Spring Web应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的所谓路由映射指的是当用户在访问一个url时将用户的请求对应到某个类的某个方法的过程就叫做路由映射。

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/sayhi")
    public String sayHi() {
        return "你好 Spring MVC";
    }
}

结果展示:

注意:从上面的代码中我们可以看出来@RequestMapping既可以修饰类又可以修饰方法。

那么@RequestMapping是GET请求呢还是POST氢气呢?这里我们可以使用PostMan来进行验证。

由上可以得知@RequestMapping即是GET请求又是POST请求。

3.1.2@GetMapping

使用@GetMapping实现HTTP连接,但只支持GET类型的请求。

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test_get")
public class GetController {
    //写法一:
    @RequestMapping("/get1")
    public String sayHi1() {
        return "你好 Spring MVC1";
    }
    //写法二:
    @RequestMapping(value = "/get2",method = RequestMethod.GET)
    public String sayHi2() {
        return "你好 Spring MVC2";
    }

    //写法三:
    @GetMapping("/get3")
    public String sayHi3() {
        return "你好 Spring MVC3";
    }
}

结果展示:

同样我们也可以使用PostMan来进行验证一下看是不是只是支持GET请求。

当我们发送的是一个GET请求的时候是可以访问到的。

当我们发送的是POST的时候就访问不到了,所以证明了当我们使用@GetMapping的时候确实是只是支持GET类型的。

3.1.3@PostMapping

使用@PostMapping实现HTTP连接,但只支持POST类型的请求。

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("test_post")
public class PostController {
    //写法一:
    @RequestMapping("/post1")
    public String sayHi1() {
        return "你好 Spring MVC1";
    }
    //写法二:
    @RequestMapping(value = "/post2",method = RequestMethod.POST)
    public String sayHi2() {
        return "你好 Spring MVC2";
    }

    //写法三:
    @PostMapping("/post3")
    public String sayHi3() {
        return "你好 Spring MVC3";
    }

}

结果展示:

注意:这里在代码中的写法一是可以通过浏览器正常访问到的,但是写法二和写法三是不可以的,因为浏览器默认是使用GET类型的。

这里虽然在浏览器上看不出来效果但是我们可以使用PostMan来进行模拟。

同样这里也可以使用PostMan来验证是否是只能使用POST。

3.2获取参数的功能

3.2.1获取单个参数

获取单个参数时可以使用以下两种方法来进行参数的传递。

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/getname")
public class TestController2 {
    //方法一:
    @RequestMapping("/getname1")
    public String getName1(HttpServletRequest request) {
        return "Name: " + request.getParameter("name");
    }
    
    //方法二:
    @RequestMapping("/getname2")
    public String getName2(String name) {
        return "Name: " + name;
    }
}

结果展示:

3.2.2获取对象

在此之前我们先来创建出一个User实体类。

代码如下所示(PS:这里我们使用了Lombok里面的@Data注解)

java 复制代码
package com.example.demo.model;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private int age;
}

那么接下来我们就尝试着获取User这个对象。

代码展示:

java 复制代码
package com.example.demo.controller;

import com.example.demo.model.User;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class TestController3 {
    @RequestMapping("add1")
    public User add(User user) {
        return user;
    }

    @RequestMapping("/add2")
    public User addByJson(@RequestBody User user) {
        return user;
    }
}

结果展示:

使用JSON格式的对象。

3.2.3上传文件

如果我们想要将一张图片上传至本地磁盘中,我们就可以使用以下的方式来进行上传。

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/test4")
public class TestController4 {
    @RequestMapping("/upload")
    public String upload(@RequestPart("myfile")MultipartFile file) throws IOException {
        String path = "D:\\image\\img.png";
        //保存文件
        file.transferTo(new File(path));
        return path;
    }
}

结果展示:

在Postman中进行演示:

3.2.4获取Cookie

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/Cookie")
public class TestController5 {

    @RequestMapping("/getcookie")
    public String getCookie(@CookieValue(value = "java",required = false) String ck) {
        return ck;
    }
}

注意:在上述中的代码中我们设置了@RequestParma中的required=false,这样就可以满足我们的实际业务前端的参数是一个非必传的参数了。

3.2.5获取Session

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;

@RestController
@RequestMapping("/Session")
public class TestController6 {
    @RequestMapping("/getsession")
    public String getsession(@SessionAttribute(required = false,value = "1") String name) {
        return name;
    }
}

3.2.6获取Header

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/Header")
public class TestController7 {
    @RequestMapping("/header")
    public String header(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent: " + userAgent;
    }
}

3.2.7从url的path(非参数部分)获取参数

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/url")
public class TestController8 {
    @RequestMapping("/urlpath/{name}/{age}")
    public String geturl(@PathVariable String name, @PathVariable String age) {
        return name + age;
    }
}

结果展示:

3.3输出数据的功能

通过上面的学习我们知道,默认请求下无论是Spring MVC或者是Spring Boot返回的是视图(xxx.html),而现在都是前后端分离的,后端只是需要返回给前端数据即可,这个时候我们就需要使用@ResponseBody注解了。

创建一个index.html:

代码展示:

java 复制代码
package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/p")
public class indexController {
    @RequestMapping("/index")
    public String index(){
        return "/index.html";
    }
    @RequestMapping("/m")
    @ResponseBody
    public String index2() {
        return "<h1>Hello Spring MVC</h1>";
    }
}

结果展示:

如果我们想要直接在页面中显示的就是我们返回的数据那么就可以直接使用上述的@RestController这个注解。

结束语:

好了这节小编就给大分享到这里啦,希望这节对大家有关于Spring MVC的基础知识的了解有一定帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

相关推荐
Leanfeng_K2 小时前
【报错】mac m1 gateway 报错
spring·macos·spring cloud·gateway·报错
Nightselfhurt3 小时前
Spring cloud 中gateway原理
spring·spring cloud·gateway
北极无雪3 小时前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
binqian3 小时前
【SpringSecurity】基本流程
java·spring
猿小蔡-Cool4 小时前
CPU 多级缓存
java·spring·缓存
编程、小哥哥13 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
wxin_VXbishe18 小时前
springboot合肥师范学院实习实训管理系统-计算机毕业设计源码31290
java·spring boot·python·spring·servlet·django·php
OEC小胖胖18 小时前
Spring Boot + MyBatis 项目中常用注解详解(万字长篇解读)
java·spring boot·后端·spring·mybatis·web
落落落sss19 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
潘多编程1 天前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring