人事管理系统的设计过程

  一、数据库表和持久化类

  1.1   进行需求分析,根据功能模块设计数据库表

  1.2   设计持久化实体

  面向对象分析,即根据系统需求提取出应用中的对象,将这些对象抽象成类,再抽取出需要持久化保存的类,这些需要持久化保存的类就是持久化对象(PO)。

  这里我们把它设计成单纯的数据类,不涉及业务逻辑方法。

  这个阶段,要仔细分析对象之间复杂的关联关系。

  1.3 创建持久化实体类  

  持久化对象之间的关联关系以成员变量的方式表现出来,而这种关联关系,通常对应数据库里的主键、外键约束。

  此外,持久化对象还有自己的普通类型的成员变量,这些成员变量对应数据库中的字段。

  二、实现DAO持久层

  MyBatis推荐通过定义接口来完成SQL语句的映射,该接口可以作为DAO组件使用。(即替代了传统在DAO层中使用JDBC进行数据库操作的方式)

  在DAO层中,每个DAO组件包含了数据库的访问逻辑;每个DAO组件可以对一个数据库表完成基本的CRUD操作。

  门面模式:业务逻辑组件封装DAO组件

  桥接模式:业务逻辑组件负责业务逻辑的变化,DAO组件负责持久化技术的变化

  1、使用一个公共常量类

  在这个常量类中定义一些可以方便使用的常量(一般是String),如清晰、简化数据库中表的名字,方便构造sql语句。

  2、定义DAO接口

  如果我们需要使用动态的SQL操作,那么需要定义专门的动态SQL操作提供类,以供DAO组件中使用。

  3、部署DAO层

  MyBatis中,只需要通过SqlSession的getMapper()方法获得对应的DAO接口实例,就可以调用接口中的方法完成相应的SQL操作。

  而在Spring中,这些DAO接口的实例由Spring容器负责生成和管理(即自动生成bean)。

  MyBatis社区自己开发一个MyBatis-Spring的中间件完成这个过程,通过SqlSessionFactoryBean类,可以将SqlSessionFactory纳入Spring的IOC容器。

  需要注意的是,在委托Spring管理DAO之前,必须要为其提供对应的数据源,这里使用C3P0数据源。

  即在applicationContext.xml中先配置数据源,然后创建SqlSessionFactoryBean类的bean,并在bean中设置好关联的数据源。

  <!--使用PropertyOverrideConfigurer后处理器加载数据源参数-->
<context:property-override location="classpath*:db.properties"/> <!--配置C3P0数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"/> <!--配置SqlSessionFactory,这个指定的class是MyBatis社区开发的用于整合Spring的bean-->

  

  三、实现Service持久层

  1、业务逻辑组件的设计

  业务逻辑组件是DAO的门面,即业务逻辑组件依赖于DAO组件提供的服务。

  业务逻辑组件面向DAO接口编程,只注重业务逻辑的实现,而无需关心数据库的访问。

  2、实现业务逻辑组件

  为了简化分页功能,设计了一个分页的JSP标签,只需要在页面使用分页标签,就可以完成所有的分页功能。(要使用JSP的标签需要在WEB-INF下增加一个tld标签文件)。

  hrmService接口及其实现类ServiceImpl,其中实现了接口中定义的所有业务逻辑方法。

  3、对业务逻辑方法事务管理

  只有对业务逻辑方法添加事务管理才是有实际意义的,对单个的DAO方法(基本的CRUD方法)增加事务管理没有太大的实际意义。

 <!--JDBC事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"/> <!--启用支持annotation注解方式的事务管理-->
<!--transaction-manager属性用于指定使用哪个事务管理器-->
<tx:annotation-driven transaction-manager="transactionManager"/>

  

  4、部署业务逻辑组件

  在applicationContext.xml中开启组件扫描,让Spring中自动创建Service Bean(与Controller Bean相同)。

<!--扫描包下的Java文件,有Spring相关注解的类,则把这些类注册为Spring的bean -->
<context:component-scan base-package="com.biguo"/>

  四、web层

  数据库设计、中间层设计(DAO组件、业务逻辑组件)都已经完成,现在进行web层的设计。

  通常,系统的控制器和jsp一起设计。因为jsp页面发出请求后,该请求被控制器接收,然后控制器调用业务逻辑组件处理请求。

  1、控制器的处理顺序

  实际上,控制器是先对请求参数进行解析,然后调用业务逻辑组件中的方法进行业务处理,完成后,再将处理结果通过jsp页面呈现给用户。(这也是为什么一般的处理器方法会返回某个jsp文件的文件名)

  Spring MVC中,控制器有两块,一个系统核心控制器DispatcherServlet和业务控制器Controller。

  web.xml中:

  • 配置好Spring的核心监听器ContextLoadListener,并指定具体的applicationContext.xml作为Spring的配置文件;
  • 配置好Spring MVC的前端核心控制器DispatchServlet,并指定具体的springmvc-config.xml作为Spring MVC的配置文件,并通过映射定义设定为拦截所有请求;
    <!--配置spring核心监听器,默认会以 /WEB-INF/applicationContext.xml作为配置文件-->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--contextConfigLocation参数用来指定Spring的配置文件-->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param> <!--定义Spring MVC的前端控制器-->
    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/springmvc-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet> <!--让Spring MVC的前端控制器拦截所有请求-->
    <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
    </servlet-mapping>

 

  2、控制器的处理细节

  springmvc-config.xml中配置了一个拦截器,用于判断用户是否登录,如果没有登录,则用户不能访问网站,然后跳转到登录页面。这个拦截器的相关类需要自己实现。

<!-- 定义Spring MVC的拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/*"/>
<!-- 自定义判断用户权限的拦截类 -->
<bean class="com.biguo.interceptor.AuthorizedInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

  事实上这是个很关键的问题,系统是怎么保存一个用户的登录状态的?  

  最后,根据不同的功能模块,设计的不同的Controller,以调用相应的Service方法,进行业务处理。

  值得一提的是,有一个动态页面跳转控制器:

/**
* 动态页面跳转控制器
* */
@Controller
public class FormController{ @RequestMapping(value="/{formName}")
public String loginForm(@PathVariable String formName){
// 动态跳转页面
return formName;
}
}

  

项目实践 hrm项目的设计过程的更多相关文章

  1. [项目实践] 在项目实战中提升代码效率的的一次应用实践-----使用列表解析式输出当前android设备的CPU核数

    1.先按照初学者思维代码应该是这样的 #coding:utf-8 import os text = os.popen("adb shell command cat /proc/cpuinfo ...

  2. 项目实践2:项目中的CSS网页布局(常用)

    好家伙, 整个网页做下来,最主要的,自然是css的网页布局(菜鸟好用啊) 我需要一个大概这样的布局: 然后上代码: <!DOCTYPE html> <html> <hea ...

  3. 《Spring Boot 入门及前后端分离项目实践》系列介绍

    课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发 ...

  4. 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]

    先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...

  5. Windows on Device 项目实践 1 - PWM调光灯制作

    在前一篇文章<Wintel物联网平台-Windows IoT新手入门指南>中,我们讲解了Windows on Device硬件准备和软件开发环境的搭建,以及Hello Blinky项目的演 ...

  6. Vue + webpack 项目实践

    Vue.js 是一款极简的 mvvm 框架,如果让我用一个词来形容它,就是 “轻·巧” .如果用一句话来描述它,它能够集众多优秀逐流的前端框架之大成,但同时保持简单易用.废话不多说,来看几个例子: & ...

  7. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  8. Python & 机器学习之项目实践

    机器学习是一项经验技能,经验越多越好.在项目建立的过程中,实践是掌握机器学习的最佳手段.在实践过程中,通过实际操作加深对分类和回归问题的每一个步骤的理解,达到学习机器学习的目的. 预测模型项目模板不能 ...

  9. nodejs, vue, webpack 项目实践

    vue 及 webpack,均不需要与nodejs一期使用,他们都可以单独使用到任何语言的框架中. http://jiongks.name/blog/just-vue/ https://cn.vuej ...

随机推荐

  1. 定时从linux获取信息放到windows上

    环境:windows上代码路径下存放:WinSCP-5.13.8-Setup.exe 第一步:test.txt   拉取脚本的txt文本 解析:存放从linux路径下拉取所需源文件zyy_count. ...

  2. mybatis集成spring

    1.为什么mybatis要去集成spring?===>简单来说就是为了让spring 来帮我们管理事务!!如果没有spring去帮助管理事务,那么需要我们自己去手动去维护事务,例如:发生异常需要 ...

  3. Leetcode题目102.二叉树的层次遍历(队列-中等)

    题目描述: 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 ...

  4. Nginx-HTTP之ngx_http_top_body_filter

    1. ngx_http_top_body_filter 该链表用于构造响应消息的响应正文. 大致有以下模块在该链表中插入了自己的函数: ngx_http_range_filter_module: ng ...

  5. QAbstractTableModel中的data()到底执行几遍???

    发现问题的过程  1.一个普通的继承 QAbstractTableModel 的类 class CurrencyModel : public QAbstractTableModel { public: ...

  6. CentOS 上 Jenkins 的安装

    Jenkins 的前身是 Hudson. Jenkins 是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件. Jenkins 支持各种运行方式,可通过系统包.Dock ...

  7. leetcode-hard-array-149. Max Points on a Line -NO

    mycode  不会.... 参考 因为每次遍历一个点,也就是i的时候,都是新建的一个lines,所以也就是考虑了k相同b不同的情况 最后gcd函数就求最大公约数,来解决斜率精度的问题 class S ...

  8. python之scrapy爬取数据保存到mysql数据库

    1.创建工程 scrapy startproject tencent 2.创建项目 scrapy genspider mahuateng 3.既然保存到数据库,自然要安装pymsql pip inst ...

  9. RabbitMQ学习之:(四)回头看刚才写的程序 (转贴+我的评论)

    转自:http://lostechies.com/derekgreer/2012/03/18/rabbitmq-for-windows-hello-world-review/ 我的心得: 1. 在创建 ...

  10. RabbitMQ学习之:(三)第一个RMQ的程序 (转贴+我的评论)

    RabbitMQ for Windows: Building Your First Application Posted by Derek Greer on March 7, 2012 This is ...