天天看點

架構底層綜合+快速開發+代碼重用架構-設計(Service)層)

架構底層綜合+快速開發+代碼重用架構-設計(Model層)

架構底層綜合+快速開發+代碼重用架構-設計(Dao層)

架構底層綜合+快速開發+代碼重用架構-設計(Service層)

架構底層綜合+快速開發+代碼重用架構-設計(Action層)

三、Service層

Service 主要是處理業務邏輯層的資料,傳遞給dao層,進行持久化,或者按條件查詢。我們還是采用dao的設計思路,寫一個抽象的manager層,其還有的代碼如下:

package com.jxs.sys.core.base.service;

import java.util.LinkedHashMap;
import java.util.List;

import com.jxs.sys.core.base.model.Model;
import com.jxs.sys.core.base.model.ModelSet;

public abstract interface Manager<T extends Model> {
	/**
	 * 增加一個對象
	 * 
	 * @param modelT
	 */
	public abstract void add(T modelT);

	/**
	 * 删除一個對象
	 */
	public abstract List<String> delete(T modelT);

	/**
	 * 删除一組對象
	 * 
	 * @param modelTId
	 *            删除對象的集合
	 * @return 傳回删除後出發的消息,
	 */
	public abstract List<String> delete(Integer[] modelTId);

	/**
	 * 修改一個對象
	 * 
	 * @param modelT
	 */
	public abstract void modify(T modelT);

	/**
	 * 查詢一個對象
	 * 
	 * @param modelTId
	 *            model.id
	 * @return 對象model
	 */
	public abstract T query(Integer modelTId);

	/**
	 * 查詢所有的對象集合
	 * 
	 * @return
	 */
	public abstract ModelSet<T> queryAll();

	/**
	 * 分頁查詢
	 * 
	 * @param firstindex
	 *            首頁
	 * @param maxresult
	 *            數量
	 * @return
	 */
	public abstract ModelSet<T> queryAll(int firstindex, int maxresult);

	/**
	 * 
	 * @param firstindex
	 * @param maxresult
	 * @param orderby
	 *            排序
	 * @return
	 */
	public abstract ModelSet<T> queryAll(int firstindex, int maxresult, LinkedHashMap<String, String> orderby);

	/**
	 * 
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql JPQL語句
	 * @param queryParams 參數
	 * @param orderby
	 * @return
	 */
	public abstract ModelSet<T> queryAll(int firstindex, int maxresult, String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby);

	/**
	 * compass檢索
	 * 
	 * @param queryString
	 * @return
	 */
	public abstract List<T> search(String queryString);

	/**
	 * compass分頁檢索
	 * 
	 * @param firstindex
	 * @param maxresult
	 * @return
	 */
	public abstract ModelSet<T> getSearchResult(int firstindex, int maxresult);

	/**
	 * DisPlayTag 導出
	 * 
	 * @param firstindex
	 * @param maxresult
	 * @return
	 */
	public abstract List<T> getSearchResultForExport(int firstindex, int maxresult);

}
           

 Service 層manager的支援怎麼寫呢?

我們還是先給出:

public abstract class ManagerSupport<T extends Model, D extends Dao<T>> implements Manager<T> {}
           

 這樣寫有什麼好處呢?

Service層需Dao層的支援,Dao是将Model同步到資料庫中的,其支援的又是Manger接口,這樣講所有的對象都給綁定在了一起,既然需要同步資料,那麼傳遞竟來的是Dao怎麼個執行個體化呢?

我們采用 javax.annotation.PostConstruct 這個annotation來執行個體化Dao,參見如下代碼:

protected Dao<T> dao = null;
	@PostConstruct
	private void initDao() {
		if (this.dao == null) {
			String modelname = ReflectionUtils.getSuperClassGenricType(super.getClass()).getSimpleName();
			StringBuffer daoname = new StringBuffer();
			daoname.append(Character.toLowerCase(modelname.charAt(0))).append(modelname.substring(1)).append("Dao");
			this.dao = ((Dao) SpringContextUtil.getBean(daoname.toString()));
		}
	}
           

 之後我們因為實作了implements Manager<T>;是以我們隻需要dao.xxx(xxx);方法就以了,參見如下代碼:

 package com.jxs.sys.core.base.service;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.perf4j.aop.Profiled;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jxs.sys.core.base.dao.Dao;
import com.jxs.sys.core.base.model.Model;
import com.jxs.sys.core.base.model.ModelSet;
import com.jxs.sys.core.base.utils.ReflectionUtils;
import com.jxs.sys.core.base.utils.SpringContextUtil;
import com.jxs.sys.core.base.utils.WebUtil;
import com.jxs.sys.core.security.model.User;
import com.jxs.sys.core.security.userholder.UserHolder;

public abstract class ManagerSupport<T extends Model, D extends Dao<T>> implements Manager<T> {
	protected final Logger log = LoggerFactory.getLogger(super.getClass());

	@Resource(name = "ehCache")
	protected Cache cache;

	@Resource(name = "springContextUtil")
	protected SpringContextUtil springContextUtil;
	protected Dao<T> dao = null;

	@PostConstruct
	private void initDao() {
		if (this.dao == null) {
			String modelname = ReflectionUtils.getSuperClassGenricType(super.getClass()).getSimpleName();
			StringBuffer daoname = new StringBuffer();
			daoname.append(Character.toLowerCase(modelname.charAt(0))).append(modelname.substring(1)).append("Dao");
			this.dao = ((Dao) SpringContextUtil.getBean(daoname.toString()));
		}
	}

	@Profiled(tag = "addInManager", message = "model = {$0}")
	public void add(T model) {
		this.dao.add(model);
	}

	public List<String> delete(T model) {
		return delete(new Integer[] { model.getId() });
	}

	@Profiled(tag = "deleteInManager", message = "modelIds = {$0}")
	public List<String> delete(Integer[] modelIds) {
		List<String> messages = new ArrayList<String>();
		for (Integer id : modelIds) {
			try {
				this.dao.delete(id);
			} catch (Exception e) {
				String message = "删除模型失敗,模型類别為:" + this.dao.getModelClass() + " ,模型Id為: " + id;
				this.log.info(message);
				messages.add(message);
			}
		}
		return messages;
	}

	@Profiled(tag = "modifyInManager", message = "model = {$0}")
	public void modify(T model) {
		this.dao.modify(model);
	}

	@Profiled(tag = "queryInManager", message = "modelId = {$0}")
	public T query(Integer modelId) {
		return (T) this.dao.query(modelId);
	}

	public ModelSet<T> queryAll() {
		return queryAll(-1, -1);
	}

	public ModelSet<T> queryAll(int pageIndex, int pageSize) {
		return queryAll(pageIndex, pageSize, null);
	}

	public ModelSet<T> queryAll(int pageIndex, int pageSize, LinkedHashMap<String, String> orderby) {
		return queryAll(pageIndex, pageSize, null, null, orderby);
	}

	@Profiled(tag = "queryAllInManager", message = "pageIndex = {$0}, pageSize = {$1}, wherejpql = {$1}, queryParams = {$1}, orderby = {$1}")
	public ModelSet<T> queryAll(int pageIndex, int pageSize, String wherejpql, Object[] queryParams, LinkedHashMap<String, String> orderby) {
		int firstindex = (pageIndex - 1) * pageSize;
		int maxresult = pageSize;
		ModelSet models = this.dao.queryAll(firstindex, maxresult, wherejpql, queryParams, orderby);

		return models;
	}

	@Profiled(tag = "searchInManager", message = "queryString = {$0}")
	public List<T> search(String queryString) {
		User user = UserHolder.getCurrentLoginUser();
		user.setQueryString(queryString);
		return this.dao.search(queryString);
	}

	@Profiled(tag = "getSearchResultForExportInManager", message = "pageIndex = {$0}, pageSize = {$1}")
	public List<T> getSearchResultForExport(int pageIndex, int pageSize) {
		ModelSet qr = getSearchResult(pageIndex, pageSize);

		List constantModels = qr.getResultlist();
		List models = new ArrayList(constantModels.size());
		for (int i = 0; i < constantModels.size(); ++i) {
			try {
				models.add(((Model) constantModels.get(i)).clone());
			} catch (CloneNotSupportedException e) {
				e.printStackTrace();
			}
		}
		removeHightlight(models);

		return models;
	}

	@Profiled(tag = "getSearchResultInManager", message = "pageIndex = {$0}, pageSize = {$1}")
	public ModelSet<T> getSearchResult(int pageIndex, int pageSize) {
		User user = UserHolder.getCurrentLoginUser();
		ModelSet qr = null;
		Element element = null;
		List models = new ArrayList();

		element = this.cache.get(user.getCacheName() + "search" + this.dao.getModelClass().getName());

		if (element == null) {
			search(user.getQueryString());
			element = this.cache.get(user.getCacheName() + "search" + this.dao.getModelClass().getName());
		}
		this.log.info("從緩存中擷取搜尋結果以供分頁顯示,頁數為: " + pageIndex + ",頁面大小為: " + pageSize);
		this.log.info("緩存辨別為: " + user.getCacheName() + "search" + this.dao.getModelClass().getName());
		qr = (ModelSet) element.getValue();
		int start = (pageIndex - 1) * pageSize;
		int end = pageIndex * pageSize + pageSize;
		if (end > qr.getResultlist().size()) {
			end = qr.getResultlist().size();
		}
		for (int i = start; i < end; ++i) {
			models.add((Model) qr.getResultlist().get(i));
		}
		long count = qr.getTotalrecord();

		qr = new ModelSet();
		qr.setResultlist(models);
		qr.setTotalrecord(count);

		return qr;
	}

	@Profiled(tag = "removeHightlightInManager", message = "models = {$0}")
	private void removeHightlight(List<T> models) {
		for (Model model : models) {
			for (String searchProperty : model.getSearchProperties()) {
				String[] multiLevelProperties = searchProperty.split(":");

				String[] searchExpressions = multiLevelProperties[0].split("_");
				String realProperty = searchExpressions[(searchExpressions.length - 1)];
				String[] properties = (String[]) null;
				if (multiLevelProperties.length > 1) {
					properties = multiLevelProperties[1].split("_");
				}
				List<Model> objs = new ArrayList<Model>();
				objs.add(model);

				if (properties != null) {
					for (String props : properties) {
						List now = new ArrayList();
						for (Model temp : objs) {
							if (props.endsWith("$")) {
								List temps = (List) ReflectionUtils.getFieldValue(temp, props.substring(0, props.length() - 1));
								now.addAll(temps);
							} else {
								Model next = (Model) ReflectionUtils.getFieldValue(temp, props);
								now.add(next);
							}
						}
						objs = now;
					}
				}
				String newValue = null;
				try {
					for (Model obj : objs) {
						Object old = ReflectionUtils.getFieldValue(obj, realProperty);
						if (old != null) {
							String oldValue = old.toString();
							newValue = WebUtil.removeHightlight(oldValue);
							ReflectionUtils.setFieldValue(obj, realProperty, newValue);
						}
					}
				} catch (Exception e) {
					this.log.info("移除高亮,給對象【" + model.getMetaData() + "】設定屬性【" + realProperty + "】失敗,值為:【" + newValue + "】");
				}
			}
		}
	}
}
           

 執行個體:

UserManager
package com.jxs.sys.core.security.manager;

import com.jxs.sys.core.base.service.Manager;
import com.jxs.sys.core.security.model.User;

public interface UserManager extends Manager<User> {
	public abstract User queryUserByName(String username);
}
UserManagerImpl:
package com.jxs.sys.core.security.manager.impl;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jxs.sys.core.base.service.ManagerSupport;
import com.jxs.sys.core.security.dao.UserDao;
import com.jxs.sys.core.security.manager.UserManager;
import com.jxs.sys.core.security.model.User;

@Service("userManager")
@Transactional(readOnly = true)
public class UserManagerImpl extends ManagerSupport<User, UserDao> implements UserManager {

	@Override
	public User queryUserByName(String username) {
		return ((UserDao) this.dao).queryUserByName(username);
	}
}

期待action層
           

繼續閱讀