BOS物流管理系統_01_抽取基礎類
阿新 • • 發佈:2018-12-10
-
內容摘要 本篇文章包括抽取Dao層基礎類(CRUD等一些基本常用操作),Web層基礎類(使用模型驅動簡化獲得引數的操作),自定義一個攔截器(要求使用者必須登入才能進行其他操作,放行登入方法,攔截其他方法)。
-
Dao層基礎類抽取
- 原理圖
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");
}
}