怎么给QQ名片做网站/打开百度一下
文章目录
- Spring MVC 优势
- 1. **松耦合**
- 2. **易于测试**
- 3. **灵活性**
- 4. **强大的配置机制**
- 5. **异常处理**
- 6. **国际化支持**
- 7. **数据验证**
- 8. **安全性**
- 9. **性能优化**
- Spring MVC 劣势
- 1. **学习曲线**
- 2. **配置复杂性**
- 3. **性能开销**
- 4. **视图技术限制**
- 5. **社区和支持**
Spring MVC 优势
1. 松耦合
-
依赖注入(DI):
- 自动装配:Spring 容器通过
@Autowired
注解自动装配依赖,减少了手动创建对象的代码量,提高了代码的可维护性和可测试性。 - 接口编程:鼓励使用接口编程,使得组件之间的依赖关系更加灵活和可替换,增强了模块化设计。
- 生命周期管理:Spring 容器管理 bean 的生命周期,包括初始化、销毁等,确保了资源的有效管理和释放。
- 自动装配:Spring 容器通过
-
示例代码:
@Service public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Long id) {return userRepository.findById(id).orElse(null);} }@Controller public class UserController {@Autowiredprivate UserService userService;@GetMapping("/users/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.getUserById(id);model.addAttribute("user", user);return "user";} }
2. 易于测试
-
单元测试:
- MockMvc:Spring 提供了
MockMvc
类,用于模拟 HTTP 请求和响应,方便进行控制器的单元测试。 - Spring TestContext Framework:提供了丰富的测试支持,包括事务管理、数据库初始化等,使得测试更加高效和全面。
- MockMvc:Spring 提供了
-
示例代码:
@RunWith(SpringRunner.class) @WebMvcTest(UserController.class) public class UserControllerTest {@Autowiredprivate MockMvc mockMvc;@MockBeanprivate UserService userService;@Testpublic void testGetUser() throws Exception {User user = new User(1L, "John Doe", "john@example.com");when(userService.getUserById(1L)).thenReturn(user);mockMvc.perform(get("/users/1")).andExpect(status().isOk()).andExpect(view().name("user")).andExpect(model().attribute("user", user));} }
3. 灵活性
-
视图技术多样:
- JSP:传统的视图技术,适合简单的 Web 应用。
- Thymeleaf:现代的模板引擎,支持静态原型和动态内容的混合,提供了丰富的表达式语言。
- FreeMarker:功能强大的模板引擎,适合复杂的页面生成,提供了灵活的模板语法。
-
配置方式多样:
- 注解配置:使用注解(如
@Controller
、@RequestMapping
)进行配置,简洁易懂,减少了 XML 配置文件的冗余。 - XML 配置:对于复杂的配置需求,可以使用 XML 配置文件进行详细设置,提供了更多的灵活性。
- 注解配置:使用注解(如
4. 强大的配置机制
-
注解驱动:
- @Controller:标记控制器类,使其被 Spring 容器管理。
- @RequestMapping:指定请求映射规则,支持路径、方法、参数等多种匹配方式。
- @GetMapping、@PostMapping:简化常见的 HTTP 方法映射,提高了代码的可读性。
-
XML 配置:
- 扫描组件:使用
<context:component-scan>
扫描指定包下的组件,自动注册到 Spring 容器。 - 启用 MVC 注解驱动:使用
<mvc:annotation-driven>
启用 MVC 注解支持,简化配置。 - 视图解析器:配置视图解析器,如
InternalResourceViewResolver
,将逻辑视图名称解析为具体的视图对象。
- 扫描组件:使用
-
示例代码:
@Configuration @ComponentScan(basePackages = "com.example") @EnableWebMvc public class WebConfig implements WebMvcConfigurer {@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;} }
5. 异常处理
-
全局异常处理:
- @ControllerAdvice:定义全局异常处理器,集中处理多个控制器的异常。
- @ExceptionHandler:处理特定类型的异常,提供统一的错误响应。
-
示例代码:
@ControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public ModelAndView handleResourceNotFoundException(ResourceNotFoundException ex) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("errorMessage", ex.getMessage());return modelAndView;} }
6. 国际化支持
-
多语言支持:
- MessageSource:用于加载多语言资源文件,支持动态获取国际化消息。
- LocaleResolver:解析用户的语言偏好,支持多种语言环境的切换。
- LocaleChangeInterceptor:拦截请求,动态切换语言,提供个性化的用户体验。
-
示例代码:
@Bean public MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("messages");messageSource.setDefaultEncoding("UTF-8");return messageSource; }@Bean public LocaleResolver localeResolver() {CookieLocaleResolver resolver = new CookieLocaleResolver();resolver.setDefaultLocale(Locale.US);resolver.setCookieName("locale");resolver.setCookieMaxAge(3600);return resolver; }@Bean public LocaleChangeInterceptor localeChangeInterceptor() {LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();interceptor.setParamName("lang");return interceptor; }@Override public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(localeChangeInterceptor()); }
7. 数据验证
-
JSR-303 标准:
- Hibernate Validator:常用的验证框架,支持多种验证注解,如
@NotNull
、@Size
、@Email
等。 - @Valid、@Validated:用于触发验证,确保输入数据的有效性。
- BindingResult:捕获验证结果,提供详细的错误信息。
- Hibernate Validator:常用的验证框架,支持多种验证注解,如
-
示例代码:
@PostMapping("/users") public String createUser(@Valid @ModelAttribute User user, BindingResult result, Model model) {if (result.hasErrors()) {return "userForm";}userService.saveUser(user);model.addAttribute("message", "User created successfully");return "success"; }
8. 安全性
-
Spring Security 集成:
- 认证:用户身份验证,支持多种认证机制,如表单登录、HTTP 基本认证等。
- 授权:访问控制,支持基于角色的访问控制(RBAC)、方法级别的安全控制等。
- CSRF 保护:防止跨站请求伪造攻击,保护用户免受恶意攻击。
-
示例代码:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/home").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}admin").roles("ADMIN");} }
9. 性能优化
-
缓存支持:
- Spring Cache:支持多种缓存提供者,如 EhCache、Redis,提供了声明式的缓存管理。
- @Cacheable、@CachePut、@CacheEvict:用于控制缓存操作,提高数据访问速度。
-
异步处理:
- @Async:标记异步方法,支持后台任务的执行。
- CompletableFuture:用于异步编程,提供了丰富的异步操作方法。
-
示例代码:
@Configuration @EnableCaching public class CacheConfig {@Beanpublic CacheManager cacheManager() {return new ConcurrentMapCacheManager("users");} }@Service public class UserService {@Cacheable("users")public User getUserById(Long id) {// 模拟耗时操作Thread.sleep(1000);return userRepository.findById(id).orElse(null);} }@Service public class AsyncService {@Asyncpublic CompletableFuture<User> getUserAsync(Long id) {return CompletableFuture.supplyAsync(() -> userService.getUserById(id));} }
Spring MVC 劣势
1. 学习曲线
- 初学者友好度:
- 概念复杂:Spring MVC 涉及的概念和技术较多,初学者需要时间来理解和掌握,特别是依赖注入、AOP、事务管理等高级特性。
- 文档复杂:官方文档内容丰富但较为复杂,新手可能需要较长时间来消化和理解,特别是对于没有 Java Web 开发经验的开发者。
2. 配置复杂性
- 配置繁琐:
- 大量配置:对于大型项目,需要编写大量的配置代码,尤其是在使用 XML 配置时,配置文件可能变得庞大且难以维护。
- 依赖管理:需要手动管理多个依赖库,增加了项目的复杂度,尤其是在没有使用构建工具(如 Maven 或 Gradle)的情况下。
3. 性能开销
-
初始化开销:
- 启动时间:Spring MVC 在启动时会初始化大量的组件和服务,可能会导致应用启动时间较长,尤其是在配置复杂的项目中。
- 内存占用:大量的依赖注入和代理机制可能会增加内存占用,影响应用的性能。
-
运行时开销:
- 反射和代理:Spring 框架广泛使用反射和代理机制,虽然提供了强大的功能,但也可能引入一定的运行时开销,特别是在高并发场景下。
4. 视图技术限制
- 视图技术选择:
- 技术多样性:虽然支持多种视图技术,但在某些情况下,特定的视图技术可能不够成熟或存在性能问题,例如某些模板引擎的渲染速度较慢。
- 模板引擎兼容性:不同模板引擎之间可能存在兼容性问题,需要额外的工作来解决,尤其是在多团队协作的情况下。
5. 社区和支持
- 社区活跃度:
- 问题解答:虽然 Spring 社区非常活跃,但某些特定问题可能需要较长时间才能得到解答,特别是在处理边缘情况或高级特性时。
- 第三方库支持:一些第三方库可能没有及时更新以支持最新的 Spring 版本,导致兼容性问题,特别是在企业级应用中使用时。
相关文章:

Spring MVC 深度剖析:优势与劣势全面解读
文章目录 Spring MVC 优势1. **松耦合**2. **易于测试**3. **灵活性**4. **强大的配置机制**5. **异常处理**6. **国际化支持**7. **数据验证**8. **安全性**9. **性能优化** Spring MVC 劣势1. **学习曲线**2. **配置复杂性**3. **性能开销**4. **视图技术限制**5. **社区和支…...

力扣hot100-->前缀和/前缀书/LRU缓存
前缀和 1. 560. 和为 K 的子数组 中等 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2&#…...

Three.js CSS2D/CSS3D渲染器
在Three.js开发过程中,有时需要将 HTML 元素与 Three.js 渲染的 3D 场景相结合,这就需要用到 CSS2DRenderer 和 CSS3DRenderer。本文将详细介绍这两种渲染器的原理及其应用 一、CSS2DRenderer 渲染器 概述 CSS2DRenderer 渲染器用于在 3D 场景中渲染纯…...

mongodb文档字符串批量替换
【mongodb文档字符串批量替换脚本语句】 前言: 1、本方式对于数据量大的情况不适用,执行可能比较慢; 2、数据量大的情况,个人推荐代码层面解决,多线程替换更快: (1)写实体类的方式…...

前端安全和解决方案
提到这个我可能想到的就是不要暴露太多的账号密码信息。一些页面的请求和操作要加上权限。 然后下面就详细的介绍前端可能遇到的安全问题以及解决方法。 首先比较常见的前端的安全性问题就是跨站脚本攻击(XSS)。跨站请求伪造(csrfÿ…...

Tlias智能辅助学习系统-部门管理
包括查询、新增、删除、修改功能 控制层 package com.itheima.controller;import com.itheima.pojo.Dept; import com.itheima.pojo.Result; import com.itheima.service.DeptService; import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.XSlf4j; import org.spr…...

React第十节组件之间传值之context
1、Context 使用creatContext() 和 useContext() Hook 实现多层级传值 概述: 在我们想要每个层级都需要某一属性,或者祖孙之间需要传值时,我们可以使用 props 一层一层的向下传递,或者我们使用更便捷的方案,用 creatC…...

flink中barrier不对齐的原因和影响
Barrier 不对齐(Barrier Misalignment)可能导致一些性能和一致性相关的问题,但 Flink 提供了机制来确保即使在不对齐的情况下,也可以保证数据的一致性。 1. 什么是 Barrier 不对齐? Barrier 不对齐是指在分布式数据流…...

软银集团孙正义再度加码OpenAI,近屿智能专注AI人才培养
11月28日凌晨,全球最大财经CNBC报道,软银集团创始人兼CEO孙正义再次向人工智能领域的领军企业OpenAI投资了15亿美元。软银对OpenAI的投资已不是首次。就在上个月,软银已在OpenAI的上一轮融资中注入了5亿美元的资金。但他一直寻求获得OpenAI更…...

麒麟系统x86安装达梦数据库
一、安装准备前工作 操作系统:银河麒麟V10,CPU: x86_64 架构 下载地址,麒麟官网:https://www.kylinos.cn/ 数据库:dm8_20220915_x86_kylin10_64 下载地址,达梦数据库官网:https://…...

Java中的“多态“详解
多态(Polymorphism)是面向对象编程(OOP)中的一个核心概念,它允许同一个接口或方法在不同对象上具有不同的实现方式。多态性使得程序在运行时可以根据对象的实际类型来决定调用哪个方法,从而提高代码的灵活性…...

buuctf-[SUCTF 2019]EasySQL 1解题记录
把你的旗帜给我,我会告诉你这面旗帜是对的。 堆叠注入查询数据库 1; show databases; 查询表名 1; show tables; 获取flag 1;set sql_modepipes_as_concat;select 1...

ASP.NET Core 入门
使用 .NET CLI 创建并运行 ASP.NET Core Web 应用。 文章目录 一、先决条件二、创建Web应用项目三、运行应用四、编辑Razor页面 一、先决条件 .NET 8.0 SDK 二、创建Web应用项目 打开命令行界面,然后输入以下命令: dotnet new webapp --output aspne…...

php反序列化1_常见php序列化的CTF考题
声明: 以下多内容来自暗月师傅我是通过他的教程来学习记录的,如有侵权联系删除。 一道反序列化的CTF题分享_ctf反序列化题目_Mr.95的博客-CSDN博客 一些其他大佬的wp参考:php_反序列化_1 | dayu’s blog (killdayu.com) 序列化一个对象将…...

题目 1013: [编程入门]Sn的公式求和
题目 1013: [编程入门]Sn的公式求和 [编程入门]Sn的公式求和 求Snaaaaaa…aa…aaa(有n个a)之值,其中a是一个数字,为2。 例如,n5时222222222222222,n由键盘输入。 #include<stdio.h> int A(int n)…...

算法——赎金信(leetcode383)
题目: 给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#…...

transformers训练(NLP)阅读理解(多项选择)
简介 在阅读理解任务中,有一种通过多项选择其中一个答案来训练机器的阅读理解。比如:给定一个或多个文档h,以及一个问题S和对应的多个答案候选,输出问题S的答案E,E是答案候选中的某一个选项。 这样的目的就是通过文档,…...

微软企业邮箱:安全可靠的企业级邮件服务!
微软企业邮箱的设置步骤?如何注册使用烽火域名邮箱? 微软企业邮箱作为一款专为企业设计的邮件服务,不仅提供了高效便捷的通信工具,更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...

什么是分布式锁
定义 分布式锁是控制分布式系统或集群中不同节点对共享资源访问的一种机制。在分布式环境下,多个节点(如多个服务器或多个进程)可能会同时访问诸如数据库中的某条记录、一个共享文件或者一个全局计数器等共享资源。分布式锁的目的是确保在同一…...

【含开题报告+文档+PPT+源码】基于SpringBoot的艺术培训学校管理系统的设计与实现
开题报告 艺术培训学校管理在现代教育行业中发挥着至关重要的作用,旨在为学员提供及时、专业且高效的课程服务,同时也激励培训机构不断提升教学质量与管理水平。然而,传统的艺术培训学校管理模式常面临一系列挑战,如课程报名程序…...

【网络安全 | 漏洞挖掘】绕过SAML认证获得管理员面板访问权限
未经许可,不得转载。 文章目录 什么是SAML认证?SAML是如何工作的?SAML响应结构漏洞结果什么是SAML认证? SAML(安全断言标记语言)用于单点登录(SSO)。它是一种功能,允许用户在多个服务之间切换时无需多次登录。例如,如果你已经登录了facebook.com,就不需要再次输入凭…...

Flutter:列表分页,上拉加载下拉刷新,在GetBuilder模板使用方式
GetBuilder模板使用方式参考上一节 本篇主要代码记录如何使用上拉加载下拉刷新, 接口请求和商品组件的代码不包括在内 pubspec.yaml装包 cupertino_icons: ^1.0.8# 分页 上拉加载,下拉刷新pull_to_refresh_flutter3: 2.0.2商品列表:controlle…...

硬件基础22 反馈放大电路
目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…...

挑战用React封装100个组件【001】
项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {ti…...

linux高级系统编程之进程
进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…...

nextjs+nestjs+prisma写todolist全栈项目
技术栈 nextjsnestjsprisma所学知识 Nextjs组件渲染,状态,路由docker启动Mysql容器prisma操作Mysql(CRUD)允许跨域请求APITanStack Query异步状态管理fetch api服务器组件预请求数据nestjs 管道和异常处理检测id是否正整数Docker启动Mysql容器 compose.yml name: todoLis…...

基于Matlab的图像去噪算法仿真
中值滤波的仿真 本节选用中值滤波法对含有高斯噪声和椒盐噪声的图像进行去噪,并用Matlab软件仿真。 (1)给图像加入均值为0,方差为0.02的高斯噪声,分别选择33模板、55模板和77模板进行去噪 Matlab部分代码࿱…...

Docker pull镜像拉取失败
因为一些原因,很多镜像仓库拉取镜像失败,所以需要更换不同的镜像,这是2024/11/25测试可用的仓库。 标题1、 更换镜像仓库的地址,编辑daemon.json文件 vi /etc/docker/daemon.json标题2、然后将下面的镜像源放进去或替换掉都可以…...

fastjson不出网打法—BCEL链
前言 众所周知fastjson公开的就三条链,一个是TemplatesImpl链,但是要求太苛刻了,JNDI的话需要服务器出网才行,BCEL链就是专门应对不出网的情况。 实验环境 fastjson1.2.4 jdk8u91 dbcp 9.0.20 什么是BCEL BCEL的全名应该是…...

vue2 中使用 Ag-grid-enterprise 企业版
文章目录 问题Vue2 引入企业版不生效npm run dev 时卡住了94% after seal 卡在这里了测试打包源 git 解决方案记录 问题 我想用企业版的树状表格 Vue2 引入企业版不生效 编译引入 // vue.config.js module.exports {transpileDependencies: ["ag-grid-enterprise"…...