SpringMVC

SpringMVC

概念:

1.SpringMVC是Spring框架后续开发的web模块.主要负责与前端用户进行交互.
2.SpringMVC基于Servlet进行开发的框架,目的简化前后端的调用.

SpringMVC入门案例

创建项目

在这里插入图片描述

勾选jar包

在这里插入图片描述

 测试Tomact服务器是否正常使用

在这里插入图片描述

 编辑HelloController

package com.jt.controller;

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

@Controller
public class HelloController {
    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){
        return "你好MVC";
    }
}

页面效果

 URL1: http://localhost:8080/hello
URL2: http://127.0.0.1:8080/hello

 SpringMVC底层实现原理

在这里插入图片描述

重要组件:
1. 前端控制器 DispatcherServlet
2. 处理器映射器 handlerMapping
3. 处理器适配器 handlerAdapter
4. 视图解析器 ViewResolver

SpringMVC调用流程:
1. 用户发起请求之后,第一步访问就是前端控制器.
2. 前端控制器只负责请求的转发/响应. 没有办法直接处理业务.
3.当SpringMVC容器启动时,处理器映射器首先会加载所有的@RequestMapping注解.将请求路径与方法进行绑定.保存到Map中. Map</url,method方法>, 当前端控制器发送请求被处理器映射器接收.如果URL地址匹配,则告知应该执行哪个方法.如果url地址不匹配.,则提示用户404

前端控制器得知将要执行的方法是谁,但是前端控制只能转发,没有办法执行业务.
所以请求处理器适配器执行业务逻辑.

处理器适配器针对配置文件(xml方式/注解方式/其它方式)的格式,挑选合适的处理器去执行业务逻辑. 业务执行成功之后返回ModelAndView对象 Model:业务数据 View:页面

历史版本: 需要返回页面名称,及将数据填充到页面中
6. 前端控制器接收到返回的ModelAndView之后,交给视图解析器去解析数据. 视图解析器通过自身的配置获取页面的名称 (/web/user.html).
7. 最终通过经过视图渲染,将数据填充到页面中.最终用户看到的页面就包含了业务数据.

前后端分离方式:
关键用法: @ResponseBody 要求返回业务数据并且转化为JSON串. 程序直接跳过6-7直接将数据返回给用户.

SpringMVC 参数接收用法

Servlet版本:

package com.jt.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class UserController {
    @RequestMapping("/findUser")
    @ResponseBody  //响应 JSON
    //request.getParameter返回值都是string类型
    public String findUser(HttpServletRequest request, HttpServletResponse response){
        String id = request.getParameter("id");
        //将string类型转化为int
        int intid=Integer.parseInt(id);
        String name = request.getParameter("name");
        return intid+":"+name;
    }
}

运行结果:

 MVC版本

方式一:直接接收

优点:自动转化参数类型

package com.jt.controller;

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


@Controller
public class UserController {
    @RequestMapping("/findUser2")
    @ResponseBody
    public String findUser2(Integer id,String name){
        return id+":"+name;
    }
}

运行结果:

 优化

package com.jt.controller;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@RestController //@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/findUser")
    //request.getParameter返回值都是string类型
    public String findUser(HttpServletRequest request, HttpServletResponse response){
        String id = request.getParameter("id");
        //将string类型转化为int
        int intid=Integer.parseInt(id);
        String name = request.getParameter("name");
        return intid+":"+name;
    }
    @RequestMapping("/findUser2")
    public String findUser2(Integer id,String name){
        return id+":"+name;
    }
}

方式二:使用对象接收参数

 /**
     * url:http://localhost:8080/user/getUser?id=1&name=李四&age=18
     * 返回值: User对象
     * 知识点:
     *   当遇到多个参数时,可以使用对象封装.
     *   要求对象的属性必须与参数名称一致,同时必须有Set/Get方法.
     *   SpringMVC会自动的将参数赋值给对象的属性.
     */
    @RequestMapping("/getUser")
    public User getUser(User user){
        return user;
    }

RestFul结构

RestFul语法

1.URL中请求的参数使用/分割
用户写的: http://localhost:8080/user/restFul/1/张三

2.服务器端参数接收时,变量使用{xx}进行包裹,并且位置固定.

3.利用@PathVariable注解,动态获取路径中的数据,要求名称必须匹配

 /**
     * RestFul结构 动态接收参数
     * url: http://localhost:8080/user/restFul/1/张三
     * 返回值: 返回User对象
     * 难点: 需要从URL的路径中获取参数!!!
     * 语法:
     *  1.服务器端参数接收时,变量使用{xx}进行包裹,并且位置固定.
     *  2.利用@PathVariable注解,动态获取路径中的数据,要求名称必须匹配
     */
    @RequestMapping("/restFul/{id}/{name}")
    public User restFul(@PathVariable Integer id,
                        @PathVariable String name){
        User user = new User();
        user.setId(id);
        user.setName(name);
        return user;
    }

运行结果:

运行

 RestFul结构对象传参

  /**
     * URL: http://localhost:8080/user/restFul2/1/王五/18
     * RestFul对象接收:
     *   如果对象的属性与{key}相同,则可以使用对象接收.
     * 用途: restFul结构 一般用于更新操作
     * @param user
     * @return
     */
    @RequestMapping("/restFul2/{id}/{name}")
    public User restFul2(User user){

        return user;
    }

 运行结果

请求类型与业务的关系

请求类型

在这里插入图片描述

规则: 随着业务深入,请求类型与业务渐渐的绑定.

新增: post请求类型 @PostMapping("")

删除: delete请求类型 @DeleteMapping("")

修改: put请求类型 @PutMapping("")

查询: get请求类型 @GetMapping("")

package com.jt.controller;

import com.jt.jopo.User;

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

@RestController //@Controller+@ResponseBody
@RequestMapping("/user")
public class UserController {

    @GetMapping("/restful2/{id}/{name}")
    public User restful2(User user){
        return user;
    }
}

运行结果:

 注解:

@RequestMapping():负责用户的请求路径与后台服务器的映射关系

@ResponseBody:将服务器的返回值转化为JSON

@RestController:@RestController==@Controller+@ResponseBody

@PathVariable:动态获取路径中的数据,要求名称必须匹配

@PostMapping(""):新增:post请求类型

@DeleteMapping(""):删除: delete请求类型

@PutMapping(""):put请求类型 @PutMapping("")

@GetMapping(""):get请求类型 @GetMapping("")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值