amp@java

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  99 随笔 :: 0 文章 :: 228 评论 :: 0 Trackbacks

#

从来没做过报表,突然要用到,急忙之中想起了Eclipse里面有个报表插件,上eclipse.org查看,知道它叫BIRT。下载,安装,不能运行,但在about里面看到这个插件已加载。再回官方网站一看,原来还需要EMF,GEF,依次下回来装上,可以用了。打开帮助里的指南,一步一步做了个表格式的报表,感觉还是比较简单的。但我的目标是要做图形报表,并且可以程序控制。研究了两天,有了初步的了解,做出了一个简单的柱状图,也能接受一些参数了,但程序控制还没头绪,也不知道从何处入手,文档里面只有API,没有使用说明,也没有找到相关的书籍。
记录下一些东西:
1、BIRT需要下载iText才能生成PDF报表,而且iText的版本必须跟网站上的要求严格一致,例如要求1.3的不能用1.3.1的,因为插件配置文件里写明是iText-1.3.jar,如果下了1.3.1版本的,也必须把文件名改成1.3才行。同时还需要iTextAsian.jar。
2、BIRT支持Web查看。其实在Eclipse里面预览就是通过本地web服务器查看的。可以把报表发布到tomcat里。
3、BIRT支持参数化报表,可以根据用户的输入生成相应的报表,但并不是什么地方都可以用参数,还是要编程才能保证灵活性。例如SQL查询里不支持表名作为参数(其实是数据库本身不支持)。图里的标题也不能用参数。
4、图形里的日期格式化不够灵活,还需要编程的支持。

还要研究一下怎样通过程序控制报表的生成。

本文为个人备忘录。
posted @ 2007-01-09 20:55 amp@java 阅读(437) | 评论 (0)编辑 收藏

龙芯,这个从02年就爆出来的东西,至今没有在市场上见到真正的可用产品,然而,龙芯的设计者们却已经给它做好了长远的计划,“多核”、“纳米”这些最新最火的名词一个个往龙芯身上堆。这不,胡伟武大老板说,2008年的龙芯3号有8-16核,2010年32-64核,以后就跟水果差不多了,满肚子核;还要用到45纳米技术呢,现在治疗性病的药都用到纳米技术啦,龙芯这么高科技的东西肯定不会落后的。真是强啊,我现在才知道中国的CPU原来是领先世界的啊,只不过这个CPU是个神物,一般人看不到而已,只有吹牛达到一定级别,想象力超过某个水平才能见到这个强大无比的CPU。可以预见,在不久的将来,龙芯将会成为世界上运算最快的通用CPU,Intel、AMD之流将死无葬身之地!!!

当前我们正在建设和谐社会,“和谐”已成为各行各业的目标,CPU也不例外,我们的龙芯3号CPU的“一个目标是要建设和谐的计算和谐,一是指人机和谐,串行程序并行化的问题;另一个是指机机和谐,就是兼容问题。”嗯,的确,多核了,纳米了,还不够,一定要和谐!

顶你个肺!

http://news.csdn.net/n/20061114/97490.html



posted @ 2006-11-19 16:00 amp@java 阅读(3251) | 评论 (27)编辑 收藏

使用WTP中的run on server来调试web程序时,按照默认的配置,会把该程序放在根目录,即context为"/",启动的时候会加载两次,如果有ServletContextListener的话,里面的东西就会运行两次;如果修改配置,通过Project->Property->Web Project Settings,把Context Root改为web project名的话,运行的时候就不会把ServletContextListener加载两次,不过除了正常加载指定的web程序外,还会试图加载一个不存在的context,导致抛出ClassNotFoundException异常,不过不影响使用,后来发现这是WTP的bug,不过描述的好像跟我遇到的情形不太一样。
http://dev.eclipse.org/newslists/news.eclipse.webtools/msg09647.html
https://bugs.eclipse.org/bugs/show_bug.cgi?id=125364

posted @ 2006-11-07 19:02 amp@java 阅读(448) | 评论 (0)编辑 收藏

使用HTML元素的style.left,style.top,style.width,style.height以及width,height属性,都不能获得元素的真正位置与大小,这些属性取出来的都是原来的设置值,例如<table  id="table1" width="500">,那么通过document.getElementById("table1").width取出来的值永远都是500,而不管这个表格是否已经被撑大了;同时,通过document.getElementById("table1").style.left获得的值是空的,因为没有设置这个值。
要取得HTML元素的真正位置与大小,只能通过offsetLeft,offsetTop,clientWidth,clientHeight,offsetWidth,offsetHeight属性,其中offsetLeft与offsetTop分别是当前元素在父元素内的相对左坐标与相对顶坐标,要取得绝对坐标,还需要用到offsetParent属性,改属性取得当前元素的父元素。要取得绝对坐标,就必须依次获得父元素的相对坐标,直到父元素为空,然后把所有相对坐标加起来,得到当前元素的绝对坐标。
最常见的是日期选择框,当点击按钮时弹出日期选择框总是在按钮的旁边,这个选择框的坐标,就是根据按钮的坐标以及按钮的offsetWidth,offsetHeight来取得的。

posted @ 2006-11-07 18:50 amp@java 阅读(2442) | 评论 (0)编辑 收藏

要把一个长表格打印出来,要做到正确分页,直接用HTML生成表格是不能满足要求的:
1、如果把整个表格放在一页,在打印时再自动分页,则有可能在某一表格行中间分页,而且只能有一个表格头,不能每页一个,因为你不知道会在哪里分页;
2、如果按照固定的行数分页,由于每行的高度不一样,就会造成有的页不能填满,有的却太满自动分页了。

原来考虑过一种方法:
利用Javascript动态生成表格,每次往表格的最后插入一行,然后检查表格高度,如果高度超过了一页的最大高度,则把这一行删除,新建一个表格,把这一行插入到新的表格里面,如此循环,直到全部行插入完毕。但是,利用table的height属性、style.height属性都得不到表格的实际高度(只有设置了height属性、style的height属性才能取得这两个值,但只是设置值,并不是实际值),于是就只能放弃了。

后来仔细查看了table的dom属性,才知道它还有clientHeight,offsetHeight等属性,这两个才是表格的真正高度,它们之间的区别可看这里:
http://developer.mozilla.org/cn/docs/DOM:element.clientHeight
http://developer.mozilla.org/en/docs/DOM:element.offsetHeight
更直观的可以看这里:
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om/measuring.asp


简单地说,clientHeight就是不包含border的高度,offsetHeight就是连border的高度。对于要打印的表格,border一般只有2px,所以用clientHeight和offsetHeight区别不大。

构建这个页面需要用到的:

table的insertRow(),deleteRow()方法,用来给表格增加、删除一行(tr);
tr的insertCell()方法,用来给一行加入一格(td);
td的innerText属性,用来给一格加入内容。

CSS分页要用到page-break-before:always(或page-break-after:aways)的样式,遇到使用了该样式的标签,就会在标签前面(或后面)强制分页,于是可以在两个表格之间加一个这样的分页。
为了显示而不打印,还要用到<style>标签的media属性,当设置
<style media="print">
.noprint {display:none}
</style>
时,用了noprint作为class的标签就只会显示而不打印出来。

对于IE,还可以使用WebBrowser控件,弹出“页面设置”窗口、“打印预览”窗口、直接打印等功能。对于其他浏览器,则只能调用window.print()函数了。

JSF生成的中文都是用&#unicode;来表示的,其中unicode是中文字符的UNICODE编码,通过innerText生成表格内容时,必须把这些东西转换成真正的中文,否则会直接把这些符号插入到表格中,惨不忍睹。javascript里有个String.fromCharCode()函数可以把Unicode编码转换成字符。另外,通过innerHTML加入内容也可把这些编码正常显示出来,但需要escape XML,以免把内容当作HTML标签渲染。


posted @ 2006-11-07 10:11 amp@java 阅读(9585) | 评论 (8)编辑 收藏

机器配置:
P4 2.8 GHz 超线程,内存 1G

症状:
使用Eclipse时,点击某个按钮或图标甚至正在输入代码时,整个程序突然失去响应,菜单栏变白,除了关闭按钮,其他地方都没反应,在任务管理器中发现javaw.exe占用CPU50%(相当于单CPU100%),内存占用200多M,且CPU和内存占用数值均停止不动,机器风扇开始轰鸣,再等半天还是这个样子。点击“关闭”按钮出现“立即结束”对话框,只能很无奈地强行退出,有时一天碰到10多次,基本失去可用性。

寻找解决方案:
百度、google搜索,一般的解决方案是,调整启动参数-Xms -Xmx,增大堆内存,然而,在上述机器上设置为-Xms512m -Xmx512m,仍然没效,到失去响应的时候占用的内存依然是200多M。
看来这个问题需要自己解决了。用命令行方式启动eclipse:
java -Xms512m -Xmx512m -jar startup.jar
到失去响应的时候,发现命令行里打印出java.lang.OutOfMemoryError: PermGen space,打开workspace/.metadata/.log文件,发现很多这样的字符串,把这段话贴到搜索引擎上,发现很多这种问题,不过一般出现在Tomcat,Weblogic等Web应用程序上,没有人报告过会出现在Eclipse上。解决方案是增加启动参数:
-XX:MaxNewSize=256m -XX:MaxPermSize=256m
于是在eclipse.ini里把启动参数改为:

-Xms512m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

启动Eclipse,用了几天,都没再出现失去响应的症状。

关于MaxPermSize的文章:
CFMX JVM Tuning - The difference between MaxPermSize and Heap Size
posted @ 2006-11-02 11:02 amp@java 阅读(12929) | 评论 (2)编辑 收藏

很遗憾,刚才写了很多,一按“代码”按钮,没有弹出对话框,但整个浏览器已经不能动,再按一下Alt+F4,整个浏览器关闭,什么都没有了,哭……我用的是TheWorld1.33+IE7。

刚才的大意是:
利用socket发送字符串时,为了区分字符串的起始、结束与中间各个部分的间隔,需要一些特殊字符作为分隔符,但普通可打印字符有可能出现在要发送的字符串中,不能作为分隔符,所以只能使用不可打印字符。Java使用的是Unicode编码,可通过\uxxxx来表示编码为xxxx的字符。例如:\u0129,\u0130,\u0131都是不可打印字符。但是,通过socket发送和接收字符串时,需要指定编码,否则会使用操作系统的默认编码。在发送端,通过OutputStream的write()函数写出要发送的字符串的Bytes,这些bytes要通过String.getBytes(编码名称)来获得,例如编码名称为: UTF-16BE,则:

1 socket.getOutputStream.write(str.getBytes("UTF-16BE"));

读socket的时候,通过InputStreamReader的read()函数来一个个字符地读取,这时候如果不指定编码,使用的也是操作系统的默认编码,例如中文的GB18030,这时候有些Unicode字符没有对应的GB18030编码,读出来的就都是?号。所以必须在InputStreamReader的构造函数中指定字符编码,例如:

1 InputStreamReader isr = new InputStreamReader(socket.getInputStream(),"UTF-16BE");
2 char c =  (char)isr.read();
posted @ 2006-11-02 10:39 amp@java 阅读(1564) | 评论 (0)编辑 收藏

改了一下实现,采用“生产者-消费者”模式。每个串口一个线程,读取BlockingQueue里的待发信息,作为消费者,发送完毕后把发送结果写到另外一个BlockingQueue里;查询线程定时查询数据库,获得待发信息并加入到BlockingQueue里;结果更新线程读取BlockingQueue里的短信发送结果,更新到数据库里,并把结果发送到客户端。
这样会带来一个问题,发送线程发送短信需要一定的时间,可能某条待发信息已经在队列里了,但查询线程并不知道,继续把该信息入列,所以发送线程在发送某条短信前要检查数据库,看是否已经发送过,如果发送过,则不再发送。
posted @ 2006-10-25 17:34 amp@java 阅读(771) | 评论 (0)编辑 收藏

做好核心部分,只完成了一半,剩下的图形界面设计还需要一个漫长的过程。
SWT做图形界面是个繁琐的过程,虽然可以用VE、SWT Designer帮助布局,设置一些属性,添加一些事件,但里面的逻辑却是要自己先想好。
以“设置”页面为例,为了设置各模块的参数,需要考虑很多问题:
1、哪些是立即生效,哪些是重启才能生效?
2、什么时候哪个widget需要被Disable,什么时候需要被Enable?
3、怎么验证用户输入的东西是符合逻辑的?
……
还需要把图形界面、确定前的临时配置类、内存中的配置类、硬盘上的配置文件结合起来,什么时候给哪个赋值,什么时候从哪个获得值都要考虑清楚,同时,在程序运行过程中还需要不断读取内存中的配置类,获得运行时参数,必须保证线程之间不发生冲突。

posted @ 2006-10-21 14:42 amp@java 阅读(685) | 评论 (0)编辑 收藏

浏览器缓存对jsp,servlet来说都有时候是很致命的。以前用AJAX实现一个进度条,每隔1秒向服务器询问一次进度,服务器返回当前的百分比,就一个数字。开始的时候没有禁止缓存,结果进度条老是不动。我在自己的电脑上测试还没发现这个问题,因为我在internet选项了选择了“每次访问此页时检查”,而默认选项是“自动”,其实就是允许缓存。禁止缓存可以在HTML中写,也可以在http header里面写,但对于非HTML页面,就只有后面那种选择了,在servlet里可以这样写:

response.setHeader("Pragma","No-Cache");
response.setHeader(
"Cache-Control","No-Cache");
response.setDateHeader(
"Expires",0);

 必须三个都写上才能应付各种浏览器。似乎大小写敏感(不确定,但上面这种肯定适用于IE 5,6)。还有Expires那个值有人说是-1。
posted @ 2006-10-16 21:32 amp@java 阅读(1141) | 评论 (2)编辑 收藏

仅列出标题
共10页: First 上一页 2 3 4 5 6 7 8 9 10 下一页