基础设置模块一:
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> 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;
}
本文介绍了一个区域管理模块的代码重构及功能增强过程,包括Action代码的优化、分页查询重构、批量导入区域数据以及分页列表查询等功能。通过引入BaseAction类实现了代码复用,并利用Apache POI和pinyin4j工具进行Excel数据解析。

1万+

被折叠的 条评论
为什么被折叠?



