文章目录
- Spring声明式事务配置
- 事务接口PlatformTransactionManager
- Spring基于AOP的事务具体实现流程
- @Transactional细节
- 事务传播行为
- SpringMVC所需依赖
- SpringMVC五个组成部分功能及其原理
- SpringMVC Handler方法注解
- RequestMappingHandlerAdapter工作原理
- Handler需要处理的数据格式,以及用于简化参数接收的参数注解
- SpringMVC 处理 JSON 415问题
- 为什么jsp文件需要放在WEB-INF下(安全性)
- ViewReslover配置
- MVC jsp页面跳转、转发、重定向
- JSON格式的二进制字符串数据在SpringMVC中的转换时机
- MVC访问静态资源404
Spring声明式事务配置
导入事务依赖 spring-tx
启用事务支持
加载所需数据源事务
配置事务注解,设置事务超时、指定回滚异常、指定不会滚、传播行为、只读。
事务接口PlatformTransactionManager
PlatformTransactionManager是Spring事务管理的核心接口,定义了事务管理的基本操作方法:
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
获取当前事务或创建一个新的事务。
void commit(TransactionStatus status) throws TransactionException;
提交事务。
void rollback(TransactionStatus status) throws TransactionException;
回滚事务。
不同的持久层技术有不同的PlatformTransactionManager实现,例如:
DataSourceTransactionManager:用于JDBC和MyBatis等基于DataSource的数据访问技术。
JpaTransactionManager:用于JPA(Java Persistence API)。
HibernateTransactionManager:用于Hibernate。
JtaTransactionManager:用于分布式事务管理(XA协议)。
- TransactionDefinition
TransactionDefinition接口定义了事务的一些属性,主要包括:
传播行为(Propagation Behavior):
定义了事务如何在方法调用之间传播。常见的传播行为有:
PROPAGATION_REQUIRED:默认值,如果当前存在事务,则加入该事务;否则创建一个新事务。
PROPAGATION_REQUIRES_NEW:总是创建一个新事务,并挂起当前事务(如果有)。
PROPAGATION_SUPPORTS:支持当前事务,但如果不存在事务则以非事务方式执行。
等等。
隔离级别(Isolation Level):
定义了事务的隔离级别,防止并发事务之间的相互干扰。常见的隔离级别有:
ISOLATION_DEFAULT:使用底层数据库的默认隔离级别。
ISOLATION_READ_UNCOMMITTED:允许读取未提交的数据(脏读)。
ISOLATION_READ_COMMITTED:允许读取已提交的数据。
ISOLATION_REPEATABLE_READ:确保在同一事务中多次读取相同数据时结果一致。
ISOLATION_SERIALIZABLE:最高级别的隔离,完全避免并发问题。
超时(Timeout):定义事务的最大执行时间,超过该时间将自动回滚。
只读标志(ReadOnly Flag):如果事务只读,则可以进行优化,减少锁的开销。
- TransactionStatus
TransactionStatus接口提供了对当前事务状态的访问方法,包括:
boolean isNewTransaction();
判断当前事务是否是新创建的。
void setRollbackOnly();
标记当前事务需要回滚。
boolean isRollbackOnly();
判断当前事务是否标记为回滚。
基于AOP实现的声明式事务管理
Spring的声明式事务管理通过AOP(面向切面编程)实现,允许开发者在不修改业务代码的情况下添加事务管理逻辑。具体来说,Spring通过代理机制在方法调用前后插入事务管理逻辑。
Spring基于AOP的事务具体实现流程
@Transactional细节
1.注解位置 ElementType
2.只读 readOnly
3.超时 timeout
4.隔离级别:isolation 默认RR
5.设置回滚异常:RollbackFor 默认Runtime 必须是Exception子类
6.设置异常不回滚:noRollbackFor 一定在RollbackFor异常内
事务传播行为
public enum Propagation {
REQUIRED(0),
SUPPORTS(1),
MANDATORY(2),
REQUIRES_NEW(3),
NOT_SUPPORTED(4),
NEVER(5),
NESTED(6);
private final int value;
private Propagation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
SpringMVC所需依赖
spring-webmvc
jakarta jakartaee web api
SpringMVC五个组成部分功能及其原理
CEO:DispatcherServlet (配置在web.xml 设置为servlet 处理 “/”)
- 功能:负责所有的请求的处理和响应
- 原理:Tomcat中的servlet 有一个init()方法
秘书:RequestMappingHandlerMapping (配置在spring.xml文件 / CEO.properties自带 / 配置在WebApplicationInitializer中)
- 功能:记录controller方法和访问地址的关系
经理:RequestMappingHandlerAdapter (和秘书一块)
- 功能:url参数处理和handler返回数据处理
财务:ViewResolver
- 功能:处理页面响应
SpringMVC Handler方法注解
@RestMapping
@RequestMapping
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@ResponseBody(易错)
RequestMappingHandlerAdapter工作原理
Handler需要处理的数据格式,以及用于简化参数接收的参数注解
Get接收请求行:
查询字符串:形参接收 / 引用(字符串)接收
查询字符串一键多值:@RequestParam + 集合或者数组
动态路径参数:@PathVariable
@RequestParam (value)
@PathVariable
Post接收请求体:@RequestBody
接收请求头:@RequestHeadler
接收Cookie:@CookieValue
@RequestBody
@RequestHeader
@CookieValue
快速获取三大域 request session servletContext
SpringMVC 处理 JSON 415问题
本质上是自定义的HandlerAdapter 覆盖了 MVC 自带的,使得jackson无法被增强到Adapter中。
那么为什么呢?
为什么jsp文件需要放在WEB-INF下(安全性)
隐藏内部实现:将JSP文件放在WEB-INF目录下可以防止客户端直接访问服务器端的源代码或中间状态页面。这有助于保护应用程序的内部逻辑和数据结构不被轻易暴露。
控制访问权限:通过Servlet来转发请求到位于WEB-INF下的JSP文件,可以更好地控制对这些资源的访问权限。例如,只有经过身份验证和授权的用户才能访问某些特定的JSP页面。
提高安全性:如果JSP文件包含敏感信息(如数据库配置、密钥等),将其放置在WEB-INF目录下可以减少泄露的风险。即使攻击者能够获取到Web应用的部分信息,也无法直接访问WEB-INF目录中的内容。
避免缓存问题:有时浏览器会缓存静态资源。将动态生成的内容放在WEB-INF目录下可以避免这种缓存带来的潜在问题,因为这些内容通常是动态生成的,不应该被缓存。
ViewReslover配置
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
MVC jsp页面跳转、转发、重定向
首先Mapping正常写,但是ResponseBody不写了否则会将目标页面地址作为字符串返回。
其次跳转只需要写最大公共前缀和最大公共后缀的中间地址如 index
最后转发和重定向需要如下格式 或者 跳转到 http://www.baidu.com
- forward:/ controller / handler
- redirect:/ controller / handler
JSON格式的二进制字符串数据在SpringMVC中的转换时机
请求到达控制器:当客户端发送一个HTTP请求到Spring MVC应用程序时,请求会被DispatcherServlet拦截并路由到相应的控制器方法。
消息转换器(Message Converter):
Spring MVC使用HttpMessageConverter接口来处理请求和响应体的数据绑定。对于JSON格式的数据,常用的实现类是MappingJackson2HttpMessageConverter。
当请求体包含JSON格式的数据时,MappingJackson2HttpMessageConverter会将请求体中的JSON字符串转换为Java对象。这个过程发生在调用控制器方法之前。
控制器方法执行:
控制器方法接收到转换后的Java对象,并进行业务逻辑处理。
如果控制器方法需要返回JSON格式的数据,则可以返回一个Java对象,由Spring MVC自动将其转换为JSON字符串。
响应体生成:
在控制器方法执行完毕后,Spring MVC再次使用MappingJackson2HttpMessageConverter将Java对象转换为JSON字符串,并将其写入响应体中,最终发送给客户端。
MVC访问静态资源404
有没有配置静态资源处理+viewresolver
前后缀匹配问题
<mvc:default-servlet-handler>