分层构建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, "当");
}
}