分層構建項目

分層構建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, "當");
    }

}
發佈了35 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章