Spring MVC
1. 用户发起请求
- 用户行为:用户在浏览器中输入URL或点击链接,向Web服务器(如Tomcat)发起一个HTTP请求。
- 请求传输:请求被发送到Web容器,Web容器根据配置将请求转发给
DispatcherServlet
。
2. 前端控制器(DispatcherServlet)
- 作用:
DispatcherServlet
是Spring MVC的核心组件,负责接收所有进入的HTTP请求,并将它们分发给适当的处理器(Controller)。 - 初始化:在Web应用启动时,
DispatcherServlet
会被初始化,并且会读取Spring配置文件(如dispatcher-servlet.xml
)来初始化相关的Bean。
web.xml
配置
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>
3. 处理器映射(HandlerMapping)
- 作用:
DispatcherServlet
接收到请求后,会查询HandlerMapping
以确定哪个控制器应该处理该请求。 - 常见类型:
RequestMappingHandlerMapping
:基于@RequestMapping
注解的映射。BeanNameUrlHandlerMapping
:基于Bean名称的映射。SimpleUrlHandlerMapping
:基于简单的URL映射。
dispatcher-servlet.xml
配置
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
4. 控制器(Controller)
- 作用:控制器负责处理具体的业务逻辑,可以访问请求参数、表单数据、会话信息等。
- 返回值:控制器方法处理完请求后,返回一个
ModelAndView
对象给DispatcherServlet
。ModelAndView
包含两个部分:- Model:模型数据,即业务数据,可以是一个Map对象,用于向视图传递数据。
- View:逻辑视图名,表示要使用的视图资源的名称。
控制器示例
@Controller
public class HelloController {@Autowiredprivate SomeService someService;@RequestMapping("/hello")public ModelAndView hello(@RequestParam("name") String name) {// 调用服务层方法String message = someService.getMessage(name);ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("message", message);modelAndView.setViewName("hello");return modelAndView;}
}
5. 视图解析器(ViewResolver)
- 作用:
DispatcherServlet
接收到ModelAndView
对象后,会使用ViewResolver
来解析逻辑视图名,找到对应的物理视图资源(如JSP页面)。 - 常见类型:
InternalResourceViewResolver
:用于JSP视图。ThymeleafViewResolver
:用于Thymeleaf视图。FreeMarkerViewResolver
:用于FreeMarker视图。
dispatcher-servlet.xml
配置
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" />
</bean>
6. 视图渲染
- 作用:找到具体的视图资源后,
DispatcherServlet
将模型数据传递给视图进行渲染。 - 渲染过程:视图负责将模型数据转换为HTML或其他格式的输出,这个过程可能包括数据格式化、模板渲染等。
视图示例 (hello.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Hello Page</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
7. 响应客户端
- 作用:渲染完成后,
DispatcherServlet
将最终的HTML页面通过HTTP响应返回给客户端浏览器,用户可以看到请求的结果。
8. 拦截器(Interceptor)
- 作用:在请求处理的过程中,可以配置拦截器来执行一些额外的操作,如日志记录、权限验证、性能监控等。
- 实现方式:通过实现
HandlerInterceptor
接口或继承HandlerInterceptorAdapter
类来创建拦截器。
拦截器示例
@Component
public class LoggingInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Pre-handle: " + request.getRequestURI());return true; // 继续处理请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Post-handle: " + request.getRequestURI());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("After completion: " + request.getRequestURI());}
}
拦截器配置示例
<mvc:interceptors><bean class="com.example.interceptor.LoggingInterceptor" />
</mvc:interceptors>
9. 异常处理(ExceptionHandler)
- 作用:Spring MVC提供了异常处理机制,可以在控制器中使用
@ExceptionHandler
注解来处理特定类型的异常。 - 全局异常处理:还可以在全局范围内使用
@ControllerAdvice
注解来定义全局异常处理。
异常处理示例
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ModelAndView handleResourceNotFoundException(ResourceNotFoundException ex) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("errorMessage", ex.getMessage());return modelAndView;}@ExceptionHandler(Exception.class)public ModelAndView handleException(Exception ex) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("errorMessage", "An unexpected error occurred.");return modelAndView;}
}
10. 数据绑定和验证
- 数据绑定:Spring MVC提供了数据绑定机制,可以自动将请求参数绑定到控制器方法的参数上。
- 数据验证:可以使用
@Valid
和@Validated
注解结合JSR 303(如Hibernate Validator)来进行数据验证。
数据绑定和验证示例
@Controller
public class UserController {@Autowiredprivate UserService userService;@RequestMapping(value = "/users", method = RequestMethod.POST)public ModelAndView createUser(@Valid @ModelAttribute User user, BindingResult result) {if (result.hasErrors()) {return new ModelAndView("userForm");}userService.createUser(user);return new ModelAndView("redirect:/users");}
}
11. 模型属性管理
- 作用:可以使用
@ModelAttribute
注解将对象添加到模型中,以便在视图中使用。
模型属性管理示例
@Controller
public class UserController {@ModelAttribute("user")public User createUserModel() {return new User();}@RequestMapping("/userForm")public String showUserForm() {return "userForm";}
}
12. 国际化(I18N)
- 作用:Spring MVC支持国际化,可以通过
LocaleResolver
和MessageSource
来实现多语言支持。
国际化配置示例
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"><property name="defaultLocale" value="en_US" />
</bean><bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><property name="basename" value="classpath:messages" /><property name="defaultEncoding" value="UTF-8" />
</bean>
国际化使用示例
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head><title><fmt:message key="title" /></title>
</head>
<body>
<h1><fmt:message key="welcome.message" /></h1>
</body>
</html>
13. 文件上传
- 作用:Spring MVC支持文件上传功能,可以通过
MultipartFile
接口来处理上传的文件。 - 配置:需要配置
CommonsMultipartResolver
或StandardServletMultipartResolver
来处理文件上传。
文件上传配置示例
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="10000000" /> <!-- 10MB -->
</bean>
文件上传控制器示例
@Controller
public class FileUploadController {@RequestMapping(value = "/upload", method = RequestMethod.POST)public ModelAndView handleFileUpload(@RequestParam("file") MultipartFile file) {if (!file.isEmpty()) {try {byte[] bytes = file.getBytes();// 处理文件保存逻辑// ...return new ModelAndView("success");} catch (IOException e) {return new ModelAndView("error");}} else {return new ModelAndView("error");}}
}
14. RESTful API
- 作用:Spring MVC支持RESTful API的开发,可以通过
@RestController
和@RequestMapping
注解来定义RESTful接口。 - 返回JSON:可以使用
@ResponseBody
注解将返回对象转换为JSON格式。
RESTful API示例
@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);}@PutMapping("/{id}")public User updateUser(@PathVariable Long id, @RequestBody User user) {return userService.updateUser(id, user);}@DeleteMapping("/{id}")public void deleteUser(@PathVariable Long id) {userService.deleteUser(id);}
}
15. 安全性(Security)
- 作用:Spring Security可以与Spring MVC集成,提供安全保护,如认证和授权。
- 配置:需要配置Spring Security的相关Bean和过滤器。
Spring Security配置示例
<security:http auto-config="true"><security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" /><security:form-login login-page="/login" default-target-url="/home" authentication-failure-url="/login?error" /><security:logout logout-success-url="/login?logout" />
</security:http><security:authentication-manager><security:authentication-provider><security:user-service><security:user name="user" password="password" authorities="ROLE_USER" /><security:user name="admin" password="password" authorities="ROLE_ADMIN" /></security:user-service></security:authentication-provider>
</security:authentication-manager>
16. 异步处理
- 作用:Spring MVC支持异步处理,可以通过
@Async
注解和DeferredResult
来实现异步请求处理。
异步处理示例
@Controller
public class AsyncController {@Autowiredprivate AsyncService asyncService;@RequestMapping("/async")public DeferredResult<String> handleAsyncRequest() {DeferredResult<String> deferredResult = new DeferredResult<>();asyncService.handleAsync(deferredResult);return deferredResult;}
}@Service
public class AsyncService {@Asyncpublic void handleAsync(DeferredResult<String> deferredResult) {// 模拟耗时操作try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}deferredResult.setResult("Async processing completed");}
}
17. 消息转换器(MessageConverter)
- 作用:Spring MVC使用消息转换器(MessageConverter)将请求体和响应体转换为Java对象或从Java对象转换为响应体。
- 常见类型:
MappingJackson2HttpMessageConverter
:用于JSON转换。StringHttpMessageConverter
:用于字符串转换。
消息转换器配置示例
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" /><bean class="org.springframework.http.converter.StringHttpMessageConverter" /></list></property>
</bean>
18. 模板引擎
- 作用:Spring MVC支持多种模板引擎,如Thymeleaf、FreeMarker等。
- 配置:需要配置相应的模板解析器和视图解析器。
Thymeleaf配置示例
<bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolvers"><set><bean class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"><property name="prefix" value="/WEB-INF/templates/" /><property name="suffix" value=".html" /><property name="templateMode" value="HTML5" /></bean></set></property>
</bean><bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="templateEngine" ref="templateEngine" />
</bean>
19. 拦截器链
- 作用:Spring MVC支持多个拦截器组成一个拦截器链,按顺序执行。
- 配置:可以在
dispatcher-servlet.xml
中配置多个拦截器。
拦截器链配置示例
<mvc:interceptors><bean class="com.example.interceptor.LoggingInterceptor" /><bean class="com.example.interceptor.AuthorizationInterceptor" />
</mvc:interceptors>
20. 异常处理策略
- 作用:Spring MVC提供了多种异常处理策略,如全局异常处理、局部异常处理等。
- 配置:可以通过
@ControllerAdvice
和@ExceptionHandler
注解来定义异常处理策略。
全局异常处理示例
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse("NOT_FOUND", ex.getMessage());return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);}@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleException(Exception ex) {ErrorResponse errorResponse = new ErrorResponse("INTERNAL_ERROR", "An unexpected error occurred.");return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);}
}
21. 拦截器的生命周期
- 作用:拦截器有三个主要的生命周期方法:
preHandle
、postHandle
和afterCompletion
。 - 方法说明:
preHandle
:在请求处理之前调用,返回true
继续处理请求,返回false
中断请求处理。postHandle
:在请求处理之后、视图渲染之前调用。afterCompletion
:在请求处理完成之后调用,无论是否发生异常。
拦截器生命周期示例
@Component
public class LoggingInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("Pre-handle: " + request.getRequestURI());return true; // 继续处理请求}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("Post-handle: " + request.getRequestURI());}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("After completion: " + request.getRequestURI());}
}
22. 跨域请求(CORS)
- 作用:Spring MVC支持跨域请求(CORS),可以在控制器或全局配置中启用CORS支持。
- 配置:可以通过
@CrossOrigin
注解或WebMvcConfigurer
接口来配置CORS。
跨域请求配置示例
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://example.com").allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").allowCredentials(true);}
}
控制器级别的CORS配置
@RestController
@RequestMapping("/api/users")
@CrossOrigin(origins = "http://example.com")
public class UserController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.getAllUsers();}// 其他方法...
}
23. 自定义注解
- 作用:Spring MVC支持自定义注解,可以通过自定义注解来简化代码或实现特定的功能。
- 实现方式:定义自定义注解并使用
HandlerMethodArgumentResolver
来解析注解。
自定义注解示例
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
自定义注解解析器
@Component
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {@Autowiredprivate HttpServletRequest request;@Overridepublic boolean supportsParameter(MethodParameter parameter) {return parameter.getParameterAnnotation(CurrentUser.class) != null;}@Overridepublic Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {// 从请求中获取当前用户信息User user = (User) request.getSession().getAttribute("user");return user;}
}
注册自定义注解解析器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {resolvers.add(currentUserMethodArgumentResolver);}
}
使用自定义注解
@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/current")public User getCurrentUser(@CurrentUser User user) {return user;}
}
24. 缓存支持
- 作用:Spring MVC支持缓存,可以通过
@Cacheable
、@CacheEvict
和@CachePut
注解来实现缓存管理。 - 配置:需要配置缓存管理器(如
ConcurrentMapCacheManager
或RedisCacheManager
)。
缓存配置示例
@Configuration
@EnableCaching
public class CacheConfig {@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("users");}
}
缓存注解示例
@RestController
@RequestMapping("/api/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")@Cacheable(value = "users", key = "#id")public User getUserById(@PathVariable Long id) {return userService.getUserById(id);}@PostMapping@CachePut(value = "users", key = "#user.id")public User createUser(@RequestBody User user) {return userService.createUser(user);}@PutMapping("/{id}")@CachePut(value = "users", key = "#id")public User updateUser(@PathVariable Long id, @RequestBody User user) {return userService.updateUser(id, user);}@DeleteMapping("/{id}")@CacheEvict(value = "users", key = "#id")public void deleteUser(@PathVariable Long id) {userService.deleteUser(id);}
}
25. AOP(面向切面编程)
- 作用:Spring MVC支持AOP,可以通过切面来实现横切关注点的分离,如日志记录、事务管理等。
- 实现方式:使用
@Aspect
注解定义切面,并使用@Before
、@After
、@Around
等注解定义通知。
切面示例
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.controller.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}@After("execution(* com.example.controller.*.*(..))")public void logAfter(JoinPoint joinPoint) {System.out.println("After method: " + joinPoint.getSignature().getName());}@Around("execution(* com.example.service.*.*(..))")public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("Around before method: " + joinPoint.getSignature().getName());Object result = joinPoint.proceed();System.out.println("Around after method: " + joinPoint.getSignature().getName());return result;}
}
26. 事务管理
- 作用:Spring MVC支持事务管理,可以通过
@Transactional
注解来管理事务。 - 配置:需要配置事务管理器(如
DataSourceTransactionManager
)。
事务管理配置示例
@Configuration
@EnableTransactionManagement
public class TransactionConfig {@Autowiredprivate DataSource dataSource;@Beanpublic PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(dataSource);}
}
事务管理注解示例
@Service
@Transactional
public class UserService {@Autowiredprivate UserRepository userRepository;public User createUser(User user) {return userRepository.save(user);}public void deleteUser(Long id) {userRepository.deleteById(id);}
}
27. 异步任务调度
- 作用:Spring MVC支持异步任务调度,可以通过
@Scheduled
注解来定期执行任务。 - 配置:需要配置任务调度器(如
TaskScheduler
)。
任务调度配置示例
@Configuration
@EnableScheduling
public class SchedulingConfig {@Beanpublic TaskScheduler taskScheduler() {return new ThreadPoolTaskScheduler();}
}
任务调度注解示例
@Component
public class ScheduledTasks {@Scheduled(fixedRate = 5000)public void scheduledTask() {System.out.println("Scheduled task executed at " + new Date());}
}
28. 配置类
- 作用:Spring MVC支持使用Java配置类来替代传统的XML配置文件。
- 配置:可以通过
@Configuration
注解定义配置类,并使用@ComponentScan
、@EnableWebMvc
等注解来启用Web MVC功能。
Java配置类示例
@Configuration
@ComponentScan(basePackages = "com.example")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureViewResolvers(ViewResolverRegistry registry) {registry.jsp("/WEB-INF/views/", ".jsp");}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoggingInterceptor());}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/");}@Beanpublic MessageSource messageSource() {ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();messageSource.setBasename("classpath:messages");messageSource.setDefaultEncoding("UTF-8");return messageSource;}@Beanpublic LocaleResolver localeResolver() {SessionLocaleResolver localeResolver = new SessionLocaleResolver();localeResolver.setDefaultLocale(Locale.US);return localeResolver;}
}
总结
通过上述详细的步骤和示例,我们可以看到Spring MVC的工作流程涉及多个组件的协同工作。每个组件都有其特定的职责,确保请求能够被正确地处理和响应。
相关文章:
Spring MVC
1. 用户发起请求 用户行为:用户在浏览器中输入URL或点击链接,向Web服务器(如Tomcat)发起一个HTTP请求。请求传输:请求被发送到Web容器,Web容器根据配置将请求转发给DispatcherServlet。 2. 前端控制器&am…...
linux ubuntu的脚本知
目录 一、变量的引用 二、判断指定的文件是否存在 三、判断目录是否存在 四、判断最近一次命令执行是否成功 五、一些比较符号 六、"文件"的读取和写入 七、echo打印输出 八、ubuntu切换到root用户 九、后台进程的控制 N、其它可以参考的网址 脚本功能强大…...
Spring Boot 动态数据源切换
背景 随着互联网应用的快速发展,多数据源的需求日益增多。Spring Boot 以其简洁的配置和强大的功能,成为实现动态数据源切换的理想选择。本文将通过具体的配置和代码示例,详细介绍如何在 Spring Boot 应用中实现动态数据源切换,帮…...
Design Linear Filters in the Frequency Domain (MATLAB帮助文档)
Design Linear Filters in the Frequency Domain 这个帮助文档写得很好,简单明了,一句废话没有。 This topic describes functions that perform filtering in the frequency domain. 2-D Finite Impulse Response (FIR) Filters The Image Processi…...
Java知识及热点面试题总结(二)
1、什么是死锁(deadlock)? 两个线程或两个以上线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是这些线程都陷入了无限的等待中。 如何避免线程死锁? 只要破坏产生死锁的四个条件中的其中一个就可以了。 破坏互斥条件:这个条件我们没有办法…...
开源加密库mbedtls及其Windows编译库
目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目,它提供了一个轻量级的加密库,适用于嵌入式系统和物联网设备。这个项…...
架构01-演进中的架构
零、文章目录 架构01-演进中的架构 1、原始分布式时代:Unix设计哲学下的服务探索 (1)背景 时间:20世纪70年代末到80年代初计算机硬件:16位寻址能力、不足5MHz时钟频率的处理器、128KB左右的内存转型:从…...
npm-运行项目报错:A complete log of this run can be found .......npm-cache_logs\
1.问题 没有找到对应的某种依赖,node_modules出现问题。 2.解决 (1)查看对应依赖是否引入或者是由于合并分支错误 引入js或依赖不存在。谨慎删除依赖包 (2)查找对应引入依赖进行安装最后解决方法-删除依赖包清除缓存 npm cache clean --force (2)重新向同事引入…...
C++中的函数对象
C 中函数对象的定义和特点 定义:函数对象(Function Object)也叫仿函数(Functor),是一个类,这个类重载了函数调用运算符()。当创建这个类的对象后,可以像使用函数一样使用这个对象&am…...
godot游戏引擎_瓦片集和瓦片地图介绍
在 Godot 中,TileSet 和 TileMap 是用于处理瓦片地图的两个关键概念,它们的作用和用途有明显的区别。以下是两者的详细对比: 1. TileSet(瓦片集) TileSet 是资源,定义瓦片的内容和属性。 特点:…...
[C++ 核心编程]笔记 4.1 封装
4.1.1 封装的意义 封装是C面向对象三大特性之一 封装的意义: 将属性和行为作为一个整体,表现生活中的事物将属性和行为加以权限控制 封装意义一: 在设计类的时候,属性和行为写在一起,表现事物 语法: class 类名{ 访问权限: 属性 /行为 }…...
学习使用jquery实现在指定div前面增加内容
学习使用jquery实现在指定div前面增加内容 设计思路代码示例 设计思路 选择要添加内容的指定元素: 使用jQuery选择器来选择你希望在其前添加内容的元素。例如,如果你有一个 元素,其ID为qipa250,你可以使用$(‘#qipa250’)来选择…...
如何写出好证明(支持思想的深入数学写作)
不断的修改和精炼是写作过程中的重要环节,数学写作最终目的是提供对问题的深刻洞察而非仅仅陈述细节。 根据harvey mudd college Francis Su教授的《GUIDELINES FOR GOOD MATHEMATICAL WRITING》讲稿,总结出撰写好的数学证明需要注意以下几个要点&#x…...
基于边缘智能网关的机房安全监测应用
随着我国工业互联网的扎实推进,越来越多地区积极建设信息基础设施,以充沛算力支撑产业物联网的可持续发展,数据机房就是其中的典型代表。而且随着机房规模的扩大,对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…...
在WSL 2 (Ubuntu 22.04)安装Docker Ce 启动错误解决
查看WSL版本 在 Windows 命令提示符(CMD)或 PowerShell 中,你可以使用以下命令来查看已安装的 WSL 发行版及其版本信息: wsl -l -v(base) PS C:\Users\Lenovo> wsl -l -vNAME STATE VERSION * Ubuntu-2…...
【RISC-V CPU debug 专栏 3 -- Debugging RISC-V Cores】
文章目录 RISC-V 调试规范开源与多样性挑战调试规范的重要性外部调试支持的主要组件调试功能Lauterbach 的贡献RISC-V 调试规范 调试 RISC-V 内核涉及许多独特的挑战,这是由 RISC-V 的开源特性和多样化的生态系统所决定的。为了避免专有调试接口的泛滥,RISC-V 基金会内的工作…...
Unity Banner广告后面自定义背景,高度适配
目的是实现这个,代码放下面 已经测试十几台设备包括pad没问题 以Max聚合为例 展示(关闭)Banner的时候调用Show,Banner加载成功回调里调用RefreshSizeDelta 最终获得是像素 所以UGUI的Canvas使用Constant Pixel Size模式࿰…...
【技术文档:技术传播的灯塔】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
git的使用(简洁版)
什么是 Git? Git 是一个分布式版本控制系统 (DVCS),用于跟踪文件的更改并协调多人之间的工作。它由 Linus Torvalds 在 2005 年创建,最初是为了管理 Linux 内核的开发。Git 的主要目标是提供高效、易用的版本控制工具,使得开发者…...
数据库编程(sqlite3)
一:数据库分类 常用的数据库 大型数据库 :Oracle商业、多平台、关系型数据库功能最强大、最复杂、市场占比最高的商业数据库 中型数据库 :Server是微软开发的数据库产品,主要支持windows平台 小型数据库 : mySQL是一个小型关系型…...
Python 中如何处理异常?
在Python中,异常处理是一种重要的编程技术,它允许开发者优雅地处理程序运行过程中出现的错误或异常情况,而不是让程序直接崩溃。 通过异常处理,我们可以使程序更加健壮、用户友好。 异常处理的基本结构 Python中最基本的异常处…...
RHCE——nfs网络文件系统
简介 NFS(Network File System,网络文件系统)是FreeBSD支持的文件系统中的一种,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通过TCP/IP网络共享资源,主要在unix系列操作系统上使用…...
【人工智能】Python常用库-Scikit-learn常用方法教程
Scikit-learn 是一个功能强大的机器学习库,支持数据预处理、分类、回归、聚类、降维等功能,广泛用于模型开发与评估。以下是 Scikit-learn 的常用方法及详细说明。 1. 安装与导入 安装 Scikit-learn: pip install scikit-learn导入基本模块…...
sargo 官方镜像刷机
资料 官方镜像https://developers.google.cn/android/images?hlzh-cn zip镜像 https://googledownloads.cn/dl/android/aosp/sargo-rq3a.211001.001-factory-2a1befea.zip 使用 fastboot 刷写 下载好的镜像 步骤 先使用命令 adb reboot bootloader 再使用./falsh-all.sh 命…...
解决首次加载数据空指针异常
起初效果: 使用async...await异步加载数据 最终效果: 代码: <template><div class"user-list-container"><!-- 加载状态 --><div v-if"loading" class"loading">正在加载用户数据..…...
BERT的中文问答系统35
优化GUI布局、显示问答内容、增加自动搜索功能等。以下是完整的项目结构和代码: 项目结构 xihe241117/ ├── data/ │ └── train_data.jsonl ├── logs/ ├── models/ │ └── xihua_model.pth ├── requirements.txt ├── README.md └── 智…...
若依框架部署在网站一个子目录下(/admin)问题(
部署在子目录下首先修改vue.config.js文件: 问题一:登陆之后跳转到了404页面问题,解决办法如下: src/router/index.js 把404页面直接变成了首页(大佬有啥优雅的解决办法求告知) 问题二:退出登录…...
DB2数据库
DB2数据库是IBM公司开发的一种关系数据库管理系统(RDBMS),它支持多种数据模型,包括关系模型、文档模型、图模型等。DB2最初是为大型机环境设计的,但现在它已扩展到各种平台,包括Windows、Linux和Unix等&…...
python excel接口自动化测试框架!
今天采用Excel继续写一个接口自动化测试框架。 设计流程图 这张图是我的excel接口测试框架的一些设计思路。 首先读取excel文件,得到测试信息,然后通过封装的requests方法,用unittest进行测试。 其中,接口关联的参数通过正则进…...
Spring框架整合单元测试
目录 一、配置文件方式 1.导入依赖 2.编写类和方法 3.配置文件applicationContext-test.xml 4.测试类 5.运行结果 二、全注解方式 1.编写类和方法 2.配置类 3.测试类 4.运行结果 每次进行单元测试的时候,都需要编写创建工厂,加载配置文件等相关…...
Java部分新特性
模式匹配 instance of 模式匹配 之前写法 public void print(Object o) {if (o instanceof String){String str (String) obj;System.out.println("This is a String of length " s.length());} else {System.out.println("This is not a String");} …...
keepalived+lVS(dr)高可用集群
keepalivedlVS(dr)高可用集群 规划 服务器名称IP描述masterkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.151keepalived的master节点和lvs负载均衡backupkeepalivedlvsVIP:192.168.238.100DIP:192.168.238.152keepalived的备份节点和lvs负载均衡server1VIP:192.168.238.…...
【前端】JavaScript中的柯里化(Currying)详解及实现
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯什么是柯里化?💯柯里化的特点💯柯里化的简单示例💯通用的柯里化实现💯柯里化让代码更易读的原因💯…...
Cyberchef 辅助网络安全运营-数据格式转换
在网络安全的世界中,经常会遇到各种格式的数据,比如二进制,比如说16进制,URL编码,HTML编码,Unicode编码,Base格式的编码。网络安全运营一个明确的目标就是把这些不同的数据格式换成为可读的字符…...
鸿蒙面试 --- 性能优化(精简版)
一、性能优化的三个方面 感知流畅:通过合理运用动画提升用户对应用操作的感知流畅度,同时避免因动画滥用导致性能下降。涵盖视觉感知优化、转场场景动效感知流畅(如出现 / 消失转场、导航转场、模态转场、共享元素转场等)&#x…...
qsort函数详解+代码展示
文章目录 概要系列文章目录前言(1) 定义(2) 使用(举例子 上代码)1、定义数组:2、定义比较函数:3、调用 qsort:4、输出结果: (3) 注意事项 小结 概要 本篇博客将详细地介绍qsort排序函数,&#x…...
ms-hot29 解码方法
leetcode原题链接: 解码方法 ms-hot目录: ms-hot目录 上一篇:ms-hot28 合并两个有序数组 下一篇:二叉树的中序遍历 题目描述 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : "1" -> A "2"…...
【5】STM32·FreeRTOS·临界段保护与调度器挂起
目录 一、临界段代码保护简介 二、临界段代码保护函数介绍 2.1、调用示例 2.2、内部实现 三、任务调度器的挂起和恢复 3.1、调用示例 3.2、内部实现 一、临界段代码保护简介 什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行ÿ…...
daos源码编译
1. 前言 本文详细介绍如何在almalinux8.9上编译daos.2.0.0源码。系统环境如下: daos: 2.0.0 linux os: almalinux 8.9 linux kernel: 4.18.0-513.5.1.el8_9.x86_64之所以选择2.0.0版本,是因为daos从2.0.0开始是一个全新的架构设计&a…...
Flink--API 之Transformation-转换算子的使用解析
目录 一、常用转换算子详解 (一)map 算子 (二)flatMap 算子 (三)filter 算子 (四)keyBy 算子 元组类型 POJO (五)reduce 算子 二、合并与连接操作 …...
火山引擎VeDI在AI+BI领域的演进与实践
随着数字化时代的到来,企业对于数据分析与智能决策的需求日益增强。作为新一代企业级数据智能平台,火山引擎数智平台VeDI基于字节跳动多年的“数据驱动”实践经验,也正逐步在AI(人工智能)与BI(商业智能&…...
java获取docker镜像构建日志
在Java中获取Docker镜像的构建日志,你可以使用Docker Engine API。以下是一个使用OkHttp库的示例代码,用于获取构建日志: import okhttp3.*; import java.io.IOException; public class DockerLogsFetcher { private static final St…...
Spring-boot整合Webservice服务端
Spring Boot整合Webservice服务端 本文是基于前辈一顿吃不饱的文章SpringBoot整合WebService(服务端客户端)-CSDN博客,由于工作需要用.NET调用其他系统发布的WebService服务,尝试用java搭建一个WebService服务端测试一下…...
动静分离具体是怎么实现的?
在 Nginx 中实现动静分离是一种常见的优化手段,用于提高网站的性能和可扩展性。以下是 Nginx 动静分离的一些基本概念和配置方法: 1、什么是动静分离: 动静分离是指将网站的静态资源(如图片、CSS、JavaScript 文件)与…...
如何取出.vmdk文件中的数据
前提:我的云服务器到期了,于是我将云服务器导出了.vmdk镜像。本想在vm虚拟机中启动,但是一直报错。很是苦恼。 首先下载DiskGenius这个软件。 点击磁盘-》打开磁盘 打开.vmdk文件 可以看到内部的文件了,可以选择对应文件导出到桌…...
Vue2中 vuex 的使用
1.安装 vuex 安装vuex与vue-router类似,vuex是一个独立存在的插件,如果脚手架初始化没有选 vuex,就需要额外安装。 yarn add vuex3 或者 npm i vuex3 233 Vue2 Vue-Router3 Vuex3 344 Vue3 Vue-Router4 Vuex4 2. 新建 store/index.j…...
Swift 数据类型
Swift 数据类型 Swift 是一种强类型语言,这意味着在 Swift 中声明的每个变量和常量都必须具有明确的类型。Swift 的类型系统旨在帮助开发者编写清晰、安全的代码。本文将详细介绍 Swift 中的基本数据类型,包括整数、浮点数、布尔值、字符和字符串。 整…...
【pyspark学习从入门到精通22】机器学习库_5
训练-验证分割 TrainValidationSplit 模型为了选择最佳模型,会对输入数据集(训练数据集)进行随机分割,分成两个子集:较小的训练子集和验证子集。分割只执行一次。 在这个例子中,我们还将使用 ChiSqSelect…...
Zookeeper3.5.8集群部署
环境说明 准备三台服务器,我这边是虚拟机,分别为:bigdata141、bigdata142、bigdata143 下载安装包 下载链接:Index of /dist/zookeeper/zookeeper-3.5.8 下载完后,上传到其中一台服务器,我这边上传到 b…...
Linux 无图形界面磁盘空间排查与优化实践20241127
Linux 无图形界面磁盘空间排查与优化实践 引言:磁盘空间问题的痛点与挑战 🔍 常见问题 当系统磁盘空间超过 90% 时,不仅可能导致性能下降,还可能让关键操作无法正常完成。这种情况下,如何高效且精准地排查磁盘占用来…...