分層構建WEB項目
如何分層
···sequence
每一層只依賴於下一層,不能跨層依賴
每層作用
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, "當");
}
}