通过ajax记录打印信息
润乾自带的打印直接可以通过触发js事件来进行调用。onClick="report1_print();return false;"
如果客户需要记录某个用户在某个时间段进行打印的次数以及规定该用户在某个时间段打印的权限,并且日后要根据这些记录进行统计,该怎么做到呢?下面提供了一套方案可以解决该问题,此方案也可以灵活的针对客户的这类需求。
具体需求:例如规定某个用户只能在8点到9点之间进行打印,其余时间需要授权后才能进行打印,后台需要记录该用户的打印时间、是否为超时打印等信息用来统计。
解决思路:
1,
判断一个时间段是否能掉打印这个比较简单,可以在单元格中加入if语句判断时间,是否显示触发打印的js,也可以先调用一段判断的js满足条件后再调用润乾的打印js。
2,
记录打印的相关信息,通过点击打印的js后先通过ajax与servlet交互进行数据的插入,然后再调用润乾的打印js。
下文采用js的方式来实现判断功能,通过ajax进行数据的插入。
随意准备一张报表作为打印的例子。
首先,先来时间判断的功能,在展现报表的页面(showReport.jsp)中接受外界的两个参数,username(用户姓名)和type(超时后授权,值为2时为超时后授权打印),然后加入js代码:
function printtime() {
//首先对日期类型数据进行格式转化,从网上找的日期格式化代码begin
Date.prototype.format = function(format) {
/*
* eg:format="YYYY-MM-dd hh:mm:ss";
*/
var o = {
"M+" :
this.getMonth() + 1,
// month
"d+" :
this.getDate(),
// day
"h+" :
this.getHours(),
// hour
"m+" :
this.getMinutes(),
// minute
"s+" :
this.getSeconds(),
// second
"q+" : Math.floor((this.getMonth()
+ 3) / 3), // quarter
"S" :
this.getMilliseconds()
}
if (/(y+)/.test(format)) {
format = format.replace(RegExp.$1, (this.getFullYear() +
"")
.substr(4 - RegExp.$1.length));
}
for (
var k
in o) {
if (new
RegExp("(" + k +
")").test(format)) {
format = format.replace(RegExp.$1,
RegExp.$1.length == 1 ? o[k] : ("00" + o[k])
.substr(("" + o[k]).length));
}
}
return format;
}
//日期格式化代码end
//模拟起始时间和结束时间
var begintime='08:00:00';
var endtime='09:00:00';
var now =
new Date().format("hh:mm:ss");//取当前系统时间并转换成相应格式
//判断当前时间是否在规定的时间内或者是否给予了授权
if((begintime<now&&endtime>now)||<%=type%>=="2")
{
run();
}else{
alert("已经超时,请联系管理员");
}
}
这样就可以进行判断是否满足规定,如果满足调用润乾的打印功能report1_print();
接下来创建一个servlet做后台处理工作.主要是把前台传入过来的打印的相关信息插入数据库中.
临时测试数据库表结构:
String userName = request.getParameter("username");
String type = request.getParameter("type");
if (type ==
null)
type = "1";//
String printTime = new SimpleDateFormat("yyyy-MM-dd
HH:mm:ss")
.format(new Date());
String sql = "insert
into print values('" + userName +
"','"
+ printTime + "','" + type +
"')";
Connect con = new Connect();
con.executeInsert(sql);
然后构建ajax框架,url为上文中的的servlet,传入参数为之前页面中接受的两个参数username和type.
//核心对象变量
var xmlHttp;
//区分浏览器创建XMLHttpRequest核心对象
function create() {
if (window.XMLHttpRequset) {
xmlHttp = new XMLHttpRequest();
} else
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
//ajax核心执行方法(此处为提交到servlet处理)
function run() {
create();
var URL = "../servlet/PrintTime?username=<%=username%>&type=<%=type%>";
xmlHttp.open("POST", URL,
true);
xmlHttp.onreadystatechange = callback;
xmlHttp.send(null);
report1_print();
}
//回调函数
function callback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var v = xmlHttp.responseText;
}
}
}
最后在toolbar.jsp中修改调用打印的js事件
onClick="printtime();return false;",这里我们先要进行判断,所以直接调用判断的js,通过后会自行调用ajax记录打印以及打印报表的相关方法。
测试结果:
1,在8点到9点之间,用户名为zhangsan的用户允许打印报表,并且在数据库中记录:
2,在9点以后,用户名为zhangsan的用户打印报表时提示超时。
3, 模拟管理员给张三授权允许他在超时情况下打印,报表中type参数模拟成2,此时再超时情况下允许打印报表,并且在数据库中记录:
当然这里的权限是模拟出来的,具体实际应用中会根据不同的需求,数据机构、权限控制、判断条件都会有所变动,但是思路相同,这样就可以通过ajax来实践记录打印的功能。
附件中也相关的jsp、java、此例中的数据库建表语句。
通过ajax记录打印信息的更多相关文章
- 向linux内核增加一个系统调用-2(利用proc打印信息)
添加系统调用,打印/proc中的系统信息 前面关于proc和内核态函数的东西可以对比代码来看. 参考 http://blog.csdn.net/kylin_fire_zeng/article/deta ...
- day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息
目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...
- Xcode8如何去除控制台多余的打印信息
Xcode8如何去除控制台多余的打印信息 最近刚使用了Xcode8.遇到了一些问题,总结如下.希望对大家有所帮助. 一.如何去除控制台多余的打印信息. 方法:点击Product----Scheme-- ...
- Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统
前言 写这篇博客是为了给我的愚蠢和浪费的6个小时买单! 过程原因分析 我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github.在以前的拓扑创建过程中,我都是用 ...
- gc 辅助打印信息
cat xx.xml|grep GC <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCDat ...
- OK335xS 网络连接打印信息 hacking
/*********************************************************************** * OK335xS 网络连接打印信息 hacking ...
- 使用hibernate更新数据库记录的信息的相关学习记录
截选代码(可能遗漏标点符号): package name.sql; import java.util.List; import name.session.HibernateSessionFactory ...
- iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)
iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...
- WPF 使用Console.Write打印信息到控制台窗口中
WPF中使用Console.Write函数来打印信息是没有意义的,因为并没有给其输出字符的窗口.对于桌面程序来说,这是十分合理的,然而有时为了方便调试,在程序编写过程中打印出信息给程序员看还是必要的, ...
随机推荐
- EF基础知识小记三(设计器=>数据库)
本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...
- 【数组】Missing Number
题目: Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is mi ...
- attachEvent和addEventListener区别总结
1.attachEvent与addEventListener的区别 支持的浏览器不同.attachEvent在IE9以下的版本中受到支持.其它的都支持addEventListener. 参数不同.ad ...
- golang---interface结合reflect的泛型应用
大致思路:序列化未知json放入一个interface{}中再通过反射将其内容解析出来 str1:=`{ , , , , , , "type_key": "testnow ...
- notepad++上搭建gtk+2.0/3.x开发环境
前言 老师布置了一道题需要用到图形界面,于是开始找图形库.最后选择了gtk+图形库,然后折腾了大概一天. 这里记录自己新学到的知识,同时也给后来者一些便利. 准备 下载以下内容 notepad++(由 ...
- SpringMVC访问WEB-INF下的jsp的方法
当输入localhost:8080/项目名 浏览器弹出不知道神马错误 The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res ...
- C++11中多线程库
一.Linux 线程API 线程是在操作系统层面支持的,所以多线程的学习建议还是先找一本linux系统编程类的书,了解linux提供线程的API,了解使用线程设计程序的基本操纵.完全使用系统调用编写多 ...
- Spark2.3.1中用各种模式来跑官方Demo
1 使用单机local模式提交任务 local模式也就是本地模式,也就是在本地机器上单机执行程序.使用这个模式的话,并不需要启动Hadoop集群,也不需要启动Spark集群,只要有一台机器上安装了J ...
- Python使用Redis数据库
Redis 简介 Redis是开源的高性能Key-Value数据库,可以用于缓存等用途. Redis可以提供事务和持久化支持保证并发安全性,并提供TTL(time to life)服务. 使用Redi ...
- 常用算法3 - 字符串查找/模式匹配算法(BF & KMP算法)
相信我们都有在linux下查找文本内容的经历,比如当我们使用vim查找文本文件中的某个字或者某段话时,Linux很快做出反应并给出相应结果,特别方便快捷! 那么,我们有木有想过linux是如何在浩如烟 ...