润乾自带的打印直接可以通过触发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";// 正点打印type为1,授权后type为2
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、此例中的数据库建表语句。