目录
前言
一、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的相关知识吧。
@Controller:用于标识一个类是SpringMVC的控制器,它接收用户请求并返回相应的视图或数据。
@RequestMapping:用于映射请求的URL路径到控制器的处理方法。可以在类级别和方法级别使用,用于处理各种HTTP请求(GET、POST、PUT等)。
@RequestParam:用于将请求参数绑定到处理方法的参数上。可以指定参数的名称、是否必须以及默认值。
@PathVariable:用于将URL中的占位符参数绑定到处理方法的参数上。通常用于RESTful风格的URL。
@ResponseBody:用于将方法的返回值直接作为HTTP响应的内容返回给客户端。适用于返回JSON、XML等非HTML格式的数据。
@ModelAttribute:用于将请求参数绑定到一个对象上,并将该对象添加到模型中,可以在视图中获取。
@RequestHeader:注解可以获取指定的请求头信息。
@CookieValue:主要是将请求的Cookie数据,映射到功能处理方法的参数上。
注解 | 说明 |
@GetMapping | 处理get方式请求的映射 |
@PostMapping | 处理post方式请求的映射 |
@PutMapping: | 处理put方式请求的映射 |
@DeleteMapping | 处理delete方式请求的映射 |
@RequestMapping(method=RequestMethod.GET) | 它会将get映射到特定的方法上 |
领域 | 作用说明 |
请求映射 | 指定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等) |
首先将pom.xml文件中原有的log4j的插件依赖替换为Slf4j的插件依赖,以及原有的log4j的核心包全替换为Slf4j的核心包。
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.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
配置运行项目
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";//返回的页面
}
}
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";//返回的页面
}
}
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,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。
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";//返回的页面
}
}
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";//返回的页面
}
}
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类模拟测试案例
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();
}
}
}
该返回值类型在前面的参数传递中已经体现了。
<%--
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";
}
}
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;
}
}
<%--
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";
}
}
- 返回值中有forward、redirect,那么会绕过试图解析器。
- 重定向会改变请求路径,转发不会。
这期分享到此结束,感谢各位老铁的大力支持