润乾自带的打印直接可以通过触发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记录打印信息的更多相关文章

  1. 向linux内核增加一个系统调用-2(利用proc打印信息)

    添加系统调用,打印/proc中的系统信息 前面关于proc和内核态函数的东西可以对比代码来看. 参考 http://blog.csdn.net/kylin_fire_zeng/article/deta ...

  2. day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息

    目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...

  3. Xcode8如何去除控制台多余的打印信息

    Xcode8如何去除控制台多余的打印信息 最近刚使用了Xcode8.遇到了一些问题,总结如下.希望对大家有所帮助. 一.如何去除控制台多余的打印信息. 方法:点击Product----Scheme-- ...

  4. Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统

    前言 写这篇博客是为了给我的愚蠢和浪费的6个小时买单! 过程原因分析 我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github.在以前的拓扑创建过程中,我都是用 ...

  5. gc 辅助打印信息

    cat xx.xml|grep GC <jvm-arg>-XX:+PrintGCDetails</jvm-arg> <jvm-arg>-XX:+PrintGCDat ...

  6. OK335xS 网络连接打印信息 hacking

    /*********************************************************************** * OK335xS 网络连接打印信息 hacking ...

  7. 使用hibernate更新数据库记录的信息的相关学习记录

    截选代码(可能遗漏标点符号): package name.sql; import java.util.List; import name.session.HibernateSessionFactory ...

  8. iOS中忽略NSLog打印信息(通过PCH文件中定义DEBUG宏解决)

    iOS中忽略NSLog打印信息 解决办法: 1.新建PrefixHeader_pch文件,在该文件中定义一下宏 //通过DEBUG宏的定义来解决Debug状态下和Release状态下的输出 #ifde ...

  9. WPF 使用Console.Write打印信息到控制台窗口中

    WPF中使用Console.Write函数来打印信息是没有意义的,因为并没有给其输出字符的窗口.对于桌面程序来说,这是十分合理的,然而有时为了方便调试,在程序编写过程中打印出信息给程序员看还是必要的, ...

随机推荐

  1. Matlab 基础

    命令行(Command Line) 1. help  格式:help  命令 2. cd 配合 Tab 使用 pwd: print current working directory,打印当前工作路径 ...

  2. LeetCode题解-147 对链表进行插入排序 Medium

    对链表进行插入排序. 插入排序的动画演示如上.从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示). 每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中. 插 ...

  3. java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification

    ListView UI重绘时触发layoutChildren, 此时会校验listView的mItemCount与其Adapter.getCount是否相同,不同报错. ListView.layout ...

  4. 剑指offer五十四之字符流中第一个不重复的字符

    一.题目 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...

  5. (转)MySQL 常用数据存储引擎区别

    MySQL 常用数据存储引擎区别 原文:https://laravel-china.org/articles/4198/mysql-common-data-storage-engine mysql有多 ...

  6. 搭建Nuget.Server push时,"Failed to process request. 'Method Not Allowed'"

    环境: windows server 2012,已经安装web dev工具. nuget.server版本2.11 输入网站地址正常访问: VS也能正常添加,nuget服务,在项目打包后上传服务器时报 ...

  7. SpringAOP-切面优先级

    项目中有两个切面,这两个切面都作用于同一个方法,哪个先执行哪个后执行呢,所以要定义一个切面的优先级 import java.util.Arrays; import org.aspectj.lang.J ...

  8. R语言-RStudio快捷键总结

    一.控制台 功能  Windows & Linux   Mac 移动鼠标到控制台 Ctrl+2 Ctrl+2 移动到鼠标命令编辑 Ctrl+1 Ctrl+1 控制台清屏 Ctrl+L Comm ...

  9. Mysql的预编译和批处理

    MySQL的预编译功能 预编译的好处 大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能.什么是预编译功能呢?它有什么好处呢? 当客户发送一条SQL语句给服务器后,服务 ...

  10. 17-hadoop-yarn安装

    在搭建好的 resourceHA的环境下, 配置yarn yarn是 hadoop2以后的计算框架, 通过ResourceManager的调用, 将我们写的程序包分到各个nodeManager上, 由 ...