JAVA B/S系统实现客户端屏幕截图

最近在项目(B/S)中客户要求页面中实现屏幕截图的功能(如WEB QQ屏幕截图那种),起初看了很多JS实现图片截取,如Jquery的插件Jcrop,但是功能和所需要的不一样。此类插件只是实现已有图片的剪切,实现原理一般是在客户端定位需要剪切的图片x,y坐标,然后将参数传给服务器,由服务器实现图片的截取, 实现类似新浪博客头像编辑的功能。[url]http://www.iteye.com/topic/510980[/url]
Google之后,目前做这种实现的一般有以下几种方式:
1. 使用AcitveX或者其他的浏览器插件。
看了下Web QQ,貌似是按照这种方式做的,不过测试了目前只有IE和FF可以支持屏幕截图,Chrome下连图标都没有。由于系统需要跨浏览器访问,如果为了实现这个功能分别为不同的浏览器开发插件的话就比较麻烦了。
2. Flash
不熟,请高手指点。
3. Java Applet
首先,在JAVA中做屏幕截图是可以的。感谢leesonhomme提供的源码[url]http://leesonhomme.iteye.com/blog/451840[/url]。
然后将用到的类打成jar包, Cmd 切换到web-info/classes目录下,通过如下命令打包:
jar -cvf snapshot.jar *.*

当然,也可以使用其它工具如Fatjar。
现在,可以编写页面了:
<HTML>
<BODY >
<APPLET
code = "Snapshot.class"
ARCHIVE = "snapshot.jar"
width = "70"
height = "30"
>
</APPLET>
</BODY>
</HTML>

此时访问该页面,会提示Access Denied错误,这是由于Java的沙盒安全模型的存在,使得未签名的applet在客户端被禁止执行某些操作,比如读写文件或者连接局域网。经过签名的applet能够向用户验证applet的编写者:他是否真的编写了这个applet;此jar文件离开 服务器后,内容是否被篡改过。如果没有这些最基本的保证,applet将不被允许执行任何有可能破坏用户机器,或者侵犯用户隐私的操作。要在互联网上安全地使用applet,这些限制非常重要,不过相对来说,这也限制了applet的能力。
为了使得applet能够访问本地的应用,比如剪切板,需要给它签名。
keytool -genkey -keystore snapshot.store -alias snapshot

这个命令用来产生一个密匙库,执行完毕后应该产生一个 hello.store的文件,这个名字你可以对它进行修改。另外在执行命令的时候还有提示你输入密匙库的密码,这里你一定要记住,否则后面要用的时候无法输入。输入密码后,它会提示你输入用户名,公司名等信息,这些都不是必须输入的,你可以直接回车跳过,最后问你输入是否正确,你可以输入y或n回答正确或错误。
keytool -export -keystore snapshot.store -alias snapshot -file snapshot.cert

这个命令用来产生签名时所要用的证书,这个命令执行完后产生一个pepper.cert的文件.
jarsigner -keystore snapshot.store snapshot.jar snapshot

这个命令用上面产生的证书将我们的jar文件进行了签名。最后把该jar包拷贝到jsp文件所在地目录下。
再访问网页,我们所需要的功能就有了。不过有一个缺陷:就是applet中的按键样式和页面统一风格不统一。
我们可以用JNLP的方式加载java文件。首先编写JNLP配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!-- file snapshot.jnlp -->
<jnlp codebase="http://localhost:8080/snapshot/" href="http://localhost:8080/snapshot/snapshot.jnlp">
<information>
<title>Snapshot</title>
<vendor>Snapshot</vendor>
<icon href="google.jpg"/>
</information>
<resources>
<j2se version="1.2+"/>
<jar href="snapshot.jar"/>
</resources>
<application-desc main-class="ScreenCapture"/>
</jnlp>

在上面的代码基础上,需要加上以下属性:
<security>
<all-permissions/>
</security>

否则在运行时同样会报access denied错误。
编写页面文件:

<a href="snapshot.jnlp">Snapshot</a>

但这样做同样有个缺陷,就是每次点击它的时候都需要弹出下载窗口然后打开,用户体验很不好。
于是,修改之前的页面如下:
<a href="#" onclick="openSnapshot()">Snapshot2</a>
<div id="test">test</div>
<script type="text/javascript">
function openSnapshot() {
//window.open("index2.html");
$("#test").load("index2.html",function(){
console.log("success");
})
}
</script>

index2.html:
<HTML>
<BODY >
<APPLET
code = "Snapshot.class"
ARCHIVE = "snapshot.jar"
width = "0"
height = "0"
>
</APPLET>
</BODY>
</HTML>

applet的宽度和高度都为0,相当于是个隐藏的元素。

附上源码,供大家讨论指教。


修改【2011-4-8】:
当我将页面放到项目中时,出现一个诡异的问题:当从HTML文件使用AJAX加载Applet时运行正常;当从JSP文件中(Struts2中的Action)加载时一直出现classNotFoundException。经过不断的尝试,最终发现是ARCHIVE设置的问题。
如果从Action页面中加载,ARCHIVE需要从项目根路径开始找,于是将其修改为:
<HTML>
<BODY >
<APPLET name="screenshotApplet" id="screenshotApplet" code = "org.myproject.snapshot.Screenshot.class"
ARCHIVE = "/【项目名】/screenshot/snapshot.jar" codebase="." width = "0" height = "0">
</APPLET>
</BODY>
</HTML>



还有就是IE中有时出现JVM 加载失败,Firefox中有时打开后看到鼠标变成了叉,但是选取的时候没有任何反应,不晓得是怎么回事。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java C/S图书管理系统是一种基于Java编程语言开发的客户端/服务器架构的图书管理系统。该系统包括了客户端和服务器端两个部分。 客户端部分是指图书管理员或读者使用的界面,通过该界面可以进行图书的借阅、归还、查询等操作。客户端使用Java Swing或JavaFX等界面库进行开发,提供直观友好的用户界面,方便用户操作。客户端还通过网络连接到服务器端,将用户的请求发送到服务器,并接收服务器的响应。 服务器端部分是指运行在服务器上的程序,负责处理客户端的请求。服务器端使用Java的Socket编程进行网络通信,监听来自客户端的请求,然后根据请求的类型,对数据库进行增删改查操作。服务器端还负责验证用户的身份和权限,确保只有授权用户才能进行图书管理操作。 该系统的数据库用于存储图书的相关信息,包括书名、ISBN、作者、出版社、出版日期等。数据库可以使用关系型数据库如MySQL或Oracle进行设计,通过Java的JDBC技术连接到服务器端进行数据的读写操作。 该系统还可以实现一些额外的功能,如图书的分类管理、借阅记录的管理、图书馆的统计报表等。同时,系统还应具备安全性和稳定性,可以进行用户身份认证、数据备份与恢复等功能。 总之,Java C/S图书管理系统基于Java编程语言开发,通过客户端/服务器架构实现图书的借阅、归还、查询等功能,旨在提高图书管理效率和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值