之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断。

  再次介绍一下背景需求: 

利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件
1、是否选择学院。
2、数据库里是否已存在该课程代码。
3、多条数据添加时,界面是否有重复的课程代码。

  实现方法如下:

  

     //遍历code数组是否有重复值
ArrayList<String> arrCode=new ArrayList<String>();
//遍历Name数组是否有重复值
ArrayList<String> arrName=new ArrayList<String>();
for (int i = 0; i < courseList.size(); i++) {
//获得当前course实体
Course course = courseList.get(i); // 根据学院ID获得学院Code
String code = courseService.getCollegeById(collegeId)
.getInstitutionCode();
// 设置课程codeBuffer=学院code+课程code
StringBuffer codeBuffer = new StringBuffer();
codeBuffer.append(code);
codeBuffer.append(course.getCode()); // arrCode.add(StringBuffer codeBuffer.toString());
arrCode.add(codeBuffer.toString());
arrName.add(course.getName());
}
//-------------------------分割线:判断是否有重复值的hashSet方法-----------------------------
//----------------------------------start------------------------------------------------------------
// HashSet<String> hashSet = new HashSet<String>();
// List<String> newlist = new ArrayList<String>();
// for (Iterator iterator = arrCode.iterator(); iterator.hasNext();) {
// String element = (String) iterator.next();
// if (hashSet.add(element)) {
// newlist.add(element);
// }
// }
// // arrCode.clear(); //如果需要把新的list付给就的list就需要这部分代码,目前不需要
// // arrCode.addAll(newlist);
// if (newlist.size()!=arrCode.size()) {
// outMsg(AjaxObject.newError("课程代码不能重复!").setNavTabId("course_add").toString());
// }
//----------------------------------end------------------------------------------------------------
//-------------------------分割线:判断是否有重复值的hashSet方法----------------------------- //----------------------------分割线:借助第三个List遍历出重复数据-----------------------------------
// 记录重复数据
List<String> cflist = new ArrayList<String>();
List<String> cflist2 = new ArrayList<String>();
// 复制一个list
List<String> blist = arrCode;
List<String> blist2 = arrName;
//判断code
for (int i = 0; i < arrCode.size(); i++) {
boolean b = false;
String mk = common.tool.constant.CommonConstant.ADD_FAIL+"课程代码第" + (i + 1) + "条数据和第";
for (int j = 0; j < blist.size(); j++) {
// 不和本身比较
if (j != i) {
// 找到相同的值
if (arrCode.get(i).equals(blist.get(j))) {
// 不存在重复数据
if (!cflist.isEmpty()) {
boolean bo = true;
// 遍历重复数据集
for (int k = 0; k < cflist.size(); k++) {
// 取出第k行的重复数据
String[] cf = cflist.get(k).toString().split("-");
// 取出第k行的第二个索引(复制数据的索引+1)
int s = Integer.parseInt(cf[1].toString());
// 比较当前顺序和重复中的顺序,如果相等则标记为false
if (s == (i + 1)) {
bo = false;
}
}
// 判断是否添加到重复数据集中(true表示重复数据集里面不存在该数据,false反之)
if (bo) {
cflist.add((i + 1) + "-" + (j + 1));
if (b) {
mk += ",";
}
mk += (j + 1);
// 记录重复数据时修改b的值,表示和第i行和第j行存在重复数据
b = true;
}
} else {
// 记录重复的数据,格式为2-3(第一个数字为原重复数据的索引+1,第二个为复制数据的索引+1)
cflist.add((i + 1) + "-" + (j + 1));
mk += (j + 1);
b = true;
}
}
}
}
mk += "条数据重复,重复值:" + arrCode.get(i);
if (b) {
outMsg(AjaxObject.newError(mk).setNavTabId("course_add").toString()); System.out.println(mk);
return;
}
}
//判断name
for (int i = 0; i < arrName.size(); i++) {
boolean b = false;
String mk = common.tool.constant.CommonConstant.ADD_FAIL+"课程名称第" + (i + 1) + "条数据和第";
for (int j = 0; j < blist2.size(); j++) {
// 不和本身比较
if (j != i) {
// 找到相同的值
if (arrName.get(i).equals(blist2.get(j))) {
// 不存在重复数据
if (!cflist2.isEmpty()) {
boolean bo = true;
// 遍历重复数据集
for (int k = 0; k < cflist2.size(); k++) {
// 取出第k行的重复数据
String[] cf = cflist2.get(k).toString().split("-");
// 取出第k行的第二个索引(复制数据的索引+1)
int s = Integer.parseInt(cf[1].toString());
// 比较当前顺序和重复中的顺序,如果相等则标记为false
if (s == (i + 1)) {
bo = false;
}
}
// 判断是否添加到重复数据集中(true表示重复数据集里面不存在该数据,false反之)
if (bo) {
cflist2.add((i + 1) + "-" + (j + 1));
if (b) {
mk += ",";
}
mk += (j + 1);
// 记录重复数据时修改b的值,表示和第i行和第j行存在重复数据
b = true;
}
} else {
// 记录重复的数据,格式为2-3(第一个数字为原重复数据的索引+1,第二个为复制数据的索引+1)
cflist2.add((i + 1) + "-" + (j + 1));
mk += (j + 1);
b = true;
}
}
}
}
mk += "条数据重复,重复值:" + arrName.get(i);
if (b) {
outMsg(AjaxObject.newError(mk).setNavTabId("course_add").toString()); System.out.println(mk);
return;
}
} //----------------------------分割线:借助第三个List遍历出重复数据-----------------------------------

  具体的实现思路就是将获取到实体List的code取出来,放在一个List里。第一种方法是借助hashSet来完成,因为如果遍历存放代码的CodeList,将它放进hashSet里,HashSet遇到相同的值,就只会添加一条。所以最后比较HashSet的长度和CodeList的长度,如果长度不一样,说明有重复值。第二种方法是利用第三方的List来遍历比较,通过这种方法的好处是一旦出现重复值,我们可以获取到他的索引,可以友好的提示用户,到底批量添加的哪一行和哪一行重复了,重复的值是什么,以方便用户查找修改,充分体现了全心全意为人民服务的宗旨。

   以下是效果展示:

          

DWZ主从表界面唯一性验证(后台验证)(三)的更多相关文章

  1. DWZ主从表界面唯一性验证(自写js)(二)

    上篇介绍了自写js判断的前三项,本篇博客介绍第四步,关于触发课程代码文本框的离开事件后,判断一整列的课程代码之间是否有重复的值. 此问题可以提取为判断一个数组里是否有重复值,重复值是什么. 第四步→判 ...

  2. DWZ主从表界面唯一性验证(自写js)(一)

    最近在项目中遇到一个问题,它的需求是: 利用DWZ的主从表结构批量添加课程信息,需要在触发课程代码文本框的离开事件时验证: 1.是否选择学院. 2.数据库里是否已存在该课程代码. 3.多条数据添加时, ...

  3. 代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能

    在代码生成工具的各种功能规划中,我们一向以客户的需求作为驱动,因此也会根据需要增加一些特殊的功能或者处理.在实际的开发中,虽然我们一般以具体的表进行具体业务开发,但是有些客户提出有时候视图开发也是很常 ...

  4. 表单数据验证方法(二)——ASP.NET后台验证

    昨天写了一下关于如何在前台快捷实现表单数据验证的方法,今天接着昨天的,把后台实现数据验证的方法记录一下.先说明一下哈,我用的是asp.net,所以后台验证方法也是基于.net mvc来做的. 好了,闲 ...

  5. (5)表单Action后台验证

    /day31/src/cn/itcast/web/struts2/user/UserAction.java package cn.itcast.web.struts2.user; import com ...

  6. (转)jquery.validate.js 的 remote 后台验证

    之前已经有一篇关于jquery.validate.js验证的文章,还不太理解的可以先看看:jQuery Validate 表单验证(这篇文章只是介绍了一下如何实现前台验证,并没有涉及后台验证remot ...

  7. 自制“低奢内”CSS3注册表单,包含JS验证哦。请别嫌弃,好吗?。

    要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识.和JS/JQuery基本语法. 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到 ...

  8. Struts2快速后台验证 使用

    为了和前台基于JavaScript的开源验证框架RapidValidation使用统一的验证规则, 最大限度的减少重复的后台验证代码, 使用方式简便, 扩展方便. https://blog.csdn. ...

  9. 第一百五十四节,封装库--JavaScript,表单验证--提交验证

    封装库--JavaScript,表单验证--提交验证 将表单的所有必填项,做一个判断函数,填写正确时返回布尔值 最后在提交时,判断每一项是否正确,全部正确才可以 提交 html <div id= ...

随机推荐

  1. [转]JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

    关于获取类的字段有两种方式:getFields()和getDeclaredFields().我们先来看看这两者的区别吧: getFields():获得某个类的所有的公共(public)的字段,包括父类 ...

  2. TP v5中环境变量在项目中的应用

    环境变量,顾名思义就是在不同的系统环境,同一个变量的值可以有所不同. 如开发环境.测试环境与正式环境下,数据库配置.静态资源文件Url前缀.缓存.各种key等配置都不相同,对于提交到仓库中的代码,理论 ...

  3. win10 tensorflow python3*,Multiprocessing using fit_generator(pickle_safe=True) fail问题解决

    由于WIN版本的tensorflow使用 fit_generator时候,出现错误,但是mac 不会出现, 所以的解决方法就是https://github.com/fchollet/keras/iss ...

  4. 设置一个按钮为一个图片,不要border

    //设置一个按钮为一个图片,不要border ImageIcon searchIcon = ImageToolkit.loadImageIcon(/search.png"); ImageIc ...

  5. Linux sed命令替换文件文件内容

    sed在Linux下是个强大的工具,这里主要说替换: 1.替换并输出(不修改源文件): sed 's/dog/cat/g' file ##dog被替换的内容,cat替换的内容 2.备份后直接替换至源文 ...

  6. genymotion 前端调试

    1. genymotion的安装见这里 注: a. 要先装VirtualBox, 再装genymotion b. VirtualBox不能太高,我装的是VirtualBox-4.1.40-101594 ...

  7. python里面有人写while 循环用 用while 1 和while True的区别

    由于Python2中,True/False不是关键字,因此我们可以对其进行任意的赋值,这就导致程序在每次循环时都需要对True/False的值进行检查:而对于1,则被程序进行了优化,而后不会再进行检查 ...

  8. ASP.NET Core 2.0使用Log4net实现记录日志功能

    一.安装Log4net 1.使用Nuget包进行安装 在依赖项上面右键,选择“管理NuGet程序包”,如下图所示: 在浏览界面输入log4net,然后点击安装,如下图所示: 2.使用程序包管理器控制台 ...

  9. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

    启动两个client,过了一会,停了其中一个,访问注册中心时,界面上显示了红色粗体警告信息: 查阅了很多资料,终于了解了中间的问题.现将理解整理如下: Eureka server和client之间每隔 ...

  10. 解决同时共用MOB公司的shareSDK和SMSSDK的冲突问题

    现在mob的SDK版本升级到3.0,跟之前的版本不兼容,尤其是在 同时使用shareSDK和SMSSDK的时候会发生冲突,报NoSuchMethodException的错误. 只需要将所有的jar包和 ...