Spring MVC(一)原理,获取客户端数据,返回客户端数据,重定向和转发

Spring mvc概论

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中.

  1. Spring MVC 是⼀个 Web 框架
  2. Spring MVC 是基于 Servlet API 构建的

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

在这里插入图片描述

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

1.用户的请求首先点到Controller
2.Controller将请求转发给Model
3.Model 处理业务并将数据结果给Controller
4.Controller会将数据给View引擎
5.View 转换数据生成最终的页面给用户

MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现

使用Spring MVC

Spring MVC 可以基于 Spring Boot 创建,也就是创建⼀个 Spring Boot 项⽬,勾选上 Spring Web模块即可。

在这里插入图片描述
Spring MVC·的创建和链接。
Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射。

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。

一、实现客户端和程序之间的“链接”

1.1@RequestMapping

@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/sayHi")
    public String sayHi(){
        return "你好,reader";
    }
}

既可以修饰类,又可以修饰方法。修饰类就就是一级目录,方法是二级目录。
在这里插入图片描述

1.2@GetMapping

实现HTTP链接,但是只支持Gett请求

    @GetMapping("/sayHi")
    public String sayHi(){
        return "你好,reader";
    }

1.3@PostMapping

实现HTTP链接,但是只支持Post请求

    @PostMapping("/sayHi")
    public String sayHi(){
        return "你好,reader";
    }

二、获取参数

2.1用Servlet的方法

@RestController
@RequestMapping("/test2")
public class TestController2 {
    @RequestMapping("/getName")
    public String getName(HttpServletRequest request){
        return "Name:" +request.getParameter("name");
    }

}

可以直接传入值

    @RequestMapping("/getName2")
    public String getName2(String name){
        return "Name:" +name;
    }

诺是可以用一个对象将值进行包裹传入。

    @RequestMapping("/getName3")
    public String getName3(String name,Integer age){
        return "Name:" +name+";Age:"+age;
    }

传入一个对象

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

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

在这里插入图片描述
在这里插入图片描述
传入一个对象,在网页响应,转换整json

后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个time 给后端,⽽后端⼜是有 createtime 字段来接收的,这样就会出现参数接收不到的情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。

    @RequestMapping("/name")
    public String  add2(@RequestParam(value = "n",required = false)String name){
        
        return name;
    }

required 是否必须必须传入。@RequestParam前端传入的是n,后端是name,通过这个注解可以便可以重命名返回。如果我们的实际业务前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的required=false 来避免不传递时报错

使用 @RequestBody接收JSON对象

@RequestBody用来修饰参数。

    @RequestMapping("add_json")
    public User addSon(@RequestBody User user){
        return user;
    }

获取URL中参数@PathVariable

    @RequestMapping("/detail/{aid}/{name}")
    public String datail(@PathVariable("aid")Integer aid,@PathVariable String name){
        return aid+""+name;
    }

通过这个方式可以实现获取url中的变量。并不是字段,与上面是有区别的。

上传文件@RequestPart

客户端上传文件给服务器,必须是POST

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

        return path;
    }

在这里插入图片描述

  @RequestMapping("/upload")
    public String uoload(@RequestPart("myfile")MultipartFile file) throws IOException {
        //生成一个唯一的id及uuid=全球唯一ID->MAc+随及种子+加密算法
        String name= UUID.randomUUID().toString().replace("-","");
        //得到源文件的后缀名
        name+=(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")));
        String path="D:\\image\\"+name;
        //保存文件
        file.transferTo(new File(path));

        return path;
    }

获取Cookie/Session/header

1.获取 Request 和 Response 对象

获取Cookie

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

获取Session

 private static String _SESSION_KEY="SESSION_KEY";
    @RequestMapping("/set_id")
    public String setId(HttpServletRequest request){
        HttpSession session=request.getSession();
        if (session!=null){
            session.setAttribute(_SESSION_KEY,"张三");
            return "session set success";
        }else {
            return "session set fail";
        }
    }
    
    @RequestMapping("/get_sess")
    public String getSess(@SessionAttribute(required = false,value = "SESSION_KEY")String name){
        return name;
    }

获取header

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

获取的单数类型小结:
1.单个参数
2.获取多个参数
3.获取一个普通对象
4.获取一个json对象
5.从URL PATH(非参数部分)获取参数
6.获取文件
7.获取Cookie/Session/header

返回数据

默认请求下⽆论是 Spring MVC 或者是 Spring Boot 返回的是视图(xxx.html),后端只需要返给给前端数据即可,这个时候我们就需要使用@ResponseBody 注解了。

@Controller
@ResponseBody//不加这个返回默认.html类型
public class TestController3 {
    
    @RequestMapping("/index")
    public String index(){
        return "hell.html";
    }
}
  • @ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成application/json
    返回给前端。
  • @ResponseBody 可以⽤来修饰⽅法或者是修饰类,修饰类表示类中的所有⽅法都会返回 html 或者json,⽽不是视图。

请求转发或请求重定向

return 不但可以返回⼀个视图,还可以实现跳转,跳转的⽅式有两种:

  • forward 是请求转发;
  • redirect:请求重定向
// 请求重定向
@RequestMapping("/index")
public String index(){
 return "redirect:/index.html";
}
// 请求转发
@RequestMapping("/index2")
public String index2(){
 return "forward:/index.html";
}

forward 和 redirect 具体区别如下:

  1. 请求重定向(redirect)将请求重新定位到资源(URL发生了改变);请求转发(forward)服务器端转发。(URL不发生改变)
  2. 请求重定向地址发⽣变化,请求转发地址不发⽣变化。
  3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值