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 }