ajax与java前后台传值及数据表查询解决一个bug的问题
前台选中某些表,确定提交到后台,偶尔会报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的问题的更多相关文章
- 在数据表中添加一个字段的SQL语句怎么写
如果要在数据表中添加一个字段,应该如何表示呢?下面就为您介绍表添加字段的SQL语句的写法,希望可以让您对SQL语句有更深的认识. 通用式: alter table [表名] add [字段名] 字 ...
- clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据. 这是一个bug 哈哈
- Java基础_0311: 数据表与简单Java类映射
数据表与简单Java类映射 现在假设有如下的关系表,现在要求实现如下的数据关联操作: 一个部门有多个雇员: 一个雇员有一个或零个领导 代码实现 class Dept { private int dep ...
- 图书管理系统(Java实现,十个数据表,含源码、ER图,超详细报告解释,2020.7.11更新)
图书管理系统数据库设计实验报告 文章目录 更新日志 1.概述 2.需求分析 2.1需要实现的功能 2.2业务流程图 2.2.1学生流程图 2.2.2管理员流程图 2.2.3超级管理员流程图 2.3功能 ...
- 使用java生成备份sqlserver数据表的insert语句
针对sqlserver数据表的备份工具很多,有时候条件限制需要我们自己生成insert语句,以便后期直接执行这些插入语句.下面提供了一个简单的思路,针对mysql或oracle有兴趣的以后可以试着修改 ...
- MySQL数据表查询操作
准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...
- MySQL数据表查询操
准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...
- Android实战简易教程-第二十五枪(基于Baas的数据表查询下拉刷新和上拉载入实现!)
上一节我们实现了数据表的载入,可是,当数据表数据非常多时.我们就要考虑数据的分页.这里我们选用了PullToRefreshListView控件,先看一下该控件的说明: 效果图: ...
- SqlServer2005 海量数据 数据表分区解决难题
超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算.而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长.这不但影响着数据库的运行效率,也增大数据库的维护难度.除了表的数据量外,对表 ...
随机推荐
- BoneBlack am335x利用SD卡烧写板卡上的emmc
参考ti论坛上面的一篇文章: 链接:https://pan.baidu.com/s/1SLSUbCRrIULJJf_BNI3sEQ 密码: hvem 自己稍微修改的debrick.sh 链接: htt ...
- 【基础知识】.Net基础加强 第四天
一. 显示实现接口 1. 显示实现接口的目的:为了解决法方法重名的问题. 2. 显示实现接口必须是私有的,不能用public 3. (复习)类中成员不写访问修饰符默认是private:类如果不写访问修 ...
- [ 原创 ]学习笔记-做一个Android音乐播放器是遇到的一些困难
最近再做一个安卓的音乐播放器,是实验室里学长派的任务,我是在eclipse上进行开发的,由于没有android的基础,所以做起来困难重重. 首先是布局上的困难 1.layout里的控件属性不熟悉 2. ...
- php最简单最基础入门笔记
偶然翻到之前刚学php时记录的笔记,特此分享给大家,希望对初学者有所帮助. php网页命名不支持中文 isset($abc) 判断变量是否被定义 empty($abc) 判断变量是否为空 u ...
- [BZOJ 4591] 超能粒子炮-改
Link: 传送门 Solution: 记录一下推$\sum_{i=0}^k C_n^i$的过程: 其实就是将相同的$i/p$合起来算,这样每个里面都是一个可以预处理的子问题 接下来递归下去算即可 T ...
- wdcp(WDlinux Control Panel) 快速安装RPM包,lanmp一件安装
lanmp一键安装包是wdlinux官网2010年开始推出的lamp,lnmp,lnamp(apache,nginx,php,mysql,zend,eAccelerator,pureftpd)应用环境 ...
- poj 2777 线段树 区间更新+位运算
题意:有一个长板子,分成多段,有两种操作,第一种是C给从a到b那段染一种颜色c,另一种是P询问a到b有多少种不同的颜色.Sample Input2 2 4 板长 颜色数目 询问数目C 1 1 2P ...
- 读书笔记_Effective_C++_条款三十八:通过复合塑模出has-a或者is-implemented-in-terms-of
如果说public是一种is-a的关系的话,那么复合就是has-a的关系.直观来说,复合就是在一个类中采用其他类的对象作为自身的成员变量,可以举个例子,像下面这样: class Person { pr ...
- 【原】MyBatis执行DDL:create table,drop table等等
[前言] 对MyBatis一直停留在仅仅会用的阶段,常用的场景就是通过MyBatis对表数据进行DML(insert, delete, update等)操作,从来没有想过通过MyBatis对数据库 进 ...
- MacBook pro new 触控板手势及快捷键
MacBook pro new 触控板手势: 显示桌面: 拇指+三指 向外张开 launchpad: 拇指+三指 向中间集中 正在运行的窗口:三指向上 应用浏览: 三指向下 窗口信息: 三指点 ...