.
以上都是常见的以v-开头的vue命令,主要包括项目创建、开发、测试、构建等生命周期的命令。
主要的vue常见命令以v-开头有:
vue create: 创建一个新项目
vue serve: 本地开发服务器,热重载功能
vue build: 生产环境构建,将会构建并优化项目
vue inspect: 检查项目的依赖关系
vue add: 添加功能,如添加vuex、路由等
vue router: 路由相关命令
vue test:unit: 单元测试
vue test:e2e: 端到端测试
vue ui: 图形化用户界面,用于管理创建和维护项目
vue devtools: vue开发者工具,用于调试vue组件
vue-cli-service: 辅助 vue-cli 的命令行接口
vue-cli-plugin: 创建 vue-cli 插件
vue-cli-plugin-xxx: 各种官方和第三方插件
session依赖于浏览器或浏览器tab的打开,只要浏览器或tab不关闭,session就一直有效。
cookie有效期可以设置,一般默认关闭浏览器窗口后失效,也可以设置为定时失效。
session通过sessionID保存到服务器上,在请求时通过cookie或URL传递sessionID实现。
cookie直接保存到客户端浏览器上。
总之,session用于服务器端会话管理,cookie用于客户端信息存储。session数据量大,但依赖于浏览器;cookie数据量小,但可以跨请求使用。
所以总体来说,转发保留请求信息,重定向只能在URL中传参,转发在服务器内部进行,重定向需要两次请求。
转发是服务器内部的操作,客户端看不到转发,URL地址栏不变,还是原来的请求。
重定向需要客户端重新发起请求,URL地址栏会发生变化,显示重定向后的地址。
转发可以保留请求中的所有信息,包括请求参数、Attribute等。
重定向只能在URL地址中传递参数,请求域对象会丢失。
转发只产生一个响应,客户端看不出来有跳转发生。
重定向会产生两次响应,一次返回重定向指令,一次返回新的页面。
转发地址栏URL不变
转发性能较好,只产生一次请求。
重定向需要两次请求,性能略差。
重定向地址栏URL会变成重定向后的地址
404 Not Found: 请求的资源不存在。
200 OK: 请求成功。
301 Moved Permanently: 请求的资源已永久移动到新位置。
302 Found: 临时重定向。
304 Not Modified: 请求的资源未修改,从缓存中返回资源。
400 Bad Request: 请求语法错误,服务器无法理解。
401 Unauthorized: 请求未经授权,需要用户登录。
403 Forbidden: 服务器理解请求但拒绝响应。
404 Not Found: 请求的资源不存在。
500 Internal Server Error: 服务器内部错误,无法完成请求。
502 Bad Gateway: 网关错误。
503 Service Unavailable: 服务器暂时无法处理请求(可能过载或维护),一段时间后可重新尝试。
其中404表示请求的资源(页面、图片、文件等)在服务器上不存在,是最常见的错误码之一。其他如200、301、500也很常见。
请求方式:
GET: 获取资源。请求参数在URL中。
POST: 提交资源到服务器。请求参数在请求体中。
PUT: 更新资源。
DELETE: 删除资源。
HEAD: 获取资源报头。
OPTIONS: 获取支持的请求方法。
PATCH: 对资源进行部分更新。
响应方式:
HTML: 最常见的响应格式,用于渲染网页。
JSON: JavaScript对象表示法,用于API接口响应。
XML: 基于标签的响应格式。
Plain Text: 纯文本响应。
Image: 图片格式响应如JPG、PNG等。
Download: 用于文件下载的响应。
其他还有:
CONNECT: 用于建立隧道,通常用于SSL。
TRACE: 回显服务器收到的请求,用于测试或诊断。
LINK、UNLINK: 操作链接资源。
所以常见的请求方式有GET、POST等,响应方式主要有HTML、JSON、XML、Plain Text等格式。不同的请求方式和响应格式在不同场景下使用。
@Configuration:代替配置类
@ComponentScan:指定要扫描的包
@Import:导入其他配置类
@PropertySource:引入配置文件
@Component:将类标记为可自动扫描的组件
@Autowired:自动注入依赖
@Qualifier:指定特定的注入bean
@Resource:= @Autowired + @Qualifier 自动装配通过名称进行装配。
@Value:属性注入
@Controller:标识为控制器类
@Service:标识为服务类
@Repository:标识为数据访问类
@Component :标识为其他类
@Configuration:标识配置类
@Bean:定义bean
@Scope:定义bean的作用域
@Conditional:条件装配等。
响应注解:
其他:
以上是Spring MVC常用的请求和响应注解,主要用于请求映射、参数绑定和响应处理等方面。
请求注解:
@RequestMapping: 用来映射请求URL到处理方法。
@GetMapping: 专为HTTP GET请求映射。
@PostMapping: 专为HTTP POST请求映射。
@PutMapping: 专为HTTP PUT请求映射。
@DeleteMapping: 专为HTTP DELETE请求映射。
@PathVariable: 绑定URI模板变量到方法参数。
@ResponseBody: 将对象直接写入HTTP响应体中。
@RestController: 相当于@Controller和@ResponseBody的组合注解。
@ModelAttribute: 绑定请求参数或模型数据到方法参数。
@RequestHeader: 绑定请求头到方法参数。
@CookieValue: 绑定Cookie值到方法参数。
@ExceptionHandler: 处理控制器异常。
@InitBinder: 初始化数据绑定器。
@SessionAttributes: 绑定会话属性。
@RequestParam: 绑定请求参数到方法参数。
@DateTimeFormat:用于格式化日期/时间字符串,可以设置日期格式。
@JsonFormat:用于Jackson序列化/反序列化日期类型数据,也可以设置日期格式。
@InitBinder:数据绑定回调方法,用于处理请求参数和类型转换
@ResponseBody:可以直接将Date类型响应写出,会自动序列化为字符串。
@RequestBody:将请求体内容转为日期对象等。
1、DispatcherServlet接收请求。
2、DispatcherServlet根据请求信息调用HandlerMapping,获得相应的Handler。
3、HandlerMapping根据请求URL找到具体的Controller类和处理方法。
4、DispatcherServlet调用HandlerAdapter,根据Handler获得适配器。
5、HandlerAdapter调用具体的Controller处理方法。
6、Controller处理后返回ModelAndView对象。
7、HandlerAdapter将Controller处理结果封装为ModelAndView对象返回给DispatcherServlet。
8、DispatcherServlet调用ViewResolver解析视图名称。
9、ViewResolver根据视图名称获取具体View对象实例。
10、DispatcherServlet调用View渲染视图,将模型数据填充到请求域中。
11、View将页面展示到客户端。
12、DispatcherServlet响应客户端,流程结束。
总体来说,Spring MVC通过DispatcherServlet分发请求到对应的Controller,Controller处理后返回ModelAndView,ViewResolver解析视图并渲染页面输出响应结果。其中HandlerMapping和HandlerAdapter负责请求到处理器的映射与适配。
10.springmvc 拦截器
Spring MVC 拦截器是一个非常强大的功能,用于实现请求前后处理功能,比如登录检查、权限检查、数据校验等。
Spring MVC 拦截器的简述:
拦截器实现HandlerInterceptor接口,重写其中的三个方法:preHandle、postHandle、afterCompletion。
preHandle方法在Controller处理之前执行,返回true则继续执行后续操作,返回false则中断后续操作。
postHandle方法在Controller处理之后执行,但在视图渲染之前执行。
afterCompletion方法在整个请求处理完成之后执行,如渲染视图等。
在Spring MVC配置文件中配置拦截器,设置拦截规则,如拦截所有URL等。
拦截器支持链式调用,每个拦截器的三个方法都会依次执行。
常见使用场景:
等通过配置Spring MVC拦截器可以实现许多通用的前后处理功能,如安全控制、数据处理等。
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
@Bean
public HandlerInterceptor loginInterceptor() {
return new LoginInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor());
}
}
public class MvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor());
}
}
所以总体来说,完全在Java代码中实现Spring MVC拦截器主要有注解配置、JavaConfig方式和实现WebMvcConfigurer接口三种方式,无需任何XML配置。
所以总体来说,Spring AOP采用了代理模式、装饰器模式、观察者模式和模板方法模式,实现了无侵入式的面向切面编程功能。
Spring AOP就是通过为目标对象创建代理对象来实现切面功能的。它使用JDK动态代理或CGLIB代理来为目标对象创建代理。
Spring AOP的切面装饰目标对象,为其添加额外的功能,这也是装饰器模式的一种实现方式。
Spring AOP的切面类实现了Advice接口,可以看作是观察者,目标对象执行切入点时会通知观察者进行拦截。
Spring AOP通过Advice定义通知逻辑,目标方法通过调用流程模板执行通知逻辑,这也是模板方法模式。
Spring AOP的主要特点:
不修改源代码实现功能增强,通过代理和装饰器模式。
面向切面编程,清晰划分关注点与功能模块。
基于动态代理,运行期动态织入增强逻辑。
采用基于接口的代理模式,不受限于类的继承关系。
支持多种切面类型,如前置通知、后置通知等。
定义一个接口或者抽象类,作为切入点签名。
定义一个实现类,实现接口或者继承抽象类,作为目标对象。
定义一个切面类,使用@Aspect注解。
在切面类中使用@Before、@AfterReturning等注解定义通知方法。
使用@Pointcut定义切入点表达式。
在Spring配置文件中开启注解驱动和组件扫描。
配置AOP代理,可以使用@EnableAspectJAutoProxy注解。
注入组件并测试功能增强是否生效。
Spring AOP的关键元素包括:
切入点(Pointcut):需要增强的方法签名。
通知(Advice):增强逻辑,如前置通知、后置返回通知等。
切面(Aspect):切入点和通知的结合。
目标对象(Target):被通知的对象。
AOP代理(Proxy):使用代理为目标对象创建代理对象。
所以通过定义切入点、通知和切面,注入到Spring容器,即可实现面向切面的功能增强。
#:
表示映射语句中的参数,如 #{id}。
MyBatis 会将 # 后面的内容解析为 OGNL 表达式进行动态设置。
#{id} 表示使用 id 参数进行设置。
$ :
表示映射语句中的列名或表名等,如 select * from user where id = #{id}
MyBatis 不会对 $ 后面的内容进行解析,直接将其作为普通字符串使用。
${tableName} 直接输出 tableName 字符串,不会解析为表达式。
区别:
表示参数,MyBatis 会对其内容进行解析;
$ 表示普通字符串,MyBatis 不会对其内容进行解析。
使用场景:
一般用于参数设置,如 #{id}、#{param.name}
一般用于表名、字段名等需要输出字符串的场景,如一般用于表名、字段名等需要输出字符串的场景,如{tablePrefix}user
所以,#表示需要动态解析的表达式参数,#{xx}会被解析替换;表示普通字符串,表示普通字符串,{xx}输出字符串而不会被替换。这是 MyBatis 中 # 和 $ 符号的主要区别。
根据条件包含where子句,实现条件查询。
类似switch的多条件选择,选择性执行标签体内的SQL代码块。
自动删掉多余的and字样。
自动删掉多余的,号。
迭代列表,构建IN条件或为每个对象执行更新/插入操作。
自定义删除额外的and/或字符。
从OGNL表达式中提取出值,并绑定到标签体内。
定义可重用的SQL代码块。
插入外部sql文件内容。
foreach标签可以循环处理列表中的每个对象,为每个对象生成SQL语句。
用户输入手机号,点击获取验证码按钮。
服务端校验手机号格式是否正确,生成4-6位随机验证码。
服务端调用短信接口,将验证码通过短信下发到用户手机。
用户收到验证码后,在登录页面输入收到的验证码。
客户端将手机号和验证码提交到服务端。
服务端从数据库或Redis中查询该手机号对应的验证码是否正确:
如果正确,生成登录token返回给客户端。
如果错误,返回错误提示用户重新输入验证码。
客户端收到token后,将token保存在本地存储如cookie中。
后续请求都在请求头或参数中携带token。
服务端从数据库或缓存中查询token是否有效:
如果有效,代表用户已登录。
如果无效,返回未登录状态。
定义通用的异常类如BusinessException,其他异常类继承该异常类。
实现HandlerExceptionResolver接口,重写resolveException方法,进行全局异常处理。
使用AOP定义异常切面,对指定包或类的异常进行拦截和处理。
使用@ControllerAdvice注解的类进行全局异常处理,类似HandlerExceptionResolver。
在SpringMVC配置中配置异常映射,指定异常类和错误视图。
具体实现:
自定义异常类层次
定义ExceptionHandler类实现HandlerExceptionResolver
在类或方法上使用@ExceptionHandler注解处理异常
使用@ControllerAdvice和@ExceptionHandler注解处理全局异常
SpringMVC配置异常映射关系
AOP定义异常切面进行拦截处理
以上方式可以统一捕获异常,进行日志记录、错误码处理等操作,实现系统层面的异常统一处理机制。
创建一个简单的Spring Boot项目主要步骤和使用到的关键注解如下:
创建Maven项目,指定项目的打包方式为jar
添加Spring Boot相关的starter依赖,如spring-boot-starter-web
定义主程序入口类,添加@SpringBootApplication注解
编写Controller类,添加@RestController注解
定义接口方法,添加@RequestMapping注解
编写业务逻辑代码
通过这些关键注解,可以快速创建一个基础的Spring Boot项目。主要步骤是创建Maven项目,添加依赖,定义主程序入口和Controller接口,编写业务代码并运行启动。
此外还可以使用:
@Autowired:自动注入Bean @Bean:注册Bean @Configuration:标注配置类
其中:
@SpringBootApplication:标注主程序类,启用自动配置和组件扫描
@RestController:标注Controller类,支持Restful风格接口
@RequestMapping:标注接口方法,定义请求URL映射规则
运行主程序,启动项目
Spring中解决数据库事务问题的主要方式有:
使用@Transactional注解标注事务方法。
配置TransactionManager事务管理器,使用TransactionTemplate或TransactionStatus直接管理事务。
事务的失效情况:
方法执行异常导致事务回滚。如果方法内部抛出异常,事务将回滚。
显式调用transactionManager.rollback()回滚事务。如果手动调用回滚,事务不会提交。
事务超时未提交就会回滚。Spring默认如果事务在一定时间内未完成,会回滚事务。
事务上下文发生错误也会回滚。如果事务管理发生错误,如无法获取连接,也会回滚。
事务配置propagation级别不支持当前调用栈。不同的propagation类型决定事务如何在方法间传播。
所以总结来说,事务会在以下情况失效(回滚而不是提交成功):
只有方法正常返回且未手动回滚时,事务才会成功提交。其他情况都有可能导致事务回滚。
一级缓存(SqlSession级别):
作用域:SqlSession。同一个SqlSession查询同一个sql,多次查询直接从缓存中读取。
失效条件:SqlSession关闭或提交事务、手动清空缓存。
二级缓存(Mapper级别):
作用域:同一个Mapper下的所有SqlSession。不同SqlSession可以共享查询结果。
失效条件:
区别:
所以一级缓存粒度小,但范围小;二级缓存粒度大,但需要额外配置。
短信登录实现:
以上方式可以实现系统登录认证和权限控制,支持用户名密码登录和短信验证码登录两种模式。
角色表存储各个角色信息,权限表存储各个权限点信息。
建立角色和权限的多对多关系表,记录每个角色拥有哪些权限。
建立用户和角色的多对多关系表,记录每个用户拥有哪些角色。
为每个可以访问的页面、API等定义唯一的权限点编码。
可以为每个权限点细分更多子权限点,实现更细粒度的控制。
通过上述方式,可以实现基于角色的访问控制,动态生成不同角色的界面菜单,达到细粒度的权限管理目标。
Redis是内存存储,读写速度远远超过磁盘存储,很适合需要高性能的场景。
Redis不仅仅支持简单的key-value类型,还提供list,set,zset,hash等数据类型,更丰富的数据结构。
Redis支持持久化,可以将数据保存到磁盘或者复制到其他Redis服务器,在一定程度上保证了数据的安全性。
Redis作为缓存架构非常合适,可以有效缓解数据库的压力,提高网站/APP的性能和响应速度。
Redis的发布订阅功能可以实现不同系统或组件之间的无缝通信,用于构建实时应用。
Redis支持主从复制和哨兵机制,可以横向扩展实现集群,提高可用性。
Redis社区活跃,开源版本更新频繁,生态圈成熟,使用和扩展都很容易。
Redis支持多种语言的客户端库,与主流语言无缝集成。
所以总体来说,Redis因其高性能、数据类型丰富、可靠性好等优点,广泛应用于缓存、消息队列、实时应用等场景。
定义注解 使用@Retention和@Target注解定义注解的目标和生命周期。
使用注解 在需要使用的位置添加自定义注解。
处理注解 通过反射获取注解信息,并进行相应处理。
常见使用场景:
参数校验:添加参数校验注解,实现参数校验功能。
日志记录:标注需要记录日志的方法。
事务管理:标注事务方法,实现事务控制。
缓存:标注需要缓存结果的方法,实现方法结果缓存。
权限控制:标注需要权限校验的方法。
序列化:标注需要序列化的类。
版本控制:标注API版本号。
多环境配置:标注需要读取不同环境配置文件的类或方法。
通过自定义注解可以给代码添加元数据,方便后续处理通用功能,如校验、事务控制、缓存等。一般用于给类、方法、属性添加标识或配置信息。使用注解可以实现跨切面功能而无需修改原代码。这就是自定义注解常见的定义、使用和应用场景。
动态代理是一种在运行时根据已经存在的类来扩展其功能的技术。
动态代理的主要实现方式有以下两种:
JDK动态代理需要接口,它会在运行时动态生成一个实现了指定接口的子类,并覆盖其中的所有方法。
实现步骤:
CGLIB动态代理不需要接口,它通过在运行时对目标类进行子类化来生成代理类,覆盖其中的方法。
实现步骤:
动态代理的主要应用场景包括:
等通过动态代理可以在不修改目标类代码的情况下,给方法添加共性功能的场景。它通过代理模式提高了代码的可扩展性和复用性。