SpringMVC知识点总结(速查速记)
文章目录
- 前言
- 1、MVC是什么
- 2、SpringMVC是什么
- 3、SpringMVC请求流程 && 环境搭建
- 3.1 SpringMVC请求流程
- 3.2 搭建环境
- 3.2.1开发环境
- 3.2.2 环境配置步骤
- 4. url地址映射 && 参数绑定
- 4.1 url地址映射之@RequestMapping
- ①、映射单个url
- ②、映射多个url
- ③、映射url到控制器
- ④、通过参数名称映射url
- ⑤、设置请求方式
- 4.2 参数绑定
- ①、基本类型
- ②、包装类型 && 字符串类型
- ③、数组类型 && javaBean类型
- ④、集合类型
- 5. SpringMVC请求转发与重定向
- 5.1 请求域对象设置API
- 5.2 请求重定向
- 5.3 请求转发
- 6. JSON请求
- 6.1配置JSON环境
- 6.2 @ResponseBody注解
- 6.3 @RequestBody注解
- 7. 拦截器
- 7.1 实现HandlerInterceptor接口
- 7.2 继承HandlerInterceptorAdapter类
- 7.3 拦截器链
- 8. 文件上传
- 8.1 环境配置
- 8.2 单文件上传
- 8.3 多文件上传
- 9. 全局异常
- 9.1 SimpleMappingExceptionResolver处理
- 9.2 实现接口 HandlerExceptionResolver定义自己的异常处理器
- 9.3 @ExceptionHandler注解处理
- 9.4 未捕获异常的处理
前言
SpringMVC是一个Spring基于MVC模式开发的一个框架,其底层封装了Servlet,用于简化开发,而MVC是一种思想。虽然现在SpringBoot用的比较多,但是SpringMVC面试也会问到,而且技术层面也有必要整体流程有个了解。
1、MVC是什么
模型(model)-视图(view)-控制器(Controller) ,就是MVC,它通过分离模型、视图、控制器在应用程序中的角色将业务逻辑从界面中解耦。Controller负责接收用户的请求,并调用后台服务(Service和Dao)来处理业务逻辑。View用来将结果显示给用户,不包含任何逻辑(现在前后端分离之后,View层很少用了)。
2、SpringMVC是什么
SpringMVC是Spring家族的web成员,他是基于java的实现了Web MVC思想的请求驱动类型的轻量级web框架。
SpringMVC是服务到工作者思想的实现,前端控制器是DispatcherServlet; 应用控制器拆为处理器映射器(HandlerMapping)进行处理管理和视图解析器(View Resolver)进行视图管理; 支持本地化/国际化(Locale) 解析及文件上传等; 提供灵活的数据验证、格式化和数据绑定机制; 提供了约定大于配置的的编程支持。
SpringMVC优点:
- 代码分层更整洁好看一些
- 天生与Spring框架集成(Ioc、Aop等)
- 可以进行简单单元测试
3、SpringMVC请求流程 && 环境搭建
3.1 SpringMVC请求流程
3.2 搭建环境
3.2.1开发环境
idea2022 + Maven3.8.1 + jdk1.8 + jetty
3.2.2 环境配置步骤
配置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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xxxx</groupId><artifactId>Springmvc01</artifactId><version>1.0-SNAPSHOT</version><name>Springmvc01</name><packaging>war</packaging><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.target>1.8</maven.compiler.target><maven.compiler.source>1.8</maven.compiler.source><junit.version>5.8.2</junit.version></properties><dependencies><!-- 测试相关依赖 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>${junit.version}</version><scope>test</scope></dependency><!-- spring web --><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>5.2.4.RELEASE</version></dependency><!-- spring mvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.4.RELEASE</version></dependency><!-- web servlet --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version></dependency></dependencies><build><finalName>springmvc01</finalName><plugins><!-- 编译环境插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><!-- --><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId> <!-- 注意:原图文本可能有拼写错误(jetty-maven-plusin → jetty-maven-plugin) --><version>9.4.27.v20200227</version><configuration><scanIntervalSeconds>10</scanIntervalSeconds> <!-- 扫描间隔(秒) --><httpConnector><port>8080</port> <!-- 端口 --></httpConnector><webAppConfig><contextPath>/springmvc01</contextPath> <!-- 项目路径(URL路径) --></webAppConfig></configuration></plugin></plugins></build>
</project>
注意点:
根访问路径在pom.xml文件中定义
<webAppConfig><contextPath>/springmvc01</contextPath> <!-- 项目路径(URL路径) --></webAppConfig>
配置web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="webApp_ID" version="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"><!-- 字符编码过滤器 --><filter><description>char encoding filter</description><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- servlet请求分发器 --><servlet><servlet-name>springMvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:servlet-context.xml</param-value></init-param><!-- 表示启动时初始化该Servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springMvc</servlet-name><!-- 拦截规则:"/" 代表拦截所有请求,"*.do" 拦截所有.do请求 --><url-pattern>/</url-pattern></servlet-mapping></web-app>
配置servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 开启组件扫描 --><context:component-scan base-package="com.xxxx.springmvc.controller"/><!-- 使用默认 Servlet 响应静态文件 --><mvc:default-servlet-handler/><!-- 开启注解驱动 --><mvc:annotation-driven/><!-- 配置视图解析器 --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><!-- 前缀:在 WEB-INF 目录下的 jsp 目录下 --><property name="prefix" value="/WEB-INF/jsp/"/><!-- 后缀:以 .jsp 结尾的资源 --><property name="suffix" value=".jsp"/></bean></beans>
项目结构如下:
注意点:
①、项目结构必须严格按照这个来,jsp文件必须放WEB-INF/jsp目录下面,web.xml必须放WEB-INF下。
②、servlet-context.xml文件中 <context:component-scan base-package> 配置的包前缀必须和java目录下包名前缀相同。
jsp页面(不用在意细节,jsp只用于演示不细学):
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html>
<html>
<head><base href="<%=basePath %>"><title>My JSP 'hello.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"><meta http-equiv="keywords" content="keyword1, keyword2, keyword3"><meta http-equiv="description" content="This is my page">
</head>
<body>
<!-- EL 表达式接收参数值 -->
${hello}
</body>
</html>
演示代码:
package com.xxxx.springmvc.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;@Controller
public class HelloController {/*** 请求地址的映射** @return*/@RequestMapping("/hello")public ModelAndView hello() {ModelAndView modelAndView = new ModelAndView();// 设置数据modelAndView.addObject("hello", "Hello SpringMvc");// 设置视图名称modelAndView.setViewName("hello");return modelAndView;}}
最终效果:
至此,我们成功跑通了Springmvc的环境。
4. url地址映射 && 参数绑定
4.1 url地址映射之@RequestMapping
@RequestMapping方法可以将请求路径和方法绑定,可以声名在类和方法级别。
①、映射单个url
示例代码:
@Controller
public class UrlController {/*** 声名在方法上,映射单个url* @return*/@RequestMapping("/test01")public ModelAndView test01() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello", "test01");modelAndView.setViewName("hello");return modelAndView;}}
运行结果:
②、映射多个url
@RequestMapping({"/test02", "/test03"})public ModelAndView test02_3() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello", "test02_3");modelAndView.setViewName("hello");return modelAndView;}
运行结果:
可以看到都可以访问到。
③、映射url到控制器
其实就是相当于在Controller类上加了一层映射。
@Controller
@RequestMapping("/url")
public class HelloController {/*** 请求地址的映射** @return*/@RequestMapping("/hello")public ModelAndView hello() {ModelAndView modelAndView = new ModelAndView();// 设置数据modelAndView.addObject("hello", "Hello SpringMvc");// 设置视图名称modelAndView.setViewName("hello");return modelAndView;}
}
访问路径多了一个/url。
④、通过参数名称映射url
@RequestMapping(params = "test04")public ModelAndView test04() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello", "test04");modelAndView.setViewName("hello");return modelAndView;}
运行结果:
访问路径改为 ? 后面跟参数
⑤、设置请求方式
由于浏览器默认使用GET方式请求,因此改成POST就无法访问到了。
@RequestMapping(value = "test05", method = RequestMethod.POST)public ModelAndView test05() {ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("hello", "test05");modelAndView.setViewName("hello");return modelAndView;}
运行结果:
4.2 参数绑定
①、基本类型
@Controller
public class ParamsController {@RequestMapping("/data01")public void data01(int age, double money) {System.out.println("age: " + age + " money: " + money);}@RequestMapping("/data02")public void data02(@RequestParam(defaultValue = "18") int age, @RequestParam(defaultValue = "20.0") double money) {System.out.println("age: " + age + " money: " + money);}@RequestMapping("/data03")public void data03(@RequestParam(defaultValue = "18", name = "userAge") int age,@RequestParam(defaultValue = "20.0", name = "userMoney") double money) {System.out.println("age: " + age + " money: " + money);}
}
访问/data01的url
http://localhost:8080/springmvc01/data01?age=17&money=18.0
打印结果:
age: 17 money: 18.0
但是如果我们传参的时候没有传完整,就会报空指针null的错误
url:
http://localhost:8080/springmvc01/data01?age=17
因此,/data02模块的@RequestParam注解提供的默认值就可以解决这个问题。
访问/data02的url
http://localhost:8080/springmvc01/data02
打印结果:
age: 18 money: 20.0
@RequestParam可以设置别名,如果设置了别名,传参时名字必须与别名相同
访问/data03的url:
http://localhost:8080/springmvc01/data03?userAge=60&userMoney=100.0
打印结果:
age: 60 money: 100.0
②、包装类型 && 字符串类型
@RequestMapping("/data04")public void data04(Integer age, Double money) {System.out.println("age: " + age + " money: " + money);}@RequestMapping("/data05")public void data05(String userName, String userPwd) {System.out.println("userName: " + userName + " userPwd: " + userPwd);}
包装类型和字符串类型其它的访问方式和参数赋值的方法和上述基本类型都基本相同,包括@RequestParam等注解的使用,但是不同的一点是,它们都有默认值为null。
访问data04和data04的url:
http://localhost:8080/springmvc01/data04
http://localhost:8080/springmvc01/data05
运行结果:
age: null money: null
userName: null userPwd: null
③、数组类型 && javaBean类型
@RequestMapping("/data06")public void data06(String[] ids) {for (String id : ids) {System.out.println("--- " + id);}}@RequestMapping("/data07")public void data07(User user) {System.out.println(user);}
User类:
public class User {private String id;private String userName;private String userPwd;// 。。。。。getter、setter、toString等方法
}
访问data06:
http://localhost:8080/springmvc01/data06?ids=1&ids=2&ids=3
运行结果:
--- 1
--- 2
--- 3
访问data07:
http://localhost:8080/springmvc01/data07?id=1&userName=admin&userPwd=123456
运行结果:
User{id='1', userName='admin', userPwd='123456'}
传参时候注意与实体类的字段一一对应即可。
④、集合类型
以List类型为例子,Set、Map使用较少,和List使用相似.
重新定义两个类来举例子:
public class Phone {private String num;// getter、setter、toString等方法
}public class User {private String id;private String userName;private String userPwd;List<Integer> ids;List<Phone> phones;// getter、setter、toString等方法
}
webapp目录下添加一个test.jsp文件:
<%--Created by IntelliJ IDEA.User: suxuchaoDate: 2025/4/28Time: 17:06To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>测试集合类型数据</title>
</head>
<body><form action="data08" method="post"><input name="ids[0]" value="123456"><br><input name="ids[1]" value="4567"><br><input name="phones[0].num" value="123321"><br><input name="phones[1].num" value="789987"><br><button type="submit">提交</button></form>
</body>
</html>
测试后台代码:
@RequestMapping("/data08")public void data08(User user) {System.out.println(user);}
访问界面:
打印结果:
User{id='null', userName='null', userPwd='null', ids=[123456, 4567], phones=[phone{num='123321'}, phone{num='789987'}]}
谨记集合类型是封装到java Bean中进行访问的。
5. SpringMVC请求转发与重定向
5.1 请求域对象设置API
@RequestMapping("/model01")public ModelAndView model01() {ModelAndView modelAndView = new ModelAndView();// 设置数据模型(请求域对象)modelAndView.addObject("hello", "Hello Model01");// 设置视图modelAndView.setViewName("hello");return modelAndView;}@RequestMapping("/model02")public String model02(ModelMap modelMap) {modelMap.addAttribute("hello", "Hello Model02");return "hello";}@RequestMapping("/model03")public String model03(Model model) {model.addAttribute("hello", "Hello Model02");return "hello";}@RequestMapping("/model04")public String model04(Map map) {map.put("hello", "Hello Model02");return "hello";}@RequestMapping("/model05")public String model05(HttpServletRequest servletRequest) {servletRequest.setAttribute("hello", "Hello Model02");return "hello";}
访问结果:
最后结果都是成功的,以model02举例。
方法 | 域对象类型 | 作用域 | 数据存储位置 | 使用方式 | 是否需要手动创建 | 数据可见范围 | 典型场景 |
---|---|---|---|---|---|---|---|
model01 | ModelAndView | 请求域(隐式) | 请求域 | 通过 addObject() 添加数据,需显式设置视图 | 是(需手动实例化) | 仅当前请求及转发链有效 | 需同时传递数据和指定视图 |
model02 | ModelMap | 请求域 | 请求域 | 通过 addAttribute() 添加数据,自动绑定 | 否(Spring 自动注入) | 仅当前请求及转发链有效 | 简化数据传递,无需处理视图逻辑 |
model03 | Model | 请求域 | 请求域 | 通过 addAttribute() 添加数据,自动绑定 | 否(Spring 自动注入) | 仅当前请求及转发链有效 | 轻量级数据传递,接口方法更简洁 |
model04 | Map | 请求域 | 请求域 | 直接操作 Map ,Spring 自动转换 | 否(Spring 自动注入) | 仅当前请求及转发链有效 | 快速存取键值对,无需接口约束 |
model05 | HttpServletRequest | 请求域 | 请求域 | 通过 setAttribute() 直接操作 | 是(需注入或获取) | 仅当前请求及转发链有效 | 需直接使用 Servlet API 的场景 |
前四种方式底层还是调用的HttpServletRequest方法,只不过被框架封装了。
5.2 请求重定向
重定向是发一个302状态码给服务器,浏览器自己去请求跳转的页面,地址栏发生改变。
重定向以redirect:开头:
@Controller
public class ViewController {@RequestMapping("/view01")public String view01() {return "redirect:view.jsp";}@RequestMapping("/view02")public String view02() {return "redirect:view.jsp?uName=admin&uPwd=123456";}@RequestMapping("/view03")public String view03() {return "redirect:view.jsp?uName=张三&uPwd=我去";}@RequestMapping("/view04")public String view04(RedirectAttributes attributes) {//设置参数attributes.addAttribute("uName", "张三");attributes.addAttribute("uPwd", "我去");return "redirect:view.jsp";}@RequestMapping("/view05")public ModelAndView view05(ModelAndView modelAndView) {//设置模型数据modelAndView.addObject("uName", "张三");modelAndView.addObject("uPwd", "123456");//设置视图modelAndView.setViewName("redirect:view.jsp");return modelAndView;}@RequestMapping("/view06")public ModelAndView view06(ModelAndView modelAndView) {//设置模型数据modelAndView.addObject("uName", "张三");modelAndView.addObject("uPwd", "123456");//设置视图modelAndView.setViewName("redirect:test");return modelAndView;}
}
- 请求view01:
http://localhost:8080/springmvc01/view01
测试结果:
可以看到,地址栏的url发生了变化,同时也成功跳转到了页面。
- 请求view02:
http://localhost:8080/springmvc01/view02
运行结果:
3. 请求view03:
http://localhost:8080/springmvc01/view03
运行结果(中文传递乱码):
4. 请求view04
http://localhost:8080/springmvc01/view04
运行结果(通过RedirectAttributes传递中文参数):
5. 请求view05
http://localhost:8080/springmvc01/view05
运行结果(通过ModelAndView传递中文参数):
6. 请求view06
http://localhost:8080/springmvc01/view06
最后会映射到:
http://localhost:8080/springmvc01/test路径,这说明不仅可以映射到视图文件,也可以重定向到其它控制器。
补充:
之所以要引入RedirectAttributes和ModelAndView等对象来存储重定向后的数据,是因为重定向之后,新的url无法共享之前旧请求域的数据,因此需要通过这些类来实现数据的传递。
5.3 请求转发
请求转发,直接调用跳转的页面,让它返回。对于浏览器来说,它无法感受到服务器有没有forward,地址栏不发生改变。可以获取请求域中的数据。
添加/text接口
@Controller
public class TestController {@RequestMapping("/test")public void test(String uName, String uPwd) {System.out.println("uName: " + uName + " uPwd: " + uPwd);}
}
测试用例:
@RequestMapping("/view07")public String view07() {return "forward:view.jsp";}@RequestMapping("/view08")public String view08() {return "forward:view.jsp?uName=张三&uPwd=123456";}@RequestMapping("/view09")public String view09(Model model) {model.addAttribute("name", "李四");return "forward:view.jsp?uName=张三&uPwd=123456";}@RequestMapping("/view10")public String view10(Model model) {model.addAttribute("name", "管理员");return "/../../view";}@RequestMapping("/view11")public ModelAndView view11(ModelAndView modelAndView) {modelAndView.setViewName("forward:test");return modelAndView;}
- 访问view07:
http://localhost:8080/springmvc01/view07
运行结果:
2. 访问view08:
http://localhost:8080/springmvc01/view08
运行结果:
- 访问view09:
http://localhost:8080/springmvc01/view09
运行结果:
4. 访问view10:
http://localhost:8080/springmvc01/view10
运行结果:
5. 访问view11:
http://localhost:8080/springmvc01/view11
打印运行结果:
uName: null uPwd: null
6. JSON请求
JSON是企业开发中的通用接口参数类型,在客户端解析很方便。SpringMVC对于json提供了很好的支持。
6.1配置JSON环境
pom.xml:
添加一下依赖:
<!-- 添加 Jackson JSON 依赖 --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.10.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.10.0</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.10.0</version></dependency>
修改servlet-context.xml文件:
<!-- 开启注解驱动 --><mvc:annotation-driven><mvc:message-converters><bean class="org.springframework.http.converter.StringHttpMessageConverter" /><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /></mvc:message-converters></mvc:annotation-driven>
- StringHttpMessageConverter:处理纯文本数据,适合简单 API。
- MappingJackson2HttpMessageConverter:处理 JSON 数据,是 RESTful API 的核心组件。
6.2 @ResponseBody注解
该注解的含义是,表明返回的数据是JSON格式的。
该注解既可以作用于方法上,也可以作用与返回值上:
@Controller
@RequestMapping("/user")
public class userController {@RequestMapping("/query01")@ResponseBodypublic User queryUser01() {User user = new User();user.setId(1);user.setUserName("zhangsan");user.setUserPwd("123456");// 返回User对象return user;}@RequestMapping("/query02")public @ResponseBody User queryUser02() {User user = new User();user.setId(2);user.setUserName("lisi");user.setUserPwd("567765");// 返回User对象return user;}@RequestMapping("/query03")@ResponseBodypublic List<User> queryUser03() {User user = new User();user.setId(1);user.setUserName("zhangsan");user.setUserPwd("123456");User user2 = new User();user.setId(2);user.setUserName("lisi");user.setUserPwd("567765");List<User> list = new ArrayList<>();list.add(user); list.add(user2);// 返回User对象return list;}
}
访问query01:
访问query02:
访问query03:
6.3 @RequestBody注解
@RequestBody注解常用来处理content-type是application/json或者application/xml等格式的内容。一般来说是处理application/json 用的比较多。@RequestBody接受的是一个字符串,一定是一个字符串。
通过@RequestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然也可绑定到对应的字符串上。
@RequestMapping("/query05")@ResponseBodypublic User query05(@RequestBody User user) {System.out.println(user);return user;}
需要注意的是,添加该注解之后,发送请求的时候也需要是JSON格式,否则会报错。
报错:
通过ApiPost进行测试成功结果:
7. 拦截器
SpringMVC中的Intercepter拦截器主要用于拦截用户请求并进行相应的处理,比如通过它来进行权限验证,或判断用户是否登录等操作。实现方式有两种
实现接口: org.springframework.web.servlet.HandlerInterceptor
继承适配器: org.springframework.web.servlet.handler.HandlerInterceptorAdapter
测试接口:
@Controller
public class HelloController {/*** 请求地址的映射** @return*/@RequestMapping("/hello")public ModelAndView hello() {System.out.println("拦截的方法....");ModelAndView modelAndView = new ModelAndView();// 设置数据modelAndView.addObject("hello", "Hello SpringMvc");// 设置视图名称modelAndView.setViewName("hello");return modelAndView;}}
7.1 实现HandlerInterceptor接口
public class MyInterceptor01 implements HandlerInterceptor {/*** 在目标方法(handler)执行前执行的方法* 返回true: 执行handler方法* 返回false: 组织目标handler执行* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("handler方法执行前打印结果....");return true;}/*** 在目标方法(handler)执行后,视图生成前执行的方法* 返回true: 执行handler方法* 返回false: 组织目标handler执行* @param request* @param response* @param handler* @param modelAndView* @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("handler方法执行后,视图生成前打印结果....");}/*** 在目标方法(handler)执行后,视图生成后执行的方法* @param request* @param response* @param handler* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("视图生成后打印结果....");}
}
配置映射文件(servlet-context.xml):
<!-- 配置拦截器 --><!-- 1、拦截所有资源 --><mvc:interceptors><!--使用一个bean标签定义一个interceptor直接定义在mvc:interceptors标签中,表示拦截器会拦截所有请求--><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01"/></mvc:interceptors><!-- 2、具体配置路径 --><mvc:interceptors><mvc:interceptor><!-- 通过 mvc:mapping 配置需要被拦截的资源,支持通配符,可配置多个 --><mvc:mapping path="/**"/><!-- 配置不需要拦截的资源,表示/url路径下的所有资源不需要拦截 --><mvc:exclude-mapping path="/url/*"/><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01"/></mvc:interceptor></mvc:interceptors>
上述有两种拦截方式,其中第一种就是全局拦截,后面是可以配置不需要拦截的,还是很方便的。
运行结果:
访问:
http://localhost:8080/springmvc01/hello
打印结果:
handler方法执行前打印结果....
拦截的方法....
handler方法执行后,视图生成前打印结果....
视图生成后打印结果....
7.2 继承HandlerInterceptorAdapter类
HandlerInterceptorAdapter类本质上还是实现了AsyncHandlerInterceptor接口,而AsyncHandlerInterceptor接口继承了HandlerInterceptor接口。
public class MyInterceptor02 extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("handler方法执行前打印结果....");return true;}
}
配置xml文件:
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.xxxx.springmvc.interceptor.MyInterceptor02"/></mvc:interceptor></mvc:interceptors>
打印结果:
handler方法执行前打印结果....
拦截的方法....
7.3 拦截器链
简单来说,就是让多个拦截器都生效,这些拦截器就是拦截器链。
优先级则是先配置的拦截器先执行:
servlet-context.xml配置:
<mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.xxxx.springmvc.interceptor.MyInterceptor02"/></mvc:interceptor></mvc:interceptors>
打印运行结果:
MyInterceptor01类的handler方法执行前打印结果....
MyInterceptor02类的handler方法执行前打印结果....
拦截的方法....
MyInterceptor01类的handler方法执行后,视图生成前打印结果....
MyInterceptor01类的视图生成后打印结果....
8. 文件上传
8.1 环境配置
pom.xml:
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version>
</dependency>
servlet-context.xml:
<!-- 文件上传 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 允许文件上传的最大尺寸 --><property name="maxUploadSize"><value>104857600</value></property><!--设置文件进入临时文件夹的最大大小限制该值为阈值,高于此值,保存在内存中,否则生成硬盘上的临时文件--><property name="maxInMemorySize"><value>4096</value></property></bean>
添加前端upload.jsp文件:
<%--Created by IntelliJ IDEA.User: suxuchaoDate: 2025/4/30Time: 15:30To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>文件上传</title>
</head>
<body><form method="post" action="uploadFile" enctype="multipart/form-data"><input type="file" name="file"><button>上传</button></form>
</body>
</html>
8.2 单文件上传
添加result.jsp用于呈现结果:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>result界面</title>
</head>
<body>
<h3>${msg}</h3>
</body>
</html>
文件上传代码实现:
@Controller
public class fileController {/*** 单文件上传* @return*/@RequestMapping("/uploadFile")public String uploadFile(HttpServletRequest request, @RequestParam("file") MultipartFile file) {if(!file.isEmpty()) {// 获取项目所在的路径(绝对路径 )String path = request.getServletContext().getRealPath("/");// 设置上传文件存放的目录File uploadFile = new File(path + "/upload");//判断文件目录是否存在,不存在就先创建if(!uploadFile.exists()) {// 新建目录uploadFile.mkdir();}try {//获取上传文件的文件名String originalFilename = file.getOriginalFilename();//获取文件后缀名String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// 通过系统当前的毫秒数,生成随机文件名String fileName = System.currentTimeMillis() + suffix;// 上传文件(转存文件到指定目录)file.transferTo(new File(uploadFile.getPath(), fileName));// 如果上传成功,设置作用域request.setAttribute("msg", "文件上传成功!");} catch (IOException e) {request.setAttribute("msg", "文件上传失败");throw new RuntimeException(e);}} else {// 如果上传文件不存在request.setAttribute("msg", "上传文件不存在");}return "result";}
}
前端界面:
运行结果:
8.3 多文件上传
与多文件上传类似,但是需要改动一些小的点。
upload.jsp改动:
<form method="post" action="uploadFiles" enctype="multipart/form-data"><input type="file" name="files"><input type="file" name="files"><button>上传</button></form>
后台代码:
@RequestMapping("/uploadFiles")public String uploadFiles(HttpServletRequest request, @RequestParam("files")List<MultipartFile> files) {if(!files.isEmpty() && files.size() > 0) {for (MultipartFile file : files) {// 上传文件// 获取项目所在的路径(绝对路径 )String path = request.getServletContext().getRealPath("/");// 设置上传文件存放的目录File uploadFile = new File(path + "/upload");//判断文件目录是否存在,不存在就先创建if(!uploadFile.exists()) {// 新建目录uploadFile.mkdir();}try {//获取上传文件的文件名String originalFilename = file.getOriginalFilename();//获取文件后缀名String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));// 通过系统当前的毫秒数,生成随机文件名String fileName = System.currentTimeMillis() + suffix;// 上传文件(转存文件到指定目录)file.transferTo(new File(uploadFile.getPath(), fileName));// 如果上传成功,设置作用域request.setAttribute("msg", "文件上传成功!");} catch (IOException e) {request.setAttribute("msg", "文件上传失败");throw new RuntimeException(e);}}}return "result";}
9. 全局异常
在JavaEE项目开发过程中,会遇到很多各种各样的bug,每个过程单独处理,系统的代码耦合度会太高。因此,SPringleMVC对于异常处理这里提供了支持,通过其提供的全局异常处理机制将异常信息从处理过程抽离出来,既保证了相关处理过程的单一,也实现了异常信息的统一和维护。
- 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver
- 实现Spring的异常处理接口 HandlerExceptionResolver定义自己的异常处理器
- 使用@ExceptionHandler注解
9.1 SimpleMappingExceptionResolver处理
首先在/hello触发器上添加一个简单的错误:
System.out.println(1/0);
访问url:
http://localhost:8080/springmvc01/hello
未配置全局异常处理之前:
配置servlet-context.xml之后:
<!-- 全局异常处理配置 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 页面跳转时出现异常,设置默认错误页面 --><property name="defaultErrorView" value="error"/><!-- 异常发生时,设置异常的变量名 --><property name="exceptionAttribute" value="ex"/></bean>
访问结果:
成功跳转到了错误处理页面 error.jsp。
这个也可以捕获自己的自定义异常,想将不同的异常映射到不同的页面也可以在xml进行配置。
servlet-context.xml 文件配置:
<!-- 设置自定义义异常映射和页面映射 --><property name="exceptionMappings"><props><!-- key代表的是自定义异常常用的路径;括案中设置的是具体的页面 --><prop key="com.xxxx.springmvc.exception.ParamsException">params_error</prop><prop key="com.xxxx.springmvc.exception.BusinessException">business_error</prop></props></property>
9.2 实现接口 HandlerExceptionResolver定义自己的异常处理器
@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {ModelAndView mv = new ModelAndView("error");mv.addObject("ex", "默认的错误信息");return mv;}
}
这样实现接口之后就可以生效了。
访问/hello接口触发器,成功跳转:
9.3 @ExceptionHandler注解处理
页面处理程序继承 BaseController
public class BaseController {@ExceptionHandlerpublic String exc(HttpServletRequest request, HttpServletResponse response, Exception ex){request.setAttribute("ex", ex);if(ex instanceof ParamsException){return "error_param";}if(ex instanceof BusinessException){return "error_business";}return "error";}
}
使用 @ExceptionHandler 注解须知异常处理,具有继承特性。有扩展性好(只需要要将要异常处理的 Controller 类继承于 BaseController 即可),不需要附加 Spring 配置等优点,但该方法还已有有个码存储入缓存(需要修改已有个码,使相关类继承于 BaseController),在异常处理时不建议取顶级条件外的数括。
9.4 未捕获异常的处理
对于 Unchecked Exception 而言,由于不强制使用捕获技术,往往在接爱隐藏,如果运行期产生 Unchecked Exception,屏幕中又没有进行相应的捕获和处理,则我们可能看不到页面上的 404,500……等服务端内部错误提示页面。
此需要一个全局的异常处理机制。目前大多数据服务端都支持在 web.xml 中通过(Websphere/Weblogic)或者 (Tomcat)中点配置将定义异常映射显示页面。修改 web.xml 文件,增加以下内容:
<!-- 全局页面定义 -->
<error-page><exception-type>java.lang.Throwable</exception-type><location>/500.jsp</location>
</error-page>
<error-page><error-code>500</error-code><location>/500.jsp</location>
</error-page>
<error-page><error-code>404</error-code><location>/404.jsp</location>
</error-page>
相关文章:
SpringMVC知识点总结(速查速记)
文章目录 前言1、MVC是什么2、SpringMVC是什么3、SpringMVC请求流程 && 环境搭建3.1 SpringMVC请求流程3.2 搭建环境3.2.1开发环境3.2.2 环境配置步骤 4. url地址映射 && 参数绑定4.1 url地址映射之RequestMapping①、映射单个url②、映射多个url③、映射url到…...
配置 Odoo 的 PostgreSQL 数据库以允许远程访问的步骤
1. 修改 PostgreSQL 配置文件 a. 修改 postgresql.conf 找到 PostgreSQL 的主配置文件 postgresql.conf,通常位于 /etc/postgresql/<版本号>/main/ 目录下。修改 listen_addresses 项的值为 *,表示允许来自任何 IP 地址的连接: sudo…...
涨薪技术|0到1学会性能测试第42课-apache监控与调优
前面的推文我们学习了操作系统性能监控与调优知识,如CPU、内存、磁盘、网络监控等,今天开始分享中间件apache监控与调优知识,后续文章都会系统分享干货,带大家从0到1学会性能测试! Apache是世界上使用最多的web服务器软件一种,它可以运行在几乎所有广泛使用的计算机平台上…...
【学习笔记】Shell编程--Bash变量
变量类型说明环境变量 与Shell的执行环境相关的一些变量。如PATH,HOME等,用户可重新定义。 一、环境变量的创建:export, export ABCD2 二、环境变量的查看 使用echo命令查看单个环境变量。如: echo $PATH 使用printenv…...
SpringBoot+Redis全局唯一ID生成器
📦 优雅版 Redis ID 生成器工具类 支持: 项目启动时自动初始化起始值获取自增 ID 方法yml 配置化起始值可灵活扩展多业务线 ID 📌 application.yml 配置 id-generator:member-start-value: 1000000000📌 配置类:IdG…...
micro-app前端微服务原理解析
一、核心设计思想 基于 WebComponents 的组件化渲染 micro-app 借鉴 WebComponents 的 CustomElement 和 ShadowDom 特性,将子应用封装为类似 WebComponent 的自定义标签(如 <micro-app>)。通过 ShadowDom 的天然隔离机制,实…...
大连理工大学选修课——机器学习笔记(7):集成学习及随机森林
集成学习及随机森林 集成学习概述 泛化能力的局限 每种学习模型的能力都有其上限 限制于特定结构受限于训练样本的质量和规模 如何再提高泛化能力? 研究新结构扩大训练规模 提升模型的泛化能力 创造性思路 组合多个学习模型 集成学习 集成学习不是特定的…...
[特殊字符] Spring Cloud 微服务配置统一管理:基于 Nacos 的最佳实践详解
在微服务架构中,配置文件众多、管理复杂是常见问题。本文将手把手演示如何将配置集中托管到 Nacos,并在 Spring Cloud Alibaba 项目中实现统一配置管理 自动刷新机制。 一、为什么要使用 Nacos 统一配置? 传统方式下,每个服务都…...
【mysql】执行过程,背诵版
sql执行再mysql的执行过程 1. 建立连接 sql通过tcp/ip发送到服务器服务器检查用户名,密码,权限创建线程处理连接 如果是sql8.0之前,select会先从缓存中查找,命中则返回,由于表结构变更会导致缓存失效,已废…...
[Survey] Image Segmentation in Foundation Model Era: A Survey
BaseInfo TitleImage Segmentation in Foundation Model Era: A SurveyAdresshttps://arxiv.org/pdf/2408.12957Journal/Time-Author北理工、上交、浙大 CCAI 、瑞士苏黎世联邦理工学院、德国慕尼黑工业大学Codehttps://github.com/stanley-313/ImageSegFM-Survey 1. Introdu…...
关于杰理ac791切换版本, git clone下来仍然是最新版本问题
在git clone 之后,在本地切换分支 常规流程:git clone →git branch →git branch -a → git checkout 分支名...
生成项目.gitignore文件的多种高效方式
在使用 Git 进行版本控制时,.gitignore 文件是不可或缺的配置文件。它可以帮助我们指定哪些文件或目录不需要被 Git 跟踪,从而避免将不必要的文件(如临时文件、编译生成的文件等)提交到仓库中。这篇文章将介绍几种生成 .gitignore…...
2025年“深圳杯”数学建模挑战赛D题-法医物证多人身份鉴定问题
法医物证多人身份鉴定问题 小驴数模 犯罪现场法医物证鉴定是关系到国家安全、公共安全、人民生命财产安全和社会稳定的重大问题。目前法医物证鉴定依赖DNA分析技术不断提升。DNA检验的核心是STR(Short Tandem Repeat,短串联重复序列)分析技术…...
嵌入式开发高频面试题全解析:从基础编程到内存操作核心知识点实战
一、数组操作:3x3 数组的对角和、偶数和、奇数和 题目 求 3x3 数组的对角元素和、偶数元素和、奇数元素和。 知识点 数组遍历:通过双重循环访问数组的每个元素,外层循环控制行,内层循环控制列。对角元素判断: 主对…...
JAVA SE 反射,枚举与lambda表达式
文章目录 📕1. 反射✏️1.1 反射相关的类✏️1.2 Class类中的相关方法✏️1.3 Field类中的相关方法✏️1.4 Method类中的相关方法✏️1.5 Constructor类中的相关方法✏️1.6 获取Class对象的三种方式✏️1.7 反射的使用 📕2. 枚举2.1 枚举的定义✏️2.2 …...
每日算法-250430
每日算法 - 2025年4月30日 记录下今天解决的两道题目。 870. 优势洗牌 (Advantage Shuffle) 题目描述 解题思路与方法 核心思想:贪心策略 (田忌赛马) 这道题的目标是对于 nums1 中的每个元素,找到 nums2 中一个比它小的元素进行配对(如果…...
MacOS 安装 cocoapods
MacOS 安装 cocoapods 下面使用 HomeBrew 安装 cocoapods 一、检测 HomeBrew 是否安装 打开终端执行命令 brew -v #如果安装,输出如 Homebrew 4.5.0如果未安装 Mac HomeBrew安装 二、检测 ruby 是否安装 系统一般自带了 ruby 但是这个升级有些麻烦,我…...
MATLAB绘制饼图(二维/三维)
在数据分析与展示领域,饼图是一种直观且高效的可视化工具,能够在瞬间传递各部分与整体的比例关系。今天,我将分享一段 MATLAB 绘制二维及三维饼图的代码,助你轻松将数据以饼图形式呈现于众人眼前。 无论是二维饼图的简洁明了&…...
python将字符串转成二进制数组
python将字符串转成二进制数组 功能概述: save_binary_to_json() 函数:将字符串转换为二进制数据(字节的整数表示),并保存到JSON文件中。 load_binary_from_json() 函数:从JSON文件中读取二进制数据并还原…...
防止HTTPS页面通过<iframe>标签嵌入HTTP内容
防止HTTPS页面通过<iframe>标签嵌入HTTP内容 出于安全考虑,现代浏览器实施了严格的规则来防止HTTPS页面通过<iframe>标签嵌入HTTP内容。这种行为主要是为了防止所谓的“混合内容”问题,即在一个安全(加密)的页面中…...
windows 使用websocket++ (C++环境)
一、简介 websocket官方网址:http://websocket.org/ websocketpp官方网址:https://www.zaphoyd.com/websocketpp websocketpp使用手册:https://www.zaphoyd.com/websocketpp/manual/ websocketpp 是 C 的 WebSocket 客户端/服务器库. 它是…...
无水印短视频素材下载网站有哪些?十个高清无水印视频素材网站分享
你知道怎么下载无水印视频素材吗?今天小编就给大家推荐十个高清无水印视频素材下载的网站,如果你也是苦于下载高清无水印的短视频素材,赶紧来看看吧~ 1. 稻虎网 首推的是稻虎网。这个网站简直就是短视频创作者的宝库。无论你需要…...
【dify—5】Dify关联Ollama
目录 一、修改.env文件 二、启动dify 三、访问dify 四、设置关联 五、添加模型插件 5.1 添加模型 5.2 配置信息编辑 第一部分 安装difydocker教程:【difydocker安装教程】-CSDN博客 第二部分 dock重装教程: 【dify—2】docker重装-CSDN博客 第三…...
PostgreSQL可串行化快照隔离和冻结处理
1.可串行化快照隔离 可串行化快照隔离SSI已经嵌入到快照隔离SI中,以实现真正的可串行化隔离等级。 SSI实现基本策略 使用SIREDA锁记录事务访问的所有对象(元组,页面,关系)。 当写入任何堆元组/索引元组时ÿ…...
Java 多线程进阶:什么是线程安全?
在多线程编程中,“线程安全”是一个非常重要但又常被误解的概念。尤其对于刚接触多线程的人来说,不理解线程安全的本质,容易写出“偶尔出错”的代码——这类 bug 往往隐蔽且难以复现。 本文将用尽可能通俗的语言,从三个角度解释线…...
Java导出带图片的Excel
使用easypoi导出带图片的Excel, 引入依赖 依赖中着重要剔除可能会造成冲突的依赖,不剔除的话可能会报错 Exception in thread “main” java.lang.NoSuchFieldError: Class org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook does not …...
Keysight万用表使用指南及基于Python采集数据生成Excel文件
文章目录 说明使用的库openpyxlpyvisa 代码说明效果展示参考代码 说明 本文介绍了 Keysight 34465A 的基本使用和 SCPI 指令设置,演示了使用 Python 的 PyVISA 库控制两台 34465A 同时采集数据的完整流程,包括设置采样参数、触发测量、读取数据、使用 O…...
HarmonyOS Next-DevEco Studio(5.0.2)无网络环境配置(详细教程)
开发者如果电脑处于完全无网环境,可以参考下面文档进行相关配置 DevEco Studio(5.0.2)开发环境一览: 工具版本DevEco Studio5.0.2openHarmonySDK14ohpm5.0.11node.js18.20.1hypium1.0.21 一、下载DevEco Studio(5.0.2 Release)…...
数字中国的建设之路:超聚变以“智算数能”四大密钥,共建智能体时代
文 | 智能相对论 作者 | 陈泊丞 即便是数字中国建设这样的宏大叙事,在长期的行业实践与业务聚焦之下,未来的发展路径也将会越来越清晰。日前,第八届数字中国建设峰会在福建拉开序幕,各大论坛、企业、机构、组织等纷纷围绕数字中…...
PageOffice在线打开word文件,并实现切换文件
本示例关键代码的编写位置,请参考“PageOffice 开发者中心-快速起步–开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 注意 本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径ÿ…...
Ubuntu 24.04 终端美化
参考文章:Ubuntu终端美化(tabbyoh-my-zsh)-Ubuntu系列03 有些步骤和 Ubuntu 24.04 不太适配,而且逻辑不太适合小白,故写此文。 1. 安装 Tabby 参考文章的 tabby 版本过老,如果在 Ubuntu 24.04 装会报一些依…...
python合并word中的run
在处理Word文档时,使用python-docx库可以读取文档中的段落,并将每个段落中的多个run合并为一个run。run对象用于表示段落中具有相同格式的文本部分。将多个run合并为一个run可以帮助简化文档结构,尤其是在格式一致的情况下。 以下是一个示例…...
微前端框架选型指南
微前端框架选型指南 一、写在前面 微前端架构为大型前端系统提供了分而治之的能力,不同团队可以独立开发、部署和维护各自的模块。然而,当前市面上存在多种微前端框架(如 Qiankun、Wujie、micro-app、Hel、Emp 等),选…...
Tailwind CSS实战技巧:从核心类到高效开发
使用 Kooboo平台 训练实战技巧,无需配置安装,直接引入CDN就可以在线练习了!具体操作流程:进入Kooboo后,选择创建空白站点 -> 站点开发 -> 控制面板 -> 页面 ->新建普通页面 -> 编写代码 一、核心布局类…...
C# 事件与委托
一、委托基础 1. 委托定义 委托是一种类型安全的函数指针,它允许将方法作为参数传递给其他方法。 // 声明一个委托类型 public delegate void MyDelegate(string message);// 使用委托 public class Program {public static void Main(){// 创建委托实例并指向方…...
django_rq
使用 Loguru 记录 Django-RQ 任务日志 要在 Django-RQ 处理的任务中使用 Loguru 记录日志,你需要做的就是按照标准的 Loguru 使用方法配置和使用日志记录器。下面是一个简单的示例,展示如何在 Django-RQ 的任务中集成 Loguru: 安装必要的包…...
Java List分页工具
PageUtil.java import com.google.common.collect.Lists; import com.jd.platform.hotkey.dashboard.common.domain.Page; import org.springframework.util.CollectionUtils;import java.util.ArrayList; import java.util.List;public class PageUtil {/*** 通用分页工具类*…...
【UE5】“对不起,您的客户端未能传递登录所需的参数”解决办法
想要进入Epic账户,正常登录后就会弹出这个: 官方提供了一个解决办法: 如果以上办法行不通,关闭单点登录: 成功解决...
Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity
知识点: 1、安全开发-JavaEE-开发框架-SpringBoot&路由&传参 2、安全开发-JavaEE-模版引擎-Thymeleaf&Freemarker&Velocity 一、演示案例-WEB开发-JavaEE-开发框架-SpringBoot&路由&传参 类似于php语言中的thinkphp,不过要更加…...
出现Invalid bound statement (not found)问题的原因可能有哪些
1.全局配置文件没配好? 检查全局配置文件application.properties或application.yml是否配置扫描mapper包的文件路径 #mybatis配置mapper文件路径 #mybatis.mapper-locationsclasspath:/mapper/*.xml #mybatis-plus配置mapper文件路径 mybatis-plus.mapper-locatio…...
多类型文件集中查看系统
软件介绍 Universal Viewer 是一款具备多格式兼容能力的文件查看工具,旨在为用户提供统一化的文档处理方案。 核心功能优势 该工具采用全格式兼容架构,支持包括图片、音视频及办公文档在内的多种通用文件类型,实现单一软件完成多格式处…...
WebSocket与Socket、TCP、HTTP的关系及区别
1.什么是WebSocket及原理 WebSocket是HTML5中新协议、新API。 WebSocket从满足基于Web的日益增长的实时通信需求应运而生,解决了客户端发起多个Http请求到服务器资源浏览器必须要在经过长时间的轮询问题,实现里多路复用,是全双工、双向、单套…...
【25软考网工】第四章(4)无线局域网WLAN安全技术、无线个人网WPAN
目录 一、无线局域网安全技术 1. WLAN安全机制 编辑 1)SSID访问控制 2)物理地址过滤 3)WEP认证和加密 4)WPA(认证、加密、数据完整性) 5)WPA2 6)无线认证技术 2. WEP和W…...
Vue:el-table-tree懒加载数据
目录 一、出现场景二、具体使用三、修改时重新加载树节点四、新增、删除重新加载树节点 一、出现场景 在项目的开发过程中,我们经常会使用到表格树的格式,但是犹豫数据较多,使用分页又不符合项目需求时,就需要对树进行懒加载的操…...
JCRQ1河马算法+消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测,作者:机器学习之心
JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法消融实验!HO-CNN-LSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-LSTM-Attention、CNN-LSTM-Attent…...
vue elementui 去掉默认填充 密码input导致的默认填充
<el-form-item prop"code"><div style"display: flex; width: 100%; align-items: flex-end"><el-inputv-model"loginForm.code"size"small"auto-complete"off"placeholder"请输入验证码"keyup.en…...
Android学习总结之设计场景题
设计图片请求框架的缓存模块 核心目标是通过分层缓存策略(内存缓存 磁盘缓存)提升图片加载效率,同时兼顾内存占用和存储性能。以下是针对 Android 面试官的回答思路,结合代码注释说明关键设计点: 一、缓存架构设计&…...
【数学建模国奖速成系列】优秀论文绘图复现代码(四)
文章目录 引言三维图双轴图三维散点图完整复现代码 引言 数模比赛的绘图是非常重要得,这篇文章给大家分享我自己复现国奖优秀论文的代码,基于Matalab来实现,可以直接运行出图。之前的文章也有分享【折线图、柱状图、箱线图、热图】的绘制&am…...
哪些因素会影响远程视频监控的质量?浅述EasyCVR视频智能诊断技术
在安防领域,无线监控系统凭借其灵活部署、便捷扩展的特性得到广泛应用。然而,实时监控图像清晰度不足、回放调查受限等问题,严重制约了其应用效果。经分析,摄像机性能、线缆质量、无线网桥性能、交换机配置及供电电压等是影响图像…...
Android学习总结之算法篇六(数组和栈)
括号匹配 public static boolean isValid(String s) {// 创建一个栈用于存储左括号Stack<Character> stack new Stack<>();// 遍历字符串中的每个字符for (char c : s.toCharArray()) {if (c ( || c [ || c {) {// 如果是左括号,将其压入栈中stack…...