Java学习笔记之SSH整合
准备
- 新建Web项目
- 引入SSH开发包
-
配置文件
1. Web.xml:里面包括Struts2过滤器,Spring监听器 2. ApplicationContext.xml:注意版本的问题 3. Struts.xml 4. db.properties:修改项目所用的数据库 5. lo4j.properties
-
创建包结构
1. *.action 2. *.domain 3. *.service 4. *.service.impl 5. *.dao 6. *.dao.impl
开始
–
-
创建实体类:实体类ID一般设置为Integer引用类型 理由:如果数据库查询字段为null,返回给int型,会报错,Integer则不会,Java里面的int型默认为0,数据库里面的int默认为null
-
创建实体类映射文件
- 引入页面
注意: 1. 对于可能出现的img、css、js的路径找不到问题,应该在路径前面加上:
${pageContext.request.contextPath}/+路径
2. 引入Struts2页面标签库:<%@taglib uri="/struts-tags" prefix="s"%>
3. 对于页面的表单元素,以Struts2代替:<s:form></form>
4. 表单里面的属性字段,name属性要与后台实体类保持一致 - 依次创建
action
、service
、serviceImpl
、Dao
、DaoImpl
- 创建
action
时,一般要继承ActionSupport
,实现ModelDriven
,重写getModel()
方法 - 一般要对
service
和dao
类封装借口,然后在实现包*.impl里面实现 - 创建
dao
类时一般要继承HibernateDaoSupport
类 -
在
Struts.xml
文件中配置action
> 注意:action里面的class属性要在Spring的配置文件中配置好Action类的bean之后再把id写到此处; - 将各个bean装配好
例如:在action中需要调用
serviceImpl
中的方法,需要先实例化一个类,就用到了Spring
的依赖注入,这里采用set
方法注入,先在action
中声明serviceImpl
变量,再为这个变量提供一个set方法,不要忘了在配置文件中装配bean
- 完了。
开发中遇到的坑
userAction
中继承了ModelDriven
的类,要重写getModel()
方法,而该方法不能直接返回user类,可以在方法里面写上:if(user == null){ user = new User(); } return user;
改正:后面证明,在声明实体的时候new一个该类对象出来,即可在该方法里面直接
return user;
-
hql语句里面”
from 实体类名
“,一定要注意实体类名通常第一个字母一般要大写,不是数据库的表名,而是实体类名。 -
实体类
entity
中,对于set
集合的属性,重写toString
方法时,不能有该属性 猜测理由是:打印Column
类时,会打印Article
类,而打印Article
又会打印Column
类(因为双向关联),成了死循环 -
对于
Hibernate
延迟加载策略中出现的问题,通常是由于在Hibernate
已经关闭了session
的情况下继续执行数据库的操作而发生的错误,Spring
中提供了OpenSessionViewFilter
来支持此操作配置方法:在web.xml里面配置过滤器,拦截的
urlparteen
为/*
, class为该版本的OpenSessionViewFilter
特别注意:按照上面的配置之后,出现错误,检查是否在多对一的关联关系配置文件里面,lazy的属性值是否写了不允许的值。 - Structs2从一个Action转到另外一个Action时,有两种方式:
- 修改
<result type="redirectAction">ActionName</result>
,重定向,参数不能通过request.attribute
传过去,原理同jsp/servlet类似
也可以传递参数,通过
<param name="参数名">${参数}</param>
或者直接<result type="redirectAction">ActionName?参数名=${参数}</result>
<result type="chain">ActionName</result>
特别注意,里面的ActionName
名字前不能加上根路径”/”,原因不知
- 修改