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来计算.而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长.这不但影响着数据库的运行效率,也增大数据库的维护难度.除了表的数据量外,对表 ...
随机推荐
- JAVAEE——SSH项目实战04:联系人添加、列表显示和修改
作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7159337.html 一.联系人添加 1.添加页面设计 linkman/list. ...
- PAGELATCH_EX Contention on 2:1:103
This blog post is meant to help people troubleshoot page latch contention on 2:1:103. If that’s what ...
- python opencv3 获取摄像头视频
git:https://github.com/linyi0604/Computer-Vision # coding:utf8 import cv2 """ 捕获摄像头10 ...
- s3c2440地址分配
mini2440的地址怎么分配.mini2440处理器的地址怎么分配. S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址为连接外设的地址空间.>1G的地址空间 分配给 ...
- Django-url路由映射与views逻辑处理
一.URL路由映射 路由映射模块,主要完成url与views视图函数的映射.当一个url请求到来时,会按照这个模块中的url地址从上到下进行匹配,如果匹配成功,将执行映射试图中的函数:反之将返回404 ...
- Django ORM训练专题
图书信息系统 表结构设计 # 书 class Book(models.Model): title = models.CharField(max_length=32) publish_date = mo ...
- android无后缀二进制执行文件替代apk实现程序功能
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha android无后缀二进制执行文件替代apk实现程序功能 实现将data/Android ...
- Windows 安装 Jenkins 2.6
最近都是Windows下干活啊... 一.下载和安装 官网地址:https://jenkins.io/index.html,选择了2.X系列的Windows版本,自动在浏览器下载到了jenkins-2 ...
- 实现多线程的另一种方式-Callable
package com.mldn.thread; import java.util.concurrent.ExecutionException; import java.util.concurrent ...
- bio、nio、aio及select、poll、epoll
BIO与NIO.AIO的区别http://blog.csdn.net/skiof007/article/details/52873421 select.poll.epoll之间的区别总结http:// ...