• 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 的缩写,它是软件工程中的一种软件架构模式,它把软件系统分
    为模型、视图和控制器三个基本部分

    3.SpringMVC的功能

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

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

    4.创建SpringMVC项目 

     勾选SpringWeb即可创建SpringMVC的项目

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

    Java代码

    1. package com.javastudy.springmvcdemo4.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author Chooker
    6. * @create 2023-07-24 16:58
    7. */
    8. @Controller
    9. @RequestMapping("/web")
    10. public class WebController {
    11. @RequestMapping("/aaa")
    12. public String aaa(){
    13. return "/aaa.html";
    14. }
    15. }

    前端html代码

    1. html>
    2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>aaatitle>
    6. head>
    7. <body>
    8. <h1>Hello,SpringMVCh1>
    9. body>
    10. html>

    访问页面信息

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

    1. package com.javastudy.springmvcdemo4.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.ResponseBody;
    5. /**
    6. * @author Chooker
    7. * @create 2023-07-24 16:58
    8. */
    9. @Controller
    10. @RequestMapping("/web")
    11. public class WebController {
    12. @RequestMapping("/aaa")
    13. @ResponseBody
    14. public String aaa(){
    15. return "Hello2,SpringMVC";
    16. }
    17. }

    这样访问的就不是一个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方法可以拿到客户端传递过来的指定参数

    1. @RestController
    2. @RequestMapping("/param")
    3. public class ParamController {
    4. @RequestMapping("/get1")
    5. public String get1(HttpServletRequest httpServletRequest) {
    6. String name = httpServletRequest.getParameter("name");
    7. return "name : " + name;
    8. }
    9. }

    2.直接通过参数去取

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

    1. @RequestMapping("/get2")
    2. public String get2(String name) {
    3. return "name : " + name;
    4. }

    3.直接获取多个参数

    1. @RequestMapping("/get3")
    2. public String get3(String name,Integer age) {
    3. return "name : " + name+" age : "+age;
    4. }

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

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

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

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

    1. @RequestMapping("/get3")
    2. public String get3(String name,int age) {
    3. return "name : " + name+" age : "+age;
    4. }

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

     

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

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

    4.对象传参

    1. @RequestMapping("/get4")
    2. public String get4(Student student) {
    3. return student.toString();
    4. }

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

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

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

    5.后端参数重命名

    1. @RequestMapping("/get5")
    2. public String get5(@RequestParam("n") String name) {
    3. return "name : " + name;
    4. }
    5. }

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

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

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

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

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

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

    6.传递json字符串

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

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

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

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

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

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

     7.从url中拿参数

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

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

    8.上传文件

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

     

    可以看到是成功上传了的

    四.获取Cookie,Session,Header

    1.获取Cookie

     1.通过之前的方法HttpServeletRequest

    1. @RequestMapping("/get10")
    2. public String get10(@CookieValue String cookie) {
    3. return cookie;
    4. }

     2.通过注解获得

    1. @RequestMapping("/get9")
    2. public String get9(HttpServletRequest httpServletRequest) {
    3. Cookie[] cookies = httpServletRequest.getCookies();
    4. String value = cookies[0].getValue();
    5. return value;
    6. }
    7. }

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

    2.获取和设置Session

     1.设置Session

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

    2.获取Session

    1. @RequestMapping("/get11")
    2. public String get11(@SessionAttribute(required = false) String username) {
    3. return "username = " + username;
    4. }

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

    3.获取Header

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

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

    五.返回数据

    1.返回静态页面

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

    1. package com.javastudy.springmvcdemo4.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author Chooker
    6. * @create 2023-07-24 16:58
    7. */
    8. @Controller
    9. @RequestMapping("/web")
    10. public class WebController {
    11. @RequestMapping("/aaa")
    12. public String aaa(){
    13. return "/aaa.html";
    14. }
    15. }

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

    2.返回text/html

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

    1. package com.javastudy.springmvcdemo4.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author Chooker
    6. * @create 2023-07-24 16:58
    7. */
    8. @Controller
    9. @RequestMapping("/web")
    10. public class WebController {
    11. @RequestMapping("/aaa")
    12. @ResponseBody
    13. public String aaa(){
    14. return "/aaa.html";
    15. }
    16. }

      

    3.返回JSON对象

    1. @RequestMapping("/get14")
    2. public HashMap get14() {
    3. HashMap map = new HashMap<>();
    4. map.put("key1", "value1");
    5. map.put("key2", "value2");
    6. map.put("key3", "value3");
    7. return map;
    8. }

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

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

    1.请求转发

    1. package com.javastudy.springmvcdemo4.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author Chooker
    6. * @create 2023-07-25 12:25
    7. */
    8. @RequestMapping("/index")
    9. @Controller
    10. public class IndexController {
    11. //请求转发
    12. @RequestMapping("/forward")
    13. public String forward() {
    14. return "forward:/aaa.html";
    15. }
    16. }

    2.请求重定向 

    1. package com.javastudy.springmvcdemo4.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. /**
    5. * @author Chooker
    6. * @create 2023-07-25 12:25
    7. */
    8. @RequestMapping("/index")
    9. @Controller
    10. public class IndexController {
    11. //请求重定向
    12. @RequestMapping("/redirect")
    13. public String redirect() {
    14. return "redirect:/aaa.html";
    15. }
    16. }

    状态码为302

    举例区分

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

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

    同:都会发生网页的跳转

    异:

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

  • 相关阅读:
    springmvc
    网络原理(网络协议初识)
    【CSDN竞赛第11期】编程竞赛总结
    Python:求求按规范写我
    接口自动化框架篇:流程封装与基于加密接口的测试用例设计
    简单的无限debugger解决eval
    【Qt之QString】数值与进制字符串间的转换详解
    Java 文件上传与下载
    SpringBoot文件上传下载
    java-php-net-python-杉杉奥莱服装配饰订制与自主选购系统计算机毕业设计程序
  • 原文地址:https://blog.csdn.net/qq_64580912/article/details/131898927