近段要实现一个上传excel文件到服务器并把excel文件的数据导入到数据库表中的功能 excel文件有两种格式对应数据库两张表我先实现了其中一种excel格式式的上传和导入数据上传的功能是一样的没什么好说的不同的是两种excel文件格式不一样对应的数据库表的字段也不一样怎么办呢? 开始的时候我先做了一个excel文件的功能做另一个很相似了运用c/p大法就搞定了:) 代码是这样的 action中: CityDayService cds = new CityDayServiceImpl(); ImpExcelData impExcelData = new ImpExcelData(filePath ); //这里从excel文件中取出数据 try { List list = impExcelDatagetData(); //放进list中用的是jxl List<CityDay> sameList = cdssameList(list);//这里有不同 //boolean isOk = cdscheckExcel(list); if (sameListsize()>) { requestsetAttribute(sameList sameList); request setAttribute(echo 以下数据有重复是否覆盖); return mappingfindForward(upload); } else { cdsadd(list);//这里有不同 } Systemoutprint(); } catch (Exception e) { // TODO Autogenerated catch block eprintStackTrace(); } 另一种格式的excel文件对应的action是这样的 /* 导入表 */ ZhbTCityDayForecastService cds = new ZhbTCityDayForecastServiceImpl();///////////////// ImpExcelData impExcelData = new ImpExcelData(filePath ); try { List list = impExcelDatagetData(); List<ZhbTCityDayForecast> sameList = cdssameList(list);//////////////////// if (sameListsize()>) { requestsetAttribute(sameList sameList); request setAttribute(echo 数据有重复是否覆盖); return mappingfindForward(upload); } else { cdsadd(list);/////////////////////////////// } Systemoutprint(); } catch (Exception e) { // TODO Autogenerated catch block eprintStackTrace(); } 业务层: public interface CityDayService{ public List findByCityAndDate(String cityDate date); public void deleteSame(List excelDataList); public void add(List excelDatalist); public List sameList(List excelDatalist); } 和 public interface ZhbTCityDayForecastService{ public List findByCityAndDate(String cityDate 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 cddfindByCityAndDate(city date); } public void add(List excelDatalist) { Session session = HibernateSessionFactorygetSession(); Transaction tran = sessionbeginTransaction(); List<CityDay> newList = new ArrayList(); for (int i = ; i < excelDatalistsize(); i++) { HashMap map = (HashMap) excelDatalistget(i); String strDate = mapget() + ; Date date; try { date = new SimpleDateFormat(yyyyMMdd)parse(strDate); CityDayDAO cdd = new CityDayDAOImpl(); CityDay cd = new CityDay(); cdsetDate(date); cdsetCity(mapget() + ); cdsetPollutionIndeces(new Integer(mapget()+)); cdsetMainPollutant(mapget()toString()); cdsetGrade(mapget()toString()); cdsetStatus(mapget()toString()); cddsaveOrUpdate(cd); } catch (ParseException e) { tranrollback(); eprintStackTrace(); } } mit(); } public void deleteSame(List excelDataList) { CityDayDAO cdd = new CityDayDAOImpl(); boolean result = true; List<CityDay> list = new ArrayList<CityDay>(); for (int i = ; i < excelDataListsize(); i++) { HashMap map = (HashMap) excelDataListget(i); String city = mapget() + ; String strDate = mapget() + ; Date date; try { date = new SimpleDateFormat(yyyyMMdd)parse(strDate); List onelist = cddfindByCityAndDate(city date); for(int j=;j<onelistsize();j++){ listadd((CityDay)onelistget(j)); } } catch (ParseException e) { // TODO Autogenerated catch block eprintStackTrace(); } } for(int j=;j<listsize();j++){ CityDay cd = (CityDay)listget(j); Systemoutprintln(要删除的数据有:\n + city:+cdgetCity()+date: + cdgetDate()); } cdddelete(list); } public List<CityDay> sameList(List excelDatalist) { CityDayDAO cdd = new CityDayDAOImpl(); boolean result = true; List<CityDay> list = new ArrayList<CityDay>(); for (int i = ; i < excelDatalistsize(); i++) { HashMap map = (HashMap) excelDatalistget(i); String city = mapget() + ; String strDate = mapget() + ; Date date; try { date = new SimpleDateFormat(yyyyMMdd)parse(strDate); List onelist = cddfindByCityAndDate(city date); for(int j=;j<onelistsize();j++){ listadd((CityDay)onelistget(j)); } } catch (ParseException e) { // TODO Autogenerated catch block eprintStackTrace(); } } for(int j=;j<listsize();j++){ CityDay cd = (CityDay)listget(j); Systemoutprintln(重复的数据有:\n + city:+cdgetCity()+date: + cdgetDate()); } return list; } } 和 public class ZhbTCityDayForecastServiceImpl implements ZhbTCityDayForecastService { public List findByCityAndDate(String city Date date) { ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl(); return cddfindByCityAndDate(city date); } public void add(List excelDatalist) { Session session = HibernateSessionFactorygetSession(); Transaction tran = sessionbeginTransaction(); List<CityDay> newList = new ArrayList(); for (int i = ; i < excelDatalistsize(); i++) { HashMap map = (HashMap) excelDatalistget(i); String strDate = mapget()++mapget()++mapget() + ; Date date; try { date = new SimpleDateFormat(yyyyMMdd)parse(strDate); ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl(); ZhbTCityDayForecast cd = new ZhbTCityDayForecast(); cdsetCity(mapget() + ); cdsetDate(date); cdsetPollutionMin(new Integer(mapget()+)); cdsetPollutionMax(new Integer(mapget()+)); cdsetMainPollutant(mapget()+); cdsetGrade(mapget()toString()); cdsetStatus(mapget()toString()); cddsaveOrUpdate(cd); } catch (ParseException e) { tranrollback(); eprintStackTrace(); } } mit(); } public void deleteSame(List excelDataList) { ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl(); boolean result = true; List<ZhbTCityDayForecast> list = new ArrayList<ZhbTCityDayForecast>(); for (int i = ; i < excelDataListsize(); i++) { HashMap map = (HashMap) excelDataListget(i); String city = mapget() + ; String strDate = mapget()++mapget()++mapget() + ; Date date; try { date = new SimpleDateFormat(yyyyMMdd)parse(strDate); List<ZhbTCityDayForecast> onelist = cddfindByCityAndDate(city date); for(int j=;j<onelistsize();j++){ listadd((ZhbTCityDayForecast)onelistget(j)); } } catch (ParseException e) { // TODO Autogenerated catch block eprintStackTrace(); } } cdddelete(list); } public List<ZhbTCityDayForecast> sameList(List excelDatalist) { // TODO Autogenerated method stub ZhbTCityDayForecastDAO cdd = new ZhbTCityDayForecastDAOImpl(); List<ZhbTCityDayForecast> list = new ArrayList<ZhbTCityDayForecast>(); for (int i = ; i < excelDatalistsize(); i++) { HashMap map = (HashMap) excelDatalistget(i); String city = mapget() + ; String strDate = mapget()++mapget()++mapget() + ; Date date; try { date = new SimpleDateFormat(yyyyMMdd)parse(strDate); List onelist = cddfindByCityAndDate(city date); for(int j=;j<onelistsize();j++){ listadd((ZhbTCityDayForecast)onelistget(j)); } } catch (ParseException e) { // TODO Autogenerated catch block eprintStackTrace(); } } return list; } } 这样做完后自己感觉很不满意因为两个相似的功能写了两遍代码:两个actionservice还有两个页面很笨 如果以后需求增加再写其它的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 interface CityDayService extends CommonUploadService{ public List findByCityAndDate(String cityDate date); } public interface ZhbTCityDayForecastService extends CommonUploadService{ public List findByCityAndDate(String cityDate date); } 实现类不用变 工厂方法 public class UploadServiceFactory { private static CommonUploadService cus; private static final String cityDayService = comxxxdatacenteruploadserviceCityDayServiceImpl; private static final String foreCastService = comxxxdatacenteruploadforecastserviceCityDayServiceImpl; private UploadServiceFactory() { } public static CommonUploadService getInstance(String type) { try { if (dailyequals(type)) { Class cls = ClassforName(cityDayService); cus = (CommonUploadService) clsnewInstance(); } if (forecastequals(type)) { Class cls = ClassforName(foreCastService); cus = (CommonUploadService) clsnewInstance(); } } catch (Exception e) { eprintStackTrace(); } return cus; } } 改造后的action /* 导入表 */ // CityDayService cds = new CityDayServiceImpl();//这里有不同 可以用工厂方法根据参数type不同构造出 String type = requestgetParameter(type); CommonUploadService cds = UploadServiceFactorygetInstance(type); ImpExcelData impExcelData = new ImpExcelData(filePath ); try { List list = impExcelDatagetData(); List<CityDay> sameList = cdssameList(list);//这里有不同 //boolean isOk = cdscheckExcel(list); if (sameListsize()>) { requestsetAttribute(sameList sameList); request setAttribute(echo 以下数据有重复是否覆盖); return mappingfindForward(upload); } else { cdsadd(list);//这里有不同 } Systemoutprint(); } catch (Exception e) { // TODO Autogenerated catch block eprintStackTrace(); } 这样一个action就可以搞定了 如果以为要增加新格式的excel文件只实现CommonUploadService方法改造一下工厂类就ok了 总结: 以后遇到功能类似的需求可以把接口相同但实现不同的方法提到共的提口来然后用工厂方法生成不同的实例 运用面向对象的多态的性能就可以简化开发 设计模式关暂在于实践光看书本是不行的有什么不对的地方请多多指点 |