• 项目实践 hrm项目的设计过程


    人事管理系统的设计过程

      一、数据库表和持久化类

      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;
        }
    }

      

     

  • 相关阅读:
    Python shutil模块
    Flask 上传文件
    Flask DBUtils
    flash-session
    Flash 上下文管理
    python 栈
    python 偏函数
    threding.local
    next() 与 nextLine() 区别
    Thread.sleep(1000*3); // 休眠3秒
  • 原文地址:https://www.cnblogs.com/bigbigbigo/p/8824807.html
Copyright © 2020-2023  润新知