1. 程式人生 > >BOS物流管理系統_01_抽取基礎類

BOS物流管理系統_01_抽取基礎類

  • 內容摘要  本篇文章包括抽取Dao層基礎類(CRUD等一些基本常用操作),Web層基礎類(使用模型驅動簡化獲得引數的操作),自定義一個攔截器(要求使用者必須登入才能進行其他操作,放行登入方法,攔截其他方法)。

  • Dao層基礎類抽取

  1. 原理圖

2. 程式碼實現

public interface BaseDao<T> {
    // 增
    public void save(T entity);
    // 刪
    public void delete(T entity);
    // 更新
    public void update(T entity);
    // 根據id查詢
    public T findById(Serializable id);
    // 查詢全部
    public List<T> findAll();
    // 更新操作
    public void executeUpdate(String queryname,Object...objects);
}
public class BaseDaoImpl<T> extends HibernateDaoSupport implements IBaseDao<T> {

	private Class<T> entityClass;
	
	@Resource
	public void setMySessionFactory(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}
	
	
	public BaseDaoImpl() {
                // 獲得父類
		ParameterizedType superclass = (ParameterizedType)this.getClass().getGenericSuperclass();
		// 獲得傳過來的泛型
		Type[] actualTypeArguments = superclass.getActualTypeArguments();
                // 引數的實體
		entityClass = (Class<T>) actualTypeArguments[0];
	}
	
	public void save(T entity) {
		this.getHibernateTemplate().save(entity);
	}
	
	public void delete(T entity) {
		this.getHibernateTemplate().delete(entity);
	}
	
	public void update(T entity) {
		this.getHibernateTemplate().update(entity);
	}

	public T findById(Serializable id) {
		return this.getHibernateTemplate().get(entityClass, id);
	}

	public List<T> findAll() {
                // 獲得實體的類名
		String hql = "FROM " + entityClass.getSimpleName();
		return (List<T>) this.getHibernateTemplate().find(hql);
	}

	public void executeUpdate(String queryname, Object... objects) {
                // 獲得與當前執行緒繫結的session
		Session session = this.getSessionFactory().getCurrentSession(); 
                // 再通過session獲得Query物件,有了Query物件就可以執行資料庫操作了
		Query query = session.getNamedQuery(queryname);
		int i = 0;
                // 動態的新增引數
		for (Object object : objects) {
			query.setParameter(i++, object);
		}

		query.executeUpdate();
		
	}
}

public void executeUpdate(String queryname, Object... objects){...}   這個方法設計實現的比較有意思,這裡拿出來詳細解釋一下。在Service層通過介面呼叫 executeUpdate() 後,Dao層的 executeUpdate() 方法根據傳過來的queryname 獲得SQL語句,再封裝成Query介面物件返回,獲得Query之後就好辦了呀,我們就可以為所欲為了.... 封裝引數... crud...

還有,SQL語句寫在了 xxx.hbm.xml 檔案中

    </class>
	<query name="user.EditUserPwd">
		update User set password=? where id=?
	</query>
</hibernate-mapping>
  • Web層基礎類抽取

public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
		
	protected T model;
	public T getModel() {
		return model;
	}
	
	public BaseAction() {
		ParameterizedType genericSuperclass = (ParameterizedType) this.getClass().getGenericSuperclass();
		Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
		Class<T> entityClass = (Class<T>) actualTypeArguments[0];
		try {
                        // 建立當前類的例項
			model = entityClass.newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}
}

抽取了BaseAction之後,獲取頁面傳過來的引數(只能是在實體類中包含的成員變數)就不用在每個Action中一遍遍獲取了,只需要呼叫 model / model.getxxx() 就OK了 。

  • 自定義攔截器

為了系統的安全性,我們自定義了一個攔截器,用來限制使用者,也就是隻能登陸之後才能進行其他操作。

攔截器類

public class BOSLoginInterceptor extends MethodFilterInterceptor{
	
	protected String doIntercept(ActionInvocation invocation) throws Exception {
		User user = BOSUtils.getUserBySession();
		if(user == null){
			return "login";
		}
		return invocation.invoke();
	}

}

struts.xml

		<interceptors>
			<!-- 自定義攔截器 -->
			<interceptor name="loginInterceptor" class="com.bos.web.interceptor.BOSLoginInterceptor">
				<param name="excludeMethods">login</param>
			</interceptor>
			<!-- 自定義攔截器棧 -->
			<interceptor-stack name="myStacks">
				<interceptor-ref name="loginInterceptor"></interceptor-ref>
				<interceptor-ref name="defaultStack"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="myStacks"/>

隨手造一個工具類

public class BOSUtils {
	
	public static HttpSession getSession(){
		return (HttpSession) ServletActionContext.getRequest().getSession();
	}
	
	public static User getUserBySession(){
		return (User) getSession().getAttribute("loginUser");
	}
}