Java开发快递物流项目(4)
2017-12-01 14:39
148 查看
基础设置模块一:
3.区域设置模块
a. 代码重构优化(优化Action代码,抽取BaseAction)
1)抽取模型驱动代码2)分页查询代码重构优化
作用:优化掉每次编写都要重复写的代码,实现代码简化
import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; import org.springframework.data.domain.Page; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; /** * 抽取 Action的公共代码 ,简化开发 * */ public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T> { // 模型驱动 protected T model; @Override public T getModel() { return model; } // 构造器 完成model实例化 public BaseAction() { // 构造子类Action对象 ,获取继承父类型的泛型 // AreaAction extends BaseAction<Area> // BaseAction<Area> Type genericSuperclass = this.getClass().getGenericSuperclass(); // 获取类型第一个泛型参数 ParameterizedType parameterizedType = (ParameterizedType) genericSuperclass; Class<T 4000 > modelClass = (Class<T>) parameterizedType .getActualTypeArguments()[0]; try { model = modelClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); System.out.println("模型构造失败..."); } } // 接收分页查询参数 protected int page; protected int rows; public void setPage(int page) { this.page = page; } public void setRows(int rows) { this.rows = rows; } // 将分页查询结果数据,压入值栈的方法 protected void pushPageDataToValueStack(Page<T> pageData) { Map<String, Object> result = new HashMap<String, Object>(); result.put("total", pageData.getTotalElements()); result.put("rows", pageData.getContent()); ActionContext.getContext().getValueStack().push(result); } }
b. 区域批量导入功能(导入国家划分的行政区)
1)必须同步提交 form 表单2) Form 表单编码方式 multipart/form-data
3)提交方式必须为 post
4)上传文件对应 input type=”file” 元素要提供 name 属性
5)限制只能上传指定格式的文件:在选择文件后,关闭自动提交,判定文件格式,再手动提交
6)使用Apache POI解析Excel文件
7)使用pinyin4j工具类生成区域简码和城市编码
@Namespace("/") @ParentPackage("json-default") @Scope("prototype") @Controller public class AreaAction extends BaseAction<Area> { // 注入service @Autowired private AreaService areaService; // 接收上传文件 private File file; public void setFile(File file) { this.file = file; } // 批量区域数据导入 @Action(value = "area_batchImport") public String batchImport() throws Exception { List<Area> areas = new ArrayList<>(); // 编写解析代码逻辑 // 基于.xls 格式解析 HSSF // 1、 加载Excel文件对象 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(new FileInputStream(file)); // 2.读取sheet中每一行 HSSFSheet sheet = hssfWorkbook.getSheetAt(0); // 3.读取sheet中每一行 for (Row row : sheet) { // 一行数据 对应一个区域对象 if (row.getRowNum() == 0) { // 第一行 跳过 continue; } // 跳过空行 if (row.getCell(0) == null || StringUtils .isBlank(row.getCell(0).getStringCellValue())) { continue; } Area area = new Area(); area.setId(row.getCell(0).getStringCellValue()); area.setProvince(row.getCell(1).getStringCellValue()); area.setCity(row.getCell(2).getStringCellValue()); area.setDistrict(row.getCell(3).getStringCellValue()); area.setPostcode(row.getCell(4).getStringCellValue()); // 基于pinyin4j生成城市编码和简码 String province = area.getProvince(); String city = area.getCity(); String district = area.getDistrict(); province = province.substring(0, province.length() - 1); city = city.substring(0, city.length() - 1); district = district.substring(0, district.length() - 1); // 简码 String[] headArray = PinYin4jUtils .getHeadByString(province + city + district); StringBuffer buffer = new StringBuffer(); for (String headStr : headArray) { buffer.append(headStr); } String shortcode = buffer.toString(); area.setShortcode(shortcode); // 城市编码 String citycode = PinYin4jUtils.hanziToPinyin(city, ""); area.setCitycode(citycode); areas.add(area); } // 调用业务层 areaService.saveBatch(areas); return NONE; }
c. 区域分页列表查询功能(分页显示)
// 分页查询 @Action(value = "area_pageQuery", results = { @Result(name = "success", type = "json") }) public String pageQuery() { // 构造分页查询对象 Pageable pageable = new PageRequest(page - 1, rows); // 构造条件查询对象 Specification<Area> specification = new Specification<Area>() { @Override public Predicate toPredicate(Root<Area> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> list = new ArrayList<>(); if (StringUtils.isNotBlank(model.getProvince())) { Predicate p1 = cb.like( root.get("province").as(String.class), "%" + model.getProvince() + "%"); list.add(p1); } if (StringUtils.isNotBlank(model.getCity())) { Predicate p2 = cb.like(root.get("city").as(String.class), "%" + model.getCity() + "%"); list.add(p2); } if (StringUtils.isNotBlank(model.getDistrict())) { Predicate p3 = cb.like( root.get("district").as(String.class), "%" + model.getDistrict() + "%"); list.add(p3); } return cb.and(list.toArray(new Predicate[0])); } }; // 调用业务层完成查询 Page<Area> pageData = areaService.findPageData(specification, pageable); // 压入值栈 pushPageDataToValueStack(pageData); return SUCCESS; }
相关文章推荐
- Java开发快递物流项目(5)
- Java开发快递物流项目(6)
- Java开发快递物流项目(1)
- Java开发快递物流项目(3)
- Java开发快递物流项目(2)
- JavaWeb物流管理项目开发(JSP、Servlet、JDBC):3、环境搭建
- Java Web项目开发到底需要掌握哪些技术?
- JAVA中DWR开发项目简单聊天实战经验
- Java开发各种经典开源项目介绍
- 项目开发规范(Java)
- 让开发自动化: 使用 Raven 构建 Java 项目
- 【转帖】Java项目开发规范
- java项目开发工具资料下载地址总汇
- Java项目开发规范
- 如何快速开发Java RCP企业级项目
- 用DB2的Java存储过程结合Tomcat连接池开发Web项目
- 做java web 开发的简单项目必须具备的知识——供新手参考
- 项目开发中经常要用到的知识----Java读取.Properties,.Xml,.Ini文件(二)
- JAVA开放源码项目与工具在企业应用开发中的运用
- [转载]让PHP支持大型项目-构建JSP、PHP与JAVA融为一体的开发环境