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来计算.而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长.这不但影响着数据库的运行效率,也增大数据库的维护难度.除了表的数据量外,对表 ...
随机推荐
- liniux Crontab 的重启和设置
重启crontab,service cron restart 05 01 * * * /usr/local/php/bin/php FILE 10,30,50 * * * * /usr/local/p ...
- ASP.NET MVC 提高运行速度的几种性能优化方法
主要介绍ASP.NETMVC 应用提速的六种方法,因为没有人喜欢等待,所以介绍几种常用的优化方法. 大家可能会遇到排队等待,遇到红灯要等待,开个网页要等待,等等等. 理所当然,没有人喜欢等待网页慢吞吞 ...
- 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 ...
- [ 转载 ] Mysql 数据库常用命令
完整的创建数据库例子: >create database db_test default character set utf8 collate utf8_general_ci; >use ...
- QT学习笔记6:常见的 QGraphicsItem
简述 QGraphicsItem 类是 QGraphicsScene 中所有 item 的基类. 它提供了一个轻量级的基础,用于编写自定义 item.其中包括:定义 item 的几何形状.碰撞检测.绘 ...
- 【洛谷】4304:[TJOI2013]攻击装置【最大点独立集】【二分图】2172: [国家集训队]部落战争【二分图/网络流】【最小路径覆盖】
P4304 [TJOI2013]攻击装置 题目描述 给定一个01矩阵,其中你可以在0的位置放置攻击装置. 每一个攻击装置(x,y)都可以按照“日”字攻击其周围的8个位置(x-1,y-2),(x-2,y ...
- 关于Vue的一些小技巧
前言 用Vue开发一个网页并不难,但是也经常会遇到一些问题,其实大部分的问题都在文档中有所提及,再不然我们通过谷歌也能成功搜索到问题的答案,为了帮助小伙伴们提前踩坑,在遇到问题的时候,心里大概有个谱知 ...
- Maven项目META-INF文件夹不存在的问题
直接在resources文件夹下新建META-INF文件夹即可. 参考: https://my.oschina.net/KingPan/blog/750159 https://stackoverflo ...
- Shell中EOF内容转义
1.在$符号前面加反斜杠,如: cat > test.sh <<EOF \$test EOF 如果不加,将转成实际的值. 2.给EOF加个双引号,如: cat > test.s ...
- Apache的443端口被占用解决方法(转)
今天想做PHP程序,结果启动Apache的时候控制台报443端口被占用.原因是我的虚拟机VMware占用443端口用于连接远程服务器的.其实出现这些状况很正常.因为不同的程序很有可能同时需要一个端口维 ...