苦尽甘来 一个月学通JavaWeb(四十六 WMS系统)

2023-12-25 16:10

本文主要是介绍苦尽甘来 一个月学通JavaWeb(四十六 WMS系统),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

夜光序言:

前尘如梦独醉里

世间总是多情痴

终年不遇便深埋

安得生死许相思

 

 

 

正文:

 

package com.ken.wms.common.util;import org.apache.commons.configuration2.HierarchicalConfiguration;
import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.builder.fluent.Configurations;
import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.commons.configuration2.tree.ImmutableNode;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.sql.Date;
import java.text.DecimalFormat;
import java.util.*;/*** @author Ken /  Yeguang / Genius Team*/
public class ExcelUtil {// 默认配置文件名private static final String DEFAULT_FILE_NAME = "ExcelUtilConfig.xml";private XMLConfiguration xmlConfig;// 实体类与Excel的映射关系private Map<String, MappingInfo> excelMappingInfo;public ExcelUtil() {init(DEFAULT_FILE_NAME);}public ExcelUtil(String fileLocation) {init(fileLocation);}/*** 对 ExcelUtil 进行初始化 将扫描配置文件,加载配置的参数** @throws ConfigurationException*/private void init(String fileLocation) {// 创建对象的 excelMappingInfo 映射excelMappingInfo = new HashMap<>();Configurations configs = new Configurations();try {xmlConfig = configs.xml(fileLocation);} catch (ConfigurationException e) {e.printStackTrace();}if (xmlConfig == null) {return;}/** 扫描 XMl 并配置参数*/// 扫描 entity 节点List<Object> entities = xmlConfig.getList("entity[@class]");if (entities == null) {return;}int entityNum = entities.size();for (int i = 0; i < entityNum; i++) {MappingInfo mappingInfo = new MappingInfo();// 获得全限定类名String className = xmlConfig.getString("entity(" + i + ")[@class]");mappingInfo.setClassName(className);// 扫描 property 节点List<HierarchicalConfiguration<ImmutableNode>> properties = xmlConfig.configurationsAt("entity(" + i + ").property");for (HierarchicalConfiguration<ImmutableNode> property : properties) {// 解析String field = property.getString("field");String value = property.getString("value");mappingInfo.addFieldsMap(field, value);mappingInfo.addValuesMap(value, field);}// 将 entity 添加到 excelMappingInfoexcelMappingInfo.put(className, mappingInfo);}}/*** 讀取 Excel 文件中的内容 Excel 文件中的每一行代表了一个对象实例,而行中各列的属性值对应为对象中的各个属性值* 读取时,需要指定读取目标对象的类型以获得相关的映射信息,并且要求该对象已在配置文件中注册** @param classType 目标对象的类型* @param file      数据来源的 Excel 文件* @return 包含若干个目标对象实例的 List*/public List<Object> excelReader(Class<? extends Object> classType, MultipartFile file) {if (file == null)return null;// 初始化存放读取结果的 ListList<Object> content = new ArrayList<>();// 获取类名和映射信息String className = classType.getName();MappingInfo mappingInfo = excelMappingInfo.get(className);if (mappingInfo == null)return null;// 读取 Excel 文件try (Workbook workbook = new XSSFWorkbook(file.getInputStream())) {Sheet dataSheet = workbook.getSheetAt(0);Row row;Cell cell;Iterator<Row> rowIterator = dataSheet.iterator();Iterator<Cell> cellIterator;// 读取第一行表头信息if (!rowIterator.hasNext())return null;List<String> methodList = new ArrayList<>();// setter 方法列表List<Class<?>> fieldTypeList = new ArrayList<>();// 目标对象属性类型列表row = rowIterator.next();cellIterator = row.iterator();String field;while (cellIterator.hasNext()) {cell = cellIterator.next();field = mappingInfo.valuesMap.get(cell.getStringCellValue());Class<?> fieldType = classType.getDeclaredField(field).getType();fieldTypeList.add(cell.getColumnIndex(), fieldType);methodList.add(cell.getColumnIndex(), getSetterMethodName(field));}// 逐行读取表格内容,创建对象赋值并导入while (rowIterator.hasNext()) {row = rowIterator.next();cellIterator = row.iterator();Object elem = classType.newInstance();// 读取单元格while (cellIterator.hasNext()) {cell = cellIterator.next();int columnIndex = cell.getColumnIndex();Class<?> fieldType = fieldTypeList.get(columnIndex);String methodName = methodList.get(columnIndex);// 获取单元格的值,并设置对象中对应的属性Object value = getCellValue(fieldType, cell);if (value == null) continue;setField(elem, methodName, value);}// 放入结果content.add(elem);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (InstantiationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IllegalAccessException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (NoSuchFieldException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return content;}/*** 将 List 中的元素对象写入到 Excel 中,其中每一个对象的一行,每一列的内容为对象的属性** @param classType 目标对象的类型* @param elems     数据来源的 List* @return*/public File excelWriter(Class<? extends Object> classType, List<?> elems) {if (classType == null || elems == null)return null;// 获取类名和映射信息String className = classType.getName();MappingInfo mappingInfo = excelMappingInfo.get(className);if (mappingInfo == null)return null;File excel = null;try {// 创建临时文件excel = File.createTempFile("excel", ".xslx");// 获取该 class 中定义的 field, 并将对应的信息保存到 List 中List<String> fieldList = new ArrayList<>();List<String> methodList = new ArrayList<>();List<String> valuesList = new ArrayList<>();Set<String> fields = mappingInfo.fieldsMap.keySet();if (fields == null)return null;for (String field : fields) {fieldList.add(field);methodList.add(getGetterMethodName(field));valuesList.add(mappingInfo.fieldsMap.get(field));}// 创建 workBook 对象Workbook workbook = new XSSFWorkbook();// 创建 sheet 对象Sheet sheet = workbook.createSheet();int rowCount = 0;int cellCount;Row row;Cell cell;// 写入第一行表头row = sheet.createRow(rowCount++);cellCount = 0;for (String value : valuesList) {cell = row.createCell(cellCount);cell.setCellValue(value);cellCount++;}// 写入内容数据for (Object elem : elems) {row = sheet.createRow(rowCount++);cellCount = 0;for (String methodName : methodList) {Object value = getField(elem, methodName);cell = row.createCell(cellCount++);setCellValue(value, workbook, cell);}}// 将 workBook 写入到 tempFile 中FileOutputStream outputStream = new FileOutputStream(excel);workbook.write(outputStream);outputStream.flush();outputStream.close();workbook.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return excel;}/*** 该方法用于获取单元格 cell 中的值** @param fieldType 指定获取的值的类型* @param cell      单元格* @return 单元格中的值*/private Object getCellValue(Class<?> fieldType, Cell cell) {if (cell == null)return null;int cellType = cell.getCellType();Object value = null;if (cellType == Cell.CELL_TYPE_STRING) {if (fieldType.equals(String.class)) {value = cell.getStringCellValue();}} else if (cellType == Cell.CELL_TYPE_NUMERIC) {if (fieldType.equals(String.class)) {value = new DecimalFormat("0").format(cell.getNumericCellValue());} else if (fieldType.equals(Date.class)) {// && HSSFDateUtil.isCellDateFormatted(cell)value = new Date(cell.getDateCellValue().getTime());} else if (fieldType.equals(Long.class)) {Double v = cell.getNumericCellValue();value = v.longValue();} else if (fieldType.equals(Integer.class)) {Double v = cell.getNumericCellValue();value = v.intValue();} else {value = cell.getNumericCellValue();}} else if (cellType == Cell.CELL_TYPE_BOOLEAN) {if (fieldType.equals(Boolean.class)) {value = cell.getBooleanCellValue();}} else if (cellType == Cell.CELL_TYPE_FORMULA) {} else if (cellType == Cell.CELL_TYPE_ERROR) {} else if (cellType == Cell.CELL_TYPE_BLANK) {}return value;}/*** 设置 Excel 单元格的值** @param value 值* @param cell  单元格*/private void setCellValue(Object value, Workbook workbook, Cell cell) {if (cell == null || value == null)return;Class<?> valueClassType = value.getClass();if (valueClassType.equals(String.class)) {String v = (String) value;cell.setCellValue(v);} else if (valueClassType.equals(Integer.class)) {Integer v = (Integer) value;cell.setCellValue(v);} else if (valueClassType.equals(Long.class)) {Long v = (Long) value;cell.setCellValue(v);} else if (valueClassType.equals(Double.class)) {Double v = (Double) value;cell.setCellValue(v);} else if (valueClassType.equals(Boolean.class)) {Boolean v = (Boolean) value;cell.setCellValue(v);} else if (valueClassType.equals(Date.class)) {Date v = (Date) value;CellStyle cellStyle = workbook.createCellStyle();CreationHelper creationHelper = workbook.getCreationHelper();cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy/mm/dd"));cell.setCellValue(v);cell.setCellStyle(cellStyle);}}/*** 该方法用于设置对象中属性的值 通过调用目标对象属性对应的 setter 方法,因而要求目标对象必须设置 setter对象,否则赋值不成功** @param targetObject 目标对象* @param methodName   setter 方法名* @param field        方法参数的值* @throws Exception*/private void setField(Object targetObject, String methodName, Object field) throws Exception {// 获得 setter 方法实例Class<?> targetObjectType = targetObject.getClass();Class<?> fieldType = field.getClass();Method setterMethod = targetObjectType.getMethod(methodName, fieldType);// 调用方法setterMethod.invoke(targetObject, field);}/*** 获取目标对象中某个属性的值,通过调用目标对象属性对应的 getter 方法,因而要求目标对象必须设置 getter 对象,否则赋值不成功** @param targetObject 目标对象* @param methodName   getter 方法名* @return 返回该属性的值* @throws Exception*/private Object getField(Object targetObject, String methodName) throws Exception {// 获得 getter 方法实例Class<?> targetObjectType = targetObject.getClass();Method getterMethod = targetObjectType.getMethod(methodName);// 调用方法return getterMethod.invoke(targetObject);}/*** 构造 setter 方法的方法名** @param field 字段名* @return*/private String getSetterMethodName(String field) {// 转换为首字母大写String name = field.replaceFirst(field.substring(0, 1), field.substring(0, 1).toUpperCase());// 拼接 set 并返回return "set" + name;}/*** 构造 getter 方法的方法名** @param field 字段名* @return*/private String getGetterMethodName(String field) {// 转换为首字母大写String name = field.replaceFirst(field.substring(0, 1), field.substring(0, 1).toUpperCase());// 拼接 get 并返回return "get" + name;}/*** 该对象代表了各个注册到 ExcelUtil 对象的映射信息 映射信息包括:注册对象的类型,对象属性与 Excel 列名的映射** @author Ken*/private class MappingInfo {private String className;private Map<String, String> fieldsMap = new HashMap<>();private Map<String, String> valuesMap = new HashMap<>();@SuppressWarnings("unused")public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public void addFieldsMap(String field, String value) {fieldsMap.put(field, value);}public void addValuesMap(String value, String field) {valuesMap.put(value, field);}}
}
package com.ken.wms.common.util;import org.apache.commons.collections.map.HashedMap;import java.util.Map;/*** controller 返回的信息载体 response* @author ken /  Yeguang / Genius Team** Created by Genius Team*/
public class Response {public static final String RESPONSE_RESULT_SUCCESS = "success";public static final String RESPONSE_RESULT_ERROR = "error";// response 中可能使用的值private static final String RESPONSE_RESULT = "result";private static final String RESPONSE_MSG = "msg";private static final String RESPONSE_DATA = "data";private static final String RESPONSE_TOTAL = "total";// 存放响应中的信息private Map<String,Object> responseContent;// ConstructorResponse() {this.responseContent = new HashedMap(10);}/*** 设置 response 的状态* @param result response 的状态,值为 success 或 error*/public void setResponseResult(String result){this.responseContent.put(Response.RESPONSE_RESULT,result);}/*** 设置 response 的附加信息* @param msg response  的附加信息*/public void setResponseMsg(String msg){this.responseContent.put(Response.RESPONSE_MSG,msg);}/*** 设置 response 中携带的数据* @param data response 中携带的数据*/public void setResponseData(Object data){this.responseContent.put(Response.RESPONSE_DATA,data);}/*** 设置 response 中携带数据的数量,与 RESPONSE_DATA 配合使用* @param total 携带数据的数量*/public void setResponseTotal(long total){this.responseContent.put(Response.RESPONSE_TOTAL,total);}/*** 设置 response 自定义信息* @param key 自定义信息的 key* @param value 自定义信息的值*/public void setCustomerInfo(String key, Object value){this.responseContent.put(key,value);}/*** 生成 response* @return 代表 response 的一个 Map 对象*/public Map<String, Object> generateResponse(){return this.responseContent;}
}
package com.ken.wms.common.util;import org.springframework.stereotype.Component;/*** Response Utils* Created by Ken /  Yeguang / Genius Team*/
@Component
public class ResponseUtil {/*** 生成一个 Response 对象* @return response 对象*/public Response newResponseInstance(){Response response = new Response();return response;}}

 

 

 

 

 

这篇关于苦尽甘来 一个月学通JavaWeb(四十六 WMS系统)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/536104

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,