设计模式一点思索
2008-04-20 21:32
344 查看
近段要实现一个上传excel文件到服务器,并把excel文件的数据导入到数据库表中的功能。
excel文件有两种格式,对应数据库两张表。我先实现了其中一种excel格式式的上传和导入数据。
上传的功能是一样的,没什么好说的。不同的是两种excel文件格式不一样,对应的数据库表的字段也不一样。
怎么办呢?
开始的时候,我先做了一个excel文件的功能。做另一个很相似了,运用c/p大法就搞定了:)。
代码是这样的.
action中:
CityDayService cds = new CityDayServiceImpl();
ImpExcelData impExcelData = new ImpExcelData(filePath, 0); //这里从excel文件中取出数据
try ...{
List list = impExcelData.getData(); //放进list中.用的是jxl
List<CityDay> sameList = cds.sameList(list);//这里有不同
//boolean isOk = cds.checkExcel(list);
if (sameList.size()>0) ...{
request.setAttribute("sameList", sameList);
request
.setAttribute("echo",
"以下数据有重复,是否覆盖");
return mapping.findForward("upload");
} else ...{
cds.add(list);//这里有不同
}
System.out.print("");
} catch (Exception e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
另一种格式的excel文件对应的action是这样的.
/* 导入表 */
ZhbTCityDayForecastService cds = new ZhbTCityDayForecastServiceImpl();/**//////////////////
ImpExcelData impExcelData = new ImpExcelData(filePath, 0);
try ...{
List list = impExcelData.getData();
List<ZhbTCityDayForecast> sameList = cds.sameList(list);/**/////////////////////
if (sameList.size()>0) ...{
request.setAttribute("sameList", sameList);
request
.setAttribute("echo",
"数据有重复,是否覆盖");
return mapping.findForward("upload");
} else ...{
cds.add(list);/**////////////////////////////////
}
System.out.print("");
} catch (Exception e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
业务层
public interface CityDayService...{
public List findByCityAndDate(String city,Date date);
public void deleteSame(List excelDataList);
public void add(List excelDatalist);
public List sameList(List excelDatalist);
}
和
public interface ZhbTCityDayForecastService...{
public List findByCityAndDate(String city,Date date);
public void deleteSame(List excelDataList);
public void add(List excelDatalist);
public List sameList(List excelDatalist);
}
业务层实现类
public class CityDayServiceImpl implements CityDayService ...{
public List findByCityAndDate(String city, Date date) ...{
CityDayDAO cdd = new CityDayDAOImpl();
return cdd.findByCityAndDate(city, date);
}
public void add(List excelDatalist) ...{
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
List<CityDay> newList = new ArrayList();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String strDate = map.get(1) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
CityDayDAO cdd = new CityDayDAOImpl();
CityDay cd = new CityDay();
cd.setDate(date);
cd.setCity(map.get(2) + "");
cd.setPollutionIndeces(new Integer(map.get(3)+""));
cd.setMainPollutant(map.get(4).toString());
cd.setGrade(map.get(5).toString());
cd.setStatus(map.get(6).toString());
cdd.saveOrUpdate(cd);
} catch (ParseException e) ...{
tran.rollback();
e.printStackTrace();
}
}
tran.commit();
}
public void deleteSame(List excelDataList) ...{
CityDayDAO cdd = new CityDayDAOImpl();
boolean result = true;
List<CityDay> list = new ArrayList<CityDay>();
for (int i = 1; i < excelDataList.size(); i++) ...{
HashMap map = (HashMap) excelDataList.get(i);
String city = map.get(2) + "";
String strDate = map.get(1) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((CityDay)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=0;j<list.size();j++)...{
CityDay cd = (CityDay)list.get(j);
System.out.println("111要删除的数据有: " + "city:"+cd.getCity()+"date:" + cd.getDate());
}
cdd.delete(list);
}
public List<CityDay> sameList(List excelDatalist) ...{
CityDayDAO cdd = new CityDayDAOImpl();
boolean result = true;
List<CityDay> list = new ArrayList<CityDay>();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String city = map.get(2) + "";
String strDate = map.get(1) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((CityDay)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=0;j<list.size();j++)...{
CityDay cd = (CityDay)list.get(j);
System.out.println("111重复的数据有: " + "city:"+cd.getCity()+"date:" + cd.getDate());
}
return list;
}
}
和
public class ZhbTCityDayForecastServiceImpl implements ZhbTCityDayForecastService ...{
public List findByCityAndDate(String city, Date date) ...{
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
return cdd.findByCityAndDate(city, date);
}
public void add(List excelDatalist) ...{
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
List<CityDay> newList = new ArrayList();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String strDate = map.get(2)+"-"+map.get(3)+"-"+map.get(4) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
ZhbTCityDayForecast cd = new ZhbTCityDayForecast();
cd.setCity(map.get(1) + "");
cd.setDate(date);
cd.setPollutionMin(new Integer(map.get(5)+""));
cd.setPollutionMax(new Integer(map.get(6)+""));
cd.setMainPollutant(map.get(7)+"");
cd.setGrade(map.get(8).toString());
cd.setStatus(map.get(9).toString());
cdd.saveOrUpdate(cd);
} catch (ParseException e) ...{
tran.rollback();
e.printStackTrace();
}
}
tran.commit();
}
public void deleteSame(List excelDataList) ...{
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
boolean result = true;
List<ZhbTCityDayForecast> list = new ArrayList<ZhbTCityDayForecast>();
for (int i = 1; i < excelDataList.size(); i++) ...{
HashMap map = (HashMap) excelDataList.get(i);
String city = map.get(1) + "";
String strDate = map.get(2)+"-"+map.get(3)+"-"+map.get(4) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List<ZhbTCityDayForecast> onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((ZhbTCityDayForecast)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
cdd.delete(list);
}
public List<ZhbTCityDayForecast> sameList(List excelDatalist) ...{
// TODO Auto-generated method stub
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
List<ZhbTCityDayForecast> list = new ArrayList<ZhbTCityDayForecast>();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String city = map.get(1) + "";
String strDate = map.get(2)+"-"+map.get(3)+"-"+map.get(4) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((ZhbTCityDayForecast)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
}
这样做完后,自己感觉很不满意.因为两个相似的功能,写了两遍代码:两个action,service,还有两个页面.很笨.
如果以后需求增加,再写其它的excel格式岂不是很惨.又要用cp大法了.初步的思路是只一个action和一个页面.
经过思索,发现,只有service层的
public void add(List excelDatalist);
public List sameList(List excelDatalist);
public void deleteSame(List excelDataList);
三个方法是不同的.
那么在action中可以根据参数生成不同的service,执行不同的service中的service方法.可以用工厂方法生产出不
同的service.
思路有了,开干.
首先把这三个方法提到一个接口里来.
public interface CommonUploadService ...{
public void add(List excelDatalist);
public List sameList(List excelDatalist);
public void deleteSame(List excelDataList);
}
原为的service就变成这样
实现类不用变.
工厂方法
public class UploadServiceFactory ...{
private static CommonUploadService cus;
private static final String cityDayService = "com.xxx.datacenter.upload.service.CityDayServiceImpl";
private static final String foreCastService = "com.xxx.datacenter.upload.forecast.service.CityDayServiceImpl";
private UploadServiceFactory() ...{
}
public static CommonUploadService getInstance(String type) ...{
try ...{
if ("daily".equals(type)) ...{
Class cls = Class.forName(cityDayService);
cus = (CommonUploadService) cls.newInstance();
}
if ("forecast".equals(type)) ...{
Class cls = Class.forName(foreCastService);
cus = (CommonUploadService) cls.newInstance();
}
} catch (Exception e) ...{
e.printStackTrace();
}
return cus;
}
}
改造后的action
/**//* 导入表 */
// CityDayService cds = new CityDayServiceImpl();//这里有不同 可以用工厂方法,根据参数type不同构造出
String type = request.getParameter("type");
CommonUploadService cds = UploadServiceFactory.getInstance(type);
ImpExcelData impExcelData = new ImpExcelData(filePath, 0);
try ...{
List list = impExcelData.getData();
List<CityDay> sameList = cds.sameList(list);//这里有不同
//boolean isOk = cds.checkExcel(list);
if (sameList.size()>0) ...{
request.setAttribute("sameList", sameList);
request
.setAttribute("echo",
"以下数据有重复,是否覆盖");
return mapping.findForward("upload");
} else ...{
cds.add(list);//这里有不同
}
System.out.print("");
} catch (Exception e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
这样一个action就可以搞定了.
如果以为要增加新格式的excel文件,只实现CommonUploadService方法,改造一下工厂类就ok了.
总结:
以后遇到功能类似的需求,可以把接口相同,但实现不同的方法提到共的提口来.然后用工厂方法生成不同的实例.
运用面向对象的多态的性能.就可以简化开发.
设计模式关暂在于实践.光看书本是不行的.有什么不对的地方,请多多指点.
excel文件有两种格式,对应数据库两张表。我先实现了其中一种excel格式式的上传和导入数据。
上传的功能是一样的,没什么好说的。不同的是两种excel文件格式不一样,对应的数据库表的字段也不一样。
怎么办呢?
开始的时候,我先做了一个excel文件的功能。做另一个很相似了,运用c/p大法就搞定了:)。
代码是这样的.
action中:
CityDayService cds = new CityDayServiceImpl();
ImpExcelData impExcelData = new ImpExcelData(filePath, 0); //这里从excel文件中取出数据
try ...{
List list = impExcelData.getData(); //放进list中.用的是jxl
List<CityDay> sameList = cds.sameList(list);//这里有不同
//boolean isOk = cds.checkExcel(list);
if (sameList.size()>0) ...{
request.setAttribute("sameList", sameList);
request
.setAttribute("echo",
"以下数据有重复,是否覆盖");
return mapping.findForward("upload");
} else ...{
cds.add(list);//这里有不同
}
System.out.print("");
} catch (Exception e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
另一种格式的excel文件对应的action是这样的.
/* 导入表 */
ZhbTCityDayForecastService cds = new ZhbTCityDayForecastServiceImpl();/**//////////////////
ImpExcelData impExcelData = new ImpExcelData(filePath, 0);
try ...{
List list = impExcelData.getData();
List<ZhbTCityDayForecast> sameList = cds.sameList(list);/**/////////////////////
if (sameList.size()>0) ...{
request.setAttribute("sameList", sameList);
request
.setAttribute("echo",
"数据有重复,是否覆盖");
return mapping.findForward("upload");
} else ...{
cds.add(list);/**////////////////////////////////
}
System.out.print("");
} catch (Exception e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
业务层
public interface CityDayService...{
public List findByCityAndDate(String city,Date date);
public void deleteSame(List excelDataList);
public void add(List excelDatalist);
public List sameList(List excelDatalist);
}
和
public interface ZhbTCityDayForecastService...{
public List findByCityAndDate(String city,Date date);
public void deleteSame(List excelDataList);
public void add(List excelDatalist);
public List sameList(List excelDatalist);
}
业务层实现类
public class CityDayServiceImpl implements CityDayService ...{
public List findByCityAndDate(String city, Date date) ...{
CityDayDAO cdd = new CityDayDAOImpl();
return cdd.findByCityAndDate(city, date);
}
public void add(List excelDatalist) ...{
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
List<CityDay> newList = new ArrayList();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String strDate = map.get(1) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
CityDayDAO cdd = new CityDayDAOImpl();
CityDay cd = new CityDay();
cd.setDate(date);
cd.setCity(map.get(2) + "");
cd.setPollutionIndeces(new Integer(map.get(3)+""));
cd.setMainPollutant(map.get(4).toString());
cd.setGrade(map.get(5).toString());
cd.setStatus(map.get(6).toString());
cdd.saveOrUpdate(cd);
} catch (ParseException e) ...{
tran.rollback();
e.printStackTrace();
}
}
tran.commit();
}
public void deleteSame(List excelDataList) ...{
CityDayDAO cdd = new CityDayDAOImpl();
boolean result = true;
List<CityDay> list = new ArrayList<CityDay>();
for (int i = 1; i < excelDataList.size(); i++) ...{
HashMap map = (HashMap) excelDataList.get(i);
String city = map.get(2) + "";
String strDate = map.get(1) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((CityDay)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=0;j<list.size();j++)...{
CityDay cd = (CityDay)list.get(j);
System.out.println("111要删除的数据有: " + "city:"+cd.getCity()+"date:" + cd.getDate());
}
cdd.delete(list);
}
public List<CityDay> sameList(List excelDatalist) ...{
CityDayDAO cdd = new CityDayDAOImpl();
boolean result = true;
List<CityDay> list = new ArrayList<CityDay>();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String city = map.get(2) + "";
String strDate = map.get(1) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((CityDay)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=0;j<list.size();j++)...{
CityDay cd = (CityDay)list.get(j);
System.out.println("111重复的数据有: " + "city:"+cd.getCity()+"date:" + cd.getDate());
}
return list;
}
}
和
public class ZhbTCityDayForecastServiceImpl implements ZhbTCityDayForecastService ...{
public List findByCityAndDate(String city, Date date) ...{
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
return cdd.findByCityAndDate(city, date);
}
public void add(List excelDatalist) ...{
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
List<CityDay> newList = new ArrayList();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String strDate = map.get(2)+"-"+map.get(3)+"-"+map.get(4) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
ZhbTCityDayForecast cd = new ZhbTCityDayForecast();
cd.setCity(map.get(1) + "");
cd.setDate(date);
cd.setPollutionMin(new Integer(map.get(5)+""));
cd.setPollutionMax(new Integer(map.get(6)+""));
cd.setMainPollutant(map.get(7)+"");
cd.setGrade(map.get(8).toString());
cd.setStatus(map.get(9).toString());
cdd.saveOrUpdate(cd);
} catch (ParseException e) ...{
tran.rollback();
e.printStackTrace();
}
}
tran.commit();
}
public void deleteSame(List excelDataList) ...{
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
boolean result = true;
List<ZhbTCityDayForecast> list = new ArrayList<ZhbTCityDayForecast>();
for (int i = 1; i < excelDataList.size(); i++) ...{
HashMap map = (HashMap) excelDataList.get(i);
String city = map.get(1) + "";
String strDate = map.get(2)+"-"+map.get(3)+"-"+map.get(4) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List<ZhbTCityDayForecast> onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((ZhbTCityDayForecast)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
cdd.delete(list);
}
public List<ZhbTCityDayForecast> sameList(List excelDatalist) ...{
// TODO Auto-generated method stub
ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl();
List<ZhbTCityDayForecast> list = new ArrayList<ZhbTCityDayForecast>();
for (int i = 1; i < excelDatalist.size(); i++) ...{
HashMap map = (HashMap) excelDatalist.get(i);
String city = map.get(1) + "";
String strDate = map.get(2)+"-"+map.get(3)+"-"+map.get(4) + "";
Date date;
try ...{
date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
List onelist = cdd.findByCityAndDate(city, date);
for(int j=0;j<onelist.size();j++)...{
list.add((ZhbTCityDayForecast)onelist.get(j));
}
} catch (ParseException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
}
这样做完后,自己感觉很不满意.因为两个相似的功能,写了两遍代码:两个action,service,还有两个页面.很笨.
如果以后需求增加,再写其它的excel格式岂不是很惨.又要用cp大法了.初步的思路是只一个action和一个页面.
经过思索,发现,只有service层的
public void add(List excelDatalist);
public List sameList(List excelDatalist);
public void deleteSame(List excelDataList);
三个方法是不同的.
那么在action中可以根据参数生成不同的service,执行不同的service中的service方法.可以用工厂方法生产出不
同的service.
思路有了,开干.
首先把这三个方法提到一个接口里来.
public interface CommonUploadService ...{
public void add(List excelDatalist);
public List sameList(List excelDatalist);
public void deleteSame(List excelDataList);
}
原为的service就变成这样
实现类不用变.
工厂方法
public class UploadServiceFactory ...{
private static CommonUploadService cus;
private static final String cityDayService = "com.xxx.datacenter.upload.service.CityDayServiceImpl";
private static final String foreCastService = "com.xxx.datacenter.upload.forecast.service.CityDayServiceImpl";
private UploadServiceFactory() ...{
}
public static CommonUploadService getInstance(String type) ...{
try ...{
if ("daily".equals(type)) ...{
Class cls = Class.forName(cityDayService);
cus = (CommonUploadService) cls.newInstance();
}
if ("forecast".equals(type)) ...{
Class cls = Class.forName(foreCastService);
cus = (CommonUploadService) cls.newInstance();
}
} catch (Exception e) ...{
e.printStackTrace();
}
return cus;
}
}
改造后的action
/**//* 导入表 */
// CityDayService cds = new CityDayServiceImpl();//这里有不同 可以用工厂方法,根据参数type不同构造出
String type = request.getParameter("type");
CommonUploadService cds = UploadServiceFactory.getInstance(type);
ImpExcelData impExcelData = new ImpExcelData(filePath, 0);
try ...{
List list = impExcelData.getData();
List<CityDay> sameList = cds.sameList(list);//这里有不同
//boolean isOk = cds.checkExcel(list);
if (sameList.size()>0) ...{
request.setAttribute("sameList", sameList);
request
.setAttribute("echo",
"以下数据有重复,是否覆盖");
return mapping.findForward("upload");
} else ...{
cds.add(list);//这里有不同
}
System.out.print("");
} catch (Exception e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
这样一个action就可以搞定了.
如果以为要增加新格式的excel文件,只实现CommonUploadService方法,改造一下工厂类就ok了.
总结:
以后遇到功能类似的需求,可以把接口相同,但实现不同的方法提到共的提口来.然后用工厂方法生成不同的实例.
运用面向对象的多态的性能.就可以简化开发.
设计模式关暂在于实践.光看书本是不行的.有什么不对的地方,请多多指点.
相关文章推荐
- 谈谈mvp for asp.net模式设计的一点感想
- 设计模式的一点思考
- 对设计模式的一点认识
- 设计模式的一点小小想法
- 学习《Head First 设计模式》的一点小小的感悟与总结(一)——设计模式简介
- 关于设计模式一点使用心得
- 每天学一点设计模式-策略模式
- 每天学一点设计模式-装饰者模式
- 每天学一点设计模式-状态模式
- GOF设计模式-创建型模式理解与思索(一)(Abstract Factory 和Builder)
- 对设计模式的一点理解
- 工作三年,对于设计模式的一点看法
- C++学习:你该了解一点C++的设计模式之单例模式
- 懂一点设计模式
- 设计模式的一点总结和思考(一)创建型
- 关于设计模式的一点感悟
- 菜鸟笔记之JAVA设计模式——策略模式的一点理解
- 初学设计模式的一点理解
- 每天学一点设计模式-工厂方法模式
- GOF设计模式-创建型模式理解与思索(二)(Factory Method分析)