前台选中某些表,确定提交到后台,偶尔会报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. liniux Crontab 的重启和设置

    重启crontab,service cron restart 05 01 * * * /usr/local/php/bin/php FILE 10,30,50 * * * * /usr/local/p ...

  2. ASP.NET MVC 提高运行速度的几种性能优化方法

    主要介绍ASP.NETMVC 应用提速的六种方法,因为没有人喜欢等待,所以介绍几种常用的优化方法. 大家可能会遇到排队等待,遇到红灯要等待,开个网页要等待,等等等. 理所当然,没有人喜欢等待网页慢吞吞 ...

  3. 1006 Sign In and Sign Out (25)(25 point(s))

    problem At the beginning of every day, the first person who signs in the computer room will unlock t ...

  4. [ 转载 ] Mysql 数据库常用命令

    完整的创建数据库例子: >create database db_test default character set utf8 collate utf8_general_ci; >use ...

  5. QT学习笔记6:常见的 QGraphicsItem

    简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...

  6. 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】

    P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...

  7. 关于Vue的一些小技巧

    前言 用Vue开发一个网页并不难,但是也经常会遇到一些问题,其实大部分的问题都在文档中有所提及,再不然我们通过谷歌也能成功搜索到问题的答案,为了帮助小伙伴们提前踩坑,在遇到问题的时候,心里大概有个谱知 ...

  8. Maven项目META-INF文件夹不存在的问题

    直接在resources文件夹下新建META-INF文件夹即可. 参考: https://my.oschina.net/KingPan/blog/750159 https://stackoverflo ...

  9. Shell中EOF内容转义

    1.在$符号前面加反斜杠,如: cat > test.sh <<EOF \$test EOF 如果不加,将转成实际的值. 2.给EOF加个双引号,如: cat > test.s ...

  10. Apache的443端口被占用解决方法(转)

    今天想做PHP程序,结果启动Apache的时候控制台报443端口被占用.原因是我的虚拟机VMware占用443端口用于连接远程服务器的.其实出现这些状况很正常.因为不同的程序很有可能同时需要一个端口维 ...