基于WMframework构建的web系统,对于前端用户表单页面jsp,主要由如下部分构成:表头(head)+ 业务展现自定义部分 + 表尾(bottom),对于表头(head)、表尾(bottom)常规情况下我们均是按照include的形式公共引用的,基于WMframework构建的web系统也是如此。
1、前台页面头(head)
1 2 3 4 5 6 7 8 | <%@ page contentType= "text/html;charset=UTF-8" %> <%@include file= "/includes/IncludeTop.jsp" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns= "http://www.w3.org/1999/xhtml" > <html> <head> <title>用户基本信息</title> </head> |
这里我们通过<%@include file="/includes/IncludeTop.jsp" %>实现了公共表头的引入。
2、 页面表单
2.1、HTML DOM元素属性说明
除了常见html元素(element)对象所具备的属性外,本次系统我们加入了几个自定义的属性(名称对大小写敏感):
issave:当前元素element值是否需要保存(默认为不需要,所以不写表示不提交该元素的值)
fieldname: 当前元素element对应后台数据对象(domain)的属性名(名称对大小写敏感)
require: 当前元素element值是否为必填(默认为不需要,所以不写表示选填)
datatype:当前元素element值的数据类型
目前已定义的数据类型:
数据类型值 |
数据类型说明 |
date |
日期类型 yyyy-mm-dd |
number |
数字类型0-9 |
integer |
整形数字 |
double |
浮点数字(仅支持小数点后2位) XXXX.XX |
chars |
字符型(目前用于校验用户名、密码等) |
showmessage: 当前元素element值没有通过校验时提示的消息;
以下属性可选择添加
(仅在需要进行dom对象元素比较的时候添加)
compareObject:当前元素与之比较的元素id
compareType:比较类型
目前已定义的比较类型:
比较类型值 |
比较类型说明 |
equal |
= 等于 |
notequal |
!= 不等于 |
greaterthan |
>= 大于等于 |
greaterequal |
> 大于 |
lessthan |
<= 小于等于 |
lessequal |
< 小于 |
compareMessage:对比错误时需要给出的提示信息
(仅在使用form构建XmlDocument 对象时使用)
vos:当前元素对应domain对象名称
vo:当前元素对应domain对象组的序号
funcname:当前元素对应操作sqlmap的名称
以下是一个demo,供大家参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | < input type="text" maxlength="20" class="textfile" id='unit_account' /****自定义属性如下***/ issave="true" //需要保存\处理 fieldname="userAccount" //对应domain中的属性值 require="true" //必填标志 datatype="chars" //当前数据类型 showmessage="用户账号为空或设置错误" //数据错误时给出的提示信息 compareObject="confirmPassword"//比对对象id compareType="equal" //比对类型 compareMessage="两次输入的密码不一致!"//比对错误时给出的提示信息 vos="EmpDomain" //提交元素属于的domain对象 vo="emp1" //当前提交多个对象时需要区分的标志 funcname="insertEmp"//当前提交执行sqlmap中的function /> |
3、数据校验
全部页面表单通过/WebRoot/js/ validate.js进行数据校验,必须把提交的数据封装在一个form(一个页面可以设置多个form表单)中,详情可查看/WebRoot/js/oa/user/user.jsp中的格式。
4、表单数据提交
可以使用两种方式提交:页面元素构建枚举数组获得XMLDOC对象和页面元素直接拼接XML字符串获得XMLDOC对象
4.1、页面元素构建枚举数组获得XMLDOC对象方式
(一) 新增
- 单表(一个domain)数据提交
代码自动生成,修改表单元素布局即可。对应HTML DOM元素属性vo属性值可不加考虑。
注意:须保证HTML DOM元素存放于<form>节点中
- 单表(多个domain)数据提交
代码自动生成,修改表单元素布局即可。复制已生成domain各属性HTML DOM对象,以vo属性值标识当前所属记录。
注意:须保证HTML DOM元素存放于<form>节点中
- 多表(一个domain)数据提交
代码自动生成,修改表单元素布局即可。不同domain对象以vos属性值标识、对应HTML DOM元素属性vo属性值可不加考虑。
注意:须保证HTML DOM元素存放于<form>节点中
- 多表多domain数据提交
综合以上
(二) 修改
代码自动生成、修改表单元素布局即可。
(三) 保存
代码自动生成、修改表单元素布局即可。
(四) 删除
代码自动生成、修改表单元素布局即可。
(五) 查看
代码自动生成、修改表单元素布局即可。
(六) 查询
代码自动生成、修改表单元素布局即可。
- 分页条显示设置
1.grid中默认显示数据每页为15条,
2.自定义页显示数量,在QueryDomain节点中增加pagesize节点、数量,如:+" < pagesize>20</ pagesize> "
3. 当pagesize节点设置为 -1 时,对当前数据部采用分页显示,也不显示分页条
- 序号显示设置
1.grid中设置序号列显示表头的位置,及相关其他属性(注意必须设置到用户结果集表头前)
如:mygrid.setHeader("选择,序号,用户ID,用户账号,用户名称,创建时间");
2. 在QueryDomain节点中增加显示序号标志,默认不需要序号,即不添加+" <isIdx>true</isIdx> "
- 单元数据码名转换设置
在QueryDomain节点中增加optflds节点,并设置需要转换的属性和option名称,多个以逗号隔开。
格式如下: optionName@fieldName,optionName@fieldName
如:+" <flds> OrgOption@orgId,DocTypeOption@docType</flds> "
- 自定义查询js函数设置
系统中默认的js查询函数名称为go,可自行定义,在QueryDomain节点中增加jsFunction节点即可。也可以设置参数。如果一个页面涉及多个查询,多个grid时可以使用当前方式区别
如: +”<jsFunction>testgo<jsFunction>”
4.2、字符串获得XMLDOC对象方式
(须注意XML格式的规范性,不然不能获得XMLDOC对象)
1、由js脚步执行,遍历当前提交表单。获得用户数据,基于js脚本的字符串拼接操作构建XML格式数据。
2、将当前字符串对象赋值WMparamObject.js对象、其余不变
可供参考的列子example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function doxmlsave() { var ac = new WMaction(); var po = new WMparamObject(); var xmlStr = " <?xml version=\"1.0\" encoding=\"UTF-8\"?>" + " <root>" + " <vos id=\"UserDomain\"> " + " <vo> " + " <userName>测试20100816</userName>" + " <userAccount>test01</userAccount>" + " <userType>1</userType>" + " <passWord>123456</passWord>" + " <function>insertUser</function>" + " </vo> " + " </vos> " + " </root> " ; po.setXmlStr(xmlStr); po.setActionType( "0" ); po.setHitObjId( "hitDiv" ); po.setTextObjId( "textdiv" ); po.setIsasy( true ); po.setUrl(cps+ '/testAction.action?action=add' ); ac.setParamobj(po); ac.execute(); } |
5、XML数据节点说明
WMframework只需要将要提交到后端进行业务处理的数据打包成如下的XML文档提交到后台即可由后台的共用服务组件进行业务处理。
5.1、提交数据格式
节点结构
example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <? xml version=’1.0’ encoding=’UTF-8?> < root >--- 根节点 < vos id=”OaUser”> -- 数据对象domain的类名(不用加包路径,加已无所谓) < vo > < userName >测试用户</ userName > ---- 数据对象domain的一个属性值,对应页面元素的fieldname="userName" ,和元素的value < userAccount >demo</ userAccount > -- 同上 < password >123</ password > < userType >1</ userType > < departmentId >1</ departmentId > < function >insertUser</ function > -- 数据对象domain执行 </ vo > --同时提交多个相同的数据对象时 < vo > …. </ vo > < vo > …. </ vo > ….. </ vos > --同时提交多个不相同的数据对象时 < vos id=”OaUnit”> ….. </ vos > < vos id=”OaDoc”> ….. </ vos > …… </ root > |
5.2、后台返回数据处理
对于通常情况下主要业务的新增、删除、更新操作后直接调用父类,开发人员无需自定义相关后台处理(action、dao、service)等。操作成功:super.doWriteResponse(response, "1");操作失败:super.doWriteResponse(response, "0");
如当前需自定义扩展后台处理,需在继承ParentAction的基础上进行改写,并实现虚方法getData。具体可参考com.bizsys.web.UserAction的写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UserService userService = UserService.getInstance(); try { XmlMapping xm = new XmlMapping(); super .readXMLFromRequestBody(request); //获得请求数据xml List list = xm.parseXML2VoLists(DocumentHelper.parseText( super .xmls), true ); //获得业务数据对象集合 userService.insertObject((List)list.get( 0 )); //单个vos的操作 super .doWriteResponse(response, "1" ); //操作成功 } catch (Exception e) { e.printStackTrace(); //捕获异常,调试的时候用,运行后去掉 super .doWriteResponse(response, "0" ); //操作失败 throw e; //抛出异常 } return null ; } |
6、注意的问题
1) 现有数据表的映射对象已存放在 package com.ccs.govoa.domain 下,需要自行增加时请提交相关说明
2) 所有sqlmap必须全部存放在package com.ccs.govoa. mappings 下,sql中执行方法的<insert id="insertUser" parameterClass="user"> 名称必须全局(本系统内所有sqlmap)唯一,大小写敏感
3) <vos id="OaUser">节点的属性值id必须是domain对象的类名,大小写敏感
4) <function>insertUser</function> 必须对应sqlMap中执行中的方法名称,大小写敏感
5) 请严格按照系统开发流程制作每个模块
6) 请完全按照页面表单元素属性说明来添加自定义的属性、值
7) 业务后台类中不能写任何关闭当前连接(connect)的语句
8) 业务后台类中不能写任何开启事务,关闭事务的语句
9) 业务类中的异常可捕获调试,但必须向外仍出
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?