1.过滤敏感词
前缀树(Trie、字典树、查找树)
查找效率高、消耗内存大
应用:字符串检索、词频统计、字符串排序
敏感词过滤器
2.发布帖子
AJAX(Asynchronous JavaScript and XML)
异步的JavaScript 与XML,不是一门新技术,只是一个新的术语
使用AJAX,网页能够将增量呈现在页面上,而不需要刷新整个页面
虽然X代表XML,但目前JSON的使用比XML更加普遍
https://developer.mozilla.org/zh-CN/docs/Web/Guide/AJAX
3.帖子详情
4.事务管理
(1)事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。
(2)事务的特性:ACID
原子性Atomicity:事务是应用中不可再分的最小执行体。
一致性Consistency:事务执行的结果,须使数据从一个一致性状态变成另一个一致性状态。
隔离性Isolation:各个事务的执行互不干扰,任何事务的内部操作对其他事务都是隔离的。
持久性Durability:事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。
(3)事务的隔离性:
常见的并发异常
第一类丢失更新(某一类事务的回滚,导致另一个事务已更新的数据丢失了)、第二类丢失更新(某一类事务的提交,导致另一个事务已更新的数据丢失了)。
脏读(某一个事务,读取了另外一个事务未提交的数据)、不可重复读(某一个事务,对同一个数据前后读取的结果不一致)、幻读(某一个事务,对同一个表前后查询到的行数不一致)。
常见的隔离级别
Read Uncommitted:读取未提交的数据。(数据的安全性无法保证,无法处理异常)(不常用)
Read Committed:读取已提交的数据。(解决了第一类丢失和脏读问题)
Repeatable Read:可重复读。(没有解决幻读)
Serializable:串行化。(所有的问题都不会出现,但是性能过低)(不常用)
(4)实现机制
悲观锁(数据锁)
共享锁(S锁):事务A对数据加了共享锁后,其他事务只能对该数据加共享锁,但不能加排他锁。
排他锁(X锁):事务A对数据加了排他锁后,其他事务对该数据既不能加共享锁,也不能加排他锁。
乐观锁(自定义)
版本号、时间戳等
在更新数据前,检测版本号是否发生变化。若变化则取消此次更新,否则就更新数据(版本号+1)。
(5)Spring事务管理
声明式事务
通过XML配置,声明某方法的事务特征
通过注解,声明某方法的事务特征
编程式事务
通过transactionTemplate管理事务,并通过它执行数据库的操作
5.显示评论 / 6.添加帖子 / 7.私信列表 / 8.发送私信
9.统一处理异常
@ControllerAdvice
用于修饰类,表示该类是Controller的全局配置类。
在此类中,可以对Controller进行三种全局配置:异常处理方案、绑定数据方案、绑定参数方案。
@ExceptionHandler
用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获到的异常。
@ModelAttribute
用于修饰方法,该方法会在Controller执行前被调用,用于为Model对象绑定参数。
@DataBinder
用于修饰方法,该方法会在Controller执行前被调用,用于绑定参数的转换器。
10.统一记录日志
AOP的概念(Aspect Oriented Programing):即面对方面(切面)编程。
AOP是一种编程思想,是对OOP的补充,可以进一步提高编程的效率。
AOP的实现
AspectJ
AspectJ是语言级的实现,它扩展了Java语言,定义了AOP语法。
AspectJ在编译前织入代码,它有一个专门的编译器,用来生成遵守Java字节码规范的class文件。
Spring AOP
Spring AOP使用纯Java实现,它不需要专门的编译过程,也不需要特殊的类装载器。
Spring AOP在运行时通过代理的方式织入代码,只支持方法类型的连接点。
Spring支持对AspectJ的集成。
Spring AOP代理方式:
JDK动态代理
Java提供的动态代理技术,可以在运行时创建接口的代理实例。
Spring AOP默认采用此种方式,在接口的代理实例中织入代码。
GGLib动态代理
采用底层的字节码技术,在运行时创建子类代理实例。
当目标对象不存在接口时,Spring AOP会采用此种方式,在子类实例中织入代码。