1.struts2中的重定向:<resultname="delete" type="redirectAction">customer_list</result>,需要注意的是,可以不配置jsp页面,而是直接配置action.
2.如果在service类上面没有添加事物,出现异常
3.存放对象到域对象或者值栈,这样就可以在其他的页面去取值
ServletActionContext.getRequest().setAttribute("list", list);
// 创建list对象,生成get方法
private List<Customer> list;
public List<Customer> getList() {
return list; }
4.取域对象或者值栈中的值
<!-- 遍历list,存放到cus中,然后显示出到下面的表格中 -->
<s:iterator value="list" var="cus">
<TR><TD><s:propertyvalue="#cus.custName"/></TD>
</TR>
</s:iterator>
5.分页功能(核心就是:这一夜有关的数据是什么,包装到一个javabean中去,让后通过传入一个当前页就可以找到所有关于这一页的所有信息,再显示到页面中就行了)
1).首先在mysql数据库中,分页的语句是select * from customer limit 0,3;两个参数的意思分别是,第一是开始的位置,第二是显示的条数。
2).开始位置计算公式:(当前页-1)*每页显示的条数
3)总页数:// 总的 页数:总记录数/每页显示的记录数
int totalPage = 0;
if (totalCount % pageSize == 0) {
totalPage = totalCount / pageSize;
} else {
totalPage = totalCount / pageSize + 1;
}
4)步骤:创建一个javabean封装和分页有关的属性。最重要的是要在bean创建一个和分页有关的实体类的list集合,// 每页记录的list集合
private List<Customer> list;
这样,在得到这个bean之后,就可以得到Customer,就可以在页面中去调用相应的属性。
5)总体思路:就是传第几页,然后就可以从数据库中读取出这页的所有数据。由页数作为参数。
6)封装:把后台查到的数据封装到域对象中,方便前台获取。
6.一对多的关联
(该实体类中引入另一个实体类中的对象,那么就在该实体类的映射文件中去配置这个对象,要搞清楚一方和多方)
1).实体类:// 客户跟联系人是一对多,在一的一方注入多的一方的集合 private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();,在多的一方声明一的一方。private String lkmMobile;然后都分别生成对应的set和get方法。
2)映射文件:无论一方还是多方,在引入对方的对象后,都要去引入。
一方:<!-- 设置外键,配置多的一方的对象,指明多的一方的类 -->
<set name="setLinkMan">
<key column="clid"></key>
<one-to-many class="pers.chq.entity.LinkMan" />
</set>
多方:要配置一方的对象,一方的类,和外键。
<many-to-one name="customer" class="pers.chq.entity.Customer"
column="clid"></many-to-one>
这只是配置,在表中并不会生成对方的属性,而且会在多的一方生成一个外键,关联到一方的主键。
7.遍历出域对象中的数据到下拉列表中,
Value是提交到服务器中的值
8.当外键不是它本身的数据,不能直接封装的时候(间接注入)
9.
- struts2文件上传:
1).jsp页面
2)action中:
上传文件默认最大是2m,可以自己配置成其他大小
1) 直接去默认配置文件里去改值:struts-core.jar---->org.apache.struts2------>default.properties,改里面的值就行了
2) 在struts.xml文件中设置:
10.
- no session 异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
1) 场景:一般是出现在多表查询。
2) 原因:hibernate的查询,底层就是通过调用session中的方法来实现的,但是session被使用后会关闭,这时再调用就会出现no session异常
3) 解决方法:让session延迟关闭,等action执行完成之后再关闭,具体方法:在web.xml中配置过滤器实现session延时关闭。(而且必须是在struts2核心配置过滤器之前)
11.
在修改时,实现把之前的下拉项的值显示出来
思路: 当前联系人所属的客户id和所有客户id比较,如果相同就为选中状态
12.
- hibernate的两个关联的表中,当其中一个做了修改后,在另一个表中显示的被改的表的内容不会改变,而是成为了null.
1) 原因:hibernate的外键是双向维护的,就是两个表都会维护外键关系。
2) 解决办法:就是让一的一方放弃这种维护关系。在一的一方使用inverse=”true”,inverse的默认值是false,就是不放弃。
总结:关系(Relationship)由两方组成,其中被定义了inverse=true的一方表示:“我是反向被控制的一方,我不负责维护关系”,而inverse=false则表示:"我是关系的控制方,拥有者,我会维护关系"。默认情况为inverse=false,即关系的两方都维护和控制关系,这中情况会造成一方重复一遍另一方已经完成的事情,比如更新外键列的值,这是不可取的,需要使用inverse=true来避免。
在没有包含关系信息的表中,则使用inverse=true. (也就是在表中不存在外键的一方)
13:删除两个有关联的表中的一个,如果没配置inverse,和cascade,会先把外键设置为null然后再删。
14.级联删除:把一的一方删了,顺带把这个对应的多的一方也删了。配置方法:在一的一方设置cascade=“delete”
总结:多表之间的设置,一般都在一的一方进行配置。
15.
多对多关系建表:
1)创建第三张表,使用外键维护关系。拆分为两个一对多。
Hibernate当中的缺陷:第三张表只有两个字段,也就是两个id
1) 拆分方式:引入一个中间表,然后两个表对中间表都是一对多的关系了。
16.多条件组合查询
1.可以写底层的hibernate代码
2.使用hibernate模板里面的find方法
/**
* this.getHibernateTemplate().find(queryString, values);
* 可见需要两个参数,hql语句和参数,所以就要想办法去得到这两个数。
* 方法:hql语句拼接,和把参数存到集合中去
* 注意:hql拼接需要留好空格
*/
3.使用离线对象和hibernate模板里面的方法(重点掌握)
// 創建离线对象,指定对哪个实体类进行操作
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
// 判断条件值是否为空
if (customer.getCustName() != null && !"".equals(customer.getCustName())) {
// 设置属性设置值
criteria.add(Restrictions.eq("CustName", customer.getCustName()));
}
return (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
17.
统计功能的实现
Sql语句:select count(*) as XXX ,XXXX from XXX group by XXX
因为hibernate的局限,多表查询会比较难实现,所以执行多表查询的时候,应该调用底层sql来实现,就是得到sessionFactory-----得到session------得到SQLQuery对象,然后调用里面的方法执行sql语句来实现。思想:当返回的为两个字段并且是一一对应的时候,就转换为map结构。
18.
.json
1)格式:对象的格式:
数组的格式:
2)好处:
19.
.多对多映射文件的配置