`
BestUpon
  • 浏览: 290587 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

框架底层综合+快速开发+代码重用框架-设计(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层
 

 

分享到:
评论
3 楼 Wallian_hua 2010-09-21  
oh,看到了。。。
原来是那样做的,和我的一样!!
不知道有没有更好的解决方案~~~
2 楼 Wallian_hua 2010-09-21  
其实我想知道的是你的cache是怎么做的。。
1 楼 bubble 2010-09-21  
只能鼓励一下,打个新手贴,自己学习还是不错的,不过还是尽量用已有的吧,造轮子的事情只能自娱自乐啊

相关推荐

    新版Android开发教程.rar

    • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • 集成的浏览器 基于开源的 WebKit 引擎 • 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 ...

    SOA\精通SOA_基于服务总线的Struts+EJB+Web Service整合应用开发

    在现代企业级软件开发中,Service-Oriented Architecture(SOA,面向服务架构)是一种广泛采用的设计理念,它强调通过独立、可重用的服务来构建分布式系统。本资料深入探讨了如何在SOA框架下,利用Struts、EJB和Web ...

    SSM框架详细阐述.pdf

    这个框架的详细阐述主要涵盖了四个层面:持久层(DAO层)、业务层(Service层)、表现层(Controller层)和视图层(View层),以及它们之间的相互联系和整合方式。 1. **持久层(DAO层)**: DAO层是数据访问对象...

    分层开发jdbc, entity层, service的接口与实现类

    在Java开发中,分层架构是一种常见的设计模式,它将应用程序的不同部分划分为逻辑上的独立层,以提高代码的可维护性、可扩展性和可重用性。在"分层开发jdbc, entity层, service的接口与实现类"这个主题中,我们将...

    2000_Delphi最新三层源码_delphi三层架构_DELPHI三层_三层_源码

    5. **Delphi的三层架构优势**:使用Delphi开发三层架构应用有以下优点:提高代码的可重用性,因为各层职责明确;提高系统的可扩展性,新功能的添加只需修改或增加相应的服务层和DAO层代码;提高系统的可维护性,各层...

    用于Delphi和FreePascal的开源RESTful ORM SOA mvc框架.zip

    【标题】中的“用于Delphi和FreePascal的开源RESTful ORM SOA mvc框架”指的是一款专门针对这两个编程语言设计的软件开发框架。这个框架整合了多种现代Web开发的关键技术,包括RESTful(Representational State ...

    1 微软.NET框架

    - **涉及系统底层**:为了充分利用.NET框架的优势,开发者需要了解更多的底层细节,这有助于编写出更加高效的代码。 - **难度相对较大**:由于其强大的功能和复杂的架构,掌握.NET框架需要一定的学习曲线。 #### 三...

    EJB+JPA数据库持久层开发实践详解PDF

    JPA是Java平台上的一个规范,它的主要目标是简化Java应用程序的持久化层开发。JPA通过ORM(Object-Relational Mapping)机制将Java对象与关系型数据库中的记录进行映射,使得开发者可以使用面向对象的方式操作数据,...

    JS应用开发框架组件.zip

    Ace Engine Lite 是JS应用开发框架的核心部分,它是轻量级的JavaScript运行环境,专门为鸿蒙OS设计。它实现了JavaScript Core的基本功能,支持ECMAScript标准,允许开发者使用JavaScript编写鸿蒙应用。Ace Engine ...

    SSH框架 增删改查操作

    这个框架集合提供了模型-视图-控制器(MVC)架构模式,用于简化企业级应用程序的开发流程,提高代码的可维护性和可重用性。在本教程中,我们将深入探讨SSH框架如何实现数据的增删改查(CRUD)操作。 1. **Struts2**...

    自定义框架实现用户增删改查

    总之,通过自定义框架实现用户增删改查,可以加深对Struts框架的理解,提升代码的可重用性和可扩展性。这涉及到数据模型设计、数据库操作、业务逻辑处理、前端展示等多个环节,每个环节都需要扎实的编程基础和良好的...

    【Java-框架-Spring】(01) - 文件

    3. **编写业务逻辑**:使用Spring提供的注解如@Service、@Repository、@Controller等,标记业务层、数据访问层和控制层的类,以便于Spring容器管理。 4. **启动应用**:Spring Boot项目可以直接运行主类启动应用,...

    框架技术培训.pptx

    这一层将业务逻辑与表示层分离,提高了代码的可重用性和可维护性。 3. **业务逻辑层(Business Logic Layer)**:这一层包含了Service组件,负责具体业务逻辑的实现,与数据访问层交互,但不涉及具体的数据库操作。...

    新闻发布网站后台管理页面及底层代码

    《新闻发布网站后台管理页面及底层代码详解》 在信息技术领域,新闻发布系统是众多网站不可或缺的一部分,它用于发布、管理和更新各类新闻资讯。本篇将详细探讨一个基于JAVA语言并使用Struts框架构建的新闻发布系统...

    Android 应用程序框架

    2. 可重用性:视图和模型可以独立开发和测试,提高了代码的复用性。 3. 易于扩展:通过修改或添加控制器,可以轻松实现新的功能,而不会影响到其他部分。 总结来说,Android应用程序框架通过提供MVC设计模式,帮助...

    Veloctiy代码生成器,基于struts2,和spring

    MDA将软件开发分为几个层次的模型,如概念层、逻辑层和物理层,允许开发者在高层次上抽象和设计系统,然后自动生成底层的实现代码。这种方法有助于提高代码的可重用性和一致性,降低维护成本。 在Veloctiy代码生成...

    NET,三层开发

    总结起来,.NET C#的三层架构开发是一个综合性的技术栈,涉及前端展示、后端逻辑和数据库操作等多个环节。通过合理地划分层次,可以构建出高效、可维护的企业级应用。在实践中,开发者应不断学习和改进,以适应不断...

    U9-UBF应用开发手册

    在表示层中,提供了统一的集成开发环境,用户可以使用包括模型设计、UI 设计、报表设计、规则设计、数据库设计、BI 设计等各方面的设计器。 三、UBF 的技术体系结构 UBF(UFIDA Business Framework)实 现 与 操 ...

Global site tag (gtag.js) - Google Analytics