目录
前言
一、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. 注解说明
@Controller:用于标识一个类是SpringMVC的控制器,它接收用户请求并返回相应的视图或数据。
@RequestMapping:用于映射请求的URL路径到控制器的处理方法。可以在类级别和方法级别使用,用于处理各种HTTP请求(GET、POST、PUT等)。
@RequestParam:用于将请求参数绑定到处理方法的参数上。可以指定参数的名称、是否必须以及默认值。
@PathVariable:用于将URL中的占位符参数绑定到处理方法的参数上。通常用于RESTful风格的URL。
@ResponseBody:用于将方法的返回值直接作为HTTP响应的内容返回给客户端。适用于返回JSON、XML等非HTML格式的数据。
@ModelAttribute:用于将请求参数绑定到一个对象上,并将该对象添加到模型中,可以在视图中获取。
@RequestHeader:注解可以获取指定的请求头信息。
@CookieValue:主要是将请求的Cookie数据,映射到功能处理方法的参数上。
2. 扩展延伸
注解 | 说明 |
@GetMapping | 处理get方式请求的映射 |
@PostMapping | 处理post方式请求的映射 |
@PutMapping: | 处理put方式请求的映射 |
@DeleteMapping | 处理delete方式请求的映射 |
@RequestMapping(method=RequestMethod.GET) | 它会将get映射到特定的方法上 |
3. 注解的作用展示
领域 | 作用说明 |
请求映射 | 指定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文件
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.yx</groupId><artifactId>yx_ssm</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>yx_ssm Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version><!--添加jar包依赖--><!--1.spring 5.0.2.RELEASE相关--><spring.version>5.0.2.RELEASE</spring.version><!--2.mybatis相关--><mybatis.version>3.4.5</mybatis.version><!--mysql--><mysql.version>5.1.44</mysql.version><!--pagehelper分页jar依赖--><pagehelper.version>5.1.2</pagehelper.version><!--mybatis与spring集成jar依赖--><mybatis.spring.version>1.3.1</mybatis.spring.version><!--3.dbcp2连接池相关 druid--><commons.dbcp2.version>2.1.1</commons.dbcp2.version><commons.pool2.version>2.4.3</commons.pool2.version><!--4.log日志相关--><!-- 替换为slf4j日志相关 --><log4j2.version>2.9.1</log4j2.version><log4j2.disruptor.version>3.2.0</log4j2.disruptor.version><slf4j.version>1.7.13</slf4j.version><!--5.其他--><junit.version>4.12</junit.version><servlet.version>4.0.0</servlet.version><lombok.version>1.18.2</lombok.version><!-- jstl+standard --><jstl.version>1.2</jstl.version><standard.version>1.1.2</standard.version><!-- spring --><spring.version>5.0.2.RELEASE</spring.version></properties><dependencies><!--1.spring相关--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!--2.mybatis相关--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--pagehelper分页插件jar包依赖--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>${pagehelper.version}</version></dependency><!--mybatis与spring集成jar包依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.spring.version}</version></dependency><!--3.dbcp2连接池相关--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>${commons.dbcp2.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons.pool2.version}</version></dependency><!--4.log日志相关依赖--><!--核心log4j2jar包--><!--替换为 slf4j包 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version><scope>runtime</scope></dependency><!--核心log4j2jar包--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version></dependency><!--用于与slf4j保持桥接--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j2.version}</version></dependency><!--web工程需要包含log4j-web,非web工程不需要--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j2.version}</version><scope>runtime</scope></dependency><!--需要使用log4j2的AsyncLogger需要包含disruptor--><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>${log4j2.disruptor.version}</version></dependency><!--5.其他--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope></dependency><!-- spring mvc相关依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>${standard.version}</version></dependency></dependencies><build><finalName>yx_ssm</finalName><resources><!--解决mybatis-generator-maven-plugin运行时没有将XxxMapper.xml文件放入target文件夹的问题--><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><!--解决mybatis-generator-maven-plugin运行时没有将jdbc.properites文件放入target文件夹的问题--><resource><directory>src/main/resources</directory><includes><include>jdbc.properties</include><include>*.xml</include></includes></resource></resources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>${maven.compiler.plugin.version}</version><configuration><source>${maven.compiler.source}</source><target>${maven.compiler.target}</target><encoding>${project.build.sourceEncoding}</encoding></configuration></plugin><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.2</version><dependencies><!--使用Mybatis-generator插件不能使用太高版本的mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency></dependencies><configuration><overwrite>true</overwrite></configuration></plugin><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></build>
</project>
二、参数传递
配置运行项目
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";//返回的页面}}
测试结果
页面
控制台
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){//参数// 复杂传参输出方式01log.info("复杂类型参数:bname:{},bid:{},price{}",request.getParameter("bname"),request.getParameter("bid"),request.getParameter("price"));
// 复杂传参输出方式02log.info("复杂类型参数:book:{}",book.toString());return "index";//返回的页面}
}
测试结果
页面
控制台
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";//返回的页面}
}
测试结果
结果一:
页面
控制台输出
结果二:
页面
控制台
结果三:
页面
控制台输出
不会输出任何结果。
注:@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";//返回的页面}}
测试结果
页面
控制台输出
5.@RequestBody
导入@RequestBody依赖
<jackson.version>2.9.3</jackson.version>
//======以上代码添加到pom.xml文件中的 <properties>标签中=======================
//======以下代码添加到pom.xml文件中的 <dependencies>标签中====================
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency>
测试代码
请使用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";//返回的页面}
}
第三方软件测试操作
控制台输出结果
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";//返回的页面}}
第三方测试操作
控制台输出结果
三、方法返回值
创建一个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<String,Object> 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: 86158Date: 2023/9/5Time: 15:49To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Hello 君易--鑨</h1>
名称:${name}
地址:${address}
</body>
</html>
测试代码
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: 86158Date: 2023/9/5Time: 15:49To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Hello 君易--鑨</h1>
名称:${name}
地址:${address}
评价:${sign}
</body>
</html>
测试结果
四、页面跳转
测试代码
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";}}
场景一:(转发到后台的某一个方法(当前类))
测试结果
场景二:(转发到后台的某一个方法(其他类))
测试结果
场景三:(重定向到后台的某一个方法(当前类))
测试结果
场景四:(重定向到后台的某一个方法(其他类))
测试结果
结论
- 返回值中有forward、redirect,那么会绕过试图解析器。
- 重定向会改变请求路径,转发不会。
这期分享到此结束,感谢各位老铁的大力支持