使用万能表单解析程序将表单数据封装成List<Map>
在JadePool中,提供了一个
万能表单解析类ProcessForm,目的是提供对ProcessVO实现插入或更新记录的支持。
它能将任意复杂的表单记录,包括所有的字段,包括单记录和多记录,解析并封装成List<Map>变量,这些结果可以作为ProcessVO插入、更新等方法的参数保存到数据库中。保存记录时,ProcessVO会自动过滤掉无效字段,只有表单中的字段名与数据库表中的字段名相同的数据才会保存到数据库中。目前,ProcessForm可能是世界上最完整的表单解析工具。
ProcessForm支持所有格式的文件上传,但不支持大文件的上传,能满足大多数网络环境的应用。
对于文件类型的字段,除了会解析出文件的内容外,还会给出文件的相关属性,这些属性按照下面的格式命名:
文件字段名_originfilename
文件字段名_filename
文件字段名_ext
文件字段名_contenttype
文件字段名_size
对于四种常见的图片文件(jpg|gif|png|bmp),还会计算出图片宽度、高度等信息,
文件字段名_width
文件字段名_height
ProcessForm支持同步(非Ajax)和异步(Ajax)两种方式提交的表单的解析。
为了保证得到正确的解析结果,在表单设计上,使用这两个属性值:
method="post"和
enctype="multipart/form-data",
如果表单代表的是一条记录,对表单的字段顺序没有要求;如果表单代表的是多条记录,请不要把check、radio类型的字段作为每条记录的第一个字段,如果页面确实需要check、radio类型作为第一个字段,那么在check或radio之前加一个无效的隐含字段。ProcessVO不会保存无效字段值。
对于异步方式提交的表单数据,必须是Ajax标准格式,即xml格式。
ProcessForm应用:
同步上传的表单解析
ProcessForm form = ProcessForm.instance();
//form.setFilter("jpg|gif|png|swf");
//form.setAllowFileSize(1024000);//单个文件允许达到1M
form.parse(request);//同步解析
Map m = form.getRecordFullInfo();//包含文件的属性
m = form.getRecord()
List v = form.getRecordList();
v = form.getRecordFullInfoList();//包含文件的附件属性
异步上传的表单解析
ProcessForm pf = ProcessForm.instance();
pf.parseXML(request, pf.IS_ECMA_UNICODE);//表单字段的值均经过escape方法的处理
pf.parseXML(request);
List v = pf.getRecordList();
一点说明:由于表单解析程序的代码相当复杂,如果遇到不能解析的情况,请及时告诉本人。邮箱hkm2300(at)yahoo.com.cn
对同步方式提交的记录进行解析的部分底层核心方法
/**
* 对非ajax方式提交的记录解析。 解析 contentType = "multipart/form-data";的表单
* 在表单中出现多条记录时,第一个元素作为新的一条记录的参考标志,必须确保其有一个固定的名称,所以表单中第一个元素应辟免使用checkbox复选框和radio单选按钮,以防止表的结构信息错误
*/
private List getMultipartFormData(HttpServletRequest request) throws IOException, ServletException {
Map recordFullInfo = null;
List _recordFullInfoList = new ArrayList();