利用strut2标签自动生成form前端验证代码,使用到的技术有
1.struts2标签,如<s:form> <s:textfieled>
2.struts2读取*Validation.xml文件(*为Action名字),
org.apache.struts2.components.Form.findFieldValidators(String name, Class actionClass, String actionName, List<Validator> validatorList, List<Validator> retultValidators, String prefix)
这是在freemarker解析form-close.ftl文件(<#assign validators=tag.getValidators("${tagName}")>)是调用的,获取关于某个输入控件的所有验证,如非空验证/长度验证
3.在void org.apache.struts2.components.UIBean.evaluateParams()方法中,会解析Form标签下的所有输入控件标签,
如<s:textfield>,<s:textarea>,主要是得到输入控件的name属性值,并存放在Map<String, Object> org.apache.struts2.components.Component.parameters这个属性中(Form.java继承与Component),
4.Freemarker解析form-close.ftl文件,主要做的工作是
遍历Map<String, Object> org.apache.struts2.components.Component.parameters字段,得到某个输入控件的tagName,
通过调用Form.findFieldValidators得到关于该输入控件的所有验证(如非空/长度/范围等)
5.解析form-close.ftl可能生成的代码如下形式,使用了jquery-validation插件:
---------------------------------开始------------------------------------------
</form>
<script type="text/javascript">$(function() { //最大提示信息数 var maxTips = 10; // validate form on keyup and submit var formElement = $("#submitDeviceManagementAdd"); //是否正在提交 var isSubmitting = false; formElement.validate({ rules: { "device.dimensionNo":{ trim:'true', minlength:1, maxlength:20 ,customValidation: true } ,"device.assetsNo":{ trim:'true', minlength:1, maxlength:25 ,customValidation: true } ,"device.buildingName":{ required: true, minlength:0 ,customValidation: true } ,"device.brandName":{ required: true, minlength:0 , trim:'true', minlength:1, maxlength:50 ,customValidation: true } ,"device.deviceModel":{ required: true, minlength:0 , trim:'true', minlength:1, maxlength:128 ,customValidation: true } ,"device.ipv4":{ trim:'true', minlength:1, maxlength:200 ,customValidation: true } ,"device.macAddress":{ trim:'true', minlength:1, maxlength:128 ,customValidation: true } ,"device.remark":{ trim:'true', minlength:1, maxlength:2000 ,customValidation: true } }, messages: { "device.dimensionNo":{ minlength:"二维码编号的长度只能是1到20个字符!", maxlength:"二维码编号的长度只能是1到20个字符!" ,customValidation: '_customValidationMessage' } ,"device.assetsNo":{ minlength:"固定资产编号的长度只能是1到25个字符!", maxlength:"固定资产编号的长度只能是1到25个字符!" ,customValidation: '_customValidationMessage' } ,"device.buildingName":{ required: "使用单位是必填项!" ,customValidation: '_customValidationMessage' } ,"device.brandName":{ required: "品牌是必填项!" , minlength:"品牌的长度只能是1到25个字符!", maxlength:"品牌的长度只能是1到25个字符!" ,customValidation: '_customValidationMessage' } ,"device.deviceModel":{ required: "设备型号是必填项!" , minlength:"设备型号的长度只能是1到128个字符!", maxlength:"设备型号的长度只能是1到128个字符!" ,customValidation: '_customValidationMessage' } ,"device.ipv4":{ minlength:"IP地址的长度只能是1到100个字符!", maxlength:"IP地址的长度只能是1到100个字符!" ,customValidation: '_customValidationMessage' } ,"device.macAddress":{ minlength:"MAC地址的长度只能是1到128个字符!", maxlength:"MAC地址的长度只能是1到128个字符!" ,customValidation: '_customValidationMessage' } ,"device.remark":{ minlength:"备注的长度只能是1到1000个字符!", maxlength:"备注的长度只能是1到1000个字符!" ,customValidation: '_customValidationMessage' } }, errorPlacement: function(error, element) { // Set positioning based on the elements position in the form var elem = $(element); if (elem.attr('type') == 'hidden') { var widgetName = elem.attr('name') + '_widget'; elem = elem.next("input[name=" + widgetName + "]"); } // Check we have a valid error message if(!error.is(':empty')) { elem.addClass('add_error_border'); var show = elem.qtip('api') != undefined; // Apply the tooltip only if it isn't valid elem.filter(function() { if ($(this).hasClass('ui-autocomplete-input') || !$(this).hasClass('valid')) { $(this).removeClass('valid'); return true; } else return false; }).qtip({ overwrite: false, content: error, position: { my: 'left bottom', at: 'right top' }, show: { event: 'mouseenter', ready: true, persistent: false }, hide: false, style: { classes: 'ui-tooltip-red' // Make it red... the classic error colour! }, events: { show: function(event, api) { var currentTips = formElement.data('currentTips'); if (typeof currentTips == 'undefined') { currentTips = 0; } if (++currentTips <= maxTips) { formElement.data('currentTips', currentTips); _timer.call(api.elements.tooltip, event); } else { return false; } }, hide: function(event, api) { var currentTips = formElement.data('currentTips'); if (typeof currentTips != 'undefined') { if (--currentTips < 0) { currentTips = 0; } formElement.data('currentTips', currentTips); } } } }) // If we have a tooltip on this element already, just update its content .qtip('option', 'content.text', error); if (show) { elem.qtip('show'); } } // If the error is empty, remove the qTip else { if(elem.hasClass('add_error_border')){ elem.toggleClass('add_error_border'); } elem.qtip('destroy'); formElement.data('currentTips', 0); } }, success: $.noop, // Odd workaround for errorPlacement not firing! submitHandler: function(form) { if (isSubmitting) { alert("请勿重复提交表单!"); } else { isSubmitting = true; form.submit(); } }, focusInvalid: false, debug: false }); $.validator.addMethod("trim", function(value, element, params) { if (params.trim === 'true') { $(element).val($.trim($(element).val())); } return true; }); $.validator.addMethod("customValidation", function(value, element, params) { var result = true; return true; }); });</script>
---------------------------------结束---------------------------------------------

转载于:https://www.cnblogs.com/wenwujuncheng/p/3558989.html

利用strut2标签自动生成form前端验证代码相关推荐

  1. php识别名片,用户信息名片怎么利用PHP实现自动生成

    用户信息名片怎么利用PHP实现自动生成 发布时间:2020-12-10 14:29:56 来源:亿速云 阅读:70 作者:Leah 本篇文章为大家展示了用户信息名片怎么利用PHP实现自动生成,内容简明 ...

  2. 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...

    解决问题: 可利用MyBatis生成器自动生成实体类.DAO接口和Mapping映射文件. 测试环境准备: 新建一个mysql数据库,例如mungerzTest. 生成一张主键为自增ID的学生表: C ...

  3. python的api库_python 利用toapi库自动生成api

    在学习做接口测试自动化的时候,我们往往会自己动手写一些简单的API,比如写一个简单的TODO API之类. 不过自己写API的时候经常需要造一些假数据,以及处理分页逻辑,开始的时候还觉得比较有意思,但 ...

  4. html HTML1300 进行了导航,jquery根据文章H标签自动生成导航目录

    jquery根据文章H标签自动生成导航目录2017-11-19 20:57 在一些旅游网站,比如说途牛.携程这些,当你看某条线路的详情页时,右边会有相应的第一天.第二天等的目录. 这么大的网站,不可能 ...

  5. 利用ApacheCXF自动生成webservice的客户端代码

    利用ApacheCXF自动生成webservice的客户端代码 一.环境准备 1.JDK环境 2.下载apache-cxf发布包,举例版本为3.2.14,解压发布包,设置CXF_HOME,并添加%CX ...

  6. 根据文章中H标签自动生成文章目录

    以前看到csdn上的目录结构就想把它移植到博客里,今天抽了个空从csdn上拔下了代码. js代码,复制放入到single.php页面中 <script type="text/javas ...

  7. 根据H标签自动生成多级目录

    根据H标签自动生成多级目录 这个问题分为两步 将标签的层级关系生成树结构 递归遍历树结构,使用ol li嵌套生成多级目录 <h2>一级标题1</h2> 1. 一级标题1 < ...

  8. 根据文章H标签自动生成导航目录

    原文地址http://www.santii.com/article/154.html 在一些旅游网站,比如说途牛.携程这些,当你看某条线路的详情页时,右边会有相应的第一天.第二天等的目录. 这么大的网 ...

  9. 长篇文章根据文章H标签自动生成导航目录方法

    在一些旅游网站,比如说途牛.携程这些,当你看某条线路的详情页时,右边会有相应的第一天.第二天等的目录. 这么大的网站,不可能后台添加行程的时候,每一天都要自动写一个目录吧! 所以应该是自动生成的. 那 ...

最新文章

  1. java 创建 HMAC 签名
  2. java小编程----str中没有内容
  3. jsonp-反向代理-CORS解决JS跨域问题的个人总结
  4. a article test
  5. STM32那点事(5)_ADC(下)
  6. 云小课 | 详解华为云独享型负载均衡如何计费
  7. spark学习-61-源代码:ShutdownHookManager虚拟机关闭钩子管理器
  8. 任务二十九:表单(一)单个表单项的检验
  9. CCF201412-1 门禁系统(100分)
  10. Python之Numpy操作基础
  11. 华硕M2A-VM+AMD4000超频方法
  12. 手机关闭浏览器html,如何解除手机浏览器网页限制?
  13. 计算机操作系统32位,电脑操作系统中32位和64位到底有哪些区别
  14. Python课堂作业(用于复习)
  15. 给女朋友写的简单的公众号推送信息程序
  16. SQL语句在Mysql中是如何被执行的?
  17. Gitlab 访问报错403 Forbidden
  18. [深度学习] PyTorch 实现双向LSTM 情感分析
  19. 自适应控制---模型参考自适应控制(一)基于局部参数最优化的设计方法(MIT方案)
  20. 笨拙的手指 代码优化版

热门文章

  1. Flutter State生命周期 Flutter Widget生命周期 Flutter 应用程序生命周期
  2. Android 自定义View绘制的基本开发流程 Android自定义View(二)
  3. Springboot02配制jsp
  4. (八)Locust 设置断言
  5. 【JAVA多线程】interrupted() 和 isInterrupted() 的区别
  6. Win8Metro(C#)数字图像处理--2.31灰度拉伸算法
  7. Tinker 热修复框架模拟使用
  8. 数学思想 —— 对称性思维
  9. poj 3411 Paid Roads (dfs)
  10. [Vue.js]实战 -- 电商项目(八)