搭建第一个web项目:实现用户的增删改查(三)
每个程序员都有自己写代码的习惯吧,用公司编代码的方式习惯了之后,就按照公司的方法在后台建立了一些工具类。
util类——JPAUtil.java(与数据库打交道)备注:只是一部分,只做了增删改查。
package cn.itcast.oa.util; import java.io.Serializable; import java.util.List; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.oa.base.IDAO; import cn.itcast.oa.domain.Role; import cn.itcast.oa.model.PageInfo; import cn.itcast.oa.model.SortParamList; public class JPAUtil { //这是第一种拿到applicationContext的方法。(通过applicationContextAware) //静态属性,spring初始化MyApplicationContextUtil的时候,将applicationContext属性set到这里面了。 /*private static ApplicationContext applicationContext; public static Object getBean(String beanName) { return getCtx().getBean(beanName); } public static void setApplicationContext(ApplicationContext ctx) { applicationContext = ctx; } private static ApplicationContext getCtx() { return applicationContext; }*/ private static IDAO dao = (IDAO) ApplicationUtil.getBean("baseDao"); //这是第二种拿到applicationContext的方法 private static ApplicationContext ac = new ClassPathXmlApplicationContext( "applicationContext.xml"); /** * find条件查询数据带分页排序 * @param jpql * @param params * @param sortParams * @param pageInfo * @return */ public static <T> List<T> find(String jpql, QueryParamList params, SortParamList sortParams, PageInfo pageInfo) { // IDAO dao = null; // try { // dao = (IDAO) getCtx().getBean("baseDao"); // } catch (BeansException e) { // e.printStackTrace(); // } return dao.find(jpql, params, sortParams, pageInfo); } /** * 创建一条数据 * @param t */ public static <T>void create(T t) { dao.create(t); } /** * 根据id查询数据 * @param clazz * @param id * @return */ public static <T> T loadById(Class<T> clazz, Serializable id) { return dao.loadById(clazz,id); } /** * 更新数据 * @param t */ public static <T> void update(T t) { dao.update(t); } /** * * @param t */ public static <T>void refresh(T t) { dao.refresh(t); } /** * 删除数据 * @param clazz * @param id */ public static <T>void remove(Class<T> clazz, Serializable id) { dao.remove(clazz,id); } }
这里面要重点说一下ApplicationUtil这个获取容器Bean的类。再说这个类之前,先说一下MyApplicationContextUtil这个类:
util类——MyApplicationContextUtil.java
package cn.itcast.oa.util; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class MyApplicationContextUtil implements ApplicationContextAware{ private ApplicationContext context; private Log log = LogFactory.getLog(this.getClass()); @Override public void setApplicationContext(ApplicationContext contex) throws BeansException { this.context = contex; } public void handle() { // JPAUtil.setApplicationContext(context); ApplicationUtil.setApplicationContext(context); log.debug("applicationContext进行设置完成。。。"); } }
这个类实现了ApplicationContextAware接口,因此可以直接获取到ApplicationContext。这种方法和使用private static ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 获取有异曲同工之处,不过还是采用了上面这种方法,因为在此方法中的handle()中可以进行后续的扩展。
这个接口在Spring的官方文档中也有阐述:
大体意思:当容器创建了一个对象实例,这个实例实现了ApplicationContextAware接口,那么这个实例可以当做这个容器的引用。
在MyApplicationContextUtil类中,当它创建一个实例后就可当做ApplicationContext容器的引用,而这个类是在spring容器初始化时给实例化了,在配置文件中给出了。然后这个实例类又将ApplicationContext对象set到了ApplicationUtil类中。
<!--获取Spring容器管理对象的环境类 --> <bean id="myApplicationContext" class="cn.itcast.oa.util.MyApplicationContextUtil" init-method="handle"></bean>
util类——ApplicationUtil.java
package cn.itcast.oa.util;
import org.springframework.context.ApplicationContext;
public class ApplicationUtil {
private static ApplicationContext applicationContext;
public static Object getBean(String beanName) {
return getCtx().getBean(beanName);
}
public static void setApplicationContext(ApplicationContext ctx) {
applicationContext = ctx;
}
private static ApplicationContext getCtx() {
return applicationContext;
}
}
这样,在JPAUtil类中,就可以拿到容器对象,然后拿到对应的实现Bean了,然后实现其中的方法。