分层构建项目

分层构建WEB项目

如何分层

···sequence

Created with Raphaël 2.1.0 WEB客户端 WEB客户端 Servlet Servlet 业务逻辑 业务逻辑 持久化逻辑 持久化逻辑 JSP JSP 客户端 客户端 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, "当");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值