解惑

解己之惑,解人之惑

分类:Java (第17页共20页)

Java技术

PHP中文乱码的一个解决方法

我说的中文乱码不是全部是乱码,而是部分是乱码,例如海明威主题里面默认的那个single.php页面里面包含edit this entry的链接,我修改为中文不行,变成乱码了,但是其它的中文都没有问题,原因不明。一个解决的方法就是把中文换成HTML的转义格式,也就是&#加上一个数字并加一个分号的格式。
阅读全文

EJB单元测试框架

公司的产品要引入单元测试以及代码覆盖,让我做一个框架方便我们写单元测试代码,上网找了一下,找到一个不错的基础:MockEJB,大家可以先了解下相关的内容:
MockEJB项目简介信息
使用MockEJB简化EJB测试

我在这个基础上进行了扩充,框架具有如下的特性:

  • 读取EJB配制文件完成EJB的自动发布,框架会读取我们工程的ejb-jar.xml,jboss.xml,jbosscmp- jdbc.xml文件的配制信息并组合这些信息完成自动发布所需要的内容。
  • 共享的dummy数据,我们自己提供一个xml文件,里面存放一些dummy的数据,这些数据会在对应的Entity Bean被使用的时候自动插入数据库,完成数据的初始化工作(这样Session Bean中的SQL也可以取到一致的内容),在一个test方法结束的时候回滚,删除那些记录,消除Test Case之间的影响。
  • 自定义事务管理,每个test方法都处于同一个事务中,方法结束的时候事务回滚,消除Test Case之间的影响。
  • 支持部分find方法的实现,由于MockEJB对于Entity Bean只提供了对findByPrimaryKey的支持,甚至连findAll都不支持,框架在MockEJB提供的Aspect机制的基础上实现了 findAll等常用必备的find方法,并且对于自定义的find方法也提供部分支持,通过解析EJB配制文件中的SQL完成,但是可能性能不好,因为会遍历所有的记录并比较字段的值完成这个查找的过程。其它比较复杂的find方法(框架无法解析的SQL),需要自己实现对应的Aspect,框架会自动查找对应的Aspect。
  • Struts TestCase的基础上支持对Action的单元测试。

测试代码范例:
阅读全文

工具

列出我常用的工具软件:

  • FireFox:最常用的浏览器,好处多多,不细说了。
  • ACDSee:看图软件,用习惯了。
  • Eclipse:Java开发工具。
  • Editplus:最常用的文本编辑器。
  • MyEclipse:Eclipse的J2EE开发插件。
  • WinRAR:最常用的压缩工具。
  • WinZip:现在其实已经不常用了,但是如果有些人不用WinRAR就用这个打包。
  • Beyond Compare:文件比较,小巧而强大。
  • Daemon:虚拟光驱。
  • EmEditor:一般使用的文本编辑器,特别是用来替换IE的查看源代码功能。
  • FlashFXP:FTP下载。
  • Maxthon:替换IE的浏览器。
  • Tomcat:J2EE服务器。
  • SnagIt:抓图工具。
  • Storm Codec:电影播放器。
  • Thunder:下载工具,最大的好处就是自动搜索相同文件。
  • 千千静听:取代WinAmp的音乐播放器。
  • VMWare:虚拟机,可以在一台机器上安装多个系统,当然你的内存要够大,一般1G以上吧。
  • WinCVS:CVS工具,公司的工程比较特殊,使用Eclipse的CVS功能不太方便,就用这个了。
  • Toad:Oracle客户端工具。
  • 金山词霸:英汉单词查询。
  • UltraEdit:文本编辑,多文件替换以及查看二进制内容常用。
  • MSN:现在最常用的IM。
  • GTalk:一直开着的IM。
  • Yahoo:公司内部通用的IM。
  • DJ:我用过的最好用的Java反编译工具。
  • Acrobat Reader:PDF阅读器。
  • Office2000:Office工具。
  • F-Secure:SSH客户端。
  • QQ:一般不用,只用来和老同学联系。
  • VNC:远程桌面访问工具。
  • 拼音加加:现在使用的输入法,以前用紫光。

再列出我常用的FireFox插件:

  • Flashblock:阻止Flash。
  • Tab Mix Plus:Tab功能增强。
  • Web Developer:Web开发常用工具集合。
  • Adblock plus:阻止广告。
  • Tabbrowser Preferences:强大的Tab浏览插件。
  • del.icio.us:网络书签。
  • Colorful Tabs:彩色Tab。
  • SessionSaver:保存Session,关闭FireFox后下次可以加载上次关闭时候的那些Tab,FireFox崩溃后也能自动恢复。
  • Google Toolbar:Google工具栏。
  • Console2:可以替换默认的JavaScript控制台并且更加强大好用的控制台。
  • NoScript:阻止JavaScript。
  • IETab:以IE内核打开页面,可以查看在FireFox下不能正常显示的页面。
  • FasterFox:性能和网络优化。
  • FoxyProxy:好用的代理设置,对于被GFW屏蔽的网站可以配制使用代理。

如何提高自己的专业技能

常常在论坛上看到人问如何成为高手,就我自己的感觉来讲,就是要保持自己深入研究的精神以及了解新知识的兴趣,感受最深的就是做日本外包的软件的朋友好像经过两年以上似乎对于Java的了解还是不够深入,因为做日本外包需要了解的东西并不是很多,大部分时间都是在做一些简单的重复工作。其实我自己本身开始也是做日本外包的,在东软国合,但是这并不影响我提高自己的能力,因为我在每个项目中都能够深入去了解我所使用的框架(外包的项目一般都是日本做设计,中国这边只是做编码,框架由日本那边提供),遇到问题我也会深入研究为什么会导致这个问题,而不是停留在解决问题后就不去想自己为什么会犯这个错误以及这个问题最根本的原因。

所以我想给所有的做软件的朋友的建议是:
遇到问题,要思考为什么我会犯这个错误,这个错误是什么原因导致的,是OS?还是服务器软件?是配置的问题吗?是使用的框架的问题吗?还是自己的代码的问题。在这个之外,还要考虑是否有什么改进的方法可以以后避免这个问题。只有保持一个深入理解各种问题的精神,你才能逐步的提高自己的能力。

WordPress的永久链接的问题

WordPress使用htaccess文件完成缺省的链接到自定义链接的转换,但如果是在linux下的apache下建站,而且一般都是有多个虚拟主机的,直接修改整个系统的AllowOverride配置不太好,我们可以只修改你的虚拟主机的AllowOverride配置,如下:
<Directory /www/jiehoo>
   AllowOverride All
</Directory>

<VirtualHost *:80>
    ServerAdmin cherami.lm@gmail.com
    DocumentRoot /www/jiehoo
    DirectoryIndex index.php
    ServerName www.jiehoo.com
    ServerAlias jiehoo.com
    ErrorLog logs/jiehoo-error_log
    CustomLog logs/jiehoo-access_log common
</VirtualHost>

足迹

我以前的一些专栏或者Blog

以前的一些文章或者作品:

下面是我使用的一些其他的服务:

使用单元测试和代码覆盖,但是不要迷信他们

单元测试和代码覆盖工具对于提高代码质量确实是很有帮助的,但是不能迷信,详细的内容已经有人代劳了:

追求代码质量: 不要被覆盖报告所迷惑

昨天晚上在构建我自己想做的东西的时候,本来没有打算写单元测试的,但是后来看看时间,做新的功能似乎不够,就写了写单元测试,结果发现代码质量不是一般的差,几个我认为肯定没有问题的地方也出问题了。以后的代码一定要坚持写单元测试,而且今天晚上回去就要把代码覆盖的工具也用上,可能是emma或者Cobertura。

为什么要使用Spring

今天Bruce问我spring怎么样,我的感觉主要是:

  • 可以用配置文件组装系统,使得系统很灵活,可以在不修改原有代码的情况下扩充功能或者替换某个实现
  • 可以使用声明式事务
  • 使用使用spring提供的模板简化代码
  • 可以使用spring提供的其它很多功能简化代码
  • 可以使用AOP

但是:Spring不是必须的。
对于小项目,引入spring可能反到增加不必要的复杂性,毕竟spring也是需要很多配置的,有时候就没有一个new来得简单,而且使用spring后很多错误要到运行的时候才能发现,而修改配置已经来不及了,只能重启 web服务器。
(在spring的配置太多的时候,启动好像很慢,这个是因为要预先初始化很多类并组装好)

但是总体上感觉spring是个好东西,在以后的项目中要尽量使用。

最后推荐:疑惑:为什么要用Spring?以及简化Spring

再谈GMT时间

bruce说我的那个得到GMT时间
代码是错误的,和他讨论了很长时间,后来发现果然是我的理论方面有问题,就java.util.Date类的定义而言,它本来就是当前的GMT时间相对于
1970年1月1日的GMT时间的long值,但是如果使用System.out.println()等方法打印出其内容的时候,也就是使用
Date.toString方法的时候,我们看到的是经过时区修正的结果,这个看看java.util.Date的实现就可以知道:

  • public String toString() {
  • DateFormat formatter = null;
  • if (simpleFormatter != null) {
  • formatter = (DateFormat)simpleFormatter.get();
  • }
  • if (formatter == null) {
  • /* No cache yet, or cached formatter GC'd */
  • formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy",
  • Locale.US);
  • simpleFormatter = new SoftReference(formatter);
  • }
  • synchronized (formatter) {
  • formatter.setTimeZone(TimeZone.getDefault());
  • return formatter.format(this);
  • }
  • }
  • 从代码我们可以看到是使用时区格式化的结果(JDK5的代码和这个不同)。
    问题是:当我们将这个GMT的Date值转换到java.sql.Date或者java.sql.Timestamp存到数据库里面以后,数据库里面的值
    是我们的本地时间而不是GMT时间,因此,如果你需要数据库存储GMT时间的时候,还是需要使用我的那个方法进行转换。至于为什么要存储GMT时间,这个
    是有跨时区应用的时候要考虑的问题,例如一个系统中国的用户和美国的用户同时使用,否则时间会很混乱。

    得到GMT时间

    本来以为得到GMT时间很简单,通过Calendar 
    date = Calendar.getInstance(TimeZone.getTimeZone(“GMT”));然后
    date.getTime()就是,但是实际的结果不是,要得到GMT时间还是需要转换下的,以下是得到当前的GMT时间:
        public static Date getGMTDate ()
        {
            Calendar calendar = Calendar.getInstance();
            int offset = calendar.get(Calendar.ZONE_OFFSET)/3600000 +
                   
    calendar.get(Calendar.DST_OFFSET)/3600000;
            calendar.add(Calendar.HOUR,-offset);
            return calendar.getTime();
        }

    更早的文章 更新的文章

    © 2025 解惑

    本主题由Anders Noren提供向上 ↑