1.什么是MVC

MVC的概念

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑、数据和用户界面分离为三个独立的部分。这种分离提高了代码的可维护性、可扩展性和可重用性。

MVC的组成部分

Model(模型)
模型负责处理数据和业务逻辑。它直接管理数据,包括数据的存储、检索和更新。模型通常与数据库交互,但不涉及用户界面的任何细节。

View(视图)
视图是用户界面的部分,负责展示数据(从模型获取)并接收用户输入。视图通常是动态生成的页面或界面组件,不包含业务逻辑。

Controller(控制器)
控制器作为模型和视图之间的桥梁,处理用户输入并更新模型或视图。它接收用户请求,调用模型处理数据,并选择适当的视图进行渲染。

2.什么是SpringMVC?

SpringMVC 的定义

SpringMVC 是 Spring 框架的一个模块,专为构建基于 Java 的 Web 应用程序而设计。它基于 Model-View-Controller (MVC) 架构模式,提供了一种结构化的方式来分离业务逻辑、数据展示和用户交互。SpringMVC 通过DispatcherServlet 作为核心控制器,协调请求处理流程,支持灵活的配置和扩展。

核心组件

  • DispatcherServlet:前端控制器,接收所有请求并分发给对应的处理器。
  • HandlerMapping:解析请求 URL,确定对应的控制器(Controller)。
  • Controller:处理业务逻辑,返回模型数据(Model)和视图名称。
  • ViewResolver:将视图名称解析为具体的视图技术(如 JSP、Thymeleaf)。
  • ModelAndView:封装模型数据和视图信息的容器。

3.学习SpringMVC

主要分以下三个⽅⾯:

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

建立连接

在SpringMVC中使⽤ @RequestMapping 来实现URL路由映射,在Spring框架中@RequestMapping是一个核心注解,用于将HTTP请求映射到特定的处理器方法或类上。

注意:以下代码可利用postman和fiddler观察,这里就不具体的演示。

简单代码示例

@RestController//后续讲解
public class headController {
    @RequestMapping("/hello")
    public String func() {
        return "hello";
    }

启动应用后,在浏览器访问http://171.0.0.1:8080/hello即可触发该方法。

GET请求和POST请求

 //方法一指定请求方法
@RequestMapping(value = "/m1" , method = RequestMethod.GET)
    public String func1() {
        return "m1";
    }

//方法二 使用GetMapping注解
 @GetMapping(value = "/m4")
    public String func4() {
        return "m4";
    }

请求

传递单个参数
// 传递单个参数的情况下
@RequestMapping("/m5")
    public String func5(String name) {
        return "接受到的参数" + name;
    }

咱们使⽤浏览器发送请求并传参 http://127.0.0.1:8080/param/m5?name=spring

注意:如果使用基本类型正常传递参数的情况下为响应200;传递的参数类型不匹配的情况下会返回400;传递的参数为空时会返回500错误;使用在使用过程中包装类和基本类型需挑选使用。

传递多个参数
//传递多个参数的情况下
 @RequestMapping("/m7")
    public String func7(String name , Integer password) {
        return "姓名" + name + "\n" + "密码" + password;
    }
传递对象

现在有个user对象里面封装了对象的账号和密码

   @RequestMapping("/m8")
    public String func8(user user1) {
        return user1.toString();
    }
后端参数重命名(后端参数映射)

使⽤ @RequestParam 来重命名前后端的参数值.

 // 必传参数
    @RequestMapping("/m10")
    public String func10(@RequestParam("time") String name) {
        return "接受到的参数" + name;
    }

 // 非必传参数
    @RequestMapping("/m11")
    public String func11(@RequestParam(value = "time",required = false) String name) {
        return "接受到的参数" + name;
    }

使⽤浏览器发送请求并传参:http://127.0.0.1:8080/param/m10?time=2023-09-12

传递数组
@RequestMapping("/m9")
    public String func9(String[] array) {
        return "可多传参数" + Arrays.toString(array);
    }

数组参数:请求参数名与形参数组名称相同且请求参数为多个,后端定义数组类型形参即可接收参数

传递集合

集合参数:和数组类似,同⼀个请求参数名有为多个,且需要使⽤ @RequestParam 绑定参数关系请求⽅式和数组类似

 @RequestMapping("/m9")
 public String method6(@RequestParam List<String> listParam){
 return "可多传参:"+listParam;
 }
传递JSON数据

JSON字符串和Java对象互转

    //对象转java
//    @Test
//    void testObject2Json() throws JsonProcessingException {
//        ObjectMapper objectMapper = new ObjectMapper();
//        user user = new user("小黑",123456);
//        //对象转json
//        String s = objectMapper.writeValueAsString(user);
//        System.out.println(s);
//    }
    //json转对象
    @Test
    void testJson2Object() throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        //定义一个json字符串
        String s = "{\"username\":\"小黑\",\"password\":123456}";
        //json 转 对象
        user user = objectMapper.readValue(s, user.class);
        System.out.println(user.toString());
    }

传递

接收JSON对象,需要使⽤ @RequestBody 注解

 // 传递json数据
    @RequestMapping("/m12")
    public String func12(@RequestBody user user) {
        return "接受到的参数" + user.toString();
    }
获取URL中参数@PathVariable

这个注解主要作⽤在请求URL路径上的数据绑定,那么我的请求参数就在问号之前了。

/获取URL中参数@PathVariable
    @RequestMapping("/m13/{id}/{name}")
    public String func13(@PathVariable Integer id , @PathVariable String name) {
        return " 解析参数 id:"+id+",name:"+name;
    }
上传⽂件@RequestPart
//上传⽂件@RequestPart
    @RequestMapping("/m14")
    public String func14(@RequestPart("file") MultipartFile file) throws IOException {
        String str = file.getOriginalFilename();
        //⽂件上传到指定路径
        file.transferTo(new File("D:/图片/" + file.getOriginalFilename()));
        return " 接收到⽂件名称为: "+ str;
    }
获取Cookie/Session

Cookie 是客户端存储技术,由服务器发送到用户浏览器并保存在本地的小型数据片段。每次请求时,浏览器会自动将 Cookie 附加到请求头中发送给服务器。

Session 是服务器端存储技术,用于跟踪用户状态。服务器为每个用户创建一个唯一的 Session ID,通常通过 Cookie 传递给客户端。后续请求中,客户端通过 Session ID 与服务器交互,服务器根据 ID 查找对应的用户数据。Session 数据存储在服务器内存或数据库中。

cookie其实就是我们的学生证,是在我们的手中,当我们用他在学校刷某一个需要学生证才可以完成的事情时,服务器就会接受到我们的请求,通过服务器所连接的数据库根据Session ID对我们的信息完成认证。

Cookie 和Session的区别

  • Cookie是客⼾端保存⽤⼾信息的⼀种机制.Session是服务器端保存⽤⼾信息的⼀种机制.
  • Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的 桥梁
  • Cookie和Session经常会在⼀起配合使⽤,但是不是必须配合,完全可以⽤Cookie来保存⼀些数据在客⼾端.这些数据不⼀定是⽤⼾⾝份信息,也不⼀定是 SessionId ,Session中的sessionId也不需要⾮得通过Cookie/Set-Cookie传递,⽐如通过URL传递

获取Cookie

HttpServletRequest , HttpServletResponse 是Servlet提供的两个类,是Spring MVC⽅法的内置对象.需要时直接在⽅法中添加声明即可

HttpServletRequest 对象代表客⼾端的请求,当客⼾端通过HTTP协议访问服务器时,HTTP请 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信 息

HttpServletResponse 对象代表服务器的响应.HTTP响应的信息都在这个对象中,⽐如向客⼾端发送的数据,响应头,状态码等.通过这个对象提供的⽅法,可以获得服务器响应的所有内容 Spring MVC在这两个对象的基础上进⾏了封装,给我们提供更加简单的使⽤⽅法

//获取cookie信息//HttpServletResponse response
    @RequestMapping("/co1")
    public String func15(HttpServletRequest request) {
    //获取所有cookie
        Cookie[] cookie = request.getCookies();
        StringBuilder stringBuilder = new StringBuilder();
        if(cookie != null){
            for(Cookie cookie1 : cookie){
                stringBuilder.append(cookie1.getName()+":"+cookie1.getValue());
            }
        }
        return "cookie:"+stringBuilder;
    }
    //cookie获取简化
    @RequestMapping("/co2")
    public String func16(@CookieValue("bite") String bite) {
        return "bite " + bite;
    }

Session存储

//session存储
    @RequestMapping("/setSess")
    public String setSession(HttpServletRequest request){
        //获取session对象
        HttpSession httpSession = request.getSession();
        if(httpSession != null){
            httpSession.setAttribute("username","zhangsan");
        }
        return "session 存储成功 ";
    }

Session读取

//Session读取
    @RequestMapping("/getSess")
    public String getSession(HttpServletRequest request){
        //获取session对象,如果不存在不会自动创建
        HttpSession httpSession = request.getSession(false);
        String username = null;
        if(httpSession != null && httpSession.getAttribute("username") != null){
            username = (String) httpSession.getAttribute("username");
        }
        return "username:" + username;
    }

    //Session读取简化1
    @RequestMapping("/getSess1")
    public String getSession1(@SessionAttribute(value = "username",required = false) String username)
    {
        return "username:" + username;
    }

    //Session读取简化2
    @RequestMapping("/getSess2")
    public String getSession2(HttpSession httpSession)
    {
        String username = (String) httpSession.getAttribute("username");
        return "username:" + username;
    }
获取head信息
//获取head信息
    @RequestMapping("/head")
    public String func17(HttpServletRequest request){
        String heads = request.getHeader("User-Agent");
        return "请求头中ua信息为:" + heads;
    }

    //简易获取
    @RequestMapping("/head1")
    public String func18(@RequestHeader("User-Agent") String userAgent){
        return "userAgent:"+userAgent;
    }

响应

简单html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>这是一个页面</title>
</head>
<body>
    Hello,Spring MVC, 我是 Index ⻚⾯
</body>
</html>

后台代码

//返回视图的方法
@Controller
//@ResponseBody // 即是类注解又是方法注解,也可以多个数据搭配使用
public class BodyContorller {
    @RequestMapping("/body1")
    public String func1(){
        return "/index.html";
    }
返回HTML代码⽚段

后端返回数据时,如果数据中有HTML代码,也会被浏览器解析

    @RequestMapping("/body3")
    @ResponseBody
    public String func3(){
        return  "<h1>Hello,HTML~</h1>";
    }
返回JSON
 //也可以返回json对象
    @RequestMapping("/body4")
    @ResponseBody
    public HashMap<String, String> func4(){
        HashMap<String, String> map = new HashMap<>();
        map.put("Java", "Java Value");
        map.put("MySQL", "MySQL Value");
        map.put("Redis", "Redis Value");
        return map;
    }
设置状态码
 //设置状态码
    @RequestMapping("/body5")
    @ResponseBody
    public String func5(HttpServletResponse response){
        response.setStatus(401);
        return "设置成功";
    }
设置Content-Type
 @RequestMapping(value = "/body6",produces = "application/json")
    @ResponseBody
    public String func6(){
        return "{\"success\":true}";
    }
设置其他的head
 @RequestMapping(value = "body7")
    @ResponseBody
    public String setHeader(HttpServletResponse response) {
        response.setHeader("MyHeader","MyHeaderValue");
        return " 设置 Header 成功 ";
    }

@Controller@RestController

@Controller@RestController 是 Spring MVC 中用于处理 HTTP 请求的核心注解,二者均用于标记类为控制器(Controller),但设计目标和功能存在差异。


核心功能差异

@Controller

  • 传统 Spring MVC 控制器注解,通常与 @ResponseBody 结合使用。
  • 返回的字符串默认解析为视图名称(View Name)
  • 若需直接返回数据(如 JSON/XML),需在方法上额外添加 @ResponseBody

@RestController

  • @Controller@ResponseBody 的组合注解,简化了 RESTful API 开发。
  • 默认将所有方法的返回值直接序列化为 HTTP 响应体(如 JSON/XML),无需显式添加 @ResponseBody
  • 专为构建无状态、数据驱动的 Web 服务设计。

更多推荐