业务逻辑层依赖持久化逻辑层,为了将这种依赖关系进一步弱化,采用了抽象工厂+反射的模式,把关于Dao层的类配置到xml文件中,然后通过工厂创建对象,后期如果需要修改,只需修改xml文件即可,不用再去修改代码。首先创建一个保存类名称的xml文件beans-config.xml。代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans><service-class><service id="com.snail.drp.basedata.manager.ItemManager" class="com.snail.drp.basedata.manager.ItemManagerImpl"></service><service id="com.snail.drp.flowcard.manager.FlowCardManager" class="com.snail.drp.flowcard.manager.impl.FlowCardManagerImpl"></service><service id="com.snail.drp.statreport.manager.StatReportManager" class="com.snail.drp.statreport.manager.impl.StatReportManagerImpl"/>   </service-class><dao-class><dao id="com.snail.drp.basedata.dao.ItemDao" class="com.snail.drp.basedata.dao.ItemDao4OracleImpl"></dao><dao id="com.snail.drp.flowcard.dao.FlowCardDao" class="com.snail.drp.flowcard.dao.impl.FlowCardDaoImpl"></dao></dao-class>
</beans>

创建一个抽象工厂,用来创建Dao层的对象,代码如下:

package com.snail.drp.util;import java.util.HashMap;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import com.snail.drp.basedata.dao.ItemDao;/*** 工厂抽象* @author yuanfubiao**/
public class BeanFactory {private static BeanFactory instance = new BeanFactory();private final String beansConfigFile = "beans-config.xml";//保存Service相关对象private Map serviceMap = new HashMap();//保存dao相关对象private Map daoMap = new HashMap();private Document doc;private BeanFactory(){try {doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(beansConfigFile));} catch (DocumentException e) {e.printStackTrace();throw new RuntimeException();}        }public static BeanFactory getInstance(){return instance;}/*** 根据产品编号取得Service系列产品* @param c* @return*/public synchronized Object getServiceObject(Class c){//如果存在相关对象实例,返回if(serviceMap.containsKey(c.getName())){return serviceMap.get(c.getName());}Element beanElt = (Element)doc.selectSingleNode("//service[@id=\"" + c.getName() + "\"]");String className = beanElt.attributeValue("class");Object service = null;try {service = Class.forName(className).newInstance();//采用动态代理包装ServiceTransactionHandler transactionHandler = new TransactionHandler();service = transactionHandler.newProxyInstance(service);//将创建好的对象放到Map中serviceMap.put(c.getName(), service);} catch (Exception e) {throw new RuntimeException();}return service;            }/*** 根据产品编号取得Dao系列产品* @param c* @return*/public synchronized Object getDaoObject(Class c){//如果存在相关对象实例,返回if(daoMap.containsKey(c.getName())){return daoMap.get(c.getName());}Element beanElt = (Element)doc.selectSingleNode("//dao[@id=\"" + c.getName() + "\"]");String className = beanElt.attributeValue("class");Object dao = null;System.out.print(className);try {dao = Class.forName(className).newInstance();//将创建好的对象放到Map中daoMap.put(c.getName(), dao);} catch (Exception e) {e.printStackTrace();}return dao;     }
}

为保持通用性,业务逻辑依旧采用面向接口编程:

package com.snail.drp.flowcard.manager;import java.util.Date;import com.snail.drp.flowcard.domain.FlowCard;
import com.snail.drp.util.ApplicationException;
import com.snail.drp.util.PageModel;/*** 流向单维护业务层接口* @author yuanfubiao**/
public interface FlowCardManager {/*** 添加流向单* @param flowCard* @throws ApplicationException*/public void addFlowCard(FlowCard flowCard) throws ApplicationException;
}

实现类代码:

package com.snail.drp.flowcard.manager.impl;import java.sql.Connection;
import java.util.Date;
import java.util.List;import com.snail.drp.flowcard.dao.FlowCardDao;
import com.snail.drp.flowcard.domain.FlowCard;
import com.snail.drp.flowcard.manager.FlowCardManager;
import com.snail.drp.util.ApplicationException;
import com.snail.drp.util.BeanFactory;
import com.snail.drp.util.ConnectionManager;
import com.snail.drp.util.DaoException;
import com.snail.drp.util.PageModel;/*** 流向单维护服务层实现* @author yuanfubiao**/
public class FlowCardManagerImpl implements FlowCardManager {private FlowCardDao flowCardDao;public FlowCardManagerImpl(){this.flowCardDao = (FlowCardDao)BeanFactory.getInstance().getDaoObject(FlowCardDao.class);}@Overridepublic void addFlowCard(FlowCard flowCard) throws ApplicationException {try{            //生成流向单单号String flowCardVouNo = flowCardDao.generateVouNo();//添加流向单主信息flowCardDao.addFlowCardMaster(flowCardVouNo, flowCard);}catch(DaoException e){throw new ApplicationException("添加流向单失败");}}
}

在Controller层,因为很多Servlet中要用到BeanFactory工厂类,因此创建一个专门初始化一些数据的Servlet,在服务器启动时,就创建好BeanFactory,和一些常用的常量。

package com.snail.drp.util.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;import com.snail.drp.util.BeanFactory;
import com.snail.drp.util.Constants;/*** 负责系统在Server启动时初始化* @author yuanfubiao**/
public class InitServlet extends HttpServlet {@Overridepublic void init() throws ServletException {//创建缺省工厂//BeanFactory beanFactory = new DefaultBeanFactory();//将工厂设置到ServletContext中//this.getServletContext().setAttribute("beanFactory", beanFactory);//将抽象工厂放到ServletContext中BeanFactory beanFactory = BeanFactory.getInstance();this.getServletContext().setAttribute("beanFactory", beanFactory);//加入常量getServletContext().setAttribute("add", Constants.ADD);getServletContext().setAttribute("showAdd", Constants.SHOW_ADD);}
}

很多Servlet具有共用的方法,因此Servlet采用面向抽象编程,把Servlet中一些公用的方法抽取出来,代码如下:

package com.snail.drp.util.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.snail.drp.sysmgr.domain.User;
import com.snail.drp.util.BeanFactory;public class BaseServlet extends HttpServlet {private String command;private User user;private BeanFactory beanFactory;protected String getCommand(){return command;}protected User getCurrentUser(){return user;}protected BeanFactory getBeanFactory(){//从servletContext中取得BeanFactorybeanFactory = (BeanFactory)this.getServletContext().getAttribute("beanFactory");return beanFactory;}@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {command = request.getParameter("command");user = (User)request.getSession().getAttribute("user_info");super.service(request,response);}
}

Servlet调用业务逻辑层为保持其灵活性,依旧采用抽象工厂+反射的模式,抽象工厂可以创建不同系列的产品,因此此项目中BeanFactory负责生产Dao层对象和业务逻辑层对象。添加流向单Servlet实现代码,

package com.snail.drp.flowcard.web;import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.snail.drp.basedata.domain.AimClient;
import com.snail.drp.basedata.domain.Client;
import com.snail.drp.basedata.domain.FiscalYearPeriod;
import com.snail.drp.basedata.domain.Item;
import com.snail.drp.flowcard.domain.FlowCard;
import com.snail.drp.flowcard.domain.FlowCardDetail;
import com.snail.drp.flowcard.manager.FlowCardManager;
import com.snail.drp.util.ApplicationException;
import com.snail.drp.util.Constants;
import com.snail.drp.util.PageModel;
import com.snail.drp.util.servlet.BaseServlet;/*** 流向单维护Servlet* @author yuanfubiao**/
public class FlowCardServlet extends BaseServlet {private FlowCardManager flowCardManager;@Overridepublic void init() throws ServletException {flowCardManager = (FlowCardManager)getBeanFactory().getServiceObject(FlowCardManager.class);}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request,response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {if(Constants.SHOW_ADD.equals(getCommand())){showAdd(request,response);}else if(Constants.ADD.equals(getCommand())){add(request,response);}else{//分页查询search(request,response);}}/*** 显示添加页面* @param request* @param response* @throws ServletException* @throws IOException*/private void showAdd(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{request.getRequestDispatcher("/flowcard/flow_card_add.jsp").forward(request, response);}/*** 添加* @param request* @param response* @throws ServletException* @throws IOException*/private void add(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{//供方分销商代码String clientId = request.getParameter("clientInnerId");//需方客户代码String[] aimIds = request.getParameterValues("aimInnerId");//物料代码String[] itemNos = request.getParameterValues("itemNo");//操作数量String[] qty = request.getParameterValues("qty");FlowCard flowCard = new FlowCard();//操作类型flowCard.setOptType("A");//取得会计核算期,正常情况下应该从session中取得FiscalYearPeriod fiscalYearPeriod = new FiscalYearPeriod();fiscalYearPeriod.setId(1);flowCard.setFiscalYearPeriod(fiscalYearPeriod);//分销商Client client = new Client();client.setId(Integer.parseInt(clientId));flowCard.setClient(client);//取得录入人flowCard.setRecorder(getCurrentUser());//操作日期flowCard.setOptDate(new Date());//单据状态flowCard.setVouSts("N");List<FlowCardDetail> flowCardDetailList = new ArrayList();for(int i=0;i<aimIds.length;i++){FlowCardDetail flowCardDetail = new FlowCardDetail();//需方客户AimClient aimClient = new AimClient();aimClient.setId(Integer.parseInt(aimIds[i]));flowCardDetail.setAimClient(aimClient);//物料Item item = new Item();item.setItemNo(itemNos[i]);flowCardDetail.setItem(item);//操作数量flowCardDetail.setOptQty(new BigDecimal(qty[i]));//调整标记flowCardDetail.setAdjustFlag("N");flowCardDetailList.add(flowCardDetail);}flowCard.setFlowCardDetailList(flowCardDetailList);//通过工厂取得业务逻辑对象FlowCardManager flowCardManager = (FlowCardManager)getBeanFactory().getServiceObject(FlowCardManager.class);try{flowCardManager.addFlowCard(flowCard);}catch(Exception e){throw new ApplicationException("登录超时,请重新登录!");}response.sendRedirect(request.getContextPath() + "/servlet/flowcard/FlowCardServlet");}
}

MVC是当下较流行的开发架构模式,Struts就是基于MVC进一步封装而成,因此吃透MVC是非常有助于后面框架学习的。

透过DRP进一步认识MVC架构(二)相关推荐

  1. MVC架构和SSM框架的个人理解

    MVC架构和SSM框架的个人理解 前言 一.原生JavaWeb对应MVC架构 二.SSM框架对应MVC架构 第一块内容(MyBatis): 第二块内容(Spring): 第三块内容(SpringMVC ...

  2. iris-v12 框架搭建二 mvc架构

    iris-v12 框架搭建二 mvc架构 在这里我就默认你已经会了搭建非mvc架构的方法(不懂得看iris-v12 框架搭建一 快速启动). 想要搭建mvc的架构非常简单,只要使用iris的mvc包就 ...

  3. 十位数据库专家:如何透过性能优化看系统架构的合理性

    十位数据库专家:如何透过性能优化看系统架构的合理性 本文首发于一年多以前,由当时十位民生银行的数据库专家合著,系统地从架构的角度对数据库性能问题进行分析解读b,是多年项目开发和运维工作的经验总结.文章 ...

  4. ASP .NET MVC 架构

    ASP.NET MVC 架构 我在写上位软件的时候基本不用MVC架构,MVC架构的分层思想是值得借鉴的.一般我采用如下架构: 1 UI 表示层,处理与用户的交互,获取显示用户数据. 2 BLL 业务逻 ...

  5. Spring 源码分析(四) ——MVC(二)概述

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...

  6. 基于REST的MVC架构设计与实现

    在上一篇随笔已经讲述了REST的WEB serivce架构的相关知识,并且搭建了一个非常简单的实例,在另一篇随笔中也写了ajax用JSON序列化数据的传输,在这篇文章将结合前两篇随笔所讲的知识做一个稍 ...

  7. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  8. spring mvc返回页面显示空白_Spring 框架基础(06):Mvc架构模式简介,执行流程详解...

    一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不 ...

  9. MVC架构在Asp.net中的应用和实现

    MVC架构在Asp.net中的应用和实现 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能为Web应用带来的好处.并以"成都市信息化资产管理系统"框架设计为例,详细介绍其 ...

最新文章

  1. 计算机视觉多目标检测整合算法
  2. java源码-AQS机制
  3. case 日期when 范围_多个日期段如何分组 case when convert等用法
  4. java.util.concurrent.Future基础
  5. 生成六位验证码python代码
  6. autojs刷网课之三、知到互动分篇
  7. 原生js追加html代码,原生js动态添加元素
  8. [AI教程]最全人工智能图谱解析和视频下载
  9. Excel——从文本中提取数字
  10. 短代码的java小游戏_java编写的简单移动方块小游戏代码
  11. 图文并茂!推荐算法架构——粗排
  12. ddpush php,GitHub - brok1n/ddpushWebManager: DDPUSH 的web管理解决方案
  13. Java 工具类 - 银行卡校验 BankCardUtil
  14. 安卓课程设计之记账本_课程设计:基于安卓的记账本.pdf
  15. 【T+】非主管操作员查询科目余额表提示 权限配置异常,没有[AccountDTO]数据权限
  16. 阿里百秀首页案例(Bootstrap框架)
  17. 苏州C/C++方向的公司汇总
  18. python离线文字转语音_python文字转语音
  19. JBPM具体应用之decision节点的使用
  20. 《小程序》微信小程序绑定系统账号并授权登录之微信端

热门文章

  1. 去掉Input文本框的边框
  2. go-pitaya学习笔记(4)-clusterdemo分析
  3. 使screen支持滚动
  4. 【数字IC验证快速入门】40、UVM项目实践之APB_SPI(8)计分板(Scoreboard)和覆盖率(Coverage)
  5. python调用系统命令的6种方法
  6. 智能手环产品分析(资料来源网上,自己总结)
  7. 【20180807模拟测试】T2 box
  8. sel system event log 情况分析
  9. 五子棋游戏代码html,HTML5网页版黑白子五子棋游戏代码
  10. Java太内卷了_程序员内卷已成常态?java开发该何去何从