目录
一、过滤敏感词
1,前缀树
可以使用JDK自带的replace方法替换敏感词,但在实际应用中敏感词比较多、字符串可能比较长(发布的一篇文章)这种情况下用replace去替换性能就比较差,使用前缀树来实现过滤敏感词的算法。但前缀树方法也有一些局限性,不能实现对停顿词、重复词的检查,考虑到此可以优化为DFA算法过滤敏感词。
查找效率高、消耗内存大。应用:字符串检错、词频统计、字符串排序
2.敏感词过滤器
-定义前缀器
-根据敏感词、初始化前缀树
-编写过滤敏感词的方法(涉及到算法)
二、发布帖子
异步请求:当前我的网页不刷新,访问服务器,服务器返回结果,根据结果对网页进行局部刷新
1,Ajax
-Asynchronous JavaScript and XML
-异步的JavaScript与XML、不是一门新技术,只是一个新术语 。
-使用AJAX,网页能够将增量更新呈现在页面上,而不需要刷新整个页面。
-虽然X代表XML,但目前JSON的使用比XML更加普遍。
2,示例
-使用jQuery发送AJAX请求。
3.实践
-采用AJAX请求,实现发布帖子的功能。
①在工具类CommunityUtil工具类里写一些处理json的方法
导入包 Fastjson,在pom.xml加对应的依赖
②做示例
在communityUtil内写处理json的方法。
1)在DiscussPostMapper.java新增 int insertDiscussPost(DiscussPost discussPost);方法
2)在配置文件discusspost-mapper.xml文件中写接口中对应方法的SQL语句
3)写业务层:在DiscussPostService中新增addDiscussPost(DiscussPost post)方法
判断参数是否非空
转义HTML标记:如果内容包含HTML当中标签类型的文本,会做一个转移 title和content
做敏感词过滤:title和content
4)写视图层:新建controller DiscussPostController.java写帖子相关的。(在视图层的post和get方法指的是浏览器对服务器的)
处理增加帖子的异步请求:补充注入hostHolder获取当前用户数据。
从hostHolder中获取用户数据,判断是否为空。用json数据发,因为是异步的
新建DiscussPost传入用户ID,title,content,时间
5)写HTML:写“我要发布”按钮的响应 index.html;index.js
三、帖子详情
1.DiscussMapper
2.DiscussPostService
3.DiscussPostController
4.index.html
在帖子标题上增加访问详情页面的链接
5.详情页模板:discuss-detail.html
-处理静态资源的访问路径
-复用index.html的header区域
-显示标题、作者、发布时间、帖子正文等内容
四、事务管理
1.什么是事务
-由N步数据库操作序列组成的逻辑执行单元,这系列操作要么权执行、要么全放弃执行
2.事物的特性(ACID)
原子性 不可再分最小执行体
一致性 事务的执行结果必须让数据从一个一致性状态,变为另一个一致性状态
隔离性 事务的执行各不干扰,事物内部操作对其他食物都是隔离的
持久性 事物一旦提交就必须放在永久内存里
3.事物的隔离性
1)常见的并发异常:
写:
第一类丢失更新:某一个事务的回滚导致另外一个事务已更新的数据丢失了
第二类丢失更新:某一个事务的提交导致另外一个事务已更新的数据丢失了
读:
脏读:某一个事务读取了另一个事务未提交的数据
不可重复读:某一个事务,对同一个数据前后读取结果不一致。
幻读:某一个事务,对同一个表前后查询到的行数不一致。
2)常见的隔离级别
-Read Uncommited:读取未提交的数据
-Read Committed读取已提交的数据
-Repeatable Read 可重复读
-Serializable:串行化
3)实现机制
悲观锁(数据库) 认为只要并发就会出现问题
4)Spring事务管理
声明式事务:
-通过XML配置,声明某方法的事物特征。
-通过注解,声明某方法的事物特征。
编程式事务
-通过TransactionTemplate 管理事务,并通过它执行数据库操作。(控制方法中局部事物)
在AlphaService中进行演示
五、显示评论 添加评论
评论的目标是有很多类型的:帖子,评论,课程。将其抽象,用一套业务解决,统称为实体。用entity-type表示实体的类型是什么,entity-id表示实体的id,target-id表示指向某个人评论时,指向的那个人的id
1.数据层:
写实体类,写dao中的Mapper:
-根据实体查询一页评论数据
List<Comment> selectCommentsByEntity(int entityType,int entityId,int offset,int limit) ;
-根据实体查询评论的数量
int selectCountByEntity(int entityType,int entityId)
新建comment-mapper.xml写配置的SQL
2.业务层
新建CommentService
-处理查询评论的业务:
List<Comment> findCommentsByEntity(int entityType, int entityId, int offset, int limit)
-处理查询评论数量的业务 int findCommentCount(int entityType, int entityId)
-处理新增评论时,要注意加锁 int addComment(Comment comment)
3.表现层
DiscussPostController设置评论分页信息,这部分比较复杂,再仔细看下代码
-显示帖子详情数据时,同时显示该帖子所有的评论数据。
添加评论:
1.数据层
-增加评论数据
-修改帖子的评论数量
2.业务层
-处理添加评论的业务:先增加评论,再更新帖子的评论数量。(保证业务完整性因此要进行事务管理)
3.表现层
-处理添加评论数据的请求
-设置添加评论的表单
六、私信列表
1.私信列表
-查询当前用户的会话列表,每个会话只显示一条最新的私信。
-支持分页显示
2.私信详情
-查询某个会话所包含的私信。
-支持分页显示。
在数据库中存两个用户间对话时,用conversationId存是两个用户ID 111->112,112->111是一个对话,存成111->112
①entity下 Message.java
②dao下MessageMapper.java
③MessageController List<Integer> getLetterIds(List<Message> letterList)实现已读功能
④letter-detail.html
七、统一处理异常
针对表现层,因为其它层会把异常抛上来
①页面上显示错误信息:配置错误页面 404.html
② 将错误信息存进日志
使用@ControllerAdvice处理异常,在Controller文件下创建Advice文件包,创建ExceptionAdivce类。
八、统一处理日志
如果是在每个方法前面都写加日志会导致业务方法与系统需求耦合在一起,难以修改并且冗余。
业务组件的目标对象叫target。
Aspect:切面组件
joinpoint:织入的位置;pointcut:声明具体织入的对象和织入的位置
AOP的实现
写在Aspect包里学ServiceLogAspect.java方法