- 浏览: 291407 次
- 性别:
- 来自: 兰州
文章分类
- 全部博客 (116)
- 给网友答疑 (1)
- J2EE (16)
- DesignPattern (14)
- OtherArchive (5)
- lucene and compass (1)
- JasperReport (2)
- FusionCharts (2)
- Classical algorithm (2)
- JS (5)
- ZK Ajax (1)
- ubuntu-linux (4)
- Weka (0)
- IDE Config (6)
- JAVA 底层 (3)
- C\C++ (4)
- Android (15)
- 项目展示 (1)
- 娱乐生活 (16)
- 电驴资源 (1)
- 网络转载 (1)
- 程序员 毛病 (1)
- Android,开发日志 (2)
- java (1)
- openGL es (2)
- MAC (1)
最新评论
-
洋葱pp奥特曼:
求大神再发一次资源,万分感激!!小弟邮箱:173992660@ ...
使用JQuery-Week-Calendar做日程 -
xbliu564:
请问版本号
fusionchart 破解文件SWF -
xue_lang:
看了半天,有点坑爹的赶脚,哎
状态模式(State) -
teacup_madman:
我只能说。这个程序可以去掉的地方太多了。这个真的是State模 ...
状态模式(State) -
冬日的阳光:
TrafficLight这个类的change方法可以改一下,如 ...
状态模式(State)
三、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
只能鼓励一下,打个新手贴,自己学习还是不错的,不过还是尽量用已有的吧,造轮子的事情只能自娱自乐啊
发表评论
-
框架底层综合+快速开发+代码重用框架-设计(Action)层)
2010-09-20 18:15 1327框架底层综合+快速开发+代码重用框架-设计(Model层 ... -
框架底层综合+快速开发+代码重用框架-设计(Dao层)
2010-09-20 17:06 1722二、Dao层 Dao层是数据化持久层,以前我们习惯使用 ... -
框架底层综合+快速开发+代码重用框架-设计(Model层)
2010-09-19 20:26 1821框架底层综合+快速开发+代码重用框架-设计(Model层) ... -
状态模式(State)续谈
2010-06-18 00:49 1490前面写了一片文章:状态模式(state)http://best ... -
状态模式(State)
2010-06-17 10:43 6189请参看:状态模式续. http://bestupon.i ... -
单例模式(Singleton)
2010-06-13 11:09 2056首先我们先看看一个例子,在说什么是单利模式(Singleton ... -
原型模式(Prototype)
2010-06-13 09:59 1261原型模式: 1、定义:原型模式就是通过一个原型对象来 ... -
责任链模式一
2010-01-26 16:42 1662责任链模式(Chain of Responsibility)是 ... -
创建者模式(Builder)
2009-09-29 12:32 1485创建者模式:(builder) 1、定义:创建者模式就是将一个 ... -
总结几个工厂模式
2009-09-28 11:29 1187总结几个工厂模式: 1、简单工厂模式:由一个类来负责所有的产品 ... -
抽象工厂模式
2009-09-28 11:20 1405package org.bestupon.abstratf ... -
工厂方法模式
2009-09-27 15:07 915工厂方法模式: 定义:工厂方法模式是用于创建对象的接口,让子 ... -
简单工厂模式
2009-09-27 14:19 1308简单工厂模式又叫静 ...
相关推荐
• 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • 集成的浏览器 基于开源的 WebKit 引擎 • 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 ...
在现代企业级软件开发中,Service-Oriented Architecture(SOA,面向服务架构)是一种广泛采用的设计理念,它强调通过独立、可重用的服务来构建分布式系统。本资料深入探讨了如何在SOA框架下,利用Struts、EJB和Web ...
这个框架的详细阐述主要涵盖了四个层面:持久层(DAO层)、业务层(Service层)、表现层(Controller层)和视图层(View层),以及它们之间的相互联系和整合方式。 1. **持久层(DAO层)**: DAO层是数据访问对象...
在Java开发中,分层架构是一种常见的设计模式,它将应用程序的不同部分划分为逻辑上的独立层,以提高代码的可维护性、可扩展性和可重用性。在"分层开发jdbc, entity层, service的接口与实现类"这个主题中,我们将...
5. **Delphi的三层架构优势**:使用Delphi开发三层架构应用有以下优点:提高代码的可重用性,因为各层职责明确;提高系统的可扩展性,新功能的添加只需修改或增加相应的服务层和DAO层代码;提高系统的可维护性,各层...
【标题】中的“用于Delphi和FreePascal的开源RESTful ORM SOA mvc框架”指的是一款专门针对这两个编程语言设计的软件开发框架。这个框架整合了多种现代Web开发的关键技术,包括RESTful(Representational State ...
- **涉及系统底层**:为了充分利用.NET框架的优势,开发者需要了解更多的底层细节,这有助于编写出更加高效的代码。 - **难度相对较大**:由于其强大的功能和复杂的架构,掌握.NET框架需要一定的学习曲线。 #### 三...
JPA是Java平台上的一个规范,它的主要目标是简化Java应用程序的持久化层开发。JPA通过ORM(Object-Relational Mapping)机制将Java对象与关系型数据库中的记录进行映射,使得开发者可以使用面向对象的方式操作数据,...
Ace Engine Lite 是JS应用开发框架的核心部分,它是轻量级的JavaScript运行环境,专门为鸿蒙OS设计。它实现了JavaScript Core的基本功能,支持ECMAScript标准,允许开发者使用JavaScript编写鸿蒙应用。Ace Engine ...
这个框架集合提供了模型-视图-控制器(MVC)架构模式,用于简化企业级应用程序的开发流程,提高代码的可维护性和可重用性。在本教程中,我们将深入探讨SSH框架如何实现数据的增删改查(CRUD)操作。 1. **Struts2**...
总之,通过自定义框架实现用户增删改查,可以加深对Struts框架的理解,提升代码的可重用性和可扩展性。这涉及到数据模型设计、数据库操作、业务逻辑处理、前端展示等多个环节,每个环节都需要扎实的编程基础和良好的...
3. **编写业务逻辑**:使用Spring提供的注解如@Service、@Repository、@Controller等,标记业务层、数据访问层和控制层的类,以便于Spring容器管理。 4. **启动应用**:Spring Boot项目可以直接运行主类启动应用,...
这一层将业务逻辑与表示层分离,提高了代码的可重用性和可维护性。 3. **业务逻辑层(Business Logic Layer)**:这一层包含了Service组件,负责具体业务逻辑的实现,与数据访问层交互,但不涉及具体的数据库操作。...
《新闻发布网站后台管理页面及底层代码详解》 在信息技术领域,新闻发布系统是众多网站不可或缺的一部分,它用于发布、管理和更新各类新闻资讯。本篇将详细探讨一个基于JAVA语言并使用Struts框架构建的新闻发布系统...
2. 可重用性:视图和模型可以独立开发和测试,提高了代码的复用性。 3. 易于扩展:通过修改或添加控制器,可以轻松实现新的功能,而不会影响到其他部分。 总结来说,Android应用程序框架通过提供MVC设计模式,帮助...
MDA将软件开发分为几个层次的模型,如概念层、逻辑层和物理层,允许开发者在高层次上抽象和设计系统,然后自动生成底层的实现代码。这种方法有助于提高代码的可重用性和一致性,降低维护成本。 在Veloctiy代码生成...
总结起来,.NET C#的三层架构开发是一个综合性的技术栈,涉及前端展示、后端逻辑和数据库操作等多个环节。通过合理地划分层次,可以构建出高效、可维护的企业级应用。在实践中,开发者应不断学习和改进,以适应不断...
在表示层中,提供了统一的集成开发环境,用户可以使用包括模型设计、UI 设计、报表设计、规则设计、数据库设计、BI 设计等各方面的设计器。 三、UBF 的技术体系结构 UBF(UFIDA Business Framework)实 现 与 操 ...