- 浏览: 139570 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
zheng_zhimeng:
这个版本在linux的版本下有问题,亲们用的没有问题么
文档展示:IcePDF 将PDF转换为图片 -
yuming.xiao:
转换的某些图片,有些模糊。不知道楼主遇到这个问题没有
文档展示:IcePDF 将PDF转换为图片 -
zenghongqing:
您好,请教您一个问题://cell内容字符串总宽度 doub ...
Java POI Excel 行高自适应 -
xiang37:
http://xiva.iteye.com/blog/2066 ...
视频分割项目预研 -
I白I:
怎么还配置数据库了?
视频分割项目预研
当自己的系统需要向别的数据平台系统上传数据时,可能规则是由数据平台定的。
下面就是一个WEB Service业务接口的典型定义。
班级信息上传接口
示例XML
自己系统的业务表设计(关系型数据库):
年级信息
班级信息
学生信息
自己系统业务对象建模
年级
班级
学生
在这篇文章中不做系统业务扩展,只讨论按照班级上传学生信息这一个业务逻辑。但是可以预测到当涉及课程,普通课程,公选课,教师,绩点,教室,校区,学费,健康状况等的业务信息上传时可以扩展出很多个上传交易。
如果针对每一个上传接口,都要结合自己系统的业务对象模型抓取数据,那就太费劲了。比如一个接口涉及学校,年级,班级,教室,教师,课程六个业务对象模型,可以想象这个接口的XML生成工作量不会小。
把数据抓取的工作放到关系数据库通过SQL语句来抓取来做是非常有吸引力。这样所有的复杂业务数据抓取逻辑都放到了SQL语句中,维护起来也会方便许多。
下面就介绍一种在Java世界里通过SQL抓取上传接口业务数据,再自动生成XML的一个程序设计。
程序设计的目标就是,当来了一个新接口时,只要添加一个接口业务数据模型类,一段SQL语句就可以搞定。这是典型的针对扩展开放的设计。
针对关系型数据库的阻抗失衡问题,JAVA世界有许多解决方案。但是我接触过的对SQL支持最融洽的当属myBatis。这里就采用MyBatis了。对于如何应用myBatis这篇文章就不介绍了,这不是文章的重点。
为了能够自动生成XML,程序需要添加一个接口,一个元数据描述类:
接口定义:
这个接口时为了描述列表类型的数据,如:对于一个班级,学生信息就是一个列表。
元数据描述类
元数据是用来生成XML文件的。
对于文章开头的那个上传接口的数据模型做出如下的设计:
用来自动生成XML的程序
这段代码应用了dom4j来处理xml。
以后每加一个接口,就只需要设计接口业务数据模型类,它要实现DataMapForXml接口;再处理从数据库或别的数据源向该数据模型类塞数据的任务即可。
整个程序设计以分离数据抓取与xml生成为目标,为了实现自动生成xml方便以后接口的增加,程序引入了接口入参元数据概念以及一个描述接口数据概念图的接口类。
程序需要改进的地方还很多,以后再扩展实现吧!
下面就是一个WEB Service业务接口的典型定义。
班级信息上传接口
标识名 | 名称 | 类型 | 长度 | 是否必填 | 说明 |
CLASS_INFO | |||||
CODE | 班级编码 | String | 20 | 是 | 班级编码 |
NAME | 班级名称 | String | 20 | 是 | 班级名称 |
GRADE | 年级信息 | String | 20 | 是 | 1、2、3 |
COUNT | 班级人数 | Number | 8 | 是 | 班级人数 |
CONTENT | 简要介绍 | String | 120 | 否 | 班级简要介绍 |
STUDENT_INFO | |||||
CODE | 学号 | String | 20 | 是 | 学生编码 |
NAME | 姓名 | String | 20 | 是 | 学生姓名 |
SEX | 性别 | String | 1 | 否 | 1:男 0:女 |
BIRTHDAY | 生日 | String | 20 | 否 | yyyy-mm-dd |
示例XML
自己系统的业务表设计(关系型数据库):
年级信息
年级ID | varchar(20) | 主键 |
年级编码 | varchar(20) | 必填 |
年级名称 | varchar(20) | 必填 |
年级描述 | varchar(120) |
班级信息
班级ID | varchar(20) | 主键 |
班级编码 | varchar(20) | 必填 |
班级名称 | varchar(20) | 必填 |
班级描述 | varchar(120) | |
年级ID | varchar(20) | 外键 |
学生信息
学生ID | varchar(20) | 主键 |
学生编码 | varchar(20) | 必填 |
学生名称 | varchar(20) | 必填 |
学生描述 | varchar(120) | |
年级ID | varchar(20) | 外键 |
班级ID | varchar(20) | 外键 |
自己系统业务对象建模
年级
package com.zas.data.xml; /** * 年级信息 * @author zas * */ public class Grade { //年级ID String gradeID; //年级编码 String gradeCode; //年级名称 String gradeName; //年级描述 String gradeDes; public Grade() { super(); } public Grade(String gradeID, String gradeCode, String gradeName, String gradeDes) { super(); this.gradeID = gradeID; this.gradeCode = gradeCode; this.gradeName = gradeName; this.gradeDes = gradeDes; } public String getGradeID() { return gradeID; } public void setGradeID(String gradeID) { this.gradeID = gradeID; } public String getGradeName() { return gradeName; } public void setGradeName(String gradeName) { this.gradeName = gradeName; } public String getGradeDes() { return gradeDes; } public void setGradeDes(String gradeDes) { this.gradeDes = gradeDes; } public String getGradeCode() { return gradeCode; } public void setGradeCode(String gradeCode) { this.gradeCode = gradeCode; } @Override public String toString() { return "Grade [gradeID=" + gradeID + ", gradeCode=" + gradeCode + ", gradeName=" + gradeName + ", gradeDes=" + gradeDes + "]"; } /** * @param args */ public static void main(String[] args) { } }
班级
package com.zas.data.xml; /** * 班级信息 * @author zas * */ public class ClassInformation{ //班级ID String classID; //班级编号 String classCode; //班级名称 String className; //年级ID String gradeID; //班级描述 String classDes; public ClassInformation() { super(); } public ClassInformation(String classID, String classCode, String className, String gradeID, String classDes) { super(); this.classID = classID; this.classCode = classCode; this.className = className; this.gradeID = gradeID; this.classDes = classDes; } public String getClassID() { return classID; } public void setClassID(String classID) { this.classID = classID; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; } public String getGradeID() { return gradeID; } public void setGradeID(String gradeID) { this.gradeID = gradeID; } public String getClassDes() { return classDes; } public void setClassDes(String classDes) { this.classDes = classDes; } public String getClassCode() { return classCode; } public void setClassCode(String classCode) { this.classCode = classCode; } @Override public String toString() { return "ClassInformation [classID=" + classID + ", classCode=" + classCode + ", className=" + className + ", gradeID=" + gradeID + ", classDes=" + classDes + "]"; } }
学生
package com.zas.data.xml; import java.util.Date; /** * 学生数据对象 * @author zas * */ public class Student { //学生ID String id; //学号 String code; //年级 String gradeid; //班级 String classid; //姓名 String name; //性别 String sexCode; //生日 Date birthDay; public Student() { super(); } public Student(String id, String code, String gradeid, String classid, String name, String sexCode, Date birthDay) { super(); this.id = id; this.code = code; this.gradeid = gradeid; this.classid = classid; this.name = name; this.sexCode = sexCode; this.birthDay = birthDay; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getGradeid() { return gradeid; } public void setGradeid(String gradeid) { this.gradeid = gradeid; } public String getClassid() { return classid; } public void setClassid(String classid) { this.classid = classid; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSexCode() { return sexCode; } public void setSexCode(String sexCode) { this.sexCode = sexCode; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } @Override public String toString() { return "Student [id=" + id + ", code=" + code + ", gradeid=" + gradeid + ", classid=" + classid + ", name=" + name + ", sexCode=" + sexCode + ", birthDay=" + birthDay + "]"; } /** * @param args */ public static void main(String[] args) { } }
在这篇文章中不做系统业务扩展,只讨论按照班级上传学生信息这一个业务逻辑。但是可以预测到当涉及课程,普通课程,公选课,教师,绩点,教室,校区,学费,健康状况等的业务信息上传时可以扩展出很多个上传交易。
如果针对每一个上传接口,都要结合自己系统的业务对象模型抓取数据,那就太费劲了。比如一个接口涉及学校,年级,班级,教室,教师,课程六个业务对象模型,可以想象这个接口的XML生成工作量不会小。
把数据抓取的工作放到关系数据库通过SQL语句来抓取来做是非常有吸引力。这样所有的复杂业务数据抓取逻辑都放到了SQL语句中,维护起来也会方便许多。
下面就介绍一种在Java世界里通过SQL抓取上传接口业务数据,再自动生成XML的一个程序设计。
程序设计的目标就是,当来了一个新接口时,只要添加一个接口业务数据模型类,一段SQL语句就可以搞定。这是典型的针对扩展开放的设计。
针对关系型数据库的阻抗失衡问题,JAVA世界有许多解决方案。但是我接触过的对SQL支持最融洽的当属myBatis。这里就采用MyBatis了。对于如何应用myBatis这篇文章就不介绍了,这不是文章的重点。
为了能够自动生成XML,程序需要添加一个接口,一个元数据描述类:
接口定义:
package com.zas.data.xml; import java.util.List; import java.util.Map; /** * xml结构图 * @author zas * */ public interface DataMapForXml { /** * 参数元数据map * 主要存储当前层信息 * @return */ Map<String, List<ParameterMetaData>> getParameterMap(); /** * 当有一对多关系时填入其中 * @return */ Map<String, List<DataMapForXml>> getOneToManyList(); }
这个接口时为了描述列表类型的数据,如:对于一个班级,学生信息就是一个列表。
元数据描述类
package com.zas.data.xml; /** * 元数据类 * @author zas * */ public class ParameterMetaData { //标识 String parameterIdentifier = null; //名称 String parameterName = null; //Java类型 String parameterType = null; //值 Object parameterValue = null; //描述 String parameterDescription = null; //前缀 String elementPrefix = null; //类型 String parameterClientType = null; //是否必填 Boolean isRequired = false; //规格 String parameterSpecification = null; public ParameterMetaData(String parameterIdentifier, String parameterName, String parameterType, Object parameterValue, String parameterDescription, String elementPrefix, String parameterPhilipsType, Boolean isRequired, String parameterSpecification) { super(); this.parameterIdentifier = parameterIdentifier; this.parameterName = parameterName; this.parameterType = parameterType; this.parameterValue = parameterValue; this.parameterDescription = parameterDescription; this.elementPrefix = elementPrefix; this.parameterClientType = parameterPhilipsType; this.isRequired = isRequired; this.parameterSpecification = parameterSpecification; } public String getParameterName() { return parameterName; } public void setParameterName(String parameterName) { this.parameterName = parameterName; } public String getParameterType() { return parameterType; } public void setParameterType(String parameterType) { this.parameterType = parameterType; } public Object getParameterValue() { return parameterValue; } public void setParameterValue(Object parameterValue) { this.parameterValue = parameterValue; } public String getParameterDescription() { return parameterDescription; } public void setParameterDescription(String parameterDescription) { this.parameterDescription = parameterDescription; } public String getElementPrefix() { return elementPrefix; } public void setElementPrefix(String elementPrefix) { this.elementPrefix = elementPrefix; } public String getParameterClientType() { return parameterClientType; } public void setParameterClientType(String parameterClientType) { this.parameterClientType = parameterClientType; } public String getParameterSpecification() { return parameterSpecification; } public void setParameterSpecification(String parameterSpecification) { this.parameterSpecification = parameterSpecification; } public String getParameterIdentifier() { return parameterIdentifier; } public void setParameterIdentifier(String parameterIdentifier) { this.parameterIdentifier = parameterIdentifier; } public Boolean getIsRequired() { return isRequired; } public void setIsRequired(Boolean isRequired) { this.isRequired = isRequired; } }
元数据是用来生成XML文件的。
对于文章开头的那个上传接口的数据模型做出如下的设计:
package com.zas.data.xml; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** * 班级信息上传 * @author zas * */ public class CLASS_INFO implements DataMapForXml { /** 标识名 名称 类型 长度 是否必填 说明 CLASS_INFO CODE 班级编码 String 20 是 班级编码 NAME 班级名称 String 20 是 班级名称 GRADE 年级信息 String 20 是 1、2、3 COUNT 班级人数 Number 8 是 班级人数 CONTENT 简要介绍 String 120 否 班级简要介绍 STUDENT_INFO CODE 学号 String 20 是 学生编码 NAME 姓名 String 20 是 学生姓名 SEX 性别 String 1 否 1:男 0:女 BIRTHDAY 生日 String 20 否 yyyy-mm-dd */ //班级编码 String CLASS_INFO_CODE; //班级名称 String CLASS_INFO_NAME; //年级信息 String CLASS_INFO_GRADE; //班级人数 Integer CLASS_INFO_COUNT; //班级介绍 String CLASS_INFO_CONTENT; List<DataMapForXml> studentList; @Override public Map<String, List<ParameterMetaData>> getParameterMap() { //先后顺序很重要 Map<String, List<ParameterMetaData>> elementMap = new LinkedHashMap<String, List<ParameterMetaData>>(); List<ParameterMetaData> listCLASS_INFO = new ArrayList<ParameterMetaData>(); listCLASS_INFO.add(new ParameterMetaData("CODE","班级编码", "String", this.CLASS_INFO_CODE, "班级编码", "CLASS_INFO", "String", true, "")); listCLASS_INFO.add(new ParameterMetaData("NAME","班级名称", "String", this.CLASS_INFO_NAME, "班级名称", "CLASS_INFO", "String", true, "")); listCLASS_INFO.add(new ParameterMetaData("GRADE","年级信息", "String", this.CLASS_INFO_GRADE, "年级信息", "CLASS_INFO", "String", true, "")); listCLASS_INFO.add(new ParameterMetaData("COUNT","班级人数", "Integer", this.CLASS_INFO_COUNT, "班级人数", "CLASS_INFO", "Number", true, "")); listCLASS_INFO.add(new ParameterMetaData("CONTENT","班级介绍", "String", this.CLASS_INFO_CONTENT, "班级介绍", "CLASS_INFO", "String", false, "")); elementMap.put("CLASS_INFO", listCLASS_INFO); return elementMap; } @Override public Map<String, List<DataMapForXml>> getOneToManyList() { //先后顺序很重要 Map<String, List<DataMapForXml>> elementMap = new LinkedHashMap<String, List<DataMapForXml>>(); elementMap.put("STUDENT_INFOS", studentList); return elementMap; } public String getCLASS_INFO_CODE() { return CLASS_INFO_CODE; } public void setCLASS_INFO_CODE(String cLASS_INFO_CODE) { CLASS_INFO_CODE = cLASS_INFO_CODE; } public String getCLASS_INFO_NAME() { return CLASS_INFO_NAME; } public void setCLASS_INFO_NAME(String cLASS_INFO_NAME) { CLASS_INFO_NAME = cLASS_INFO_NAME; } public String getCLASS_INFO_GRADE() { return CLASS_INFO_GRADE; } public void setCLASS_INFO_GRADE(String cLASS_INFO_GRADE) { CLASS_INFO_GRADE = cLASS_INFO_GRADE; } public Integer getCLASS_INFO_COUNT() { return CLASS_INFO_COUNT; } public void setCLASS_INFO_COUNT(Integer cLASS_INFO_COUNT) { CLASS_INFO_COUNT = cLASS_INFO_COUNT; } public String getCLASS_INFO_CONTENT() { return CLASS_INFO_CONTENT; } public void setCLASS_INFO_CONTENT(String cLASS_INFO_CONTENT) { CLASS_INFO_CONTENT = cLASS_INFO_CONTENT; } public List<DataMapForXml> getStudentList() { return studentList; } public void setStudentList(List<DataMapForXml> studentList) { this.studentList = studentList; } static class STUDENT_INFO implements DataMapForXml { //学号 String STUDENT_INFO_CODE; //姓名 String STUDENT_INFO_NAME; //性别 String STUDENT_INFO_SEX; //生日 String STUDENT_INFO_BIRTHDAY; @Override public Map<String, List<ParameterMetaData>> getParameterMap() { Map<String, List<ParameterMetaData>> elementMap = new LinkedHashMap<String, List<ParameterMetaData>>(); List<ParameterMetaData> listSTUDENT_INFO = new ArrayList<ParameterMetaData>(); listSTUDENT_INFO.add(new ParameterMetaData("CODE","学号", "String", this.STUDENT_INFO_CODE, "", "STUDENT_INFO", "String", true, "")); listSTUDENT_INFO.add(new ParameterMetaData("NAME","姓名", "String", this.STUDENT_INFO_NAME, "", "STUDENT_INFO", "String", true, "")); listSTUDENT_INFO.add(new ParameterMetaData("SEX","性别", "String", this.STUDENT_INFO_SEX, "", "STUDENT_INFO", "String", false, "")); listSTUDENT_INFO.add(new ParameterMetaData("BIRTHDAY","生日", "Integer", this.STUDENT_INFO_BIRTHDAY, "", "STUDENT_INFO", "String", false, "")); elementMap.put("STUDENT_INFO", listSTUDENT_INFO); return elementMap; } @Override public Map<String, List<DataMapForXml>> getOneToManyList() { return null; } public String getSTUDENT_INFO_CODE() { return STUDENT_INFO_CODE; } public void setSTUDENT_INFO_CODE(String sTUDENT_INFO_CODE) { STUDENT_INFO_CODE = sTUDENT_INFO_CODE; } public String getSTUDENT_INFO_NAME() { return STUDENT_INFO_NAME; } public void setSTUDENT_INFO_NAME(String sTUDENT_INFO_NAME) { STUDENT_INFO_NAME = sTUDENT_INFO_NAME; } public String getSTUDENT_INFO_SEX() { return STUDENT_INFO_SEX; } public void setSTUDENT_INFO_SEX(String sTUDENT_INFO_SEX) { STUDENT_INFO_SEX = sTUDENT_INFO_SEX; } public String getSTUDENT_INFO_BIRTHDAY() { return STUDENT_INFO_BIRTHDAY; } public void setSTUDENT_INFO_BIRTHDAY(String sTUDENT_INFO_BIRTHDAY) { STUDENT_INFO_BIRTHDAY = sTUDENT_INFO_BIRTHDAY; } } }
用来自动生成XML的程序
package com.zas.data.xml; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.XMLWriter; public class BuildXML { /** * 根据数据xml结构图生成xml文件 * @param elementList * @param rootName 暂定为交易号的根名称 * @return */ public static String buildXML(List<DataMapForXml> elementList, String rootName) { Document document = DocumentHelper.createDocument(); Element root = document.addElement(rootName); createRootElement(elementList, root); try { XMLWriter output = new XMLWriter(new FileWriter(new File("F:/catalog/catalog.xml"))); output.write(document); output.close(); } catch (IOException e) { System.out.println(e.getMessage()); } return "F:/catalog/catalog.xml"; } /** * 创建xml文件内容 * @param elementList * @param e */ private static void createRootElement(List<DataMapForXml> elementList, Element e) { if(null == elementList || elementList.size() < 1){ return; } for (DataMapForXml dataMapForXml : elementList) { //首先处理当前层信息 Map<String, List<ParameterMetaData>> elementMap = dataMapForXml.getParameterMap(); if(null != elementMap && elementMap.size() > 0){ for (String str : elementMap.keySet()) { Element element = e.addElement(str); for (ParameterMetaData pmd : elementMap.get(str)) { if(pmd.getParameterValue() != null){ Element elementInner = element.addElement(pmd.getParameterIdentifier()); elementInner.setText(pmd.getParameterValue().toString()); } } } } //再处理一对多信息 Map<String, List<DataMapForXml>> mapList = dataMapForXml.getOneToManyList(); if(null != mapList && mapList.size() > 0){ for (String str : mapList.keySet()) { Element element = e.addElement(str); //递归处理一对多关系所有的内容 createRootElement(mapList.get(str), element); } } } } /** * @param args */ public static void main(String[] args) { List<DataMapForXml> elementList = new ArrayList<DataMapForXml>(); CLASS_INFO classInfo = new CLASS_INFO(); classInfo.setCLASS_INFO_CODE("10001"); classInfo.setCLASS_INFO_NAME("一班"); classInfo.setCLASS_INFO_GRADE("一年级"); classInfo.setCLASS_INFO_CONTENT("一年级一班"); classInfo.setCLASS_INFO_COUNT(8); List<DataMapForXml> list = new ArrayList<DataMapForXml>(); for (int i = 0; i < 8; i++) { CLASS_INFO.STUDENT_INFO student = new CLASS_INFO.STUDENT_INFO(); student.setSTUDENT_INFO_CODE("10001_"+i); student.setSTUDENT_INFO_NAME("学生_" + i); if(i % 2 == 0){ student.setSTUDENT_INFO_SEX("男"); }else{ student.setSTUDENT_INFO_BIRTHDAY("1998-0" + i + "-0" + i); } list.add(student); } classInfo.setStudentList(list); elementList.add(classInfo); BuildXML.buildXML(elementList, "root"); } }
这段代码应用了dom4j来处理xml。
以后每加一个接口,就只需要设计接口业务数据模型类,它要实现DataMapForXml接口;再处理从数据库或别的数据源向该数据模型类塞数据的任务即可。
整个程序设计以分离数据抓取与xml生成为目标,为了实现自动生成xml方便以后接口的增加,程序引入了接口入参元数据概念以及一个描述接口数据概念图的接口类。
程序需要改进的地方还很多,以后再扩展实现吧!
发表评论
-
oracle按照某一字段里的数字排序
2014-10-21 19:59 1095select * from LSK_SBCAJ t ord ... -
JS onkeydown onenter
2014-10-20 16:53 1011html中 onenter不是一个标准的事件。 js 中仿o ... -
Java数组删除指定元素
2014-09-18 11:30 2265package com.zas.util; impo ... -
sql 去重
2014-09-18 10:43 661delete from table t1 where t1.i ... -
linux 干掉所有java进程
2014-08-07 12:31 1037ps -ef|grep java|grep -v grep|c ... -
Oracle自带连接池使用(转载收录)
2014-07-31 10:01 1417最近在搞数据迁移:从sql server 迁数据到oracle ... -
html dom jsoup httpclient
2014-07-10 21:45 1131xml dom 对大多数java程序员来说并不陌生,但是htm ... -
Oracle 清库脚本
2014-07-08 22:40 1322清库脚本一份 表dossier_group 的字段Dossi ... -
Java 对象存储到oracle Blob字段
2014-07-08 14:52 1108Java 数据对象在没有持久存储到业务表时,可能需要临时存 ... -
Java 科学计数法数字转字符串
2014-07-08 14:30 1521科学计数法数字转字符串,记录代码,留后使用 double ... -
突破tomcat jsp编译65535行的限制
2014-07-04 17:16 4806使用tomcat时有可能会遇到其对jsp编译行数的限制, ... -
oracle 函数中游标及递归的应用
2014-06-19 17:13 1432在代码中使用递归可能大部分程序员都不陌生,但是在存储过程或 ... -
视频操作类
2014-06-19 17:04 1151接 视频分割项目预研 http://zhuyufufu.i ... -
视频分割项目预研
2014-06-11 16:12 2289由于工作需要,研究下视频切割。 现在的情况:视频切割是重中之 ... -
Java POI Excel 行高自适应
2014-03-28 14:08 15937在Excel处理的过程中,可能有需要用到行高自适应的时候。 ... -
Java POI Excel sheet 合并遇到的问题解决2
2014-03-25 18:03 3272上接 Java POI Excel sheet 合并 http ... -
文档展示:使用iText转换各种图片为PDF
2014-03-23 12:38 2927如题: 下面这段代码可以处理各种格式的图片,代码的出处忘记了 ... -
Java 进程执行外部程序,造成外部程序阻塞的一种原因
2014-03-23 12:06 1471前一阵子在研究文档展示时使用了java进程直接调用外部程序 ... -
Java POI Excel sheet 合并遇到的问题解决
2014-03-23 11:30 5135上接 Java POI Excel sheet http:// ... -
Java POI Excel sheet合并
2014-03-19 10:59 6643由于工作上的需要,特地研究了下Excel合并的问题,现贴出来, ...
相关推荐
总结起来,批量上传图片EXT框架是一个强大且灵活的解决方案,它结合了EXT框架的优势,为Web应用提供了高效、直观的图片上传功能。通过深入理解和利用这一框架,开发者可以构建出用户友好的图像管理界面,提升应用的...
#### 文件上传的具体实现步骤 1. **定义ActionForm**:首先需要定义一个继承自`ActionForm`的类,该类中包含一个或多个`FormFile`类型的成员变量,用来接收用户上传的文件。 2. **配置文件上传**:在`struts-...
ASP.NET是一个服务器端的Web应用程序框架,它负责处理用户的请求、执行业务逻辑和生成HTML响应。Ajax(Asynchronous JavaScript and XML)则允许我们在不刷新整个页面的情况下与服务器进行异步通信,提高网页的交互...
在IT行业中,构建一个能够实时显示文件上传进度的交互式用户界面是一项常见的需求。本教程将探讨如何利用Spring、Ajax以及Velocity技术来实现这一功能,为用户提供更好的用户体验。 首先,让我们了解一下这三个关键...
在本文中,我们将深入探讨如何使用Java开发框架JFinal与前端文件上传插件Uploadify结合,实现高效、便捷的图片上传功能。JFinal以其轻量级、高效的特性,深受开发者喜爱,而Uploadify则是一款广泛使用的JavaScript...
结合Maven和SSM框架,我们可以实现高效稳定的上传下载功能。通常,上传功能会涉及以下步骤: 1. **前端交互**:使用HTML5的File API,用户选择文件后,通过Ajax异步发送文件数据到服务器。 2. **后端处理**:在...
在本项目中,我们主要探讨如何使用SpringBoot框架与阿里云OSS(Object Storage Service)服务相结合,通过Easypoi库实现文件的导入、导出功能,以及OSS上的文件上传和下载。Easypoi是一个强大的Java操作Excel的工具...
**Spring** 是一个全面的企业级应用开发框架,提供了IOC(Inversion of Control)和AOP(Aspect Oriented Programming)等特性,使得组件间的依赖关系得以解耦,提高了代码的可测试性和可维护性。而**SpringMVC** 是...
在Java和Amis的后端框架中,内置的代码生成器是一个强大的工具。它能够自动生成常见的CRUD操作代码,如增删改查,大大减少了手动编码的工作量。开发者只需要定义好数据库模型,代码生成器就能根据模型生成对应的...
本文主要探讨了一款基于SSM(Spring、SpringMVC、MyBatis)框架开发的Android平台健康管理系统的设计与实现,旨在提供一个高效、便捷的健康管理工具。 一、SSM框架介绍 1. Spring:这是一个全面的Java企业级应用...
而"springboot-upload"可能是一个与SpringBoot上传功能相关的模块或示例代码,展示了如何在SpringBoot应用中处理文件上传。 综上所述,这个开源项目利用SpringBoot的便利性,结合Thymeleaf的模板渲染,Layui的前端...
结合这三个框架和POI库,开发者可以构建一个完整的后端系统,处理HTTP请求,通过Spring MVC进行业务逻辑控制,利用Spring管理依赖,通过Mybatis执行数据库操作,同时使用POI处理Excel数据,如报表生成或数据导入导出...
"Freemarker+Structs2.0文章上传生成静态页面"是这样一个系统,它结合了两个强大的Java技术来实现这一目标。 Freemarker是一个模板引擎,它允许开发者用简单的模板语言(FTL)编写设计模板,然后用数据模型填充这些...
教程中的每个子文件都对应一个具体的知识点,通过实践操作,你可以逐步掌握Guns框架的各个方面。 总的来说,Guns框架教程是一份全面的学习资源,涵盖了从入门到进阶的所有内容。无论是初学者还是经验丰富的开发者,...
具体实现上,前端JavaScript通过Ajax发送异步请求到服务器,服务器处理文件上传后返回响应,前端根据响应更新页面内容,如显示上传成功信息或错误提示。 ### 4. 文件名和扩展名处理 在文件上传过程中,正确处理...
Struts+Spring+Hibernate(SSH)是一个常见的Java企业级应用开发框架组合,它结合了Struts的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的对象关系映射能力。在SSH框架下实现文件上传和下载,可以充分...
Struts是Apache组织下的一个开源框架,主要用于构建Java Web应用程序。在Struts中实现文件上传功能,是一项常见的需求,尤其在处理用户提交的各种文件,如图片、文档等时。这个功能可以帮助开发者将用户选择的文件从...
【FTP技术】 FTP(File Transfer Protocol)是用于在互联网上传输文件的一种协议。它允许用户从远程服务器上下载文件或向服务器上传...在实施过程中,你需要深入理解这些技术,并结合具体的业务需求进行整合和优化。
在本例中,`SyncProduct`可能是服务中的一个具体操作,用于同步产品数据。你可以根据实际需求扩展服务接口,添加更多功能。通过结合CXF和Spring,你可以轻松地构建高效、可扩展的Java WebServices,并利用Spring的...
标题中的“ssh2框架搭建的小系统”是指一个基于SSH2框架构建的Web应用程序,它具备基础的业务操作功能,如增删改查、批量删除、分页显示,以及文件的上传和下载。对于初学者来说,这是一个很好的实践项目,能够帮助...