解惑

解己之惑,解人之惑

2005年9月 (第1页共2页)

crystal report的一些限制

目前为止我所了解的一些限制:

  • 子报表不能再包含子报表,也就是报表只能有两层
  • Chart不能放在Detail中,只能放在Report或者Group的部分。
  • Cross-tab只能放在Report部分

基于规则还是基于配置

一直一来都在思索为什么很多公司开发的产品都不好维护,也一直在思考如何设计一个可以快速开发和快速上手的框架,并且用该框架开发的东西要易于维护。
前几天在思考spring的IoC其实也并不是很好的解决方案,虽然他将类之间的依赖关系延迟到了运行时,做到了降低系统的偶合度,但是同时意味着对于一
个新人而言,它在理解这个系统的时候会存在很多问题,特别是系统的设计文档缺失或者不完善的情况下。国内的程序员似乎都不太喜欢写文档,有时候也认为代码
很简单,根本不需要文档,甚至很多连代码注释都没有,在这样的情况你如何希望别人可以很快入手呢?
前两天在改造我的JDBCTemplate的过程中,在完成数据的持久化时,突然想到与其基于配置,不如基于规则,符合规则的就可以通过,不符合的就不
行,例如从数据库取出的数据可以自动映射到javabean,数据库的命名使用下划线分隔,而转换到java的属性就是以下划线分隔的单词,除了第一个单
词外的其它的首字母大写,而对于表间关系,可以也按照命名规范来,对于一对多的关系,可以利用JDK5中的新的特性声明其类型完成。
在基于规则的情况下,配置会减少很多,但是文档依然是不可缺少的,不同的是文档要描述的主要是规则,而这个规则是框架的规则,新人需要研读的就是这个规则,他也不能写出不符合规则的程序,因为那样就不能工作。
有必要实际的检验一下这个想法。

所见即所得的web编辑器对比一览表

http://www.geniisoft.com/showcase.nsf/WebEditors

自己看吧,不过还是推荐一下tinymce,9月12号刚刚发布了2.0RC1。

整理过的处理GB2312的工具类

package com.cherami;

public class GB2312 {
  public static final int SYMBOL_START=0xa1a1;
  public static final int SYMBOL_END=0xa9fe;
  public static final int FIRST_LEVEL_START=0xb0a1;
  public static final int FIRST_LEVEL_END=0xd7fe;
  public static final int SECOND_LEVEL_START=0xd8a1;
  public static final int SECOND_LEVEL_END=0xf7fe;
 
  public static boolean isSymbol(char c) {
    return isGb2312ValueRange(c,SYMBOL_START,SYMBOL_END);
  }
 
  public static boolean isFirstLevel(char c) {
    return isGb2312ValueRange(c,FIRST_LEVEL_START,FIRST_LEVEL_END);
  }
 
  public static boolean isSecondLevel(char c) {
    return isGb2312ValueRange(c,SECOND_LEVEL_START,SECOND_LEVEL_END);
  }

 
  public static boolean isGb2312ValueRange(char c,int start,int end) {
    String s= new String(new char[]{c});
    byte[] bs;
    try {
      bs = s.getBytes(“GB2312”);
    } catch (java.io.UnsupportedEncodingException e) {
      return false;
    }
    if (bs.length < 2) {
      return false;
    }
    int b1 = bs[0] & 0xff;
    int b2 = bs[1] & 0xff;
    int value = (b1 << 8) | b2;
    if (value>=start&&value<=end) {
      return true;
    }
    return false;
  }

  public static char getFirstPinyin(String str) {
    byte[] bs;
    try {
      bs = str.getBytes(“GB2312”);
    } catch (java.io.UnsupportedEncodingException e) {
      return '*';
    }

    if (bs.length == 0)
      return '*';
    if (bs.length >= 2) {
      int b1 = bs[0] & 0xff;
      int b2 = bs[1] & 0xff;
      int value = (b1 << 8) | b2;
      if (value >= 0xb0a1 && value <= 0xb0c4)
        return 'a';
      if (value >= 0xb0c5 && value <= 0xb2c0)
        return 'b';
      if (value >= 0xb2c1 && value <= 0xb4ed)
        return 'c';
      if (value >= 0xb4ee && value <= 0xb6e9)
        return 'd';
      if (value >= 0xb6ea && value <= 0xb7a1)
        return 'e';
      if (value >= 0xb7a2 && value <= 0xb8c0)
        return 'f';
      if (value >= 0xb8c1 && value <= 0xb9fd)
        return 'g';
      if (value >= 0xb9fe && value <= 0xbbf6)
        return 'h';
      if (value >= 0xbbf7 && value <= 0xbfa5)
        return 'j';
      if (value >= 0xbfa6 && value <= 0xc0ab)
        return 'k';
      if (value >= 0xc0ac && value <= 0xc2e7)
        return 'l';
      if (value >= 0xc2e8 && value <= 0xc4c2)
        return 'm';
      if (value >= 0xc4c3 && value <= 0xc5b5)
        return 'n';
      if (value >= 0xc5b6 && value <= 0xc5bd)
        return 'o';
      if (value >= 0xc5be && value <= 0xc6d9)
        return 'p';
      if (value >= 0xc6da && value <= 0xc8ba)
        return 'q';
      if (value >= 0xc8bb && value <= 0xc8f5)
        return 'r';
      if (value >= 0xc8f6 && value <= 0xcbf9)
        return 's';
      if (value >= 0xcbfa && value <= 0xcdd9)
        return 't';
      if (value >= 0xcdda && value <= 0xcef3)
        return 'w';
      if (value >= 0xcef4 && value <= 0xd188)
        return 'x';
      if (value >= 0xd189 && value <= 0xd4d0)
        return 'y';
      if (value >= 0xd4d1 && value <= 0xd7fe)
        return 'z';
    }
    return '*';
  }

}
 

Java的Web框架对比

第一项是优点,第二项是缺点。

以下是各种web框架比较: (by Matt Raible)

  • struts:
    • 广泛流行;拥有很多信息和示例;HTML标签库是一个非常好的东西。
    • ActionForms非常恶心;不能够做单元测试;大量的邮件列表令人无法忍受
  • Spring MVC
    • 生命周期由重写绑定,效验等确定;能够无缝隙地与各种表现层程序结合在一起,如JSP,XSL等;IC使得很容易测试。
    • 很少被使用;需要在JSP中写入大量代码;太灵活了,反而不能得到通用的控制。
  • WebWork
    • 结构简单,容易被扩展;标签库容易被自定义,并获得Velocity支持;拦截机制成熟可靠。
    • 其文档最近才出现,示例很少;客户端效验很不成熟。
  • Tapestry
    • 一旦学会,效率很高;HTML模板很合适美工;有良好的社区支持。
    • 文档非常概念,而缺少实践;学习曲线陡峭,示例非常少;
  • JSF
    • J2EE规范;能够快速和容易地开发;丰富的导航框架。
    • 标签依赖JSPs;技术不够成熟;实现资源不单纯。

以上摘自《Tapestry开发指南》
Tapestry技术论坛:http://forum.cdmcs.com/viewforum.php?f=17
作者的email:gzdlw_Adong@Hotmail.com

crystal report server(水晶报表)java开发入门

经过一段时间的调查发现光使用crystal report
viewer不能满足我们的需要,不得已只能使用server版的,但是server版多了一些API,还需要登录,取得ISession之类的。其实在
线文档里面的quick start是一个很好的起始的地方,还带一个可以直接运行的demo,应该包含常用功能了。
他的文档里面有一个java_docs.zip的文件,解开后看看java_docs\CE\reference\default.htm,这个是
BusinessObjects Enterprise Java SDK Guide-》General Reference:Includes
general information to help you get started-》Getting Started Tutorials
-》Developing a web application,一点一点看下来或者把Code
examples里面的例子发布到你的tomcat里面运行看看再看看源代码应该就能很快上手了,有些功能你可能就要找他的API了,由于不是CHM版
本,所以用的时候比较麻烦。

创建crystal report的模板

其实crystal report的模板就是一个已经有的报表,不需要特别创建,但是有些限制:

these report objects will be applied to the new report:

  • Fields
  • Groups
  • Group charts
  • Summary fields
  • Hyperlinks
  • Bitmaps
  • Lines, boxes, borders
  • Static OLE objects

these report objects will not be applied to the new
report:

  • Detail charts
  • Subreports
  • OLAP grids
  • Cross-tabs
  • Maps
  • Embedded OLE objects
  • BLOB fields
  • Specified order grouping
  • Advanced summaries (such as Top Ns, Percentages, and Running Totals)

完整的内容可以参考设计器的Template considerations的内容。

5000万年后的人类长相

今天看参考消息,第七版的一个问与答很有意思,问题是:
在今后5000万年里,人类的长相会如何改变。
在解答的最后,解答者给出的答案是:
据猜测,我们最终会发现对自己的人品和特征进行电子编码的方法,世界上的“人口”可能会存在于虚拟形式中,包含在一台电脑的存储器内,而人性特征则可以在一小批必需的有机人体之间来回传输。

这个答案很有意思,让我想起了黑客帝国和终结者三,以及原型模式,他将黑客帝国中的虚拟社会描绘为未来的真实社会,利用终结者三中的未来智能机器人随时变身的能力并应用原型模式完成人的实例化。

错误百出

看来JRoller的blog还不够强壮,今天发现了几个错误。

  • 将显示的项数设置为1后下面的那个导航的链接不好用了,在一天有多篇blog的情况下
  • 那个导航链接不能去掉,从页面里面不能去掉

只能看看什么时候升级了跟着升级了,velocity实在是不好改。

晚上看了下JRoller的velocity的模板,在显示blog的模式可能有问题,首先是按照blog项取出,然后按照天进行分组,这样,如果设置显
示的最大项数是1或者某个值,而该天的blog数大于这个数,那么比较旧的那些项就无法通过下面的导航链接看到,因为那些导航链接是以某天的某项(页面内
的链接,也就是以#标记的)为地址的,因此就会出现回到当前页面的问题。

无锡太湖一日游

昨天到无锡玩了一天,早上九点坐T710出发,十点十五到,然后吃点饭,坐K2到了个地方,然后坐K98到了百米喷泉(很遗憾我们没有看到喷泉,据说喷的时候高达百米,很远的山上都可以看到),然后打的到了鼋头渚,门票七十,先
坐大巴到码头,然后坐游船上岛,岛不大,两个小时就可以逛玩,我记得的就是水帘洞、月老祠、天街、凌霄宫、仙佛洞、银河、卧佛啊什么的,然后坐游艇回到出发的地
方,其实外面的大岛上还有一些景点,但是我们不知道回来的火车,所以急急忙忙的坐K1回火车站买票(去的时候决定比较仓促,没有查回来的火车)。

这次因为有朋友接待,所以不是走的直线,其实在火车站下车后可以坐K1直达鼋头渚(公交车站就在出站口上面),玩完以后坐K1回火车站(最后一趟车好像是六点半的),可以买七点十五的T719回上海。

在无锡玩还有一个好处,就是上海的公交卡也可以用,刷卡就行,不用带那么多零钱,而且会出现五分或者一角的情况,因为在无锡刷卡是打九五折的。

更早的文章

© 2025 解惑

本主题由Anders Noren提供向上 ↑