1、Struts2.xml

2、Struts2核心过滤器

3、log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=d:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
### fatal error warn info debug trace
log4j.rootLogger=debug, stdout
# info,debug... file==>输出到文件中
4、Maven工程中Spring扫描hibernate实体的xml配置文件

5、Spring配置事物

6、持久层代码抽取

BaseDao.java
/**
* 持久(Dao)层通用接口
* @param <T>
*/
public interface IBaseDao<T> {
public void save(T entity);
public void delete(T entity);
public void update(T entity);
public T findById(Serializable id); // ???
public List<T> findAll();
}
BaseDaoImpl.java(+Spring封装的HibernateTemplate的使用方法)***
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {
// ***********根据类型注入spring工厂中的会话工厂对象sessionFactory***********
@Resource(name = "sessionFactory") // 只要子类注入容器中就能给它注入值;原理:继承了之后,它已经是子类的方法了,可以当做和父类没有关系了
public void setMySessionFactory(SessionFactory sessionFactory){
super.setSessionFactory(sessionFactory);
}
// ***************为什么要这样写,因为T是泛型类型,所以不可以用T.class方法获取 指定类 的字节码对象(获取的是T这个类的)***************
// 字节码对象
Class<T> entityClass;
public BaseDaoImpl() {
// 获取当前类的字节码对象==>获取当前类的超类(类的泛型的父类)
Type type = this.getClass().getGenericSuperclass();
// 将超类转换成泛型
ParameterizedType pt = (ParameterizedType) type;
// 获取泛型数组(可能有多个泛型)
Type[] typeArray = pt.getActualTypeArguments();
// 将第一个转为字节码类型
Class<T> clazz = (Class<T>) typeArray[0];
this.entityClass = clazz;
}
@Override
public void save(T entity) {
super.getHibernateTemplate().save(entity);
}
@Override
public void delete(T entity) {
super.getHibernateTemplate().delete(entity);
}
@Override
public void update(T entity) {
super.getHibernateTemplate().update(entity);
}
@Override
public T findById(Serializable id) {
// get方法需要一个字节码对象和序列话的id
return super.getHibernateTemplate().get(entityClass,id);
}
@Override
public List<T> findAll() {
String hql = "from " + entityClass.getSimpleName(); // 通过字节码对象获取类名
List<T> list = (List<T>) super.getHibernateTemplate().find(hql);
return list;
}
}
其他:通用更新方法

7、表现层代码抽取


public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
// 由于T是泛型对象,所以不能实例化,要我们用构造给它传递对象
private T model;
// 初始化方法,子类实例化,会调用父类的初始化方法
public BaseAction() {
// 获取泛型
ParameterizedType pType = (ParameterizedType) this.getClass().getGenericSuperclass();
// 获取泛型数组
Type[] tList = pType.getActualTypeArguments();
// 取出数组中第一个值,转成字节码对象
Class<T> clazz = (Class<T>) tList[0];
// 由于model要的是一个对象,所以要将字节码对象通过反射转换成对象
try {
this.model = clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
@Override
public T getModel() {
return model;
}
}
8、js表单提交

9、啦啦啦

10、清除session

11、前端没有穿参数,赋默认值

12、UUID问题

13、通用page查询

pageQuery方法要抽取出来,所以不贴代码了
1 @Override 2 public void pageQuery(PageUtils pageBean) { 3 Integer currentPage = pageBean.getCurrentPage(); 4 Integer pageSize = pageBean.getPageSize(); 5 // 获取离线对象 6 DetachedCriteria detachedCriteria = pageBean.getDetachedCriteria(); 7 8 // 1.查询总数,封装到total中 9 // select * ... ==> select count(*) ... 10 detachedCriteria.setProjection(Projections.rowCount()); 11 List<Long> countList = (List<Long>) super.getHibernateTemplate().findByCriteria(detachedCriteria); 12 // Long型 ==> int型 13 Long count = countList.get(0); 14 pageBean.setTotal(count.intValue()); 15 // 2.分页查询,封装到rows中 16 // 将上面的条件清空 select count(*) ... ==> select * ... 17 detachedCriteria.setProjection(null); 18 19 Integer firstResult = (currentPage - 1) * pageSize; 20 Integer maxResults = pageSize; 21 22 List list = super.getHibernateTemplate().findByCriteria(detachedCriteria, firstResult, maxResults); 23 24 pageBean.setRows(list); 25 }