1.1,在整合hibernate与spring时,可以 保留hibernate.cfg.xml,但application.xml必 须配置hibernate的数据源。
1.2,每次添加或整合一个框架就测试一 下,这样有利于后期编码的调试。
2,如果遇到bean加载失败的错误,可能的 原因有:
①没有配置*.hbm.xml,,,
②hiber nate.cfg.xml或application.xml中没有配置*. hbm.xml,,,
③没有对相应的bean(如:UserServiceImpl,UserDaoImpl)进行注解。
④看看dao的实现类是否有问题
3,面向接口编程,解耦强,提高代码的复用 性,Dao,Service写接口,另外写daoimpl,ser viceimpl,,,如:UserAction中注入UserService, 然后调用的是UserServiceimpl的方法,,同 样,UserServiceimpl中注入UserDao接口, 调用的是UserDaoImpl的方法,,,,,,d ao中提取出公共的增删改查的方法到baseDa o和baseDaoimpl,,,,,serviceimpl类 ,需要注解事务。
4,在action的方法中如果调用了serviceimpl 的方法得到了数据对象(如果是非根元素), 记得用actionContext.getContext存入值栈中 ,否则在jsp中不能用OGNL表达式获取,, ,
5,在jsp表单提交中,记得检查是否需要写 入隐藏字段(特别是id),,,,,
6,接口编程时,如果serviceImpl继承了daoSupport而忘记实现service接口,不会报错,但在访问的时候,所有的jsp都不能用,会报 注解错误的异常
7,在注入事务的ServiceImpl中继承了其它类,如继承了DaoSupportImpl,则事务对父类的的所有方法都无效,可能导致delete(),update()等方法不能操作。
8,如果提示 session已经关闭,不能用findById()等方法时,可以在web.xml中配置 OpenSessionInViewFilter来延长session的生命。
9,对于 findById(Long id) {
return null ;
}
10,action操作对象的时候要分清是model的对象,还是从数据库中得到的对象,model对象是封装了jsp中表单的信息,有些属性表单中没有。
11, org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here的异常。
本项目中是因为, @Transactional注入在了private的方法上了!!!!!!!!!!改成public即可。
12,sessionFactory=null 导致的 sessionfactory.getcurrentsession()为空 。
同样是事务没配置或注入好。
》1: @Transactional声明的方法执行时,Spring的TransactionManager会自动Open Sesion,自动开启事务,并且将此Sesion绑定到SpringSessionContext(实际上是TransactionSynchronizationManager的ThreadLocal的Map)中..
》2:SessionFactory.getCurrentSession()方法执行时,调用SpringSessionContext.currentSession()从TransactionSynchronizationManager的上下文中查找 当前的Session
》3:找到后返回当前的Session,找不到,则返回HibernateException("No Sessionfound for current thread")
如果sessionFactory是Null,那可能是transactionManager没有正常构造出来,从transactionManager的配置文件来看没啥问题,Spring帮助我们生成了一个单例的transactionManager对象,通过对象名称("transactionManager")从ApplicationContext 里面的getBean方法获取。
13,如果你createSQLQuery is not valid without active transaction,获取的session是在spring代理的上下文之外的的当前线程之中,所以此session并非事务管理器代理的那个session,不会自动开启事务。根据官方提示:第三方框架提供了基于代理(proxy)或者基于拦截器(interception)的上下文相关的会话的管理,所以把hibernate.current_session_context_class设置删除了就好了。
15, " javax.naming.NamingException: Cannot create resource instance ”
在本项目中是因为web.xml配置了的InitServletListener ,而 InitServletListener 还没写完善。
监听器在web.xml中注册, 但 InitServletListener 这个类 的privilegeService注入不进来,因为在web.xml中的监听器默认不是注入到spring中的, 所以只能通过反射得到applicationContext对象 。
16,用<s:iterator>嵌套循环,输出两次或多次一级循环而没有二级或以下的循环内容时,应该就是二级或以下的循环体vaule的值有误。
还有就是 display: none;把它删了。而本项目中只是因为数据库中多了一份复制的数据。
17,
18, <!-- 由于权限表中没有"权限设置"这一项,所以除admin外,其它role都没有该权限, 超级管理员在<s:a>的源码中被 hasPrivilegeByUrl()直接返回true,所以它什么权限都有,包括 "权限设置 " -->
19,如果struts.xml文件中<result></result>的内容为空,会报404错误。在加入拦截器后,如果登录后报没有权限的错误,则是权限表中没有的,如,主页,退出等功能;得在hasPrivilegeByUrl()方法中过滤这些元素。
20, <s:form action="forumManage_%{id==null?'add':'edit'}">中,如果add和edit没有加引号,会报找不到返回的错误,,还有,表单提交要加隐藏字段。
21, <s:iterator 中的status 使用方法
1:#status.odd 是否奇数行
2:#status.count 当前行数
3:#status.index 当前行的序号,从0开始『#status.count=#status.index+1』
4:#status.first 是否第一行
5:#status.last 是否最后一行
6:#status.modules(int) 当前行数取模
还有,在加入 fckeditor的文件夹的时候,如果导别人改过的,要注意配置文件,可能 会报找不到工具栏的提示, 应该导原始的,再自己改一下要用的工具栏功能,比如:在 fckeditor.js中改 FCKConfig.CustomConfigurationsPath = FCKConfig.EditorPath + "myconfig.js"
即引用自定义的myconfig.js配置。
24,shift+alt+A是一个不错的快捷键
25,

26,遇到 PersistentObjectException: uninitialized proxy passed to save() 的错误,,,代码如下
public void save(Reply reply){
27,<s:iterator value="replyList" status="status">里面的 "replyList" 忘加#了,会导致无法显示参数
28,IllegalArgumentException in class: com.thxy.oa.domain.Forum, getter method of property: id 原码如下:
29,如何jQuery没反应,应该看看表达式有没有写错
$(document.forms[0]).append("<input type='hidden' name='currentPage' value='+"pageNum+"'>");
此处的 value='+"pageNum+"'>",,,,,有误,应改为 value='”+pageNum+"'>",,,,还有就是el表达式不要用在struts的标签里,会报错的。