一:Hibernate、HibernateTemplate
1、 Hibernate 的 save返回值 类型为 Serializable接口,该结果的值就是你插入到数据库后新记录的主键值。如果你的主键是数值,可以按如下方法:
Serializable result =this.getSession().save(t);
Integer integer = (Integer)result; 返回值大于0表示操作成功
2、 HibernateDaoSupport 中注入 sessionFactory:
|
两种解决方式:
***在spring的配置文件的头部,写上:default-autowire="byName">或者byType 如果是byName,SessionFactory的bean名字必须是sessionFactory.
***在Dao层上加入:
|
3、 Hibernate中使用annotation注解实体类@Entity报一下错误:
|
错误原因:@Entity(name="t_admin"),实体类与数据库表对应关系映射错误,用@Entity注解要用默认表格式(即类名对应数据库表名,字段名对应属性名,不能自定义),若要自定义要用@Table ,即@Entity @Table(name="t_admin")
4、cascade级联属性:cascade属性的可能值有
all:所有情况下均进行关联操作,即save-update和delete。
none:所有情况下均不进行关联操作。这是默认值。
save-update: 在执行save/update/saveOrUpdate时进行关联操作。
delete:在执行delete 时进行关联操作。
CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法。
CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法。
CascadeType.REMOVE:级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法。
CascadeType.REFRESH:级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据。
CascadeType.ALL:以上四种都是。
一般情况:
@ManyToOne( cascade = {CascadeType.PERSIST,CascadeType.MERGE} )
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},
fetch=FetchType.LAZY)
@OneToMany(cascade= {CascadeType.ALL},fetch=FetchType.LAZY)
5、Fetch属性:
FetchType.LAZY:延迟加载 ,关联表需要用时才加载
FetchType.EAGER:急加载 ,发出SQL语句,立即加载关联表
6、懒加载问题:
方法一:设置属性fetch为eager。
方法二:在web.xml中配置: 要加在struts2核心转发器之前
|
二:Struts2
1、 通配符问题:
在使用通配符的时候可能遇到这样的问题:
|
***在struts2.3之前的版本修改:在struts2的核心jar包 struts-core中的default.properties中(路径:/org/apache/struts2/default.properties)
|
如果是方法动态方法调用的话(action名+ ! +Method名) 的值要改为true。
使用通配符则改为false 。
***在struts2.5版本之后要加:
|
加入:<allowed-methods>addAdmin,deleteAdminallowed-methods>
其中addAdmin为Action中的方法名,多个方法之间用‘,’隔开。
2、 修改struts2请求中的默认后缀 .action 为 .do:
如果想在web.xml中修改后缀为.do的形式是不可行的,因为该形式表示以.do为后缀的url会被struts2框架捕获
|
***解决方法之一是:在struts.xml文件添加:
|
3、struts2集成struts-menu:
(1)由于struts2没有struts-config.xml配置文件,所以需要在web.xml中添加监听器:
|
(2)在lib文件夹下添加jar包struts-menu-2-4-3.jar
(3)在WEB-INF文件夹下添加menu-config.xml配置文件,内容如:
|
4、web.xml中的加载顺序问题:
Content-param -> listener -> filter-> servlet
5、从jsp页面到action出现中文乱码:
***情况一:在pageEncoding = utf-8的情况下,form表单请求方式改为post。
6、从jsp页面到action获得日期格式为:Thu Mar 0700:00:00 CST 2019是java.util.Date类型,先将它转换为yyyy-MM-dd HH:mm:ss格式存入数据库:
|
7、防止页面刷新表单数据重复提交:通过sturts2提供的token令牌机制。
1)在struts.xml中配置基于action的拦截器:
<interceptor-refname="token">
<param name="includeMethods">addWordMemberparam>
interceptor-ref>
<interceptor-refname="defaultStack"/>
<result name="invalid.token" type="redirectAction">browseWordMember.doresult>
2)在jsp页面的表单域内添加
三:Spring
1、 Spring框架 做带回滚操作的Juit单元测试:多数情况下我们希望用Junit做单元测试不破坏数据库现场,就需要用到 回滚操作
|
第一步:首先导入Juit测试的相关jar包,另外导入Spring包下的spring-text.jar包
第二步:创建一个测试类,此类继承AbstractTransactionalJUnit4SpringTestContextTests(类名相当长)
第三步:在类上注解@RunWith(SpringJUnit4ClassRunner.class),该注解的参数类是spring-test中的类,表示用spring主导,用以驱动此次测试
第四步:第二个注解@ContextConfiguration(locations={"classpath:beans.xml"}),用以定位bean的资源文件,也就是减少getBean的操作。其中locations加了s表示为数组类型,因此{}不可省;如果不加s当然不用写。
第五步:第三个注解@TestExecutionListeners(listeners={
DependencyInjectionTestExecutionListener.class,
}) ,测试执行监听器,配置一系列的监听。
第六步:@TransactionConfiguration(transactionManager="txManager",defaultRollback=true) ,事物配置,其中txManage为beans.xml中的事物bean的id,默认defaultRollback为true表示执行回滚操作。 至此配置完成
2、使用Spring事物管理可能出现 出现只读而不能写异常,如:
|
错误原因可能有多种:
原因一:Spring 和 Hibernate整合的时候用到了HibernateTemplate,该类中封装了sessionFactory,其中的session是通过getCurrentSession()来获取的,使用此方法需要和事物相关联,故在beans.xml中添加:
|
四:SSH项目的基础总结:
1、 pageContext.request.contextPath :
3、JS中使用虚拟表单的形式提交POST请求:
|
4、 jsp中的<%= %>
举例如下:
<% String username="abc";%>
下面两句代码是一样的效果,
<% %> 标识里面的是jsp代码.
<%=变量 %> 是 <% out.println(变量) %> 的简写方式
用户:<%=username%>
用户:<%out.println(username) %>
5、动态构造下拉列表:
|
6、jsp页面设日期输出格式
|
五:
1、 Struts开发与jsp+servlet开发的差异:
***代码的规范性:struts基于MVC开发模式,结构清晰、层次分明,而jsp+servlet由于开发的任意性导致代码的规范性差;
***开发时间:struts稍微逊色,其前期需要编写一些配置文件
***后期维护:struts远胜于servlet,struts 开发结构清晰,数据层、业务逻辑层、控制层层次分明,符合java的模块化编程,易于维护;而servlet的开发中,其逻辑代码存在于jsp页面、servlet中,导致逻辑混乱,维护困难,后期维护容易引入新的bug。
2、Jquery-validate.js表单验证;
1)通过name:
$('#form1').validate({
rules:{
bookName : "required"
},
messages:{
bookName : "商品不能为空"
}
});
2)通过id:
$('#form1').validate();
$('#user1').rules('add',{required:true,messages:{required:'请输入您的名字'}});
//删除规则
$('#user1').rules('remove');