前台选中某些表,确定提交到后台,偶尔会报500错误,通过排查发现:由于后台代码写的不严谨,导致前台选中的表名如果全不存在的话就会导致后台走异常报500错误,所以决定在前台先对数据进行一次过滤,使至少有一个表名存在的话才会去走跳转语句。数据过滤成功之后再去请求下载的方法。下面相关代码记录:

1、此处获取所有选中复选框的id。

function getCheckbox(){
var checkbox = $('.un-p-l input'),
len = checkbox.length,
checkboxStr = '';
for(var i = ; i < len; i++){
if(checkbox.eq(i).prop("checked")){
checkboxStr += checkbox.eq(i).val() + ',';
}
}
return checkboxStr.substring(,checkboxStr.length - );
}

2、把选中的复选框的id值传给后台。

function AcceptClick(){
var checkboxStr = getCheckbox();
if($.checkSession()){
$.ajax({
url:'${basePath}/dict/logConfigAction_validatorBackUp.do',
datatype:"text",
async:true,
data:{
'checkbox':checkboxStr
},
success:function(responseText){
var obj = eval("(" + responseText + ")");
if(obj.result == "success"){
var $form = $("#backupForm") ;
var action = "";
try {
action = $form.attr("action");
$form.attr("action","${basePath}/dict/logConfigAction_backup.do").submit();
}finally{
$form.attr("action",action);
}
}else{
dialogMsg("选中的表名全不存在,无法备份!",-);
}
}
});
}
}

3、java后台获取值,内部操作并返回给前台

public void validatorBackUp(){
log.info("备份校验-BEGIN");
this.msg=RESULT_FAIL;
String[] logConfigIdsArr = getRequest().getParameter("checkbox").split(",");//获取前台传过来的值,并拆分成数组
List<String> successName = new ArrayList<String>();
List<LogConfig> logConfigList = logConfigService.queryByIds(logConfigIdsArr);//通过id去查找表名
List<LogConfig> logConfigNewList = new ArrayList<LogConfig>();
if(!logConfigList.isEmpty()){
for(LogConfig LogConfig: logConfigList){
LogConfig logConfigTemp = new LogConfig();
logConfigTemp.setName(MessageUtils.getMessage(LogConfig.getName()));
logConfigTemp.setTableName(LogConfig.getTableName());
logConfigNewList.add(logConfigTemp);
successName.add(MessageUtils.getMessage(LogConfig.getName()));
}
}
boolean tableFlag = logConfigService.tableExits(logConfigNewList,schemaName.toLowerCase());
if(tableFlag){
this.msg=RESULT_SUCCESS;
}else{
this.msg="tableNameFail";
}
print("{result: '"+ this.msg +"'}");
}

queryByIds方法在service层:

public class LogConfigServiceImpl extends BaseServiceImpl<LogConfig> implements LogConfigService {
……
public List<LogConfig> queryByIds(String[] ids) {
return logConfigDao.queryByIds(ids);
}
……
}

dao层里的queryByIds:

public class LogConfigDaoImpl extends BaseDaoImpl<LogConfig> implements LogConfigDao {
……
public List<LogConfig> queryByIds(String[] ids) {
String hql = "from " + this.clazz.getName() + " this where this.id in:ids";
//hql:from com.vrv.cems.dict.domain.LogConfig this where this.id in:ids
return getSession().createQuery(hql).setParameterList("ids", ids).list();
}
……
}

返回的数据就是:

经过循环处理之后,我们只需要数据里的:name和tableName

4、查询表,返回给java方法的值。logConfigService.tableExits代表service层的tableExits方法:

public boolean tableExits(List<LogConfig> logConfigList,String schemaName ) {
List<Object[]> li = null;
List<String> l = new ArrayList<String>();
if(logConfigList.size()>){
for(LogConfig logConfig : logConfigList){
l.add(logConfig.getTableName().trim());
}
li = logConfigDao.queryLogTableByTableNames(l,schemaName);
}
if(li != null && li.size() > ){
return true;
}else{
return false;
}
}

经过循环处理,l只需要它的tableName

5、采用in查询查询表的方法:logConfigDao.queryLogTableByTableNames,dao层的queryLogTableByTableNames方法

  @Override
public List<Object[]> queryLogTableByTableNames(List tableNames,String schemaName) {
StringBuilder sql=new StringBuilder();
Map<String,Object> paraMap=new HashMap<String, Object>();//paraMap:{}
sql.append(" select COLUMN_NAME,DATA_TYPE FROM information_schema.COLUMNS WHERE table_name IN (:tableNames) and table_schema =:schemaName");
       //sql:select COLUMN_NAME,DATA_TYPE FROM information_schema.COLUMNS WHERE table_name  IN (:tableNames) and table_schema =:schemaName
paraMap.put("tableNames", tableNames);
paraMap.put("schemaName", schemaName);
       //paraMap:{schemaName=cems, tableNames=[cems_log_device_openlog, cems_log_device_clientLog, cems_log_device_clientLog, cems_log_device_clientLog]}
Query q =getSession().createSQLQuery(sql.toString());
q = assignValues(q, paraMap);
return q.list();
}
public Query assignValues(Query query, Map<String, ?> values) {
if (values != null) {
  Set<String> keySet = values.keySet();
  for (String string : keySet) {
    Object obj = values.get(string);
    if (obj instanceof Collection<?>) {
      query.setParameterList(string, (Collection<?>) obj);
    } else if (obj instanceof Object[]) {
      query.setParameterList(string, (Object[]) obj);
    } else {
      query.setParameter(string, obj);
    }
  }
}
return query;
}

通过in查询li获取的值是很多字段,如果查询到的话;如果没查询到就返回的都是空

最后在service层通过判断返回逻辑值给action层,action层再通过逻辑值确定返回值给前台。

action层:service层和dao层:

ajax与java前后台传值及数据表查询解决一个bug的问题的更多相关文章

  1. 在数据表中添加一个字段的SQL语句怎么写

    如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识.   通用式: alter table [表名] add [字段名] 字 ...

  2. clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈

    clientdataset 读取excel   如果excel 文件不存在的时候   相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据.   这是一个bug 哈哈

  3. Java基础_0311: 数据表与简单Java类映射

    数据表与简单Java类映射 现在假设有如下的关系表,现在要求实现如下的数据关联操作: 一个部门有多个雇员: 一个雇员有一个或零个领导 代码实现 class Dept { private int dep ...

  4. 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)

    图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...

  5. 使用java生成备份sqlserver数据表的insert语句

    针对sqlserver数据表的备份工具很多,有时候条件限制需要我们自己生成insert语句,以便后期直接执行这些插入语句.下面提供了一个简单的思路,针对mysql或oracle有兴趣的以后可以试着修改 ...

  6. MySQL数据表查询操作

    准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...

  7. MySQL数据表查询操

    准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...

  8. Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉载入实现!)

    上一节我们实现了数据表的载入,可是,当数据表数据非常多时.我们就要考虑数据的分页.这里我们选用了PullToRefreshListView控件,先看一下该控件的说明: 效果图:            ...

  9. SqlServer2005 海量数据 数据表分区解决难题

    超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算.而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长.这不但影响着数据库的运行效率,也增大数据库的维护难度.除了表的数据量外,对表 ...

随机推荐

  1. bzoj4668: 冷战 并查集按秩合并

    题目链接 bzoj4668: 冷战 题解 按秩合并并查集,每次增长都是小集合倍数的两倍以上,层数不超过logn 查询路径最大值 LCT同解 代码 #include<bits/stdc++.h&g ...

  2. Makefile-fPIC,C++静态库与动态库

    在计算机领域中,地址无关代码 (英文: position-independent code,缩写为PIC),又称地址无关可执行文件 (英文: position-independent executab ...

  3. 【10.9校内练习赛】【搜索】【2-sat】【树链剖分】【A_star k短路】【差分约束+判负环】

    在洛谷上复制的题目! P3154 [CQOI2009]循环赛 题目描述 n队伍比赛,每两支队伍比赛一次,平1胜3负0. 给出队伍的最终得分,求多少种可能的分数表. 输入输出格式 输入格式: 第一行包含 ...

  4. NOIP 2002提高组 选数 dfs/暴力

    1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...

  5. PHP self与static区别

    this,static和self. self和this还是很好区分的,可是self和static就很糊涂了,两者都能调用静态的方法和属性,看似使用上没有什么太大的分别,但是实际上分别很大,先来看下面这 ...

  6. Syncthing vs BitTorrent Sync

    Syncthing 是一款跨平台的文件同步工具.即你在一台设备上创建.修改或删除文件,在其他设备上会同步执行相同的操作.Syncthing 不会将你的数据上传到云端,而是在你的多台设备同时在线时对指定 ...

  7. 将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

    公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够 ...

  8. thread_indent

    http://blog.csdn.net/justlinux2010/article/details/10269033

  9. MYSQL 源码- 淘宝数据库研发组

    http://mysql.taobao.org/index.php?title=%E8%B5%84%E6%96%99%E5%85%B1%E4%BA%AB

  10. 浅析OpenGL光照

    浅析OpenGL光照 之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有 ...