分层构建项目

原创 2015年11月18日 23:46:24

分层构建WEB项目

如何分层

···sequence

Created with Raphaël 2.1.0WEB客户端WEB客户端ServletServlet业务逻辑业务逻辑持久化逻辑持久化逻辑JSPJSP客户端客户端request取得页面数据调用业务逻辑方法调用持久化逻辑方法返回返回渲染页面输出页面

每一层只依赖于下一层,不能跨层依赖

每层作用

  • WEB客户端

    该层只负责提交表单到后台的Servlet,通过request取得数据等,打印输出到表格显示

  • Servlet层
    关键的一层,接收到表单数据,调用业务逻辑,处理业务。
    相同的servlet可以先抽象出来一个 抽象类 继承使用,比如对于物料的 增,删,改,查 ,都需要使用业务逻辑 Manager 类,可以 在 init()时即取得该 类的对象,其他类直接继承
    即该层可以需要创建业务逻辑层对象

抽象类

package com.houlu.drp.basedata.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

import com.houlu.drp.basedata.dao.ItemDao;
import com.houlu.drp.basedata.manager.ItemManager;
import com.houlu.drp.basedata.manager.ItemManagerImpl;
import com.houlu.drp.util.BeanFactory;


/**
 * 物料servlet抽象
 * @author Administrator
 *
 */
public abstract class AbstractItemServlet extends HttpServlet {

    protected ItemManager itemManager;

    public AbstractItemServlet(){

        System.out.println("AbstractItemServlet-----------Construct");
    }

    @Override
    public void init() throws ServletException{

    //  itemManager = (ItemManager)BeanFactory.getInstance().getServiveObject("itemManager");

        BeanFactory beanFactory = (BeanFactory)this.getServletContext().getAttribute("beanFactory");
        itemManager = (ItemManager)beanFactory.getServiveObject(ItemManager.class);
    }
}

继承类

package com.houlu.drp.basedata.web;

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.houlu.drp.basedata.domain.Item;
import com.houlu.drp.basedata.manager.ItemManager;
import com.houlu.drp.basedata.manager.ItemManagerImpl;
import com.houlu.drp.datadict.domain.ItemCategory;
import com.houlu.drp.datadict.domain.ItemUnit;

public class AddItemServlet extends AbstractItemServlet {

    private ItemManager itemManager;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //取得表单数据
        String itemNo = request.getParameter("itemNo");
        String itemName = request.getParameter("itemName");
        String spec = request.getParameter("spec");
        String pattern = request.getParameter("pattern");
        String category = request.getParameter("category");
        String unit = request.getParameter("unit");

        //构造item对象
        Item item = new Item();
        item.setItemNo(itemNo);
        item.setItemName(itemName);
        item.setSpec(spec);
        item.setPattern(pattern);


        //构造物料类别
        ItemCategory itemCategory = new ItemCategory();
        itemCategory.setId(category);
        item.setItemCategory(itemCategory);

        //构造物料单位
        ItemUnit itemUnit = new ItemUnit();
        itemUnit.setId(unit);
        item.setItemUnit(itemUnit);

    //  itemManager = new ItemManagerImpl();

        try {
            itemManager.addItem(item);
        } catch (Exception e) {
            request.setAttribute("add_message", "添加物料失败,失败代码 ["+itemNo+"]");
        }
        //重定向
        //response.sendRedirect(requset.getContextPath()+"/basedata/item_maint.jsp");
        request.setAttribute("add_message", "添加成功");
        //转发
        request.getRequestDispatcher("/basedata/item_maint.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}
  • 业务逻辑
    该层只与业务逻辑打交道,该层创建DAO层的connection
    业务逻辑层创建固定接口,然后不同类实现。

业务逻辑接口

package com.houlu.drp.basedata.manager;

import java.sql.Connection;

import com.houlu.drp.basedata.domain.Item;
import com.houlu.drp.util.PageModel;

/**
 * 物料业务逻辑层接口
 * @author Administrator
 *
 */
public interface ItemManager {

    /**
     * 添加物料
     * @param conn
     * @param item
     */
    public void addItem(Item item);

    /**
     * 根据物料代码集合删除
     * @param conn
     * @param itemNos
     */
    public void delItem(String[] itemNos);

    /**
     * 修改物料
     * @param conn
     * @param item
     */
    public void modifyItem(Item item);

    /**
     * 根据物料代码查询
     * @param conn
     * @param itemNo
     * @return
     */
    public Item findItemById(String itemNo);

    /**
     * 根据条件分页查询
     * @param pageNo
     * @param pageSize
     * @param condation
     * @return
     */
    public PageModel findItemList(int pageNo, int pageSize, String condation);
}

实现类

package com.houlu.drp.basedata.manager;

import java.sql.Connection;

import com.houlu.drp.basedata.dao.ItemDao;
import com.houlu.drp.basedata.dao.ItemDaoFactory;
import com.houlu.drp.basedata.dao.ItemDaoFactory4SqlServer;
import com.houlu.drp.basedata.domain.Item;
import com.houlu.drp.util.ApplicationException;
import com.houlu.drp.util.BeanFactory;
import com.houlu.drp.util.DbUtil;
import com.houlu.drp.util.PageModel;
import com.houlu.drp.util.XmlConfigReader;

/**
 * 物料管理接口实现
 * @author Administrator
 *
 */
public class ItemManagerImpl implements ItemManager {

    private ItemDao itemDao = null;

    public ItemManagerImpl(){
        //System.out.println("new------------------------ItemManagerImplClass");
        itemDao = (ItemDao)BeanFactory.getInstance().getDaoObject(ItemDao.class);
    }

    public void addItem(Item item) {
        Connection conn = null;

        try {
            conn = DbUtil.getConnection();
                if(itemDao.findItemById(conn, item.getItemNo())!=null){
                    throw new ApplicationException("该代码物料已经存在");
                }
            itemDao.addItem(conn, item);
        } finally{
            DbUtil.close(conn);
        }

    }

    @Override
    public void delItem(String[] itemNos) {
        // TODO Auto-generated method stub

    }

    @Override
    public void modifyItem(Item item) {
        // TODO Auto-generated method stub

    }

    @Override
    public Item findItemById(String itemNo) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public PageModel findItemList(int pageNo, int pageSize, String condation) {
        Connection conn = null;
        PageModel pageModel = null;
        try {
            conn = DbUtil.getConnection();
            pageModel = itemDao.findItemList(conn, pageNo, pageSize, condation);
        } finally{
            DbUtil.close(conn);
        }

        return pageModel;
    }


}
  • 持久化层
    该层与数据库打交道,取得业务逻辑层的connection进行sql操作

上层接口

package com.houlu.drp.basedata.dao;

import java.sql.Connection;

import com.houlu.drp.basedata.domain.Item;
import com.houlu.drp.util.PageModel;

/**
 * 物料数据访问接口
 * @author Administrator
 *
 */
public interface ItemDao {

    /**
     * 添加物料
     * @param conn
     * @param item
     */
    public void addItem(Connection conn,Item item);

    /**
     * 根据物料代码集合删除
     * @param conn
     * @param itemNos
     */
    public void delItem(Connection conn,String[] itemNos);

    /**
     * 修改物料
     * @param conn
     * @param item
     */
    public void modifyItem(Connection conn,Item item);

    /**
     * 根据物料代码查询
     * @param conn
     * @param itemNo
     * @return
     */
    public Item findItemById(Connection conn,String itemNo);

    /**
     * 根据条件分页查询
     * @param pageNo
     * @param pageSize
     * @param condation
     * @return
     */
    public PageModel findItemList(Connection conn,int pageNo, int pageSize, String condation);

}

具体实现

package com.houlu.drp.basedata.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.houlu.drp.basedata.domain.Item;
import com.houlu.drp.datadict.domain.ItemCategory;
import com.houlu.drp.datadict.domain.ItemUnit;
import com.houlu.drp.util.ApplicationException;
import com.houlu.drp.util.DbUtil;
import com.houlu.drp.util.PageModel;

public class ItemDao4SqlServerImpl implements ItemDao {

    @Override
    public void addItem(Connection conn, Item item) {
        StringBuffer sb = new StringBuffer();
        sb.append("INSERT INTO T_ITEMS ");
        sb.append("(ITEM_NO, ITEM_CATEGORY_ID, ITEM_UNIT_ID, ITEM_NAME, SPEC, PATTERN) ");
        sb.append("VALUES (?,?,?,?,?,?)");
        String sql = sb.toString();

        PreparedStatement pstmt = null;
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, item.getItemNo());
            pstmt.setString(2, item.getItemCategory().getId());
            pstmt.setString(3, item.getItemUnit().getId());
            pstmt.setString(4, item.getItemName());
            pstmt.setString(5, item.getSpec());
            pstmt.setString(6, item.getPattern());
            pstmt.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
            throw new ApplicationException("添加物料失败");
        } finally{
            DbUtil.close(pstmt);
        }

    }

    @Override
    public void delItem(Connection conn, String[] itemNos) {
        // TODO Auto-generated method stub

    }

    @Override
    public void modifyItem(Connection conn, Item item) {
        // TODO Auto-generated method stub

    }

    @Override
    public Item findItemById(Connection conn, String itemNo) {
        StringBuffer sb = new StringBuffer();
        sb.append("select i.ITEM_NO,i.ITEM_NAME,I.SPEC,I.PATTERN,i.ITEM_CATEGORY_ID as category_id, d1.NAME as category_name,i.ITEM_UNIT_ID as unit_id, d2.NAME as unit_name ");
        sb.append("from T_ITEMS i,T_DATA_DIC d1, T_DATA_DIC d2 ");
        sb.append("where i.ITEM_CATEGORY_ID = d1.ID and i.ITEM_UNIT_ID = d2.ID and i.ITEM_NO = ?");
        String sql = sb.toString();

        PreparedStatement pstmt = null;
        ResultSet rs = null;
        Item item = null;
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, itemNo);
            rs = pstmt.executeQuery();
            if(rs.next()){
                item = new Item();
                item.setItemNo(rs.getString("item_no"));
                item.setItemName(rs.getString("item_name"));
                item.setSpec(rs.getString("spec"));
                item.setPattern(rs.getString("pattern"));

                //构造ItemCategory
                ItemCategory ic = new ItemCategory();
                ic.setId(rs.getString("category_id"));
                ic.setName(rs.getString("category_name"));
                item.setItemCategory(ic);

                //构造ItemUnit
                ItemUnit iu = new ItemUnit();
                iu.setId(rs.getString("unit_id"));
                iu.setName(rs.getString("unit_name"));
                item.setItemUnit(iu);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new ApplicationException("根据物料代码查询出错");
        }finally{
            DbUtil.close(rs);
            DbUtil.close(pstmt);
        }

        return item;
    }

    @Override
    public PageModel findItemList(Connection conn,int pageNo, int pageSize, String condation) {
        StringBuffer sb = new StringBuffer();
        sb.append("select * from( ");
        sb.append("select ROW_NUMBER() over(order by i.ITEM_NO) as r2,* from( ");
        sb.append("select ");
        sb.append("ROW_NUMBER() over(order by a.ITEM_NO) as r1,a.ITEM_NO,a.item_name,a.SPEC,a.PATTERN,a.ITEM_CATEGORY_ID,b.NAME as item_category_name,a.ITEM_UNIT_ID,c.NAME as item_unit_name ");
        sb.append("from T_ITEMS a,T_DATA_DIC b,T_DATA_DIC c where a.ITEM_CATEGORY_ID=b.ID and a.ITEM_UNIT_ID = c.ID ");
        if(condation!=null&&!"".equals(condation)){
            sb.append("and a.ITEM_NAME like '"+ condation +"%' ");
        }
        sb.append(") i where i.r1<= ? ");
        sb.append(")o where o.r2 > ? ");

        String sql = sb.toString();

    //  System.out.println(sql);
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        PageModel pageModel = null;
        try {
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, pageNo*pageSize);
            pstmt.setInt(2, (pageNo-1)*pageSize);
            rs = pstmt.executeQuery();
            List<Item> itemList = new ArrayList<Item>();
            while(rs.next()){
                Item item = new Item();
                item = new Item();
                item.setItemNo(rs.getString("item_no"));
                item.setItemName(rs.getString("item_name"));
                item.setSpec(rs.getString("spec"));
                item.setPattern(rs.getString("pattern"));

                //构造ItemCategory
                ItemCategory ic = new ItemCategory();
                ic.setId(rs.getString("item_category_id"));
                ic.setName(rs.getString("item_category_name"));
                item.setItemCategory(ic);

                //构造ItemUnit
                ItemUnit iu = new ItemUnit();
                iu.setId(rs.getString("item_unit_id"));
                iu.setName(rs.getString("item_unit_name"));
                item.setItemUnit(iu);

                itemList.add(item);
            }
            pageModel = new PageModel();
            pageModel.setPageNo(pageNo);
            pageModel.setPageSize(pageSize);
            pageModel.setList(itemList);

            //根据条件取得记录数
            int totalRecorders = getTotalRecords(conn, condation);
            pageModel.setTotalRecords(totalRecorders);

        } catch (Exception e) {
            e.printStackTrace();
            throw new ApplicationException("分页查询失败");
        }finally{
            DbUtil.close(rs);
            DbUtil.close(pstmt);
        }

        return pageModel;
    }

    /**
     * 根据条件取得记录数
     * @param conn
     * @param condation
     * @return
     * @throws SQLException
     */
    private int getTotalRecords(Connection conn,String condation)throws SQLException{
        String sql = "select count(*) from t_items ";
            if(condation!=null&&!"".equals(condation)){
                sql += "where ITEM_NAME like '"+ condation +"%' ";      
            }
        //System.out.println(sql);
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        int temp=0;
        try {
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            rs.next();
            temp = rs.getInt(1);
        }finally{
            DbUtil.close(rs);
            DbUtil.close(pstmt);
        }
        return temp;
    }


    public static void main(String[] args){
        Connection conn = DbUtil.getConnection();
        ItemDao itemDao = new ItemDao4SqlServerImpl();
        itemDao.findItemList(conn, 1, 5, "当");
    }

}

maven分层项目

上一篇记录了maven项目的创建,由于现在项目都是分层搭建,这次记录一篇maven分层项目的创建。参考的http://www.cnblogs.com/xdp-gacl/p/4242221.html。感...
  • cg3410
  • cg3410
  • 2016年06月06日 10:06
  • 901

使用Maven构建多模块项目

在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分层开发,最常见的就是分为domain(域模型层)、dao(数据库访问层)、service(业务逻辑层)、web(表现层),这样分层之...
  • gebitan505
  • gebitan505
  • 2015年06月29日 14:22
  • 2473

JavaWeb项目的大概分层

1.web层。 web层可以使用经典的MVC设计模式,又可以分为三个部分: M-Model,模型,一般表现为提交的表单内容,请求参数等,是服务器与客户端交流的数据载体。 V-View,表现层,用来展示...
  • zhuyunhe
  • zhuyunhe
  • 2015年04月15日 15:13
  • 4464

Java Web项目包分层

1、打开Eclipse,单击“Window-》Show View-》Others” 2、在输入框输入“Package Explorer” 3、点击“OK”,出现如下图 4、新建“...
  • you23hai45
  • you23hai45
  • 2013年11月20日 22:59
  • 3201

手把手创建自定义的分层的maven-archetype

从网络找了很多自定义archetype的文章,都不是自己想要的,因为想创立一个分层的archetype,于是通过分析以及得到的零散的知识,终于完成了,下面每个步骤都会呈现出来。 1、首先创建好一个现...
  • cr266
  • cr266
  • 2015年07月31日 11:26
  • 1018

android项目分层解析

整体分层结构整体分为app和base两个层,app层作为项目的业务层,里面所有的分包都和当前业务相关。base层作为项目的框架层。业务与框架层级分离的好处: 可以让我们更专注于业务的开发 可以快速集成...
  • anthony_3
  • anthony_3
  • 2017年09月13日 18:22
  • 144

使用Maven构建多模块层级项目

原文地址:http://www.cnblogs.com/h--d/p/6001366.html Maven多模块项目   Maven多模块项目,适用于一些比较大的项目,通过合理的模...
  • luoxiang183
  • luoxiang183
  • 2017年07月27日 18:14
  • 852

浅谈JaveWeb项目分层设计

在搭建JaveWeb项目架构中,我们一般会分层设计,便于后期的维护,开发人员可以分模块去开发,提高整体团队的开发效率。层次按职责分一般分四层:表现层(SpringMVC)、持久层(mybatis)、业...
  • andyliulin
  • andyliulin
  • 2016年11月01日 18:54
  • 498

学习笔记-轻量级Java EE:Java EE应用的分层模型

摘抄 李刚 > 经典的javaee架构大致分为如下几层: 1.Domain Object(领域对象)层: 由系列的POJO(Plan Old Java Object,普通的、传统的java对象)组成...
  • freeliving
  • freeliving
  • 2013年12月20日 11:13
  • 2111

浅谈项目系统架构分层

本文粗浅的讨论下关于项目系统架构的拆分模型,阐述每个层次(layer)的作用,以及面向SOA编程提供服务的方式。 服务端架构解决之道 大家看到这张图,用了一个形象的比喻来体现传统的服务端软...
  • u012662731
  • u012662731
  • 2016年12月15日 09:58
  • 1242
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分层构建项目
举报原因:
原因补充:

(最多只允许输入30个字)