自主开发个人博客经验总结

写于2017-09-16 23:54:17由原博客迁移 

1 在设计数据库时遇到这样一个问题,文章表中并没有字段记录分类的名字,或者作者的名字

而只记录了他们的id,最大的劣势:文章经常需要展示作者或者分类的名字,那么
问题是每次有这种需求就需要到数据库中查询,很麻烦,对于这种频繁访问的字段
最好保留在文章中,但同时也需要保留分类id和用户id以便以后扩展

这是设计数据库需要注意的地方,不是所以表仅仅靠主键关联起来就ok了

2当你要对一个表中添加一个记录时 思考哪些是从页面中获取 哪些是自己在业务层中设置

3 关于session 为什么我们用同一个字段user 获取到了不同的用户
实际上这背后还有cookie存放了jsessionId(由服务器产生),这就相当于做单点登录系统中的
token,我猜测所有session存放在这样有个结构,Map<jsessionid,Session>
用户访问该站点都会携带cookie。这个标识也是相当于用户浏览器的标识,认为一个浏览器就是一个用户
当发送过来jsessionid,就可以获取到session,在由session获取到user,所以虽然代码中都是写
session.getAtributue("user");但是获取的数据却不同

3关于配置文件存放位置、
在一个maven工程中最后的打包都是以打包方式是war包的模块为主,其他的模块都直接打成jar包,所以配置文件放哪里?之前我放到service模块中。但是打包后service模块只是一个jar包,配置文件也就放到了jar包中
根本不起作用,如何放置?对于一个maven project 所有配置文件都放在打包方式为war包的web模块中
打包后的目录:所有webapp下面的东西座位根目录,控制器的代码放在classes目录下,配置文件在calsses目录的下一级,模块为jar包的,放入lib中作为依赖

4 关于路url径配置问题
最好好不要用相对路径,稍微改下访问路径就会受影响


5写代码时把不可能的情况写在前面。这样直接就return,注意代码的逻辑顺序

6 做用户注册时应该注意的几个问题:重复提交注册表单,登陆后不应该访问到登陆或者注册的页面,注册密码需要加密,表单校验

7 请求中的referer可以访问一个地址之前的地址

8 对于spring中的aop和事务区别
aop只要有切面类,并且配置了切面(通知加切入点),开启了自动代理。那么就会执行通知方法
但是对于事务,如果只配置了切面(不用谢切面类),而没有打开事务是没有效果的
怎么打开事务?使用注解@transaction  可以在类或者方法上使用该注解,但是只对public的方法起作用
并且需要开启烧苗该注解的,在配置文件中配置

9 事务的处理没有成功,方法上加了注解还是没有效果

10 涉及到不止操作一天数据几乎都要开启事务(这里的操作除了查询以外的操作)

11 再写方法时,把不确定的参数丢给调用的人,比如参数类型Class,因为谁用谁知道什么类型

12 发现一个问题,使用pageHelper时如果开始分页,也就是调用PageHelper的startPage(num,size);
的时候如果接着下面的代码,不是获取example,那就会出现构造PageInfo的时候
不能把数据封装到PageInfo中,目前不知道原因

13 在使用foreach标签的时候也可以通过索引来获取一个list的一个元素
比如 users[0] 这样带来的好处,在一个foreach中可以循环很多个个数一样的集合

14今天解决了一个重大的问题,之前为什么事务不起作用,以及为什么aop配置的方法不执行?
首先需要知道容器是spring框架的核心,springmvc的配置文件生成一个spring容器,而spring父容器也就是,applicationContext相关的各种配置文件生成一个父容器
对于父容器的bean,子容器可以拿到,但对于子容器的bean,父容器不可拿到,
我们在使用注解@contrler@Compoent @Service @Resposity这些注解来生成bean时候。需要在配置文件中配置扫描哪些包里面的注解
由于我之前在springmvc中配置的<component sacn=“”>配置的是com.colin.* 那么该子容器会扫描所有包里面的注解,但是由于springmvc配置文件中并没有配置事物相关的东西,比如通知以及@Transactional这样的
注解,所以springmvc生成配置文件时会生成service的bean,但是对于方法上的@Transactionanl它是不知道的,所以该方法就相当于没有写@Transactional的注解一样,但是service以及dao的bean它都生成了
这就是后面为什么@Transactional会失效的先兆
当spring父容器生成它的bean时,扫描所有@service以及@Resposity @aspect的注解,并且有效,但是当我们在前端controller调用业务层时用的是谁的service的bean(因为子容器和父容器中都有)
我设想的是因为自己容器里有就不会去父容器个里面去拿(类似与就近原则),这就造成了@transactional @aspect失效,因为子容器扫描时并扫描不到这些注解,因为springmvc的配置文件中没有配置事务,自动代理
所以当然扫描不到
这就是为什么事务 通知方法不执行的原因?
解决办法就是在配置springmvc的<componet scan>的时候只让它扫描controller的包,想要service去父容器拿,因为父容器中的service bean是完整的

对于框架的底层原理还是要知道的,不然发生这种情况就傻逼,打死找不到错

测试了一遍 确实如我猜想 改了后事物和aop都起作用了

15 如何用springaop来获取被增强方法的一些东西,比如获取被增强方法的参数?
在通知方法中的参数上加入JoinPoint 改类中就有获取参数等一些方法

16 为什么一个请求被执行多次??目前还不知道确切的原因,但是我在父容器和子容器都扫描了controller 不知道和这个有不有关
果然和这个有关系,刚修改了父容器的扫描范围 排除了controller 再搜索时就没有出现多次搜索的情况了
再一次警告,springmvc之负责controller 父容器扫描其他的

17 component配置文件 标签的使用
<!-- 扫描带有@service或者其他dao层注解的类 -->
<context:component-scan base-package="com.colin.*" use-default-filter="false">
<!-- 不扫描某些注解 -->
<context:exclude-filter type="annotation" expression=""/>
<!-- 指定只扫描某些 -->
<context:include-filter type="annotation" expression="com.colin.web.controller"/>
</context:component-scan>

 
18 对于查询 如果返回的是list 需要判断 是否为空,再去获取元素,否则抛出空指针异常

数据的校验十分重要

猜你喜欢

转载自blog.csdn.net/qq_37667364/article/details/79326288