SpringMVC

目录

一.SpringMVC

1.什么是SpringMVC

2.什么是MVC

3.SpringMVC的功能

4.创建SpringMVC项目 

二.注解介绍

1.RequestMapping注解

2.ResponseBody注解

3.RestController注解

三.获取参数

1.通过HttpServletRequest拿到参数

2.直接通过参数去取

3.直接获取多个参数

4.对象传参

5.后端参数重命名

6.传递json字符串

 7.从url中拿参数

8.上传文件

四.获取Cookie,Session,Header

1.获取Cookie

 1.通过之前的方法HttpServeletRequest

 2.通过注解获得

2.获取和设置Session

 1.设置Session

2.获取Session

​编辑

3.获取Header

五.返回数据

1.返回静态页面

2.返回text/html

3.返回JSON对象

六.请求转发和请求重定向

1.请求转发

2.请求重定向 

3. 请求转发和请求重定向异同


一.SpringMVC

1.什么是SpringMVC

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从一开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来自其源模块的名称(Spring-webmvc),但它通常被称为“Spring
MVC''.

2.什么是MVC

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

3.SpringMVC的功能

1.连接的功能:将用户(浏览器)和Java程序连接起来,也就是访问一个地址能够调用到我们的Spring程序。
2.获取参数的功能:用户访问的时候会带一些参数,在程序中要想办法获取到参数。

3.输出数据的功能:执行了业务逻辑之后,要把程序执行的结果返回给用户。

4.创建SpringMVC项目 

SpringMVC_第2张图片 勾选SpringWeb即可创建SpringMVC的项目

SpringMVC_第3张图片

 一个简单的SpringMVC接口(这个只能访问一个页面)

Java代码

package com.javastudy.springmvcdemo4.controller;

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

/**
 * @author Chooker
 * @create 2023-07-24 16:58
 */
@Controller
@RequestMapping("/web")
public class WebController {
    @RequestMapping("/aaa")
    public String aaa(){
        return "/aaa.html";
    }

}

前端html代码




    
    aaa


Hello,SpringMVC

访问页面信息

SpringMVC_第4张图片

可以在方法上面加上@Response注解 

package com.javastudy.springmvcdemo4.controller;

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

/**
 * @author Chooker
 * @create 2023-07-24 16:58
 */
@Controller
@RequestMapping("/web")
public class WebController {
    @RequestMapping("/aaa")
    @ResponseBody
    public String aaa(){
        return "Hello2,SpringMVC";
    }

}

这样访问的就不是一个html页面了

SpringMVC_第5张图片

 接下来我们重点介绍这些注解

二.注解介绍

1.RequestMapping注解

@RequestMapping既可以修饰类,也可以修饰方法

同时支持get和post方法,两种方法访问路径的时候都支持

有两个参数,value参数可以指定访问的路径,method方法可以指定访问的方法,当我们使用别的方法访问的时候,会报如下错误

//仅允许get方法访问
@RequestMapping(value = "/aaa",method = RequestMethod.GET)

//仅允许post方法访问

@RequestMapping(value = "/aaa",method = RequestMethod.POST)

 也可以直接改为@GetMapping或者@PostMapping

@GetMapping 等同于 @RequestMapping(method = RequestMethod.GET)

@PostMapping等同于 @RequestMapping(method = RequestMethod.POST)

2.ResponseBody注解

@ResponseBody 返回的值如果是字符会转换成 text/html,如果返回的是对象会转换成
application/json 返回给前端。
@ResponseBody 可以用来修饰方法或者是修饰类,修饰类表示类中的所有方法都会返回 html 或者 json,而不是视图。

返回的是一个数据,而不是视图

3.RestController注解

可以在类上面加@RestController注解来替代@ResponseBody和@Controller注解,因为@Controller只能修饰类,所以@RestController注解只能修饰类,并且这个类中所有的方法的返回都只能只会返回 html 或者 json,方法一律不能返回视图,因此如果这个类中有的方法需要返回视图,我们不能使用这个组合注解@ResponseBody

三.获取参数

1.通过HttpServletRequest拿到参数

因为SpringMVC是基于Servlet框架的,因此方法的参数中可以使用HttpServletRequest 和HttpServletResponse.

因此通过HttpServletRequest中的getParameter方法可以拿到客户端传递过来的指定参数

@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/get1")
    public String get1(HttpServletRequest httpServletRequest) {
        String name = httpServletRequest.getParameter("name");
        return "name : " + name;

    }
}

SpringMVC_第6张图片

2.直接通过参数去取

直接在方法的参数列表写需要的参数,就可以取到参数,要求是参数列表中的参数的名字和url中的名字一致

    @RequestMapping("/get2")
    public String get2(String name) {
        return "name : " + name;

    }

SpringMVC_第7张图片

3.直接获取多个参数

    @RequestMapping("/get3")
    public String get3(String name,Integer age) {
        return "name : " + name+"  age : "+age;

    }

 自动匹配名字一致的参数,和url中的顺序无关,并进行了类型的转换

SpringMVC_第8张图片

 如果不对age进行传参,会有如下结果.

如果类型无法出现转换,会报以下错误 

SpringMVC_第9张图片

将age的类型改为基本数据类型int,不对age进行传参 

    @RequestMapping("/get3")
    public String get3(String name,int age) {
        return "name : " + name+"  age : "+age;

    }

如何此时不对age进行传参,会报500的错误

SpringMVC_第10张图片

 SpringMVC_第11张图片

 错误传参和之前的错误一样,都是报400错误

 总结:在项目开发的过程中,使用包装类更加的保险

4.对象传参

    @RequestMapping("/get4")
    public String get4(Student student) {
        return student.toString();

    }

SpringMVC_第12张图片

思考:当我们使用其他方式进行传参,比如表单,ajax传参,会发生改变吗?

SpringMVC_第13张图片

 由上图可知,不会发生改变

总结:前端不论用什么方式进行传参,后端都可以通过这些方法接收到参数,因此后端只需要关心后端的处理逻辑即可

5.后端参数重命名

    @RequestMapping("/get5")
    public String get5(@RequestParam("n") String name) {
        return "name : " + name;
    }
}

将调用方发送的参数n,重命名为name

SpringMVC_第14张图片

 那当我们不传这个参数的时候会发生什么情况呢?

SpringMVC_第15张图片

 可以看到会报这个错误,但是之前我们没有传参数的时候默认为null,不会报这个错误,这个时候为什么会出现这个错误呢?

SpringMVC_第16张图片

观察源码可以发现默认required是true,因此加了@RequestParam的参数是必填参数,我们可以进行修改,使为不必填参数

    @RequestMapping(name = "/get5")
    public String get5(@RequestParam(name = "n",required = false) String name) {
        return "name : " + name;
    }

此时再传参数就不会报错误了.

6.传递json字符串

    @RequestMapping("/get6")
    public String get6(Student student) {
        return student.toString();
    }

如何我们此时直接发送,我们可以看到student是接受不到json字符串的信息的

SpringMVC_第17张图片

 此时我们给Student对象加上@RequestBody 注解,再来观察

    @RequestMapping("/get6")
    public String get6(@RequestBody Student student) {
        return student.toString();
    }

SpringMVC_第18张图片

 这个时候接收到的信息是正确的,因此只要只有加了@RequestBody注解系统才会将json字符串转换为对象

但当我们加了@RequestBody注解,接收到的却不是json字符串,会报以下的错误

SpringMVC_第19张图片

 7.从url中拿参数

    @RequestMapping("/get7/{shopid}/{dealid}")
    public String get7(@PathVariable Integer shopid, @PathVariable("dealid") Integer dealId) {
        return "shopId=" + shopid + "  dealid= " + dealId;
    }

SpringMVC_第20张图片

 注意的是字段需要保持一致,如果不一致的话,需要在@PathVariable中设置参数的名称

8.上传文件

    @RequestMapping("/get8")
    public String get8(@RequestPart("file") MultipartFile file) throws IOException {
        log.info(file.getOriginalFilename());
        file.transferTo(new File("D:\\java cave\\temp\\" + file.getOriginalFilename()));
        return "success";
    }

SpringMVC_第21张图片

 SpringMVC_第22张图片

可以看到是成功上传了的

四.获取Cookie,Session,Header

1.获取Cookie

 1.通过之前的方法HttpServeletRequest

    @RequestMapping("/get10")
    public String get10(@CookieValue String cookie) {
        return cookie;
    }

 2.通过注解获得

    @RequestMapping("/get9")
    public String get9(HttpServletRequest httpServletRequest) {
        Cookie[] cookies = httpServletRequest.getCookies();
        String value = cookies[0].getValue();
        return value;
    }
}

SpringMVC_第23张图片

SpringMVC_第24张图片

同时这个注解也是必填的参数,可以通过required=false设置为非必填的 

2.获取和设置Session

 1.设置Session

    @RequestMapping("/set11")
    public String set11(HttpSession session) {
        session.setAttribute("username", "张三");
        return "success";
    }

SpringMVC_第25张图片

2.获取Session

    @RequestMapping("/get11")
    public String get11(@SessionAttribute(required = false) String username) {
        return "username = " + username;
    }

SpringMVC_第26张图片

 同时这个注解也是必填的参数,可以通过required=false设置为非必填的 

3.获取Header

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

SpringMVC_第27张图片

 同时这个注解也是必填的参数,可以通过required=false设置为非必填的 

五.返回数据

1.返回静态页面

如果注解不加@ResponseBody就是返回直接映射到一个静态的页面

package com.javastudy.springmvcdemo4.controller;

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

/**
 * @author Chooker
 * @create 2023-07-24 16:58
 */
@Controller
@RequestMapping("/web")
public class WebController {
    @RequestMapping("/aaa")
    public String aaa(){
        return "/aaa.html";
    }

}

直接映射到 这个aaa.html页面

2.返回text/html

只需要在方法前面加上@ResponseBody注解竟可以返回一个text/html文字了

package com.javastudy.springmvcdemo4.controller;

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

/**
 * @author Chooker
 * @create 2023-07-24 16:58
 */
@Controller
@RequestMapping("/web")
public class WebController {
    @RequestMapping("/aaa")
    @ResponseBody
    public String aaa(){
        return "/aaa.html";
    }

}

SpringMVC_第28张图片  

3.返回JSON对象

    @RequestMapping("/get14")
    public HashMap get14() {
        HashMap map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        map.put("key3", "value3");
        return map;
    }

 可以看到当我们返回的是HashMap的时候,自动返回的就是一个Json字符串对象

SpringMVC_第29张图片

六.请求转发和请求重定向

1.请求转发

package com.javastudy.springmvcdemo4.controller;

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

/**
 * @author Chooker
 * @create 2023-07-25 12:25
 */
@RequestMapping("/index")
@Controller
public class IndexController {
    //请求转发
    @RequestMapping("/forward")
    public String forward() {
        return "forward:/aaa.html";

    }

}

SpringMVC_第30张图片

2.请求重定向 

package com.javastudy.springmvcdemo4.controller;

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

/**
 * @author Chooker
 * @create 2023-07-25 12:25
 */
@RequestMapping("/index")
@Controller
public class IndexController {

    //请求重定向
    @RequestMapping("/redirect")
    public String redirect() {
        return "redirect:/aaa.html";
    }
}

SpringMVC_第31张图片

状态码为302

SpringMVC_第32张图片

举例区分

forward(请求转发)和 redirect(请求重定向)的区别,举例来说,例如,你告诉你妈妈,你想吃辣条,如果你妈妈,说好,我帮你去买,这就是 forward 请求转发;如果你妈妈让你自己去买,那么就是请求 redirect 重定向。 

3. 请求转发和请求重定向异同

同:都会发生网页的跳转

异:

1、请求转发是服务器行为、请求重定向是客户端浏览器行为
2、请求转发是request对象调用方法、请求重定向是response对象调用方法
3、请求转发只有一次请求所以可以实现request域对象中的数据共享,而请求重定向是多次请求、多次响应
4、请求转发的效率要高于请求重定向
5、请求转发url地址栏不变,而请求重定向会发生变化
6、既然请求转发是服务器内部的行为,所以只能访问服务器内部资源.而请求重定向既然是浏览器行为,地址栏会变,所以可以访问服务器外部资源
SpringMVC_第33张图片

你可能感兴趣的:(SSM,spring,boot,spring,java)