透过DRP进一步认识MVC架构(二)
业务逻辑层依赖持久化逻辑层,为了将这种依赖关系进一步弱化,采用了抽象工厂+反射的模式,把关于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架构(二)相关推荐
- MVC架构和SSM框架的个人理解
MVC架构和SSM框架的个人理解 前言 一.原生JavaWeb对应MVC架构 二.SSM框架对应MVC架构 第一块内容(MyBatis): 第二块内容(Spring): 第三块内容(SpringMVC ...
- iris-v12 框架搭建二 mvc架构
iris-v12 框架搭建二 mvc架构 在这里我就默认你已经会了搭建非mvc架构的方法(不懂得看iris-v12 框架搭建一 快速启动). 想要搭建mvc的架构非常简单,只要使用iris的mvc包就 ...
- 十位数据库专家:如何透过性能优化看系统架构的合理性
十位数据库专家:如何透过性能优化看系统架构的合理性 本文首发于一年多以前,由当时十位民生银行的数据库专家合著,系统地从架构的角度对数据库性能问题进行分析解读b,是多年项目开发和运维工作的经验总结.文章 ...
- ASP .NET MVC 架构
ASP.NET MVC 架构 我在写上位软件的时候基本不用MVC架构,MVC架构的分层思想是值得借鉴的.一般我采用如下架构: 1 UI 表示层,处理与用户的交互,获取显示用户数据. 2 BLL 业务逻 ...
- Spring 源码分析(四) ——MVC(二)概述
随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) from:Spring 源码分析(四) --MVC(二)概述 - 水门-kay的个人页面 - OSCHINA ...
- 基于REST的MVC架构设计与实现
在上一篇随笔已经讲述了REST的WEB serivce架构的相关知识,并且搭建了一个非常简单的实例,在另一篇随笔中也写了ajax用JSON序列化数据的传输,在这篇文章将结合前两篇随笔所讲的知识做一个稍 ...
- data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解
本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...
- spring mvc返回页面显示空白_Spring 框架基础(06):Mvc架构模式简介,执行流程详解...
一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不 ...
- MVC架构在Asp.net中的应用和实现
MVC架构在Asp.net中的应用和实现 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能为Web应用带来的好处.并以"成都市信息化资产管理系统"框架设计为例,详细介绍其 ...
最新文章
- 计算机视觉多目标检测整合算法
- java源码-AQS机制
- case 日期when 范围_多个日期段如何分组 case when convert等用法
- java.util.concurrent.Future基础
- 生成六位验证码python代码
- autojs刷网课之三、知到互动分篇
- 原生js追加html代码,原生js动态添加元素
- [AI教程]最全人工智能图谱解析和视频下载
- Excel——从文本中提取数字
- 短代码的java小游戏_java编写的简单移动方块小游戏代码
- 图文并茂!推荐算法架构——粗排
- ddpush php,GitHub - brok1n/ddpushWebManager: DDPUSH 的web管理解决方案
- Java 工具类 - 银行卡校验 BankCardUtil
- 安卓课程设计之记账本_课程设计:基于安卓的记账本.pdf
- 【T+】非主管操作员查询科目余额表提示 权限配置异常,没有[AccountDTO]数据权限
- 阿里百秀首页案例(Bootstrap框架)
- 苏州C/C++方向的公司汇总
- python离线文字转语音_python文字转语音
- JBPM具体应用之decision节点的使用
- 《小程序》微信小程序绑定系统账号并授权登录之微信端