`
Fly_m
  • 浏览: 259688 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

新闻发布系统设计思路(Dao与service)

阅读更多

        接上篇的新闻发布系统设计思路(域模型)之后,我把相关dao的设计和逻辑层的相关设计思路发上来,请大家一起看看还有什么需要改进的地方.
       dao作为域模型的一部分,被与单独的domain分开成单独的数据访问对象,并分别对应域模型的四个数据模型对象.分别为articleDao,categoryDao,articleTopTypeDao,和userDao.其中articleDao和categoryDao为主要的dao,其他的还等待扩展或者只是一个简单的占位点.
#-------------------------------------

articleDao(文章数据访问对象)

java 代码
  1. public interface IArticleDAO {   
  2.     /** 通过一个主键得到一篇文章   
  3.      * @param s 文章主键   
  4.      **/  
  5.     public Article get(Serializable s);   
  6.        
  7.     /** 通过主键来删除一篇文章,传递整个文章对象  
  8.      *@param s 整个文章对象,此对象至少含有主键id值  
  9.      */  
  10.     public void delete(Article s);   
  11.        
  12.     /** 更新这个文章  
  13.      * @param article 需要更新的文章对象,此对象是在原有的文章对象基础之上改变相应值再更新其.  
  14.      * 必须保证此对象是持久化的,如果未持久化,则作相应的插入操作.  
  15.      */  
  16.     public void update(Article article);   
  17.        
  18.     /** 保存这个对象  
  19.      * @param article 要保存的文章对象,此对象要求是未持久化的,即id值是未被赋值的,反之如果数据  
  20.      * 库中有此对象,则作相应的更新操作.  
  21.      */  
  22.     public void save(Article article);   
  23.        
  24.     /**  
  25.      * 通过文章路径信息和其页面数值来得到一个唯一的article对象  
  26.      */    
  27.     public Article getArticleByPathMarkAndPageCurrentIndex(String pathMark, int pageCurrentIndex);   
  28.        
  29.     /**  
  30.      * 通过文章路径信息得到一篇文章的页面列表,因为文章可能有多页.  
  31.      */  
  32.     public List<Article> getArticleListByPathMark(String pathMark);   
  33.        
  34.     /**   
  35.      * 通过一个动态查询条件查询所有的文章对象  
  36.      */    
  37.     public List<Article> getArticleListByCriteria(DetachedCriteria criteria);   
  38.        
  39.     /**  
  40.      * 通过一个动态查询条件和个分页对象相关的文章对象,此次查询只查询相关分页内的文章对象  
  41.      */    
  42.     public List<Article> getArticleListByCriteria(DetachedCriteria criteria, Page page);   
  43. }   

此接口中都是一些常用的操作,包括文章的查询和上下页的翻页等操作.其中getArticleListByPathMark(String pathMark)操作为得到某一篇文章的所有单页文章,因为如果对某一篇文章进行相应更改(如文章页数的改变等),需要对这一篇文章进行相关数据项的删除与添加.而其它操作,如动态查询,目录下文章查询等操作,都委托给getArticleListByCriteria(criteria)和getArticleListByCriteria(cirteria,page)来完成因为一个查询的条件多,如考虑删除条件,目录条件,置顶条件等.

#--------------------
categoryDao(目录数据访问对象)

java 代码
  1. public interface ICategoryDAO {   
  2.        
  3.     /** 通过主键来得到类别对象 **/  
  4.     public Category get(Serializable s);   
  5.        
  6.     /** 删除类别对象 **/  
  7.     public void delete(Category s);   
  8.        
  9.     /** 更新类别对象 **/  
  10.     public void update(Category category);   
  11.        
  12.     /** 保存类别对象 **/  
  13.     public void save(Category category);   
  14.        
  15.     /** 得到一个类别的下级类别列表 **/  
  16.     public List<Category> getCategoryListBySuperCategory(Category category);   
  17.        
  18.     /** 判断一个类别是否和其同级别类别有重复的名字 **/  
  19.     public boolean hasCategory(Category category);   
  20. }  

目录操作相对简单些,除了基本操作,增加getCategoryListBySuperCategory(category)操作,由一目录来得到它的子目录(此处category我只传递了category的主键信息,当然在openSessionInView环境中,可由category.getCategoryList()方法来直接得到子目录,不要这要多发送一条上级目录的查询操作).hasCategory(category)方法,用来处理目录的同名问题,在同一目录下,不允许两个同名的目录存在(当然跨目录是可以的).

其它dao都很简单,就不要再细说了.四个数据访问对象都只对基本的数据操作作了定义,相对来说,更说的操作放在逻辑层(servie)来作.service处理的事也不多,也是把相应操作委托给dao来操作,加上一些自己的逻辑操作.相关接口定义如下(整个系统我只设计了一个servie,此service将所有dao操作聚合在一起)

java 代码
  1. public interface IService {   
  2.     /** 保存一页文章,而不是一篇,因为一篇文章可能有多页 **/  
  3.     public void saveArticle(Article article);   
  4.        
  5.     /** 得到一页文章,此方法通过主键来得到一篇文章中的其中一页 **/  
  6.     public Article getArticle(Serializable s);   
  7.        
  8.     /** 通过文章的路径标记和当前页面的页面下标数(第几页)来得到实际的页面文章对象 **/  
  9.     public Article getArticleByPathMarkAndPageCurrentIndex(String pathMark, int pageCurrentIndex);   
  10.        
  11.     /** 通过文章路径来得到一篇文章,一篇文章可能有多页,故返回一个文章列表 **/  
  12.     public List<Article> getArticleListByArticlePathMark(String pathMark);   
  13.        
  14.     /** 更新一篇文章中的一页文章 **/  
  15.     public void updateArticle(Article article);   
  16.        
  17.     /** 为一篇文章添加或者删除置顶标记,一篇文章并不是指一页文章,而是指包含几个页面的一篇文章 **/  
  18.     public void updateArticleByArticleTopType(Article article, ArticleTopType articleTopType);   
  19.        
  20.     /** 为一篇文章添加或者删除审核标记 **/  
  21.     public void updateArticleByAudit(Article article, boolean auditFlag);   
  22.        
  23.     /** 为一个列表文章添加或者删除置顶标记 **/  
  24.     public void updateArticleListByTop(List<Article> articleList, ArticleTopType articleTopType);   
  25.        
  26.     /** 为一个列表文章添加或者删除审核标记 **/  
  27.     public void updateArticleListByAudit(List<Article> articleList, boolean auditFlag);   
  28.        
  29.     /** 删除一篇文章,在实际操作中,这个方法并不使用,因为实际没有从数据库中删除记录的操作 **/  
  30.     public void deleteArticle(Article article);   
  31.        
  32.     /** 第一次删除一篇文章,此操作为文章作删除标记 **/  
  33.     public void deleteFirstArticle(Article article);   
  34.        
  35.     /** 最终删除一篇文章,此操作将使文章最终不可被检索,仅存在于数据库中作为备份 **/  
  36.     public void deleteShiftArticle(Article article);   
  37.        
  38.     /** 保存一个类别 **/  
  39.     public void saveCategory(Category category);   
  40.        
  41.     /** 取得一个类别  **/  
  42.     public Category getCategory(Serializable s);   
  43.        
  44.     /** 更新类别 **/  
  45.     public void updateCategory(Category category);   
  46.        
  47.     /** 删除一个类别 **/  
  48.     public void deleteCategory(Category category);   
  49.        
  50.     /** 保存一个文章置顶对象,并返回这个对象的id值 **/  
  51.     public Serializable saveArticleTopType(ArticleTopType articleTopType);   
  52.        
  53.     /** 根据动态查询条件和分页组件,查询相关的文章列表 **/  
  54.     public List<Article> queryArticleListByCriteria(DetachedCriteria criterion, Page page);   
  55.        
  56.     /** 查询现在时间段内有次的文章置顶对象 **/  
  57.     public List<ArticleTopType> getArticleTopTypeListNowValid();   
  58.        
  59.     /** 根据动态查询条件,查询相关的文章列表,查询满足条件的所有对象 **/  
  60.     public List<Article> queryArticleListByCriteria(DetachedCriteria criteria);   
  61.        
  62.     /** 恢复一篇文章,这是由于先前的删除文章所作操作的逆向操作 **/  
  63.     public void updateArticleByRecover(Article article);   
  64.        
  65.     /** 取得一个用户 **/  
  66.     public User getUser(Serializable s);   
  67.        
  68.     /** 判断是否有一个重复的类别 **/  
  69.     public boolean hasCategory(Category category);   
  70.        
  71.     /** 通过上级类别来得到其下级类别列表 **/  
  72.     public List<Category> getCategoryListBySuperCategory(Category category);   
  73.        
  74.     /** 改变文章的类别 **/  
  75.     public void updateArticleByCategory(Article article, Category category);   
  76.        
  77.     /** 改变一个列表文章的类别,这些文章都是同一个类别 **/  
  78.     public void updateArticleListByCategory(List<Article> articleList, Category category);   
  79. }  

service将各种操作以更形象的方式提供给action层,并在其中封装数据对象的操作过程,避免action与dao的直接交互.

在service和dao中都出现了一个page对象,这个对象用于页面分页使用.将分页操作放在特定的对象中.分页操作主要涉及到三个方面,每页文章数,当前页数,以及总文章数,其他都可以这三个参数来得到.相应分页对象代码如下:

java 代码
  1. public class Page {   
  2.   
  3.     public Page() {   
  4.     }   
  5.        
  6.     /** 当前页数,默认为第一页 **/  
  7.     private int currentPage = 1;   
  8.        
  9.     /** 每页显示的记录数 默认为 20条记录 **/  
  10.     private int pageSize = 20;   
  11.        
  12.     /** 总记录数 **/  
  13.     private int totalCount;   
  14.   
  15.     public int getCurrentPage() {   
  16.         return currentPage;   
  17.     }   
  18.   
  19.     public void setCurrentPage(int currentPage) {   
  20.         if(currentPage <= 0)   
  21.             return;   
  22.         this.currentPage = currentPage;   
  23.     }   
  24.        
  25.     public int getPageSize() {   
  26.         return pageSize;   
  27.     }   
  28.   
  29.     public void setPageSize(int pageSize) {   
  30.         if(pageSize <= 0)   
  31.             return;   
  32.         this.pageSize = pageSize;   
  33.     }   
  34.   
  35.     public int getTotalCount() {   
  36.         return totalCount;   
  37.     }   
  38.   
  39.     public void setTotalCount(int totalCount) {   
  40.         this.totalCount = totalCount;   
  41.     }   
  42.        
  43.     /** 得到起始记录,此记录是当前显示数据的第一条记录的前一条记录,即前一页记录页的最后一条记录  
  44.      * 因为setCurrentPage方法的存在,使得不可能出现计算得出起始记录为负数的情况,此结果返回的  
  45.      * 最小起始记录为 0  
  46.      */  
  47.     public int getStartIndex() {   
  48.         return (this.currentPage - 1) * this.pageSize;   
  49.     }   
  50.        
  51.     /** 得到总的记录页面数,此结果页每页显示的记录数与总记录数之间的关系计算得出 **/  
  52.     public int getTotalPage() {   
  53.         int i = this.totalCount / this.pageSize;   
  54.         int j = this.totalCount % this.pageSize;   
  55.         return i + (j == 0 ? 0 : 1);   
  56.     }   
  57.        
  58.     /** 是否有上一页 **/  
  59.     public boolean hasPreviousPage() {   
  60.         return this.currentPage > 1;   
  61.     }   
  62.        
  63.     /** 是否有下一页 **/  
  64.     public boolean hasNexPage() {   
  65.         return this.currentPage < this.getTotalCount();   
  66.     }   
  67.   
  68. }  

相应操作都是很简单,我也是简单地进行了些操作.由于需求的简单, 使得相应的代码都不是太长,当然逻辑操作也不是太多.在很多的小型系统的开发场合,常常把service这层去掉,而直接以dao层跟action的直接交互.这也未必不是一种方式.(这里我也有想把service层去掉,因为工作确实不多).

dao层代码和service代码放在附件中,请有意思地交流一下.看有什么可以补充的.

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    新闻发布系统设计思路(Action)

    【新闻发布系统设计思路】主要涉及的是使用Action框架构建一个新闻发布平台的过程。Action是Struts2框架的核心组件,它处理用户请求并控制应用程序的行为。在这个设计思路中,我们可以通过以下步骤来理解系统的构建...

    新闻发布系统 课程设计(J2EE)

    6. **文档编写**:撰写《面向对象程序设计Ⅱ》课程设计说明书,详述系统设计思路、实现细节和测试结果。 在实际操作中,你可能还需要使用到开发工具(如Eclipse或IntelliJ IDEA)、版本控制系统(如Git)、构建工具...

    新闻发布系统(界面+代码+文档)

    **PPT**可能是项目汇报或教学材料,通常会涵盖系统设计思路、技术选型、模块划分、关键功能的实现细节以及系统测试等内容。通过PPT,我们可以快速概览整个项目的开发流程,理解开发者如何从需求分析到系统实现,再到...

    新闻发布系统(MVC模式,struts技术)

    通过以上介绍,我们可以看出这个新闻发布系统是一个综合运用了MVC设计模式和Struts框架的典型Java Web应用,其设计思路清晰,功能完善,适合初学者进行学习和实践。同时,面向接口编程的使用提升了系统的可维护性和...

    《Java Web程序设计》_项目库_项目案例_《新闻发布系统》设计文档.doc

    它能够实时发布新闻、公告、活动信息,帮助用户快速传递信息,提高信息传播效率。本设计文档详细阐述了《Java Web程序设计》课程中的一个项目案例——《新闻发布系统》的设计思路、技术选型以及实现过程。 2 系统...

    ACCP S2 使用JSP/Servlet技术开发新闻发布系统

    **课件全代码**:这部分内容可能包含了整个新闻系统的源代码,包括Servlet类、JSP页面、DAO(数据访问对象)层、Service层以及可能的MVC架构实现。通过学习这些代码,学生可以深入理解如何将理论知识应用于实际项目...

    基于Java的新闻管理系统.rar

    这个系统设计并实现了管理员与普通用户的不同权限功能,为新闻管理提供了便捷的平台。 首先,SSH框架是Java Web开发中的常用技术栈。Struts2作为MVC模式的实现,负责处理HTTP请求,协调前端视图与后端业务逻辑;...

    javaWeb学生公寓管理系统struts2 毕业设计 外加设计思路 文档

    设计思路部分会阐述系统的设计理念、主要功能模块划分及实现方式,帮助理解整个系统的运作机制。 8. **源代码**:源代码是实现系统功能的程序,包含了Action类、DAO类、Service类、JSP页面等。通过阅读源代码,可以...

    JavaWeb管理系统毕业设计 在线考试系统设计与实现 大纲及开发思路

    JavaWeb在线考试系统设计与实现是一项重要的毕业设计项目,它响应了在线教育发展的趋势,为教育机构提供了便捷的在线考试工具。系统的核心目标是构建一个高效、安全且易用的平台,涵盖用户管理、题库管理、考试管理...

    基于java的新闻发布及管理系统(项目报告+答辩PPT+源代码+数据库+截图+辅导视频).zip

    《基于Java的新闻发布及管理系统详解》 在信息技术飞速发展的今天,新闻管理系统的开发与应用已经成为各类企事业单位不可或缺的一部分。本系统以Java编程语言为基础,旨在实现高效、便捷的新闻发布和管理功能,满足...

    ssh框架的基于jsp开发的新闻管理系统

    开发人员需要编写DAO(Data Access Object)层来与数据库交互,Service层处理业务逻辑,Action层处理请求并调用Service,最后由JSP生成页面响应。 7. **安全与优化**:系统可能还涉及权限控制,确保只有授权用户...

    人事管理系统设计报告

    1.3 系统设计思路 1.3.1 分层模型 系统遵循经典的三层架构设计,包括表现层(Web层)、业务逻辑层(Service层)和数据访问层(DAO层)。表现层负责用户交互,业务逻辑层处理业务规则,数据访问层与数据库进行交互。...

    基于Java设计的仓库管理系统设计源码.zip

    《基于Java设计的仓库管理系统设计源码》 在IT行业中,仓库管理系统的开发是一项重要的任务,它涉及到企业的物资流动和库存控制,对于提高运营效率具有关键作用。本系统是基于Java语言进行设计的,Java以其跨平台性...

    2021-基于Vue+Vant+SSM图书管理系统设计.zip

    【标题】"2021-基于Vue+Vant+SSM图书管理系统设计.zip" 提供了一个关于2021年开发的图书管理系统的源码示例,它结合了前端的Vue.js框架、Vant UI组件库以及后端的Spring、SpringMVC和MyBatis(简称SSM)三大框架。...

    DAo设计模式[定义].pdf

    2. **程序设计思路**: DAO模式的核心思想是通过创建一系列对象来处理与数据库的交互,而不是直接在JSP页面中编写SQL语句。这样可以使得JSP页面专注于展示和控制逻辑,而数据访问则由专门的DAO类负责。这个设计允许...

Global site tag (gtag.js) - Google Analytics