SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)

目录

前言

一、SpringMVC之常用注解

1. 注解说明

2. 扩展延伸

3. 注解的作用展示

导入slf4j的相关依赖及配置项目

 pom.xml文件

二、参数传递

1. 基础类型+String类型

测试代码

测试结果

页面

控制台

2. 复杂类型

测试代码

测试结果

页面

控制台

​编辑

3. @RequestParam

测试代码

测试结果

结果一:

结果二:

结果三:

4. @PathVariable

测试代码

测试结果

页面

 控制台输出

 5.@RequestBody

导入@RequestBody依赖

测试代码

 第三方软件测试操作

控制台输出结果

 6. @RequestHeader

测试代码

第三方测试操作

 控制台输出结果

 三、方法返回值

案例一:void

借助工具类

测试类代码

测试结果(页面显示结果)

案例二:String

案例三:String+model

jsp文件代码

 测试代码

运行测试结果

 案例四:ModelAndView

测试代码

jsp文件

测试结果

 四、页面跳转

测试代码

场景一:(转发到后台的某一个方法(当前类))

测试结果

场景二:(转发到后台的某一个方法(其他类))

测试结果

场景三:(重定向到后台的某一个方法(当前类))

测试结果

场景四:(重定向到后台的某一个方法(其他类))

测试结果

结论


前言

在上一期的博客中我们初步的了解学习SpringMVC框架的一些基础知识,也领略到了一些SpringMVC框架在开发中对我们的帮助与好处,今天这期博客各位老铁跟着我继续来学习SpringMVC的相关知识吧。

一、SpringMVC之常用注解

1. 注解说明

  1. @Controller:用于标识一个类是SpringMVC的控制器,它接收用户请求并返回相应的视图或数据

  2. @RequestMapping:用于映射请求的URL路径到控制器的处理方法。可以在类级别和方法级别使用,用于处理各种HTTP请求(GET、POST、PUT等)

  3. @RequestParam:用于将请求参数绑定到处理方法的参数上。可以指定参数的名称、是否必须以及默认值。

  4. @PathVariable:用于将URL中的占位符参数绑定到处理方法的参数上。通常用于RESTful风格的URL。

  5. @ResponseBody:用于将方法的返回值直接作为HTTP响应的内容返回给客户端。适用于返回JSON、XML等非HTML格式的数据

  6. @ModelAttribute:用于将请求参数绑定到一个对象上,并将该对象添加到模型中,可以在视图中获取。

  7. @RequestHeader:注解可以获取指定的请求头信息。

  8. @CookieValue:主要是将请求的Cookie数据,映射到功能处理方法的参数上。

2. 扩展延伸

springMVC注解
注解 说明
@GetMapping 处理get方式请求的映射
@PostMapping 处理post方式请求的映射
@PutMapping: 处理put方式请求的映射
@DeleteMapping 处理delete方式请求的映射
@RequestMapping(method=RequestMethod.GET) 它会将get映射到特定的方法上

3. 注解的作用展示

springMVC注解的作用领域
领域 作用说明
请求映射 指定URL路径与处理方法的映射关系,将请求分发到对应的方法进行处理。(如@RequestMapping、@GetMapping、@PostMapping等)
参数绑定 将请求中的参数绑定到方法的参数上,方便获取和处理请求参数。(如@RequestParam、@PathVariable、@RequestBody等)
响应处理 将方法的返回值转换为HTTP响应体,并返回给客户端。可以方便地返回JSON、XML等格式的数据。(如@ResponseBody、@RestController等)
表单处理 将方法的返回值转换为HTTP响应体,并返回给客户端。可以方便地返回JSON、XML等格式的数据。(如@ResponseBody、@RestController等)
异常处理 处理应用程序中出现的异常情况,并返回适当的错误信息或页面。(如@ExceptionHandler、@ControllerAdvice等)
会话管理 在会话中存储和获取数据,实现会话管理的功能。(如@SessionAttribute、@SessionAttributes等)
配置管理 配置和管理SpringMVC框架中的各种组件和配置项。(如@Configuration、@Bean、@ComponentScan等)

导入slf4j的相关依赖及配置项目

首先将pom.xml文件中原有的log4j的插件依赖替换为Slf4j的插件依赖,以及原有的log4j的核心包全替换为Slf4j的核心包。

 pom.xml文件




  4.0.0

  com.yx
  yx_ssm
  1.0-SNAPSHOT
  war

  yx_ssm Maven Webapp
  
  http://www.example.com

  
    UTF-8
    1.8
    1.8
    3.7.0

    
    
    5.0.2.RELEASE
    
    3.4.5
    
    5.1.44
    
    5.1.2
    
    1.3.1
    
    2.1.1
    2.4.3
    
    
    2.9.1
    3.2.0
    1.7.13
    
    4.12
    4.0.0
    1.18.2

    
    1.2
    1.1.2
    
    5.0.2.RELEASE
  


  
    
    
      org.springframework
      spring-context
      ${spring.version}
    
    
      org.springframework
      spring-orm
      ${spring.version}
    
    
      org.springframework
      spring-tx
      ${spring.version}
    
    
      org.springframework
      spring-aspects
      ${spring.version}
    
    
      org.springframework
      spring-web
      ${spring.version}
    
    
      org.springframework
      spring-test
      ${spring.version}
    

    
    
      org.mybatis
      mybatis
      ${mybatis.version}
    
    
    
      mysql
      mysql-connector-java
      ${mysql.version}
    
    
    
      com.github.pagehelper
      pagehelper
      ${pagehelper.version}
    
    
    
      org.mybatis
      mybatis-spring
      ${mybatis.spring.version}
    

    
    
      org.apache.commons
      commons-dbcp2
      ${commons.dbcp2.version}
    
    
      org.apache.commons
      commons-pool2
      ${commons.pool2.version}
    

    
    
    
    
      org.slf4j
      slf4j-api
      ${slf4j.version}
    
    
      org.slf4j
      jcl-over-slf4j
      ${slf4j.version}
      runtime
    

    
    
      org.apache.logging.log4j
      log4j-api
      ${log4j2.version}
    
    
      org.apache.logging.log4j
      log4j-core
      ${log4j2.version}
    
    
    
      org.apache.logging.log4j
      log4j-slf4j-impl
      ${log4j2.version}
    
    
    
      org.apache.logging.log4j
      log4j-web
      ${log4j2.version}
      runtime
    

    
    
      com.lmax
      disruptor
      ${log4j2.disruptor.version}
    
    
    
      junit
      junit
      ${junit.version}
      test
    
    
      javax.servlet
      javax.servlet-api
      ${servlet.version}
      provided
    

    
      org.projectlombok
      lombok
      ${lombok.version}
      provided
    

    
      junit
      junit
      4.12
      compile
    

    
    
      org.springframework
      spring-webmvc
      ${spring.version}
    
    
      jstl
      jstl
      ${jstl.version}
    
    
      taglibs
      standard
      ${standard.version}
    

  

  
    yx_ssm
    
      
      
        src/main/java
        
          **/*.xml
        
      
      
      
        src/main/resources
        
          jdbc.properties
          *.xml
        
      
    
      
        
          org.apache.maven.plugins
          maven-compiler-plugin
          ${maven.compiler.plugin.version}
          
            ${maven.compiler.source}
            ${maven.compiler.target}
            ${project.build.sourceEncoding}
          
        
        
          org.mybatis.generator
          mybatis-generator-maven-plugin
          1.3.2
          
            
            
              mysql
              mysql-connector-java
              ${mysql.version}
            
          
          
            true
          
        

        
          maven-clean-plugin
          3.1.0
        
        
        
          maven-resources-plugin
          3.0.2
        
        
          maven-compiler-plugin
          3.8.0
        
        
          maven-surefire-plugin
          2.22.1
        
        
          maven-war-plugin
          3.2.2
        
        
          maven-install-plugin
          2.5.2
        
        
          maven-deploy-plugin
          2.8.2
        
      
  

 SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第1张图片

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第2张图片SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第3张图片 

二、参数传递

配置运行项目

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第4张图片

1. 基础类型+String类型

测试代码

package com.yx.web;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-05 15:22
 * 用于实现参数传递的控制器类
 */
@Slf4j
@Controller
@RequestMapping("/yx")
public class ParamController {
    
    @RequestMapping("/test01")//标记方法
    public String test01a(String bname,Integer bid){//参数
        log.info("简单类型参数:bname:{},bid:{}",bname,bid);
        return "index";//返回的页面
    }
    
}

测试结果

页面

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第5张图片

控制台

2. 复杂类型

测试代码

package com.yx.web;

import com.yx.model.Book;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-05 15:22
 * 用于实现参数传递的控制器类
 */
@Slf4j
@Controller
@RequestMapping("/yx")
public class ParamController {

    @RequestMapping("/test02")//标记方法
    public String test02(Book book, HttpServletRequest request){//参数
        //        复杂传参输出方式01
        log.info("复杂类型参数:bname:{},bid:{},price{}",
                request.getParameter("bname"),
                request.getParameter("bid"),
                request.getParameter("price"));
//        复杂传参输出方式02
        log.info("复杂类型参数:book:{}",book.toString());
        return "index";//返回的页面
    }
}

测试结果

页面

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第6张图片

控制台

3. @RequestParam

测试代码

package com.yx.web;

import com.yx.model.Book;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-05 15:22
 * 用于实现参数传递的控制器类
 */
@Slf4j
@Controller
@RequestMapping("/yx")
public class ParamController {

    @RequestMapping("/test03")//标记方法
    public String test03(
           @RequestParam String bname,
           @RequestParam(required = false) Integer bid){//参数
        log.info("@requestParam传参:bname:{},bid:{}",bname,bid);
        return "index";//返回的页面
    }
}

测试结果

结果一:

页面

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第7张图片

控制台输出

结果二:

页面

控制台

结果三:

页面

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第8张图片

控制台输出

不会输出任何结果。

注:@RequestParam的required属性

 该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。

4. @PathVariable

测试代码

package com.yx.web;

import com.yx.model.Book;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-05 15:22
 * 用于实现参数传递的控制器类
 */
@Slf4j
@Controller
@RequestMapping("/yx")
public class ParamController {

    @RequestMapping("/test04/{bid}")//标记方法
    public String test04(
           @PathVariable("bid") Integer bid){//参数
        log.info("@PathVariable传参:bid:{}",bid);
        return "index";//返回的页面
    }

}

测试结果

页面

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第9张图片

 控制台输出

 5.@RequestBody

导入@RequestBody依赖

 2.9.3
//======以上代码添加到pom.xml文件中的 标签中=======================
//======以下代码添加到pom.xml文件中的 标签中====================

      com.fasterxml.jackson.core
      jackson-databind
      ${jackson.version}
    
    
      com.fasterxml.jackson.core
      jackson-core
      ${jackson.version}
    
    
      com.fasterxml.jackson.core
      jackson-annotations
      ${jackson.version}
    

测试代码

请使用postman或者apipost/eolink等工具发送请求数据。因为浏览器无法携带集合参数,所以借助第三方软件进行测试。

 

package com.yx.web;

import com.yx.model.Book;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-05 15:22
 * 用于实现参数传递的控制器类
 */
@Slf4j
@Controller
@RequestMapping("/yx")
public class ParamController {


    @RequestMapping("/test05")//标记方法
    public String test05(
           @RequestBody Map map){//参数
        log.info("@RequestBody传参:map:{}",map);
        return "index";//返回的页面
    }
}

 第三方软件测试操作

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第10张图片

控制台输出结果

 6. @RequestHeader

测试代码

package com.yx.web;

        import com.yx.model.Book;
        import lombok.extern.slf4j.Slf4j;
        import org.springframework.stereotype.Controller;
        import org.springframework.web.bind.annotation.*;

        import javax.servlet.http.HttpServletRequest;
        import java.util.Map;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-05 15:22
 * 用于实现参数传递的控制器类
 */
@Slf4j
@Controller
@RequestMapping("/yx")
public class ParamController {

    @RequestMapping("/test06")//标记方法
    public String test06(
            @RequestHeader("jwt") String jwt){//参数
        log.info("@RequestHeader传参:jwt:{}",jwt);
        return "index";//返回的页面
    }

}

第三方测试操作

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第11张图片

 控制台输出结果

 三、方法返回值

创建一个ReturnController类模拟测试案例

案例一:void

借助工具类

package com.yx.untils;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

public class ResponseUtil {

	public static void write(HttpServletResponse response,Object o)throws Exception{
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		out.println(o.toString());
		out.flush();
		out.close();
	}
	
	public static void writeJson(HttpServletResponse response,Object o)throws Exception{
		ObjectMapper om = new ObjectMapper();
//		om.writeValueAsString(o)代表了json串
		write(response, om.writeValueAsString(o));
	}
}

测试类代码

package com.yx.web;

import com.yx.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-06 18:45
 * 测试类
 */
@Controller
@RequestMapping("/rs")
public class ReturnController {

    @RequestMapping("/hello1")
    public void hello1(HttpServletResponse response){
        Map map=new HashMap<>();
        map.put("code",200);
        map.put("msg","成功添加...");
        try {
            ResponseUtil.writeJson(response,map);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

测试结果(页面显示结果)

案例二:String

该返回值类型在前面的参数传递中已经体现了。

案例三:String+model

jsp文件代码

<%--
  Created by IntelliJ IDEA.
  User: 86158
  Date: 2023/9/5
  Time: 15:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


Hello 君易--鑨

名称:${name} 地址:${address}

 测试代码

package com.yx.web;

import com.yx.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-06 18:45
 * 测试类
 */
@Controller
@RequestMapping("/rs")
public class ReturnController {

    @RequestMapping("/hello2")
    public String hello2(Model model,
                       HttpServletRequest request){
          model.addAttribute("name","君易--鑨");
          request.setAttribute("address","长沙");
      return "index";
    }


}

运行测试结果

 案例四:ModelAndView

测试代码

package com.yx.web;

import com.yx.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-06 18:45
 * 测试类
 */
@Controller
@RequestMapping("/rs")
public class ReturnController {


    @RequestMapping("/hello3")
    public ModelAndView hello3(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("sign","真厉害");
        mv.setViewName("index");
        return mv;
    }
}

jsp文件

<%--
  Created by IntelliJ IDEA.
  User: 86158
  Date: 2023/9/5
  Time: 15:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


Hello 君易--鑨

名称:${name} 地址:${address} 评价:${sign}

测试结果

 四、页面跳转

测试代码

package com.yx.web;

import com.yx.untils.ResponseUtil;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-06 18:45
 * 测试类
 */
@Controller
@RequestMapping("/rs")
public class ReturnController {


//    场景一
    @RequestMapping("/hello4")
    public String hello4(){
        System.out.println("hello4...");
        return "forward:hello2";
    }

//    场景二:
    @RequestMapping("/hello5")
    public String hello5(){
        System.out.println("hello5...");
        return "forward:/yx/test05";
    }
//    场景三:
    @RequestMapping("/hello6")
    public String hello6(){
        System.out.println("hello6...");
        return "redirect:hello2";
    }

    //    场景四:
    @RequestMapping("/hello7")
    public String hello7(){
        System.out.println("hello7...");
        return "redirect:/yx/test05";
    }

}

场景一:(转发到后台的某一个方法(当前类))

测试结果

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第12张图片

场景二:(转发到后台的某一个方法(其他类))

测试结果

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第13张图片​​​​​​​

场景三:(重定向到后台的某一个方法(当前类))

测试结果

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第14张图片

场景四:(重定向到后台的某一个方法(其他类))

测试结果

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第15张图片

 

结论

  • 返回值中有forward、redirect,那么会绕过试图解析器。
  • 重定向会改变请求路径,转发不会。​​​​​​​

 这期分享到此结束,感谢各位老铁的大力支持

SpringMVC之综合示例讲解(用示例来带你学习SpringMVC)_第16张图片​​​​​​​

你可能感兴趣的:(SpringMVC,Mybatis,Spring,spring,mybatis,intellij-idea)