您的位置:首页 > 编程语言 > Java开发

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: