Struts2 + Hibernate + Spring 以及javaweb模块问题解决
1.资源文件的配置:src文件夹里面要配置,action所在的目录中也要配置。
2.<s: actionerror/> 与addActionError相对应,若出错信息为addFieldError 则删去<s: actionerror/>。
3.在使用validation验证器时int 类型的数据需要封装在integer类型中,否则会抛出异常;
日期类型不用转化,貌似重启服务器,重新打开网页就好。
4.mysql 中文显示问题:在修改编码或重新安装之后,重新建立一个数据库即可实现中文的输入与显示。
5.mysql 安装过程中不要选择standard configuration(在此情况下不能选择mysql 编码的设置),在另外一种configuration 中选择第三个gbk 编码即可,结合上面第三点,中文显示问题解决。
6.hibernate 在执行对对象的保存和更改操作时,需要调用beginTransaction(),getTransaction()事务方法,不必执行executeUpdate相关方法;而对于按id执行删除相关操作时,因为调用了createQuery方法来执行hql语句,所以不需再调用事务开启和提交的方法,但是必须执行executeUpdate相关方法,因为对数据库内部进行了操作。
对数据库内部进行操作时,必须有事务提交和开启两个方法,或者执行hql语句后,调用executeUpdate()方法。
按id查询数据库中的数据时,由于并没有对库中数据进行“破坏”,所以“下划线”中所对应的方法不用调用。
事务方法是对数据库内部数据进行操作,executeUpdate同样也是对数据进行修改。
7.在处理业务逻辑层和持久化层时,都用到了按id查询的方法,但是该方法在两个层中的作用是不同的,在业务逻辑层的方法是真正满足用户需求的查找方法,而在持久化层的方法是
(1)为了给业务逻辑层提供判断(该id是否重复);(2)查找方法。
8.创建hibernate 时,在先创建spring(jdbc包)的前提下数据库驱动才能以spring的方式构造出来。要修改dataresource 的class 为org . springframework . …… 可以用快捷键导出(导入spring jdbc包的作用),否则不行。
9.在设计两个维度的自由组合时,可以使用bridge 桥接模式进行设计。
10.在构建SSH框架时,应先构建struts2,spring,hibernate(连接数据库驱动以Spring的形式),以myeclipse web xml tester 的方式打开Spring形式的数据库驱动(xml),改掉dataresource 中class的名称。
11.强大的Myeclipse 8.0 在SSH框架下,在第10点的基础上,不用手工创建持久化类,以及相应的映射文件,还有SessionFactory 方法的重写(在代码后面加入了加载映射文件的代码),此外在实现DAO实现类时也可以进行自动创建。这一切都要依靠在Myeclipse里面进行数据库连接的配置,在网址http://blog.163.com/s2000_ma/blog/static/1320144902009101045237301/中详细描述了这些东西。
12.在整合SSH项目的时候,tomcat服务器会抛出异常,原因是spring2.5和hibernate3.0整合时jar包出现重叠,由于部署时是MyEclipse自动导入jar包,导致删除jar很不方便。具体做法是:在工具栏上点击MyEclipseàpreferenceàMyEclipseàproject Capabilitiesàspring2.5à选中asm-2.2.3.jarà点击remove即可。在项目中进行刷新,此jar包在工程之中的spring2.5 liberary中消失。如想恢复,则在相应的选项中选择restore default进行还原。只有这种方法可以进行删除Myeclipse Liberary中多余的jar包。
13.在进行spring和struts2整合时,beanàid 和 actionàaction.class 中的对象名必须相同。
14.在配置struts的action时,当action属性中的result对应的结果是一个action名称,(此action对应一个跳转的页面),在这种情况下在原来的result配置里应加入type=”redirect”。
15.在struts2中解决中文问题的方法很简单,即在struts.xml中配置<constant name="struts.i18n.encoding" value="gb2312" />(value的值应该根据页面的编码格式而定)即可,貌似添加过滤器fiter是没有作用的。(在SSH项目中有所体现)
16.数据库与hibernate默认值的问题:
http://www.iteye.com/topic/368809网址上讲的很详细,或者直接在数据库中将所需的值设置成“自动递增”。(Identity) 而assign则不用,因为是系统默认的自动递增形式。
17.Struts2 NameSpace作用:
18.Struts2 的jsp路径问题:
Struts2的路径问题是根据action 的路径而不是根据jsp 的路径,所以尽量不要使用相对路径。在myeclipse 中的jsp文件中系统会自动创建basepath的绝对路径,所以只要在链接地址前加入<%=basepath %> 即地址变为“<%=basepath %>xxxxx.jsp”。
19.
20.在定义JavaScript的函数时,函数名尽量不要使用alert(),clear()等等,使用自己命名的最好。
21. 编写SSH框架下的持久化层(DAO),在执行getHibernateTemplate(XX)方法需要从某个表中取出数据时,XX应为from+与表对应之的抽象类名称,其限制条件where中的属性应为抽象类中对应表中属性的属性,不能想当然的与表联系起来。否则在执行返回List时,会有指针为空的异常抛出。
22. 在SSH_Bookshop项目中,一个action类中对应有很多控制方法,此时以spring<bean>方式导入的成员变量bookDetailService,需定义成静态类型的成员变量,因为静态变量可以通过类访问。不然,则会报出指针为空的异常。
23. 在前台访问action中的List ul时,需要对ul注入setter和getter方法,否则需要把ul作为参数传递到前台。总之,注入setter和getter方法,可以使得前台访问action中的数据,action访问前台中的数据。
24. struts2异常处理:(全局异常处理,跳转到error.jsp页面)
25. 在struts2中jsp页面所对应的action应注意:
例如:如果jsp页面是在 / bbs / xx.jsp目录下(不是系统默认的目录),那么对应的action的命名空间,即namespace,也应该设置成 / bbs 。否则系统将找不到对应的action,会有异常抛出No result defined for action com.bbs.action.LoginAction and result input 。
26.当html的form表单的action="/url"(以/开头的url地址)时,其会从http://127.0.0.1:8080这个根开始附加,我们要访问具体信息必需要加上
项目的上下文(context),就是tomcat安装目录下wepapps/context(具体是你工程名字)这个文件夹名字,象这样
<form action="/Struts2Study/namespace/test.jsp" method="post">
而struts的form标签的action="/url"(以/开头的url地址)时,struts2帮我们作了优化,他会自动为我们在htpp://127.0.0.1:8080/后面加上
项目的上下文,再附加action后的url,而这也是我们开发时想要的本意,象这样<s:form action="/namespace/test.jsp">
其余的都是一样的
action="url" 和 action="./url" 都表示当前路径
action="../" 表示上级路径
27.hibernate 抛出异常:org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionExce
ption;Lantlr/collections/impl/BitSet;)V
问题找出来了,原来真的是语法(Syx什么异常)的错误.从网上粘贴的代码,与开发环境的字符处理不一致造成.
看起来正确的代码也会隐藏着格式错误导致编译错误
什么时候会出现这样的情况呢?
一般从网上直接复制,粘贴的代码会出现字符编码与开发环境不一样,空格占位长度处理不一致导致编译出错.
这种错误一般很难发现.
如何避免呢?
首先尽量手写代码.
其次首先把网上复制的代码保存到记事本以纯文本格式保存,然后再复制出来粘贴到开发环境中.
28. hibernate HQL语言 hql = "from Boards where bdid=" + boardId; boardId为int类型所以和String类型的属性值写法上有区别:hql = "from Users as b where b.username='" + userName + "'"; userName为String类型。
29. 在判定用户登录的时候,用户名,密码等等的if判断为空的条件都应为:if(userName == null || "".equals(userName.trim()))
30. hibernate 加入注解时应加入的jar包:(过时了,3.5开始支持注解,不用再加入以下三种jar包了,但是需要hibernate的validation产品,才能对属性进行非空、长度等等的约束验证)
31.hibernate运行时log4j的警告
Log4J.properties其实是个日志文件,hibernate本身使用的是slf 日志 ,要想使用Log4J.properties需把原先slf的jar包删除,引入slf-log4j的转换jar包,再把Log4J.properties加入到项目中即可。(马士兵视频第九分钟。)D:\myeclipse 构建\hibernate-distribution-3.5.2-Final\project\etc这个目录中有Log4J.properties的日志文件,复制到项目中即可。
32.脚本页面显示问题
<%@taglib prefix="sx" uri="/struts-dojo-tags" %>
<base href="<%=basePath%>"> 与 <sx:head /> 在网页显示时会有冲突,注释掉前者即可。
33.html标签和struts标签取值的区别:
<input type="text" id="USERNBR" name="regcorpuser.USERNBR" value="<s:property value="regcorpuser.UADD"/>" class="medium" dojotype="dijit.form.ValidationTextBox" required="true" trim="true" onblur="UserIsRegDwr()" promptmessage="用户代码以字母开头,只能包含字符、数字和下划线" invalidmessage="请确认用户代码以字母开头,只能包含字符、数字和下划线,长度在1~20之间" regexp="[a-zA-Z]\w{1,19}" />
Value中嵌套struts的property标签即可取出action中的值
<s:textfield id="USERNBR" label="管理员代码" name="regcorpadmin.USERNBR"
class="medium" dojotype="dijit.form.ValidationTextBox" required="true" trim="true" onblur="UserIsRegDwr()" invalidmessage="请输入管理员代码" />
struts标签中有name属性即可。
34.Spring事务提交
Spring的xml的配置文件中,应该对相应的DAO类创建事务代理,才能有save,update,delete方法的实现,否则会出现数据在服务器中可以查询,但不能保存到数据库中的情况。
具体例子参照BSP项目的配置。
35.Ajax url传值乱码:
两次加密和两次解密的过程
客户端url要经过两次加密var url = 'policy.do?method=searchSuggest&word=' + str+"&now="+new Date().getTime();
服务器端经过两次解密
方可得到中文
36.浏览器的选择:
在编写项目是经常会用到各种浏览器,个人感觉火狐浏览器(能够更好地对java脚本以及ajax支持)非常好。
37.数据库主键:
最近在做项目时,发现书中所列举的项目有几张表中定义了“双主键”,其中的数据在单个主键中出现了重复的现象,数据仍可保存,个人认为双主键可以看作是一个大的整合主键,仍不违背主键不重复的原则。例如:
Id,name 两个都是主键(双主键)
1 小明
1 小军
这样的数据是可以进行保存的。
38.String类型的判断:
最近在做项目时,遇到了String为空的情况,在执行时虽然有if(string == “”)的判断,但是仍然不能符合需求,需加入if(string == “” || string == null)
39.数据库数据类型的选择:
在数据库中,电话(类似于号码)的字段,其数据类型应该为int或varchar类型,如果用double的话,取出其数据时会有**.0作为结尾,故在页面中用struts的iterater标签做遍历时比较难于处理,故应放弃double类型作为“电话”等的数据类型。