🥳🥳Welcome Huihui's Code World ! !🥳🥳
接下来看看由辉辉所写的关于SpringMVC的相关操作吧
目录
🥳🥳Welcome Huihui's Code World ! !🥳🥳
一.关于日志的了解
1.使用日志的好处
2.日志的类型
3.需要的依赖
二.参数传递
1.基础类型+String
2.复杂类型
3.@RequestParam
4.@PathVariable
5.@RequestBody
6.@RequestHeader
三.返回值
1.Void
2.String
3.String+Model
4.ModelAndView
四.常用注解
@RequestMapping
@PathVariable
@RequestBody
@RequestHeader
@RequestParam
@ModelAttribute
@CookieValue
@SessionAttributes
五.页面跳转
1.转发
controller
浏览器效果
2.重定向
controller
浏览器效果
3.跳转到其他controller
转发
重定向
在进入今天的正题之前,还需要对一个知识点进行学习了解的
一.关于日志的了解
1.使用日志的好处
- 1. 调试和故障排查:日志可以记录应用程序的运行状态、错误信息和异常堆栈跟踪,帮助开发人员定位和解决问题。通过查看日志,可以了解应用程序在特定情况下的行为,从而更好地理解和调试代码
- 2. 监控和性能分析:日志可以提供应用程序的性能指标、请求处理时间、资源利用率等信息,帮助开发人员监控应用程序的运行情况。通过分析日志,可以找出性能瓶颈和资源消耗过高的地方,进行优化和改进
- 3. 安全和合规性:日志可以记录应用程序的安全事件、用户操作和敏感数据访问,帮助监测和防止安全漏洞和攻击。此外,一些行业和法规要求应用程序必须记录和保留特定类型的日志,以确保合规性
- 4. 运维和故障恢复:日志可以提供应用程序的运行状态、系统资源使用情况和错误信息,帮助运维人员监控和管理应用程序。在故障发生时,通过分析日志可以追踪问题的根源,进行故障恢复和修复
- 5. 分析和业务洞察:日志可以记录应用程序的用户行为、业务事件和数据变化,帮助分析用户行为模式、业务趋势和数据异常。通过分析日志,可以获取有关用户需求、产品改进和市场趋势的洞察,支持业务决策和战略规划
2.日志的类型
调试日志(Debug Logs):用于记录应用程序的调试信息,例如变量的值、方法的执行路径等。这些日志通常用于开发和调试阶段,帮助开发人员定位和解决问题
信息日志(Info Logs):用于记录应用程序的一般信息,例如应用程序的启动和关闭、请求的处理结果等。这些日志通常用于了解应用程序的运行状态和行为
警告日志(Warning Logs):用于记录应用程序的警告信息,例如潜在的问题或异常情况,但不会导致应用程序的中断或错误。这些日志通常用于提醒开发人员或运维人员注意潜在的风险或问题
错误日志(Error Logs):用于记录应用程序的错误信息,例如异常抛出、无法处理的请求等。这些日志通常用于追踪和解决应用程序的错误和异常情况
致命错误日志(Fatal Logs):用于记录应用程序的致命错误信息,例如无法恢复的错误、系统崩溃等。这些日志通常用于追踪和解决严重的错误情况
审计日志(Audit Logs):用于记录应用程序的安全事件、用户操作和敏感数据访问等信息。这些日志通常用于监测和审计应用程序的安全性和合规性
3.需要的依赖
<log4j2.version>2.9.1</log4j2.version> <log4j2.disruptor.version>3.2.0</log4j2.disruptor.version> <slf4j.version>1.7.13</slf4j.version> <!--4.log日志相关依赖--> <!-- log4j2日志相关依赖 --> <!-- log配置:Log4j2 + Slf4j --> <!-- 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>
二.参数传递
1.基础类型+String
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author 王辉 * @site www.shihuihuila.com * @create 2023-09-05 15:15 */ @Controller @RequestMapping("/smvc2") @Slf4j public class SpringMVC2Controller { @RequestMapping("/print1") public String test1(String bname ,Integer bid){ log.info("简单类型的参数 bname:{},bid:{}",bname,bid); return "index"; } }
2.复杂类型
@RequestMapping("/print2") public String test2(HBook book){ log.info("简单类型的参数 Book:{}",book.toString()); return "index"; }
参数是复杂类型时,比如实体,那么所携带的参数必须是实体有的,不然传过去也是没有的
3.@RequestParam
@RequestMapping("/print3") public String test3(@RequestParam Integer bid, @RequestParam(value = "p") Integer price){ log.info("用@RequestParam传递参数{}",bid,price); return "index"; }
如果不是传的你指定的那个value值的话便会有错误
而且只要你是设置了value值那么那个参数就是必须携带的
4.@PathVariable
@RequestMapping("/print4/{bid}") public String test4(@PathVariable("bid") Integer bid){ log.info("用@PathVariable传递参数{}",bid); return "index"; }
5.@RequestBody
需要将依赖导入到pom.xml中
<jackson.version>2.9.3</jackson.version> <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>
这里需要用到一个工具,因为在网页中无法发送put请求(可在网上自行下载)
@RequestMapping("/print5") public String test5(@RequestBody Map map){ log.info("用@RequestBody传递参数{}",map); return "index"; }
6.@RequestHeader
@RequestMapping("/print6") public String test6( @RequestHeader("huihui") String huihui){ log.info("用@RequestHeader传递参数{}",huihui); return "index"; }
三.返回值
1.Void
@RequestMapping("/myreturn1") public void myretuen1(HttpServletResponse response) throws Exception { Map<String,Object> map= new HashMap(); map.put("huihui",18); ResponseUtil.writeJson(response,map); log.info("void"); }
2.String
@RequestMapping("/myreturn2") public String myretuen2(){ return "hello_huihui"; }
3.String+Model
@RequestMapping("/myreturn3") public String myretuen3(Model model,HttpServletResponse response){ //将模型数据填充好 model.addAttribute("name","huihui"); return "hello_huihui"; }
4.ModelAndView
@RequestMapping("/myreturn4") public ModelAndView myretuen4(){ ModelAndView mv=new ModelAndView(); mv.addObject("info","大美女"); mv.setViewName("hello_huihui"); return mv; }
四.常用注解
@RequestMapping
- 用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上
- 用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法
- 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
参数 说明 value @RequestMapping 的 value 属性必须设值; @RequestMapping 的 value 属性是通过当前请求的请求地址来匹配请求; 从源码中可以看到value属性是一个字符串类型的数组,因此说明可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的数组。 method @RequestMapping的method属性是通过当前请求的请求方式来匹配请求; 浏览器向服务器发送请求,请求方式有很多GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。可以使用 method 属性来约束请求方式。 headers @RequestMapping的headers属性是通过当前请求的请求头信息来匹配请求; @RequestMapping的headers属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系 例如: “header”:要求请求映射的请求必须为包含 header的请求头信息 “!header”:要求请求映射的请求必须为不包含 header的请求头信息 “header=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须为value “header!=value”:要求请求映射的请求必须为包含 header的请求头信息,并且header的值必须不是value params @RequestMapping的params属性是通过当前请求的请求参数来匹配请求; @RequestMapping的params属性是一个字符串类型的数组,可以通过下面四种表达是来设置匹配关系 例如: “param”:要求请求映射的请求必须为包含 param的请求参数 “!param”:要求请求映射的请求是不能包含param的请求参数 “param=value”:要求请求映射的请求必须包含 param 的请求参数,且 param 参数的值必须为 value “param!=value”: 要求请求映射的请求是必须包含 param 的请求参数,其值不能为 value。 @PathVariable
- 请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定
- 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariable注解绑定它传过来的值到方法的参数上
@RequestBody
- 用来接收前端传递给后端的json字符串中的数据的(即请求体中的数据的)
- GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个【一个请求:只有一个@RequestBody ,可以有多个@RequestParam 】
- @RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为)实体类的对应属性的类型要求时,会调用实体类的setter方法将值赋给该属性
@RequestHeader
@RequestHeader 注解可以获取指定的请求头信息。如果想要获取所有的请求头信息,可以使用 Map<String,String>、MultiValueMap<String,String>、HttpHeaders 这三个 Map 中的任何一个封装所有请求头的 name 和 value
参数 说明 name name 和 value 互为别名,当只有一个参数时,可以省略 value,直接("xxx") 就可以了 value name 和 value 互为别名,当只有一个参数时,可以省略 value,直接("xxx") 就可以了 required 默认情况下,如果请求头中缺少了指定的 name,那么将会报错。 如果没有添加required = false,当请求头中没有这个zking请求头时就会报错。 defaultValue 如果请求头中缺少了指定的 name ,那么会报错,可以使用 defaultValue 这个属性指定默认值,就可以避免报错 ;如果请求头缺少指定 name ,该属性设置的值将会作为默认值,如果该属性不设置值,它有自己的默认值 DEFAULT_NONE @RequestParam
用于将请求参数区域的数据映射到控制层方法的参数上
参数 说明 value 请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。 required 该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。 defaultValue 参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}" @ModelAttribute
绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用
@CookieValue
将请求的Cookie数据,映射到功能处理方法的参数上
参数 说明 value 绑定的参数名称,String类型。 required 是否必须包含value,boolean类型,默认为 true,表示请求参数中必须包含对应的参数;若不存在,将抛出异常。 defaultValue 默认值,String类型。当没有传参时将使用此值赋值。 @SessionAttributes
- 在默认情况下,当ModelMap中的属性作用域是request级别时,也就是说,当本次请求结束后,ModelMap中的属性将销毁。如果希望在多个请求中共享ModelMap中的属性,必须将其属性转存到session中,这样ModelMap的属性才会被跨请求访问;
- spring允许我们有选择地指定ModelMap中的哪些属性需要转存到session中,以便下一个请求属对应的ModelMap的属性列表中还能访问到这些属性
- 有两种方式将ModelMap中的属性值共享到session中:
- 使用注解的value属性:可以通过属性名指定需要放到会话中的属性
- 使用注解的types属性:还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中
五.页面跳转
1.转发
controller
@RequestMapping("/forward") public String toHelloPage1(){ System.out.println("forward转发"); return "forward:myreturn2"; }
浏览器效果
2.重定向
controller
@RequestMapping("/redirect") public String toHelloPage2(){ System.out.println("redirect重定向"); return "redirect:myreturn2"; }
浏览器效果
3.跳转到其他controller
转发
@RequestMapping("/otherforward") public String otherforward(){ System.out.println("otherforward"); return "forward:/smvc1/print"; } ------------------------------------------------------------------------------------------- @RequestMapping("/print") public String test(){ return "hello_huihui"; }
重定向
@RequestMapping("/otherredirect") public String otherredirect(){ System.out.println("otherredirect"); return "redirect:/smvc1/print"; } ------------------------------------------------------------------------------------------- @RequestMapping("/print") public String test(){ return "hello_huihui"; }
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊