0


SpringMVC

一.SpringMVC

1.什么是SpringMVC

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

MVC''.

2.什么是MVC

MVC 是 Model View Controller 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分

为模型、视图和控制器三个基本部分

3.SpringMVC的功能

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

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

4.创建SpringMVC项目

勾选SpringWeb即可创建SpringMVC的项目

一个简单的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代码

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>aaa</title>
</head>
<body>
<h1>Hello,SpringMVC</h1>
</body>
</html>

访问页面信息

可以在方法上面加上@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页面了

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

二.注解介绍

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;

    }
}

2.直接通过参数去取

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

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

    }

3.直接获取多个参数

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

    }

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

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

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

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

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

    }

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

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

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

4.对象传参

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

    }

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

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

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

5.后端参数重命名

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

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

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

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

观察源码可以发现默认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字符串的信息的

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

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

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

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

7.从url中拿参数

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

注意的是字段需要保持一致,如果不一致的话,需要在@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";
    }

可以看到是成功上传了的

四.获取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;
    }
}

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

2.获取和设置Session

1.设置Session

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

2.获取Session

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

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

3.获取Header

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

同时这个注解也是必填的参数,可以通过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";
    }

}

3.返回JSON对象

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

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

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

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";

    }

}

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";
    }
}

状态码为302

举例区分

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

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

同:都会发生网页的跳转

异:

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

标签: spring boot spring java

本文转载自: https://blog.csdn.net/qq_64580912/article/details/131898927
版权归原作者 允歆辰丶 所有, 如有侵权,请联系我们删除。

“SpringMVC”的评论:

还没有评论